diff --git a/src/Gulpfile.js b/src/Gulpfile.js index 80b2c1eb7..05b62a89e 100644 --- a/src/Gulpfile.js +++ b/src/Gulpfile.js @@ -13,7 +13,11 @@ var glob = require("glob"), uglify = require("gulp-uglify"), rename = require("gulp-rename"), concat = require("gulp-concat"), - header = require("gulp-header") + header = require("gulp-header"); + +/* +** GULP TASKS +*/ // Incremental build (each asset group is built only if one or more inputs are newer than the output). gulp.task("build", function () { @@ -35,14 +39,16 @@ gulp.task("rebuild", function () { // Continuous watch (each asset group is built whenever one of its inputs changes). gulp.task("watch", function () { + var pathWin32 = require("path"); getAssetGroups().forEach(function (assetGroup) { - assetGroup.watchPaths = !!assetGroup.watch ? - assetGroup.watch.map(function (watchPath) { - return path.join(assetGroup.basePath, watchPath); - }).concat(assetGroup.inputPaths) : assetGroup.inputPaths; - gulp.watch(assetGroup.watchPaths, function (event) { - console.log("Asset file '" + event.path + "' was " + event.type + ", rebuilding output '" + assetGroup.outputPath + "'."); - var doRebuild = true; + var watchPaths = assetGroup.inputPaths.concat(assetGroup.watchPaths); + gulp.watch(watchPaths, function (event) { + var isConcat = path.basename(assetGroup.outputFileName, path.extname(assetGroup.outputFileName)) !== "@"; + if (isConcat) + console.log("Asset file '" + event.path + "' was " + event.type + ", rebuilding asset group with output '" + assetGroup.outputPath + "'."); + else + console.log("Asset file '" + event.path + "' was " + event.type + ", rebuilding asset group."); + var doRebuild = true; var task = createAssetGroupTask(assetGroup, doRebuild); }); }); @@ -70,6 +76,12 @@ function resolveAssetGroupPaths(assetGroup, assetManifestPath) { assetGroup.inputPaths = assetGroup.inputs.map(function (inputPath) { return path.join(assetGroup.basePath, inputPath); }); + assetGroup.watchPaths = []; + if (!!assetGroup.watch) { + assetGroup.watchPaths = assetGroup.watch.map(function (watchPath) { + return path.join(assetGroup.basePath, watchPath); + }); + } assetGroup.outputPath = path.join(assetGroup.basePath, assetGroup.output); assetGroup.outputDir = path.dirname(assetGroup.outputPath); assetGroup.outputFileName = path.basename(assetGroup.output); @@ -162,7 +174,7 @@ function buildJsPipeline(assetGroup, doRebuild) { .pipe(gulp.dest(assetGroup.outputDir)) .pipe(uglify()) .pipe(rename({ - suffix: ".min" - })) + suffix: ".min" + })) .pipe(gulp.dest(assetGroup.outputDir)); } diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/console-shim.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/console-shim.js index 6406e0625..484143a1d 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/console-shim.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/console-shim.js @@ -212,4 +212,4 @@ if (!console["count"]) console["count"] = function() {}; })(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjb25zb2xlLXNoaW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJlc2VydmUgY29uc29sZS1zaGltIDEuMC4yXG4gKiBodHRwczovL2dpdGh1Yi5jb20va2F5YWhyL2NvbnNvbGUtc2hpbVxuICogQ29weXJpZ2h0IChDKSAyMDExIEtsYXVzIFJlaW1lciA8a0BhaWxpcy5kZT5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogKFNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlKVxuICovXG4gXG4gXG4oZnVuY3Rpb24oKXtcblwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aGljaCBjYWxscyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGluIHRoZSBzcGVjaWZpZWRcbiAqIHNjb3BlLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gKiBAcGFyYW0ge09iamVjdH0gc2NvcGVcbiAqICAgICAgICAgICAgVGhlIHNjb3BlIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIGluLlxuICogQHBhcmFtIHsuLi4qfSBhcmdzXG4gKiAgICAgICAgICAgIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGJvdW5kIGZ1bmN0aW9uLlxuICogQHJldHVybnMge2Z1bmN0aW9uKC4uLlsqXSk6IHVuZGVmaW5lZH1cbiAqICAgICAgICAgICAgVGhlIGJvdW5kIGZ1bmN0aW9uLlxuICovXG52YXIgYmluZCA9IGZ1bmN0aW9uKGZ1bmMsIHNjb3BlLCBhcmdzKVxue1xuICAgIHZhciBmaXhlZEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHJldHVybiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICB2YXIgYXJncyA9IGZpeGVkQXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7XG4gICAgICAgICgvKiogQHR5cGUge0Z1bmN0aW9ufSAqLyBmdW5jKS5hcHBseShzY29wZSwgYXJncyk7XG4gICAgfTtcbn07XG5cbi8vIENyZWF0ZSBjb25zb2xlIGlmIG5vdCBwcmVzZW50XG5pZiAoIXdpbmRvd1tcImNvbnNvbGVcIl0pIHdpbmRvdy5jb25zb2xlID0gLyoqIEB0eXBlIHtDb25zb2xlfSAqLyAoe30pO1xudmFyIGNvbnNvbGUgPSAoLyoqIEB0eXBlIHtPYmplY3R9ICovIHdpbmRvdy5jb25zb2xlKTtcblxuLy8gSW1wbGVtZW50IGNvbnNvbGUgbG9nIGlmIG5lZWRlZFxuaWYgKCFjb25zb2xlW1wibG9nXCJdKVxue1xuICAgIC8vIFVzZSBsb2c0amF2YXNjcmlwdCBpZiBwcmVzZW50XG4gICAgaWYgKHdpbmRvd1tcImxvZzRqYXZhc2NyaXB0XCJdKVxuICAgIHtcbiAgICAgICAgdmFyIGxvZyA9IGxvZzRqYXZhc2NyaXB0LmdldERlZmF1bHRMb2dnZXIoKTtcbiAgICAgICAgY29uc29sZS5sb2cgPSBiaW5kKGxvZy5pbmZvLCBsb2cpO1xuICAgICAgICBjb25zb2xlLmRlYnVnID0gYmluZChsb2cuZGVidWcsIGxvZyk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyA9IGJpbmQobG9nLmluZm8sIGxvZyk7XG4gICAgICAgIGNvbnNvbGUud2FybiA9IGJpbmQobG9nLndhcm4sIGxvZyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IgPSBiaW5kKGxvZy5lcnJvciwgbG9nKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGVtcHR5IGR1bW15IGltcGxlbWVudGF0aW9uIHRvIGlnbm9yZSBsb2dnaW5nXG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2cgPSAoLyoqIEBwYXJhbSB7Li4uKn0gYXJncyAqLyBmdW5jdGlvbihhcmdzKSB7fSk7XG4gICAgfVxufVxuXG4vLyBJbXBsZW1lbnQgb3RoZXIgbG9nIGxldmVscyB0byBjb25zb2xlLmxvZyBpZiBtaXNzaW5nXG5pZiAoIWNvbnNvbGVbXCJkZWJ1Z1wiXSkgY29uc29sZS5kZWJ1ZyA9IGNvbnNvbGUubG9nO1xuaWYgKCFjb25zb2xlW1wiaW5mb1wiXSkgY29uc29sZS5pbmZvID0gY29uc29sZS5sb2c7XG5pZiAoIWNvbnNvbGVbXCJ3YXJuXCJdKSBjb25zb2xlLndhcm4gPSBjb25zb2xlLmxvZztcbmlmICghY29uc29sZVtcImVycm9yXCJdKSBjb25zb2xlLmVycm9yID0gY29uc29sZS5sb2c7XG5cbi8vIFdyYXAgdGhlIGxvZyBtZXRob2RzIGluIElFICg8PTkpIGJlY2F1c2UgdGhlaXIgYXJndW1lbnQgaGFuZGxpbmcgaXMgd3Jvbmdcbi8vIFRoaXMgd3JhcHBpbmcgaXMgYWxzbyBkb25lIGlmIHRoZSBfX2NvbnNvbGVTaGltVGVzdF9fIHN5bWJvbCBpcyBzZXQuIFRoaXNcbi8vIGlzIG5lZWRlZCBmb3IgdW5pdCB0ZXN0aW5nLlxuaWYgKHdpbmRvd1tcIl9fY29uc29sZVNoaW1UZXN0X19cIl0gIT0gbnVsbCB8fCBcbiAgICBldmFsKFwiLypAY2Nfb24gQF9qc2NyaXB0X3ZlcnNpb24gPD0gOUAqL1wiKSlcbntcbiAgICAvKipcbiAgICAgKiBXcmFwcyB0aGUgY2FsbCB0byBhIHJlYWwgSUUgbG9nZ2luZyBtZXRob2QuIE1vZGlmaWVzIHRoZSBhcmd1bWVudHMgc29cbiAgICAgKiBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBub3QgcmVwcmVzZW50ZWQgYnkgYSBwbGFjZWhvbGRlciBhcmUgcHJvcGVybHlcbiAgICAgKiBwcmludGVkIHdpdGggYSBzcGFjZSBjaGFyYWN0ZXIgYXMgc2VwYXJhdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsuLi4qfSBhcmdzXG4gICAgICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyB0aGUgbG9nIGZ1bmN0aW9uXG4gICAgICogICAgICAgICAgICB0byBjYWxsLCB0aGUgb3RoZXIgYXJndW1lbnRzIGFyZSB0aGUgbG9nIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICB2YXIgd3JhcCA9IGZ1bmN0aW9uKGFyZ3MpXG4gICAge1xuICAgICAgICB2YXIgaSwgbWF4LCBtYXRjaCwgbG9nO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29udmVydCBhcmd1bWVudCBsaXN0IHRvIHJlYWwgYXJyYXlcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgbG9nIG1ldGhvZCB0byBjYWxsXG4gICAgICAgIGxvZyA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgXG4gICAgICAgIG1heCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAobWF4ID4gMSAmJiB3aW5kb3dbXCJfX2NvbnNvbGVTaGltVGVzdF9fXCJdICE9PSBmYWxzZSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gV2hlbiBmaXJzdCBwYXJhbWV0ZXIgaXMgbm90IGEgc3RyaW5nIHRoZW4gYWRkIGEgZm9ybWF0IHN0cmluZyB0b1xuICAgICAgICAgICAgLy8gdGhlIGFyZ3VtZW50IGxpc3Qgc28gd2UgYXJlIGFibGUgdG8gbW9kaWZ5IGl0IGluIHRoZSBuZXh0IHN0b3BcbiAgICAgICAgICAgIGlmICh0eXBlb2YoYXJnc1swXSkgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhcmdzLnVuc2hpZnQoXCIlb1wiKTtcbiAgICAgICAgICAgICAgICBtYXggKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2hpY2ggaGFzIG5vIHBsYWNlaG9sZGVyIGluIHRoZVxuICAgICAgICAgICAgLy8gZm9ybWF0IHN0cmluZyB3ZSBhZGQgYW5vdGhlciBwbGFjZWhvbGRlciBzZXBhcmF0ZWQgd2l0aCBhXG4gICAgICAgICAgICAvLyBzcGFjZSBjaGFyYWN0ZXIuXG4gICAgICAgICAgICBtYXRjaCA9IGFyZ3NbMF0ubWF0Y2goLyVbYS16XS9nKTtcbiAgICAgICAgICAgIGZvciAoaSA9IG1hdGNoID8gbWF0Y2gubGVuZ3RoICsgMSA6IDE7IGkgPCBtYXg7IGkgKz0gMSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhcmdzWzBdICs9IFwiICVvXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgRnVuY3Rpb24uYXBwbHkuY2FsbChsb2csIGNvbnNvbGUsIGFyZ3MpO1xuICAgIH07XG4gICAgXG4gICAgLy8gV3JhcCB0aGUgbmF0aXZlIGxvZyBtZXRob2RzIG9mIElFIHRvIGZpeCBhcmd1bWVudCBvdXRwdXQgcHJvYmxlbXNcbiAgICBjb25zb2xlLmxvZyA9IGJpbmQod3JhcCwgd2luZG93LCBjb25zb2xlLmxvZyk7XG4gICAgY29uc29sZS5kZWJ1ZyA9IGJpbmQod3JhcCwgd2luZG93LCBjb25zb2xlLmRlYnVnKTtcbiAgICBjb25zb2xlLmluZm8gPSBiaW5kKHdyYXAsIHdpbmRvdywgY29uc29sZS5pbmZvKTtcbiAgICBjb25zb2xlLndhcm4gPSBiaW5kKHdyYXAsIHdpbmRvdywgY29uc29sZS53YXJuKTtcbiAgICBjb25zb2xlLmVycm9yID0gYmluZCh3cmFwLCB3aW5kb3csIGNvbnNvbGUuZXJyb3IpO1xufVxuXG4vLyBJbXBsZW1lbnQgY29uc29sZS5hc3NlcnQgaWYgbWlzc2luZ1xuaWYgKCFjb25zb2xlW1wiYXNzZXJ0XCJdKVxue1xuICAgIGNvbnNvbGVbXCJhc3NlcnRcIl0gPSBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICAgIHZhciBleHByID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBpZiAoIWV4cHIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGFyZ3NbMF0gPSBcIkFzc2VydGlvbiBmYWlsZWQ6IFwiICsgYXJnc1swXTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBMaW5raW5nIGNvbnNvbGUuZGlyIGFuZCBjb25zb2xlLmRpcnhtbCB0byB0aGUgY29uc29sZS5sb2cgbWV0aG9kIGlmXG4vLyBtaXNzaW5nLiBIb3BlZnVsbHkgdGhlIGJyb3dzZXIgYWxyZWFkeSBsb2dzIG9iamVjdHMgYW5kIERPTSBub2RlcyBhcyBhXG4vLyB0cmVlLlxuaWYgKCFjb25zb2xlW1wiZGlyXCJdKSBjb25zb2xlW1wiZGlyXCJdID0gY29uc29sZS5sb2c7XG5pZiAoIWNvbnNvbGVbXCJkaXJ4bWxcIl0pIGNvbnNvbGVbXCJkaXJ4bWxcIl0gPSBjb25zb2xlLmxvZztcblxuLy8gTGlua2luZyBjb25zb2xlLmV4Y2VwdGlvbiB0byBjb25zb2xlLmVycm9yLiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBidXRcbi8vIGF0IGxlYXN0IHNvbWUgZXJyb3IgbWVzc2FnZSBpcyBkaXNwbGF5ZWQuXG5pZiAoIWNvbnNvbGVbXCJleGNlcHRpb25cIl0pIGNvbnNvbGVbXCJleGNlcHRpb25cIl0gPSBjb25zb2xlLmVycm9yO1xuXG4vLyBJbXBsZW1lbnQgY29uc29sZS50aW1lIGFuZCBjb25zb2xlLnRpbWVFbmQgaWYgb25lIG9mIHRoZW0gaXMgbWlzc2luZ1xuaWYgKCFjb25zb2xlW1widGltZVwiXSB8fCAhY29uc29sZVtcInRpbWVFbmRcIl0pXG57XG4gICAgdmFyIHRpbWVycyA9IHt9O1xuICAgIGNvbnNvbGVbXCJ0aW1lXCJdID0gZnVuY3Rpb24oaWQpXG4gICAge1xuICAgICAgICB0aW1lcnNbaWRdID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgfTtcbiAgICBjb25zb2xlW1widGltZUVuZFwiXSA9IGZ1bmN0aW9uKGlkKVxuICAgIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGltZXJzW2lkXTtcbiAgICAgICAgaWYgKHN0YXJ0KVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpZCArIFwiOiBcIiArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0KSArIFwibXNcIik7XG4gICAgICAgICAgICBkZWxldGUgdGltZXJzW2lkXTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIEltcGxlbWVudCBjb25zb2xlLnRhYmxlIGlmIG1pc3NpbmdcbmlmICghY29uc29sZVtcInRhYmxlXCJdKVxue1xuICAgIGNvbnNvbGVbXCJ0YWJsZVwiXSA9IGZ1bmN0aW9uKGRhdGEsIGNvbHVtbnMpXG4gICAge1xuICAgICAgICB2YXIgaSwgaU1heCwgcm93LCBqLCBqTWF4LCBrO1xuICAgICAgICBcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBkYXRhIGhhcyB3cm9uZyB0eXBlIG9yIG5vIGRhdGEgd2FzIHNwZWNpZmllZFxuICAgICAgICBpZiAoIWRhdGEgfHwgIShkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy8gQXV0by1jYWxjdWxhdGUgY29sdW1ucyBhcnJheSBpZiBub3Qgc2V0XG4gICAgICAgIGlmICghY29sdW1ucyB8fCAhKGNvbHVtbnMgaW5zdGFuY2VvZiBBcnJheSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoayBpbiBkYXRhWzBdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICghZGF0YVswXS5oYXNPd25Qcm9wZXJ0eShrKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKGkgPSAwLCBpTWF4ID0gZGF0YS5sZW5ndGg7IGkgPCBpTWF4OyBpICs9IDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJvdyA9IFtdO1xuICAgICAgICAgICAgZm9yIChqID0gMCwgak1heCA9IGNvbHVtbnMubGVuZ3RoOyBqIDwgak1heDsgaiArPSAxKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJvdy5wdXNoKGRhdGFbaV1bY29sdW1uc1tqXV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBGdW5jdGlvbi5hcHBseS5jYWxsKGNvbnNvbGUubG9nLCBjb25zb2xlLCByb3cpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8gRHVtbXkgaW1wbGVtZW50YXRpb25zIG9mIG90aGVyIGNvbnNvbGUgZmVhdHVyZXMgdG8gcHJldmVudCBlcnJvciBtZXNzYWdlc1xuLy8gaW4gYnJvd3NlcnMgbm90IHN1cHBvcnRpbmcgaXQuXG5pZiAoIWNvbnNvbGVbXCJjbGVhclwiXSkgY29uc29sZVtcImNsZWFyXCJdID0gZnVuY3Rpb24oKSB7fTtcbmlmICghY29uc29sZVtcInRyYWNlXCJdKSBjb25zb2xlW1widHJhY2VcIl0gPSBmdW5jdGlvbigpIHt9O1xuaWYgKCFjb25zb2xlW1wiZ3JvdXBcIl0pIGNvbnNvbGVbXCJncm91cFwiXSA9IGZ1bmN0aW9uKCkge307XG5pZiAoIWNvbnNvbGVbXCJncm91cENvbGxhcHNlZFwiXSkgY29uc29sZVtcImdyb3VwQ29sbGFwc2VkXCJdID0gZnVuY3Rpb24oKSB7fTtcbmlmICghY29uc29sZVtcImdyb3VwRW5kXCJdKSBjb25zb2xlW1wiZ3JvdXBFbmRcIl0gPSBmdW5jdGlvbigpIHt9O1xuaWYgKCFjb25zb2xlW1widGltZVN0YW1wXCJdKSBjb25zb2xlW1widGltZVN0YW1wXCJdID0gZnVuY3Rpb24oKSB7fTtcbmlmICghY29uc29sZVtcInByb2ZpbGVcIl0pIGNvbnNvbGVbXCJwcm9maWxlXCJdID0gZnVuY3Rpb24oKSB7fTtcbmlmICghY29uc29sZVtcInByb2ZpbGVFbmRcIl0pIGNvbnNvbGVbXCJwcm9maWxlRW5kXCJdID0gZnVuY3Rpb24oKSB7fTtcbmlmICghY29uc29sZVtcImNvdW50XCJdKSBjb25zb2xlW1wiY291bnRcIl0gPSBmdW5jdGlvbigpIHt9O1xuXG59KSgpO1xuIl0sImZpbGUiOiJjb25zb2xlLXNoaW0uanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjb25zb2xlLXNoaW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBwcmVzZXJ2ZSBjb25zb2xlLXNoaW0gMS4wLjJcclxuICogaHR0cHM6Ly9naXRodWIuY29tL2theWFoci9jb25zb2xlLXNoaW1cclxuICogQ29weXJpZ2h0IChDKSAyMDExIEtsYXVzIFJlaW1lciA8a0BhaWxpcy5kZT5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXHJcbiAqIChTZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZSlcclxuICovXHJcbiBcclxuIFxyXG4oZnVuY3Rpb24oKXtcclxuXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaW4gdGhlIHNwZWNpZmllZFxyXG4gKiBzY29wZS5cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xyXG4gKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gc2NvcGVcclxuICogICAgICAgICAgICBUaGUgc2NvcGUgdG8gY2FsbCB0aGUgZnVuY3Rpb24gaW4uXHJcbiAqIEBwYXJhbSB7Li4uKn0gYXJnc1xyXG4gKiAgICAgICAgICAgIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGJvdW5kIGZ1bmN0aW9uLlxyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oLi4uWypdKTogdW5kZWZpbmVkfVxyXG4gKiAgICAgICAgICAgIFRoZSBib3VuZCBmdW5jdGlvbi5cclxuICovXHJcbnZhciBiaW5kID0gZnVuY3Rpb24oZnVuYywgc2NvcGUsIGFyZ3MpXHJcbntcclxuICAgIHZhciBmaXhlZEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYXJncyA9IGZpeGVkQXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7XHJcbiAgICAgICAgKC8qKiBAdHlwZSB7RnVuY3Rpb259ICovIGZ1bmMpLmFwcGx5KHNjb3BlLCBhcmdzKTtcclxuICAgIH07XHJcbn07XHJcblxyXG4vLyBDcmVhdGUgY29uc29sZSBpZiBub3QgcHJlc2VudFxyXG5pZiAoIXdpbmRvd1tcImNvbnNvbGVcIl0pIHdpbmRvdy5jb25zb2xlID0gLyoqIEB0eXBlIHtDb25zb2xlfSAqLyAoe30pO1xyXG52YXIgY29uc29sZSA9ICgvKiogQHR5cGUge09iamVjdH0gKi8gd2luZG93LmNvbnNvbGUpO1xyXG5cclxuLy8gSW1wbGVtZW50IGNvbnNvbGUgbG9nIGlmIG5lZWRlZFxyXG5pZiAoIWNvbnNvbGVbXCJsb2dcIl0pXHJcbntcclxuICAgIC8vIFVzZSBsb2c0amF2YXNjcmlwdCBpZiBwcmVzZW50XHJcbiAgICBpZiAod2luZG93W1wibG9nNGphdmFzY3JpcHRcIl0pXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxvZyA9IGxvZzRqYXZhc2NyaXB0LmdldERlZmF1bHRMb2dnZXIoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyA9IGJpbmQobG9nLmluZm8sIGxvZyk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyA9IGJpbmQobG9nLmRlYnVnLCBsb2cpO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyA9IGJpbmQobG9nLmluZm8sIGxvZyk7XHJcbiAgICAgICAgY29uc29sZS53YXJuID0gYmluZChsb2cud2FybiwgbG9nKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yID0gYmluZChsb2cuZXJyb3IsIGxvZyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIFVzZSBlbXB0eSBkdW1teSBpbXBsZW1lbnRhdGlvbiB0byBpZ25vcmUgbG9nZ2luZ1xyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nID0gKC8qKiBAcGFyYW0gey4uLip9IGFyZ3MgKi8gZnVuY3Rpb24oYXJncykge30pO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBJbXBsZW1lbnQgb3RoZXIgbG9nIGxldmVscyB0byBjb25zb2xlLmxvZyBpZiBtaXNzaW5nXHJcbmlmICghY29uc29sZVtcImRlYnVnXCJdKSBjb25zb2xlLmRlYnVnID0gY29uc29sZS5sb2c7XHJcbmlmICghY29uc29sZVtcImluZm9cIl0pIGNvbnNvbGUuaW5mbyA9IGNvbnNvbGUubG9nO1xyXG5pZiAoIWNvbnNvbGVbXCJ3YXJuXCJdKSBjb25zb2xlLndhcm4gPSBjb25zb2xlLmxvZztcclxuaWYgKCFjb25zb2xlW1wiZXJyb3JcIl0pIGNvbnNvbGUuZXJyb3IgPSBjb25zb2xlLmxvZztcclxuXHJcbi8vIFdyYXAgdGhlIGxvZyBtZXRob2RzIGluIElFICg8PTkpIGJlY2F1c2UgdGhlaXIgYXJndW1lbnQgaGFuZGxpbmcgaXMgd3JvbmdcclxuLy8gVGhpcyB3cmFwcGluZyBpcyBhbHNvIGRvbmUgaWYgdGhlIF9fY29uc29sZVNoaW1UZXN0X18gc3ltYm9sIGlzIHNldC4gVGhpc1xyXG4vLyBpcyBuZWVkZWQgZm9yIHVuaXQgdGVzdGluZy5cclxuaWYgKHdpbmRvd1tcIl9fY29uc29sZVNoaW1UZXN0X19cIl0gIT0gbnVsbCB8fCBcclxuICAgIGV2YWwoXCIvKkBjY19vbiBAX2pzY3JpcHRfdmVyc2lvbiA8PSA5QCovXCIpKVxyXG57XHJcbiAgICAvKipcclxuICAgICAqIFdyYXBzIHRoZSBjYWxsIHRvIGEgcmVhbCBJRSBsb2dnaW5nIG1ldGhvZC4gTW9kaWZpZXMgdGhlIGFyZ3VtZW50cyBzb1xyXG4gICAgICogcGFyYW1ldGVycyB3aGljaCBhcmUgbm90IHJlcHJlc2VudGVkIGJ5IGEgcGxhY2Vob2xkZXIgYXJlIHByb3Blcmx5XHJcbiAgICAgKiBwcmludGVkIHdpdGggYSBzcGFjZSBjaGFyYWN0ZXIgYXMgc2VwYXJhdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Li4uKn0gYXJnc1xyXG4gICAgICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyB0aGUgbG9nIGZ1bmN0aW9uXHJcbiAgICAgKiAgICAgICAgICAgIHRvIGNhbGwsIHRoZSBvdGhlciBhcmd1bWVudHMgYXJlIHRoZSBsb2cgYXJndW1lbnRzLlxyXG4gICAgICovXHJcbiAgICB2YXIgd3JhcCA9IGZ1bmN0aW9uKGFyZ3MpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGksIG1heCwgbWF0Y2gsIGxvZztcclxuICAgICAgICBcclxuICAgICAgICAvLyBDb252ZXJ0IGFyZ3VtZW50IGxpc3QgdG8gcmVhbCBhcnJheVxyXG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSBsb2cgbWV0aG9kIHRvIGNhbGxcclxuICAgICAgICBsb2cgPSBhcmdzLnNoaWZ0KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbWF4ID0gYXJncy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKG1heCA+IDEgJiYgd2luZG93W1wiX19jb25zb2xlU2hpbVRlc3RfX1wiXSAhPT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBXaGVuIGZpcnN0IHBhcmFtZXRlciBpcyBub3QgYSBzdHJpbmcgdGhlbiBhZGQgYSBmb3JtYXQgc3RyaW5nIHRvXHJcbiAgICAgICAgICAgIC8vIHRoZSBhcmd1bWVudCBsaXN0IHNvIHdlIGFyZSBhYmxlIHRvIG1vZGlmeSBpdCBpbiB0aGUgbmV4dCBzdG9wXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YoYXJnc1swXSkgIT0gXCJzdHJpbmdcIilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXJncy51bnNoaWZ0KFwiJW9cIik7XHJcbiAgICAgICAgICAgICAgICBtYXggKz0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2hpY2ggaGFzIG5vIHBsYWNlaG9sZGVyIGluIHRoZVxyXG4gICAgICAgICAgICAvLyBmb3JtYXQgc3RyaW5nIHdlIGFkZCBhbm90aGVyIHBsYWNlaG9sZGVyIHNlcGFyYXRlZCB3aXRoIGFcclxuICAgICAgICAgICAgLy8gc3BhY2UgY2hhcmFjdGVyLlxyXG4gICAgICAgICAgICBtYXRjaCA9IGFyZ3NbMF0ubWF0Y2goLyVbYS16XS9nKTtcclxuICAgICAgICAgICAgZm9yIChpID0gbWF0Y2ggPyBtYXRjaC5sZW5ndGggKyAxIDogMTsgaSA8IG1heDsgaSArPSAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhcmdzWzBdICs9IFwiICVvXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgRnVuY3Rpb24uYXBwbHkuY2FsbChsb2csIGNvbnNvbGUsIGFyZ3MpO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gV3JhcCB0aGUgbmF0aXZlIGxvZyBtZXRob2RzIG9mIElFIHRvIGZpeCBhcmd1bWVudCBvdXRwdXQgcHJvYmxlbXNcclxuICAgIGNvbnNvbGUubG9nID0gYmluZCh3cmFwLCB3aW5kb3csIGNvbnNvbGUubG9nKTtcclxuICAgIGNvbnNvbGUuZGVidWcgPSBiaW5kKHdyYXAsIHdpbmRvdywgY29uc29sZS5kZWJ1Zyk7XHJcbiAgICBjb25zb2xlLmluZm8gPSBiaW5kKHdyYXAsIHdpbmRvdywgY29uc29sZS5pbmZvKTtcclxuICAgIGNvbnNvbGUud2FybiA9IGJpbmQod3JhcCwgd2luZG93LCBjb25zb2xlLndhcm4pO1xyXG4gICAgY29uc29sZS5lcnJvciA9IGJpbmQod3JhcCwgd2luZG93LCBjb25zb2xlLmVycm9yKTtcclxufVxyXG5cclxuLy8gSW1wbGVtZW50IGNvbnNvbGUuYXNzZXJ0IGlmIG1pc3NpbmdcclxuaWYgKCFjb25zb2xlW1wiYXNzZXJ0XCJdKVxyXG57XHJcbiAgICBjb25zb2xlW1wiYXNzZXJ0XCJdID0gZnVuY3Rpb24oKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcclxuICAgICAgICB2YXIgZXhwciA9IGFyZ3Muc2hpZnQoKTtcclxuICAgICAgICBpZiAoIWV4cHIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcmdzWzBdID0gXCJBc3NlcnRpb24gZmFpbGVkOiBcIiArIGFyZ3NbMF07XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuLy8gTGlua2luZyBjb25zb2xlLmRpciBhbmQgY29uc29sZS5kaXJ4bWwgdG8gdGhlIGNvbnNvbGUubG9nIG1ldGhvZCBpZlxyXG4vLyBtaXNzaW5nLiBIb3BlZnVsbHkgdGhlIGJyb3dzZXIgYWxyZWFkeSBsb2dzIG9iamVjdHMgYW5kIERPTSBub2RlcyBhcyBhXHJcbi8vIHRyZWUuXHJcbmlmICghY29uc29sZVtcImRpclwiXSkgY29uc29sZVtcImRpclwiXSA9IGNvbnNvbGUubG9nO1xyXG5pZiAoIWNvbnNvbGVbXCJkaXJ4bWxcIl0pIGNvbnNvbGVbXCJkaXJ4bWxcIl0gPSBjb25zb2xlLmxvZztcclxuXHJcbi8vIExpbmtpbmcgY29uc29sZS5leGNlcHRpb24gdG8gY29uc29sZS5lcnJvci4gVGhpcyBpcyBub3QgdGhlIHNhbWUgYnV0XHJcbi8vIGF0IGxlYXN0IHNvbWUgZXJyb3IgbWVzc2FnZSBpcyBkaXNwbGF5ZWQuXHJcbmlmICghY29uc29sZVtcImV4Y2VwdGlvblwiXSkgY29uc29sZVtcImV4Y2VwdGlvblwiXSA9IGNvbnNvbGUuZXJyb3I7XHJcblxyXG4vLyBJbXBsZW1lbnQgY29uc29sZS50aW1lIGFuZCBjb25zb2xlLnRpbWVFbmQgaWYgb25lIG9mIHRoZW0gaXMgbWlzc2luZ1xyXG5pZiAoIWNvbnNvbGVbXCJ0aW1lXCJdIHx8ICFjb25zb2xlW1widGltZUVuZFwiXSlcclxue1xyXG4gICAgdmFyIHRpbWVycyA9IHt9O1xyXG4gICAgY29uc29sZVtcInRpbWVcIl0gPSBmdW5jdGlvbihpZClcclxuICAgIHtcclxuICAgICAgICB0aW1lcnNbaWRdID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICB9O1xyXG4gICAgY29uc29sZVtcInRpbWVFbmRcIl0gPSBmdW5jdGlvbihpZClcclxuICAgIHtcclxuICAgICAgICB2YXIgc3RhcnQgPSB0aW1lcnNbaWRdO1xyXG4gICAgICAgIGlmIChzdGFydClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGlkICsgXCI6IFwiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgXCJtc1wiKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRpbWVyc1tpZF07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuLy8gSW1wbGVtZW50IGNvbnNvbGUudGFibGUgaWYgbWlzc2luZ1xyXG5pZiAoIWNvbnNvbGVbXCJ0YWJsZVwiXSlcclxue1xyXG4gICAgY29uc29sZVtcInRhYmxlXCJdID0gZnVuY3Rpb24oZGF0YSwgY29sdW1ucylcclxuICAgIHtcclxuICAgICAgICB2YXIgaSwgaU1heCwgcm93LCBqLCBqTWF4LCBrO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgZGF0YSBoYXMgd3JvbmcgdHlwZSBvciBubyBkYXRhIHdhcyBzcGVjaWZpZWRcclxuICAgICAgICBpZiAoIWRhdGEgfHwgIShkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEF1dG8tY2FsY3VsYXRlIGNvbHVtbnMgYXJyYXkgaWYgbm90IHNldFxyXG4gICAgICAgIGlmICghY29sdW1ucyB8fCAhKGNvbHVtbnMgaW5zdGFuY2VvZiBBcnJheSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb2x1bW5zID0gW107XHJcbiAgICAgICAgICAgIGZvciAoayBpbiBkYXRhWzBdKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGFbMF0uaGFzT3duUHJvcGVydHkoaykpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGspO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAoaSA9IDAsIGlNYXggPSBkYXRhLmxlbmd0aDsgaSA8IGlNYXg7IGkgKz0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJvdyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGogPSAwLCBqTWF4ID0gY29sdW1ucy5sZW5ndGg7IGogPCBqTWF4OyBqICs9IDEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJvdy5wdXNoKGRhdGFbaV1bY29sdW1uc1tqXV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBGdW5jdGlvbi5hcHBseS5jYWxsKGNvbnNvbGUubG9nLCBjb25zb2xlLCByb3cpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbi8vIER1bW15IGltcGxlbWVudGF0aW9ucyBvZiBvdGhlciBjb25zb2xlIGZlYXR1cmVzIHRvIHByZXZlbnQgZXJyb3IgbWVzc2FnZXNcclxuLy8gaW4gYnJvd3NlcnMgbm90IHN1cHBvcnRpbmcgaXQuXHJcbmlmICghY29uc29sZVtcImNsZWFyXCJdKSBjb25zb2xlW1wiY2xlYXJcIl0gPSBmdW5jdGlvbigpIHt9O1xyXG5pZiAoIWNvbnNvbGVbXCJ0cmFjZVwiXSkgY29uc29sZVtcInRyYWNlXCJdID0gZnVuY3Rpb24oKSB7fTtcclxuaWYgKCFjb25zb2xlW1wiZ3JvdXBcIl0pIGNvbnNvbGVbXCJncm91cFwiXSA9IGZ1bmN0aW9uKCkge307XHJcbmlmICghY29uc29sZVtcImdyb3VwQ29sbGFwc2VkXCJdKSBjb25zb2xlW1wiZ3JvdXBDb2xsYXBzZWRcIl0gPSBmdW5jdGlvbigpIHt9O1xyXG5pZiAoIWNvbnNvbGVbXCJncm91cEVuZFwiXSkgY29uc29sZVtcImdyb3VwRW5kXCJdID0gZnVuY3Rpb24oKSB7fTtcclxuaWYgKCFjb25zb2xlW1widGltZVN0YW1wXCJdKSBjb25zb2xlW1widGltZVN0YW1wXCJdID0gZnVuY3Rpb24oKSB7fTtcclxuaWYgKCFjb25zb2xlW1wicHJvZmlsZVwiXSkgY29uc29sZVtcInByb2ZpbGVcIl0gPSBmdW5jdGlvbigpIHt9O1xyXG5pZiAoIWNvbnNvbGVbXCJwcm9maWxlRW5kXCJdKSBjb25zb2xlW1wicHJvZmlsZUVuZFwiXSA9IGZ1bmN0aW9uKCkge307XHJcbmlmICghY29uc29sZVtcImNvdW50XCJdKSBjb25zb2xlW1wiY291bnRcIl0gPSBmdW5jdGlvbigpIHt9O1xyXG5cclxufSkoKTtcclxuIl0sImZpbGUiOiJjb25zb2xlLXNoaW0uanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/dash.all.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/dash.all.js index fbb8bbb13..7b9f7b0d2 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/dash.all.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/dash.all.js @@ -3,4 +3,4 @@ function X2JS(a,b,c){function d(a){var b=a.localName;return null==b&&(b=a.baseNa Q.all(r).then(function(a){for(n.debug.log(a),k={},k[MediaPlayer.rules.SwitchRequest.prototype.STRONG]=MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE,k[MediaPlayer.rules.SwitchRequest.prototype.WEAK]=MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE,k[MediaPlayer.rules.SwitchRequest.prototype.DEFAULT]=MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE,h=0,i=a.length;i>h;h+=1)j=a[h],j.quality!==MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE&&(k[j.priority]=Math.min(k[j.priority],j.quality));k[MediaPlayer.rules.SwitchRequest.prototype.WEAK]!==MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE&&(q=MediaPlayer.rules.SwitchRequest.prototype.WEAK,p=k[MediaPlayer.rules.SwitchRequest.prototype.WEAK]),k[MediaPlayer.rules.SwitchRequest.prototype.DEFAULT]!==MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE&&(q=MediaPlayer.rules.SwitchRequest.prototype.DEFAULT,p=k[MediaPlayer.rules.SwitchRequest.prototype.DEFAULT]),k[MediaPlayer.rules.SwitchRequest.prototype.STRONG]!==MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE&&(q=MediaPlayer.rules.SwitchRequest.prototype.STRONG,p=k[MediaPlayer.rules.SwitchRequest.prototype.STRONG]),p!==MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE&&void 0!==p&&(l=p),q!==MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE&&void 0!==q&&(m=q),n.manifestExt.getRepresentationCount(c).then(function(a){0>l&&(l=0),l>=a&&(l=a-1),m!=MediaPlayer.rules.SwitchRequest.prototype.STRONG&&m!=MediaPlayer.rules.SwitchRequest.prototype.WEAK&&(m=MediaPlayer.rules.SwitchRequest.prototype.DEFAULT),e(b,l),n.debug.log("New quality of "+l),g(b,m),n.debug.log("New confidence of "+m),o.resolve({quality:l,confidence:m})})})})})):(n.debug.log("Unchanged quality of "+l),o.resolve({quality:l,confidence:m})),o.promise},setPlaybackQuality:function(a,b){var c=d(a);b!==c&&e(a,b)},getQualityFor:function(a){return d(a)}}},MediaPlayer.dependencies.AbrController.prototype={constructor:MediaPlayer.dependencies.AbrController},MediaPlayer.dependencies.BufferController=function(){"use strict";var a,b,c,d,e=.5,f=22,g="WAITING",h="READY",i="VALIDATING",j="LOADING",k=g,l=!1,m=!1,n=!1,o=!0,p=[],q=!1,r=-1,s=!0,t=-1,u=!1,v=!1,w=!1,x=!1,y=[],z=null,A=Q.defer(),B=null,C=null,D=-1,E=0,F=0,G=null,H=0,I=!1,J=null,K=0,L=!1,M=null,N=null,O=null,P=null,R=!0,S=function(a){var b=this;b.debug.log("BufferController "+c+" setState to:"+a),k=a,null!==G&&b.fragmentController.onBufferControllerStateChange()},T=function(a,b){var c=0,d=null;R===!1&&(d=P.start,c=a.getTime()-d.getTime(),P.duration=c,P.stopreason=b,R=!0)},U=function(){var a=this.manifestModel.getValue(),b=this.manifestExt.getIsLive(a);return w=!0,Q.when(b)},V=function(){if(l&&m){var a=this;U.call(this).then(function(b){v=b,a.debug.log("BufferController begin "+c+" validation"),S.call(a,h),a.requestScheduler.startScheduling(a,rb),G=a.fragmentController.attachBufferController(a)})}},W=function(){var a;this.requestScheduler.isScheduled(this)||(q===!1&&(a=new Date,T(a,MediaPlayer.vo.metrics.PlayList.Trace.USER_REQUEST_STOP_REASON),O=this.metricsModel.addPlayList(c,a,0,MediaPlayer.vo.metrics.PlayList.INITIAL_PLAY_START_REASON)),this.debug.log("BufferController "+c+" start."),m=!0,n=!0,V.call(this))},X=function(a){var b;this.debug.log("BufferController "+c+" seek: "+a),q=!0,r=a,b=new Date,T(b,MediaPlayer.vo.metrics.PlayList.Trace.USER_REQUEST_STOP_REASON),O=this.metricsModel.addPlayList(c,b,r,MediaPlayer.vo.metrics.PlayList.SEEK_START_REASON),W.call(this)},Y=function(){k!==g&&(this.debug.log("BufferController "+c+" stop."),S.call(this,g),this.requestScheduler.stopScheduling(this),this.fragmentController.cancelPendingRequestsForModel(G),m=!1,n=!1,T(new Date,MediaPlayer.vo.metrics.PlayList.Trace.USER_REQUEST_STOP_REASON))},Z=function(a,b){var c=null;return b&&b.Representation_asArray&&b.Representation_asArray.length>0&&(c=b.Representation_asArray[a]),c},$=function(){var a=this;k===j&&(u&&(u=!1,this.videoModel.stallStream(c,u)),S.call(a,h))},_=function(a){if(this.fragmentController.isInitializationRequest(a))S.call(this,h);else{S.call(this,j);var b=this,c=b.fragmentController.getLoadingTime(b);setTimeout(function(){(M||N)&&(S.call(b,h),qb.call(b))},c)}},ab=function(a,b){this.fragmentController.isInitializationRequest(a)?hb.call(this,a,b):bb.call(this,a,b)},bb=function(a,b){var d=this;d.debug.log(c+" Bytes finished loading: "+a.url),K||isNaN(a.duration)||(K=a.duration),d.fragmentController.process(b.data).then(function(b){null!==b&&null!==z?Q.when(z.promise).then(function(){cb.call(d,b,a.quality).then(function(){A.promise.then(function(b){b.index-1!==a.index||x||(x=!0,u&&(u=!1,d.videoModel.stallStream(c,u)),S.call(d,h),d.system.notify("bufferingCompleted"))})})}):d.debug.log("No "+c+" bytes to push.")})},cb=function(a,b){var d=this,e=a==J,h=e?B:Q.defer(),i=e?y.length:y.push(h),j=Z(t,d.getData()),l=d.videoModel.getCurrentTime(),m=new Date;return d.debug.log("Push ("+c+") bytes: "+a.byteLength),R===!0&&k!==g&&-1!==t&&(R=!1,P=d.metricsModel.appendPlayListTrace(O,j.id,null,m,l,null,1,null)),Q.when(e||2>i||y[i-2].promise).then(function(){N&&fb.call(d).then(function(){return b!==t?(h.resolve(),e&&(B=null,J=null),void 0):(Q.when(C?C.promise:!0).then(function(){d.sourceBufferExt.append(N,a,d.videoModel).then(function(){e&&(B=null,J=null),d.requestScheduler.isScheduled(d)||W.call(d),I=!1,db.call(d).then(function(){h.resolve()}),N&&d.sourceBufferExt.getAllRanges(N).then(function(a){if(a&&(d.debug.log("Append "+c+" complete: "+a.length),a.length>0)){var b,e;for(d.debug.log("Number of buffered "+c+" ranges: "+a.length),b=0,e=a.length;e>b;b+=1)d.debug.log("Buffered "+c+" Range: "+a.start(b)+" - "+a.end(b))}})},function(b){b.err.code===f&&(J=a,B=h,I=!0,F=0,Y.call(d))})}),void 0)})}),h.promise},db=function(){if(!M&&!N)return Q.when(!1);var a=this,b=Q.defer(),d=ob.call(a);return a.sourceBufferExt.getBufferLength(N,d).then(function(d){H=d,a.metricsModel.addBufferLevel(c,new Date,H),eb.call(a),b.resolve()}),b.promise},eb=function(){var a=this.bufferExt.getLeastBufferLevel(),b=2*K,c=H-a;c>b&&!C?(F=0,C=Q.defer()):b>c&&C&&(C.resolve(),C=null)},fb=function(){var a,b=this,c=Q.defer(),d=0;return I?(a=function(){gb.call(b).then(function(b){d+=b,d>=K?c.resolve():setTimeout(a,1e3*K)})},a.call(b),c.promise):Q.when(!0)},gb=function(){var a,c,d=this,e=Q.defer(),f=d.videoModel.getCurrentTime(),g=0;return c=d.fragmentController.getExecutedRequestForTime(G,f),a=c&&!isNaN(c.startTime)?c.startTime:Math.floor(f),K=c&&!isNaN(c.duration)?c.duration:1,d.sourceBufferExt.getBufferRange(N,f).then(function(c){null===c&&r===f&&N.buffered.length>0&&(a=N.buffered.end(N.buffered.length-1)),g=N.buffered.start(0),d.sourceBufferExt.remove(N,g,a,E,b).then(function(){d.fragmentController.removeExecutedRequestsBeforeTime(G,a),e.resolve(a-g)})}),e.promise},hb=function(a,b){var d=this,e=b.data,f=a.quality;d.debug.log(c+" Initialization finished loading: "+a.url),d.fragmentController.process(e).then(function(b){null!==b?(p[f]=b,f===t&&cb.call(d,b,a.quality).then(function(){z.resolve()})):d.debug.log("No "+c+" bytes to push.")})},ib=function(){var a=this,b=a.manifestModel.getValue(),c=a.manifestExt.getIsLive(b);k===j&&S.call(a,h),c||a.system.notify("segmentLoadingFailed")},jb=function(a){this.debug.log(c+" Stream is complete."),T(new Date,MediaPlayer.vo.metrics.PlayList.Trace.END_OF_CONTENT_STOP_REASON),Y.call(this),A.resolve(a)},kb=function(a,b){var d,e=null,f=this.bufferExt.getTopQualityIndex(c),g=[];if(o&&(this.debug.log("Marking a special seek for initial "+c+" playback."),q||(q=!0,r=0),o=!1),s){for(z=Q.defer(),p=[],d=0;f>=d;d+=1)g.push(this.indexHandler.getInitRequest(d,M));t=b,e=Q.all(g)}else e=Q.when(null),a&&(z=Q.defer(),t=b,p[b]&&cb.call(this,p[b],b).then(function(){z.resolve()}));return e},lb=function(b){var d,e=this;if(s&&!q)e.debug.log("Data changed - loading the "+c+" fragment for time: "+a),d=e.indexHandler.getSegmentRequestForTime(a,b,M);else{var f=Q.defer(),g=e.videoModel.getCurrentTime();d=f.promise,e.sourceBufferExt.getBufferRange(N,g).then(function(a){q=!1,null!==a&&(g=a.end),e.debug.log("Loading the "+c+" fragment for time: "+g),e.indexHandler.getSegmentRequestForTime(g,b,M).then(function(a){f.resolve(a)},function(){f.reject()})},function(){f.reject()})}return s=!1,d},mb=function(a){var b=this;null!==a?b.fragmentController.isFragmentLoadedOrPending(b,a)?"complete"!==a.action?b.indexHandler.getNextSegmentRequest(t,M).then(mb.bind(b)):(Y.call(b),S.call(b,h)):(b.debug.log("Loading an "+c+" fragment: "+a.url),Q.when(C?C.promise:!0).then(function(){b.fragmentController.prepareFragmentForLoading(b,a,_,ab,ib,jb).then(function(){S.call(b,h)})})):S.call(b,h)},nb=function(){n&&(d>H&&d0?(F--,lb.call(a,t).then(mb.bind(a))):(k===i&&S.call(a,h),$.call(a))},rb=function(){var a,b=this,d=!1,f=null,g=new Date,l=b.videoModel.getCurrentTime(),m=ob.call(b);if(b.debug.log("BufferController.validate() "+c+" | state: "+k),b.debug.log(c+" Playback rate: "+b.videoModel.getElement().playbackRate),b.debug.log(c+" Working time: "+m),b.debug.log(c+" Video time: "+l),b.debug.log("Current "+c+" buffer length: "+H),nb.call(b),k===j&&e>H)u||(b.debug.log("Stalling "+c+" Buffer: "+c),T(new Date,MediaPlayer.vo.metrics.PlayList.Trace.REBUFFERING_REASON),u=!0,n=!0,b.videoModel.stallStream(c,u));else if(k===h){S.call(b,i);var o=b.manifestModel.getValue().minBufferTime;b.bufferExt.decideBufferLength(o,E,n).then(function(a){b.debug.log("Buffer time: "+a),b.setMinBufferTime(a),b.requestScheduler.adjustExecuteInterval()}),b.abrController.getPlaybackQuality(c,M).then(function(e){var h=e.quality;if(b.debug.log(c+" Playback quality: "+h),b.debug.log("Populate "+c+" buffers."),void 0!==h&&(a=h),d=h!==t,d===!0){if(b.fragmentController.abortRequestsForModel(G),f=Z(a,b.getData()),null===f||void 0===f)throw"Unexpected error!";b.manifestExt.getTimestampOffsetForPeriod(D,b.manifestModel.getValue(),h,M).then(function(a){N.timestampOffset!==a&&(N.timestampOffset=a)}),T(new Date,MediaPlayer.vo.metrics.PlayList.Trace.REPRESENTATION_SWITCH_STOP_REASON),b.metricsModel.addRepresentationSwitch(c,g,l,f.id)}return b.debug.log(d?c+" Quality changed to: "+h:"Quality didn't change."),pb.call(b,h)}).then(function(e){F=e,kb.call(b,d,a).then(function(a){if(null!==a){var d,e,f=a.length;for(e=0;f>e;e+=1)d=a[e],b.debug.log("Loading "+c+" initialization: "+d.url),b.debug.log(d),b.fragmentController.prepareFragmentForLoading(b,d,_,ab,ib,jb).then(function(){S.call(b,h)})}}),qb.call(b)})}else k===i&&S.call(b,h)};return{videoModel:void 0,metricsModel:void 0,manifestExt:void 0,manifestModel:void 0,bufferExt:void 0,sourceBufferExt:void 0,abrController:void 0,fragmentExt:void 0,indexHandler:void 0,debug:void 0,system:void 0,errHandler:void 0,initialize:function(a,b,c,d,e,f,g,h){var i=this,j=i.manifestModel.getValue(),k=i.manifestExt.getIsLive(j);i.setMediaSource(h),i.setVideoModel(e),i.setType(a),i.setPeriodIndex(b),i.setData(c).then(function(){l=!0,V.call(i)}),i.setBuffer(d),i.setScheduler(f),i.setFragmentController(g),i.indexHandler.setIsLive(k),i.manifestExt.getDurationForPeriod(b,i.manifestModel.getValue()).then(function(a){E=a,i.indexHandler.setDuration(a),i.bufferExt.decideBufferLength(j.minBufferTime,E,n).then(function(a){i.setMinBufferTime(a)})})},getType:function(){return c},setType:function(a){c=a,void 0!==this.indexHandler&&this.indexHandler.setType(a)},getPeriodIndex:function(){return D},setPeriodIndex:function(a){D=a},getVideoModel:function(){return this.videoModel},setVideoModel:function(a){this.videoModel=a},getScheduler:function(){return this.requestScheduler},setScheduler:function(a){this.requestScheduler=a},getFragmentController:function(){return this.fragmentController},setFragmentController:function(a){this.fragmentController=a},getAutoSwitchBitrate:function(){var a=this;return a.abrController.getAutoSwitchBitrate()},setAutoSwitchBitrate:function(a){var b=this;b.abrController.setAutoSwitchBitrate(a)},getData:function(){return M},setData:function(b){var d=this,e=Q.defer(),f=M;return f||(f=b),d.abrController.getPlaybackQuality(c,f).then(function(g){d.indexHandler.getCurrentTime(g.quality,f).then(function(f){s=!0,a=f,M=b,d.seek(f),d.bufferExt.updateData(M,c),e.resolve()})}),e.promise},getBuffer:function(){return N},setBuffer:function(a){N=a},getMinBufferTime:function(){return d},setMinBufferTime:function(a){d=a},setMediaSource:function(a){b=a},isReady:function(){return k===h},isBufferingCompleted:function(){return x},clearMetrics:function(){var a=this;null!==c&&""!==c&&a.metricsModel.clearCurrentMetricsForType(c)},updateBufferState:function(){var a=this;I&&J&&!L?(L=!0,cb.call(a,J,t).then(function(){L=!1})):db.call(a)},reset:function(a){var c=this;Y.call(c),c.clearMetrics(),c.fragmentController.abortRequestsForModel(G),c.fragmentController.detachBufferController(G),G=null,y=[],z=null,p=[],A=Q.defer(),a||(c.sourceBufferExt.abort(b,N),c.sourceBufferExt.removeSourceBuffer(b,N)),M=null,N=null},start:W,seek:X,stop:Y}},MediaPlayer.dependencies.BufferController.prototype={constructor:MediaPlayer.dependencies.BufferController},MediaPlayer.dependencies.BufferExtensions=function(){"use strict";var a,b,c=0,d=0,e=null,f=null,g=function(a){var b=this.metricsExt.getCurrentHttpRequest(a);return null!==b?(b.tresponse.getTime()-b.trequest.getTime())/1e3:0},h=function(){var a,b=this,g=Q.defer();return Q.when(e?b.abrController.getPlaybackQuality("audio",e):c).then(function(e){Q.when(f?b.abrController.getPlaybackQuality("video",f):d).then(function(b){a=e.quality===c&&b.quality===d,a=a||e.confidence===MediaPlayer.rules.SwitchRequest.prototype.STRONG&&b.confidence===MediaPlayer.rules.SwitchRequest.prototype.STRONG,g.resolve(a)})}),g.promise};return{system:void 0,videoModel:void 0,manifestExt:void 0,metricsExt:void 0,metricsModel:void 0,abrController:void 0,bufferMax:void 0,updateData:function(a,b){var g=a.Representation_asArray.length-1;"audio"===b?(c=g,e=a):"video"===b&&(d=g,f=a)},getTopQualityIndex:function(a){var b=null;return"audio"===a?b=c:"video"===a&&(b=d),b},decideBufferLength:function(b,c){return a=MediaPlayer.dependencies.BufferExtensions.DEFAULT_MIN_BUFFER_TIMEb?Math.max(MediaPlayer.dependencies.BufferExtensions.DEFAULT_MIN_BUFFER_TIME,b):b>=c?Math.min(c,MediaPlayer.dependencies.BufferExtensions.DEFAULT_MIN_BUFFER_TIME):Math.min(c,b),Q.when(a)},getLeastBufferLevel:function(){var a=this.metricsModel.getReadOnlyMetricsFor("video"),b=this.metricsExt.getCurrentBufferLevel(a),c=this.metricsModel.getReadOnlyMetricsFor("audio"),d=this.metricsExt.getCurrentBufferLevel(c),e=null;return e=null===b||null===d?null!==d?d.level:null!==b?b.level:null:Math.min(d.level,b.level)},getRequiredBufferLength:function(c,d,e,f){var i,j=this,k=j.metricsModel.getReadOnlyMetricsFor("video"),l=j.metricsModel.getReadOnlyMetricsFor("audio"),m=f>=MediaPlayer.dependencies.BufferExtensions.LONG_FORM_CONTENT_DURATION_THRESHOLD,n=Q.defer(),o=null;return j.bufferMax===MediaPlayer.dependencies.BufferExtensions.BUFFER_SIZE_MIN?(i=a,n.resolve(i)):j.bufferMax===MediaPlayer.dependencies.BufferExtensions.BUFFER_SIZE_INFINITY?(i=f,n.resolve(i)):j.bufferMax===MediaPlayer.dependencies.BufferExtensions.BUFFER_SIZE_REQUIRED?(b=a,e||c||(o=h.call(j)),Q.when(o).then(function(a){a&&(b=m?MediaPlayer.dependencies.BufferExtensions.BUFFER_TIME_AT_TOP_QUALITY_LONG_FORM:MediaPlayer.dependencies.BufferExtensions.BUFFER_TIME_AT_TOP_QUALITY),i=b+d+Math.max(g.call(j,k),g.call(j,l)),n.resolve(i)})):n.reject("invalid bufferMax value: "+j.bufferMax),n.promise},getBufferTarget:function(){return void 0===b?a:b}}},MediaPlayer.dependencies.BufferExtensions.BUFFER_SIZE_REQUIRED="required",MediaPlayer.dependencies.BufferExtensions.BUFFER_SIZE_MIN="min",MediaPlayer.dependencies.BufferExtensions.BUFFER_SIZE_INFINITY="infinity",MediaPlayer.dependencies.BufferExtensions.BUFFER_TIME_AT_STARTUP=1,MediaPlayer.dependencies.BufferExtensions.DEFAULT_MIN_BUFFER_TIME=8,MediaPlayer.dependencies.BufferExtensions.BUFFER_TIME_AT_TOP_QUALITY=30,MediaPlayer.dependencies.BufferExtensions.BUFFER_TIME_AT_TOP_QUALITY_LONG_FORM=300,MediaPlayer.dependencies.BufferExtensions.LONG_FORM_CONTENT_DURATION_THRESHOLD=600,MediaPlayer.dependencies.BufferExtensions.prototype.constructor=MediaPlayer.dependencies.BufferExtensions,MediaPlayer.utils.Capabilities=function(){"use strict"},MediaPlayer.utils.Capabilities.prototype={constructor:MediaPlayer.utils.Capabilities,supportsMediaSource:function(){"use strict";var a="WebKitMediaSource"in window,b="MediaSource"in window;return a||b},supportsMediaKeys:function(){"use strict";var a="WebKitMediaKeys"in window,b="MSMediaKeys"in window,c="MediaKeys"in window;return a||b||c},supportsCodec:function(a,b){"use strict";if(!(a instanceof HTMLVideoElement))throw"element must be of type HTMLVideoElement.";var c=a.canPlayType(b);return"probably"===c}},MediaPlayer.utils.Debug=function(){"use strict";var a=!0;return{eventBus:void 0,setLogToBrowserConsole:function(b){a=b},getLogToBrowserConsole:function(){return a},log:function(b){a&&console.log(b),this.eventBus.dispatchEvent({type:"log",message:b})}}},MediaPlayer.dependencies.ErrorHandler=function(){"use strict";return{eventBus:void 0,capabilityError:function(a){this.eventBus.dispatchEvent({type:"error",error:"capability",event:a})},downloadError:function(a,b,c){this.eventBus.dispatchEvent({type:"error",error:"download",event:{id:a,url:b,request:c}})},manifestError:function(a,b,c){this.eventBus.dispatchEvent({type:"error",error:"manifestError",event:{message:a,id:b,manifest:c}})},mediaSourceError:function(a){this.eventBus.dispatchEvent({type:"error",error:"mediasource",event:a})},mediaKeySessionError:function(a){this.eventBus.dispatchEvent({type:"error",error:"key_session",event:a})},mediaKeyMessageError:function(a){this.eventBus.dispatchEvent({type:"error",error:"key_message",event:a})},mediaKeySystemSelectionError:function(a){this.eventBus.dispatchEvent({type:"error",error:"key_system_selection",event:a})}}},MediaPlayer.dependencies.ErrorHandler.prototype={constructor:MediaPlayer.dependencies.ErrorHandler},MediaPlayer.utils.EventBus=function(){"use strict";var a,b=function(b,c){var d=(c?"1":"0")+b;return d in a||(a[d]=[]),a[d]},c=function(){a={}};return c(),{addEventListener:function(a,c,d){var e=b(a,d),f=e.indexOf(c);-1===f&&e.push(c)},removeEventListener:function(a,c,d){var e=b(a,d),f=e.indexOf(c);-1!==f&&e.splice(f,1)},dispatchEvent:function(a){for(var c=b(a.type,!1).slice(),d=0;dd;d++)if(a[d].getContext()==b)return a[d];return null},c=function(){for(var b=!0,c=a.length,d=0;c>d;d++)if(!a[d].isReady()){b=!1;break}return b},d=function(){for(var b=0;b0&&(b=new Uint8Array(a)),Q.when(b)},attachBufferController:function(c){if(!c)return null;var d=b(c);return d||(d=this.system.getObject("fragmentModel"),d.setContext(c),a.push(d)),d},detachBufferController:function(b){var c=a.indexOf(b);c>-1&&a.splice(c,1)},onBufferControllerStateChange:function(){c()&&d.call(this)},isFragmentLoadedOrPending:function(a,c){var d,e=b(a);return e?d=e.isFragmentLoadedOrPending(c):!1},getPendingRequests:function(a){var c=b(a);return c?c.getPendingRequests():null},getLoadingRequests:function(a){var c=b(a);return c?c.getLoadingRequests():null},isInitializationRequest:function(a){return a&&a.type&&"initialization segment"===a.type.toLowerCase()},getLoadingTime:function(a){var c=b(a);return c?c.getLoadingTime():null},getExecutedRequestForTime:function(a,b){return a?a.getExecutedRequestForTime(b):null},removeExecutedRequest:function(a,b){a&&a.removeExecutedRequest(b)},removeExecutedRequestsBeforeTime:function(a,b){a&&a.removeExecutedRequestsBeforeTime(b)},cancelPendingRequestsForModel:function(a){a&&a.cancelPendingRequests()},abortRequestsForModel:function(a){a&&a.abortRequests()},prepareFragmentForLoading:function(a,c,d,e,f,g){var h=b(a);return h&&c&&!this.isFragmentLoadedOrPending(a,c)?(h.addRequest(c),h.setCallbacks(d,e,f,g),Q.when(!0)):Q.when(null)}}},MediaPlayer.dependencies.FragmentController.prototype={constructor:MediaPlayer.dependencies.FragmentController},MediaPlayer.dependencies.FragmentLoader=function(){"use strict";var a=3,b=500,c=[],d=function(a,e){var f=new XMLHttpRequest,g=null,h=!0,i=!0,j=this;c.push(f),a.requestStartDate=new Date,a.firstByteDate=a.requestStartDate,f.open("GET",a.url,!0),f.responseType="arraybuffer",a.range&&f.setRequestHeader("Range","bytes="+a.range),f.onprogress=function(b){h&&(h=!1,(!b.lengthComputable||b.lengthComputable&&b.total!=b.loaded)&&(a.firstByteDate=new Date))},f.onload=function(){if(!(f.status<200||f.status>299)){i=!1,a.requestEndDate=new Date;var b=a.requestEndDate,c=f.response,d=a.firstByteDate.getTime()-a.requestStartDate.getTime(),e=a.requestEndDate.getTime()-a.firstByteDate.getTime(),h=a.requestEndDate.getTime()-a.requestStartDate.getTime();j.debug.log("segment loaded: ("+f.status+", "+d+"ms, "+e+"ms, "+h+"ms) "+a.url),g=j.metricsModel.addHttpRequest(a.streamType,null,a.type,a.url,null,a.range,a.requestStartDate,a.firstByteDate,a.requestEndDate,f.status,null,a.duration),j.metricsModel.appendHttpTrace(g,b,(new Date).getTime()-b.getTime(),[c.byteLength]),a.deferred.resolve({data:c,request:a})}},f.onloadend=f.onerror=function(){if(-1!==c.indexOf(f)&&(c.splice(c.indexOf(f),1),i)){i=!1,a.requestEndDate=new Date;var h=a.firstByteDate.getTime()-a.requestStartDate.getTime(),k=a.requestEndDate.getTime()-a.firstByteDate.getTime(),l=a.requestEndDate.getTime()-a.requestStartDate.getTime();j.debug.log("segment loaded: ("+f.status+", "+h+"ms, "+k+"ms, "+l+"ms) "+a.url),g=j.metricsModel.addHttpRequest(a.streamType,null,a.type,a.url,null,a.range,a.requestStartDate,a.firstByteDate,a.requestEndDate,f.status,null,a.duration),e>0?(j.debug.log("Failed loading segment: "+a.url+", retry in "+b+"ms"+" attempts: "+e),e--,setTimeout(function(){d.call(j,a,e)},b)):(j.debug.log("Failed loading segment: "+a.url+" no retry attempts left"),j.errHandler.downloadError("content",a.url,f),a.deferred.reject(f))}},f.send()};return{metricsModel:void 0,errHandler:void 0,debug:void 0,load:function(b){return b?(b.deferred=Q.defer(),d.call(this,b,a),b.deferred.promise):Q.when(null)},abort:function(){var a,b,d=c.length;for(a=0;d>a;a+=1)b=c[a],c[a]=null,b.abort(),b=null;c=[]}}},MediaPlayer.dependencies.FragmentLoader.prototype={constructor:MediaPlayer.dependencies.FragmentLoader},MediaPlayer.dependencies.FragmentModel=function(){"use strict";var a,b,c,d,e,f=[],g=[],h=[],i=5,j=function(e){var g,i=this;b.call(a,e),g=function(b,d){h.splice(h.indexOf(b),1),f.push(b),c.call(a,b,d),b.deferred=null},i.fragmentLoader.load(e).then(g.bind(a,e),d.bind(a,e))},k=function(a,b){var c=function(a,c){return a[b]c[b]?1:0};a.sort(c)},l=function(a,b){var c,d,e=a.length-1;for(d=e;d>=0;d-=1)if(c=a[d],c.url===b.url&&c.startTime===b.startTime)return!0;return!1},m=function(a){var b=f.indexOf(a);-1!==b&&f.splice(b,1)};return{system:void 0,debug:void 0,fragmentLoader:void 0,setContext:function(b){a=b},getContext:function(){return a},addRequest:function(a){a&&(g.push(a),k.call(this,g,"index"))},setCallbacks:function(a,f,g,h){b=a,e=h,d=g,c=f},isFragmentLoadedOrPending:function(a){for(var b,c=this,d=!1,e=f.length-1,i=e;i>=0;i-=1)if(b=f[i],a.startTime===b.startTime||"complete"===b.action&&a.action===b.action){if(c.debug.log(a.streamType+" Fragment already loaded for time: "+a.startTime),a.url===b.url){c.debug.log(a.streamType+" Fragment url already loaded: "+a.url),d=!0;break}m(a)}return d||(d=l.call(c,g,a)||l.call(c,h,a)),d},isReady:function(){return a.isReady()},getPendingRequests:function(){return g},getLoadingRequests:function(){return h},getLoadingTime:function(){var a,b,c=0;for(b=f.length-1;b>=0;b-=1)if(a=f[b],a.requestEndDate instanceof Date&&a.firstByteDate instanceof Date){c=a.requestEndDate.getTime()-a.firstByteDate.getTime();break}return c},getExecutedRequestForTime:function(a){var b,c=f.length-1,d=0/0,e=0/0,g=null;for(b=c;b>=0;b-=1)if(g=f[b],d=g.startTime,e=d+g.duration,!isNaN(d)&&!isNaN(e)&&a>d&&e>a)return g;return null},removeExecutedRequest:function(a){m.call(this,a)},removeExecutedRequestsBeforeTime:function(a){var b,c=f.length-1,d=0/0,e=null;for(b=c;b>=0;b-=1)e=f[b],d=e.startTime,!isNaN(d)&&a>d&&m.call(this,e)},cancelPendingRequests:function(){g=[]},abortRequests:function(){this.fragmentLoader.abort(),h=[]},executeCurrentRequest:function(){var b,c=this;if(0!==g.length&&!(h.length>=i))switch(b=g.shift(),b.action){case"complete":f.push(b),e.call(a,b);break;case"download":h.push(b),j.call(c,b);break;default:this.debug.log("Unknown request action.")}}}},MediaPlayer.dependencies.FragmentModel.prototype={constructor:MediaPlayer.dependencies.FragmentModel},MediaPlayer.dependencies.ManifestLoader=function(){"use strict";var a=3,b=500,c=null,d=function(a){var b=null;return-1!==a.indexOf("/")&&(b=a.substring(0,a.lastIndexOf("/")+1)),b},e=function(a,f){var g=d(a),h=new XMLHttpRequest,i=new Date,j=!0,k=this;this.debug.log("Start loading manifest: "+a),h.open("GET",a,!0),h.onload=function(){h.status<200||h.status>299||(j=!1,k.metricsModel.addHttpRequest("stream",null,"MPD",a,null,null,i,new Date,h.status,null,null),k.parser.parse(h.responseText,g).then(function(b){b.mpdUrl=a,c.resolve(b)},function(){c.reject(h)}))},h.onloadend=h.onerror=function(){j&&(j=!1,k.metricsModel.addHttpRequest("stream",null,"MPD",a,null,null,i,new Date,h.status,null,null),f>0?(k.debug.log("Failed loading manifest: "+a+", retry in "+b+"ms"+" attempts: "+f),f--,setTimeout(function(){e.call(k,a,f)},b)):(k.debug.log("Failed loading manifest: "+a+" no retry attempts left"),k.errHandler.downloadError("manifest",a,h),c.reject(h)))},h.send()};return{debug:void 0,parser:void 0,errHandler:void 0,metricsModel:void 0,load:function(b){return c=Q.defer(),e.call(this,b,a),c.promise}}},MediaPlayer.dependencies.ManifestLoader.prototype={constructor:MediaPlayer.dependencies.ManifestLoader},MediaPlayer.models.ManifestModel=function(){"use strict";var a;return{getValue:function(){return a},setValue:function(b){a=b}}},MediaPlayer.models.ManifestModel.prototype={constructor:MediaPlayer.models.ManifestModel},MediaPlayer.dependencies.ManifestUpdater=function(){"use strict";var a=0/0,b=null,c=null,d=function(){null!==b&&(clearInterval(b),b=null)},e=function(){d.call(this),isNaN(a)||(this.debug.log("Refresh manifest in "+a+" seconds."),b=setInterval(c.bind(this),1e3*a,this))},f=function(){var b=this,c=b.manifestModel.getValue();void 0!==c&&null!==c&&b.manifestExt.getRefreshDelay(c).then(function(c){a=c,e.call(b)})};return c=function(){var a=this,b=a.manifestModel.getValue(),c=b.mpdUrl;b.hasOwnProperty("Location")&&(c=b.Location),a.debug.log("Refresh manifest @ "+c),a.manifestLoader.load(c).then(function(b){a.manifestModel.setValue(b),a.debug.log("Manifest has been refreshed."),a.debug.log(b),f.call(a),a.system.notify("manifestUpdated")})},{debug:void 0,system:void 0,manifestModel:void 0,manifestExt:void 0,manifestLoader:void 0,setup:function(){f.call(this)},init:function(){f.call(this)},stop:function(){d.call(this)}}},MediaPlayer.dependencies.ManifestUpdater.prototype={constructor:MediaPlayer.dependencies.ManifestUpdater},MediaPlayer.dependencies.MediaSourceExtensions=function(){"use strict"},MediaPlayer.dependencies.MediaSourceExtensions.prototype={constructor:MediaPlayer.dependencies.MediaSourceExtensions,createMediaSource:function(){"use strict";var a="WebKitMediaSource"in window,b="MediaSource"in window;return b?Q.when(new MediaSource):a?Q.when(new WebKitMediaSource):null},attachMediaSource:function(a,b){"use strict";return b.setSource(window.URL.createObjectURL(a)),Q.when(!0)},detachMediaSource:function(a){"use strict";return a.setSource(""),Q.when(!0)},setDuration:function(a,b){"use strict";return a.duration=b,Q.when(a.duration)},signalEndOfStream:function(a){"use strict";return a.endOfStream(),Q.when(!0)}},MediaPlayer.models.MetricsModel=function(){"use strict";return{system:void 0,streamMetrics:{},clearCurrentMetricsForType:function(a){delete this.streamMetrics[a]},clearAllCurrentMetrics:function(){this.streamMetrics={}},getReadOnlyMetricsFor:function(a){return this.streamMetrics.hasOwnProperty(a)?this.streamMetrics[a]:null},getMetricsFor:function(a){var b;return this.streamMetrics.hasOwnProperty(a)?b=this.streamMetrics[a]:(b=this.system.getObject("metrics"),this.streamMetrics[a]=b),b},addTcpConnection:function(a,b,c,d,e,f){var g=new MediaPlayer.vo.metrics.TCPConnection;return g.tcpid=b,g.dest=c,g.topen=d,g.tclose=e,g.tconnect=f,this.getMetricsFor(a).TcpList.push(g),g},addHttpRequest:function(a,b,c,d,e,f,g,h,i,j,k,l){var m=new MediaPlayer.vo.metrics.HTTPRequest;return m.tcpid=b,m.type=c,m.url=d,m.actualurl=e,m.range=f,m.trequest=g,m.tresponse=h,m.tfinish=i,m.responsecode=j,m.interval=k,m.mediaduration=l,this.getMetricsFor(a).HttpList.push(m),m},appendHttpTrace:function(a,b,c,d){var e=new MediaPlayer.vo.metrics.HTTPRequest.Trace;return e.s=b,e.d=c,e.b=d,a.trace.push(e),e},addRepresentationSwitch:function(a,b,c,d,e){var f=new MediaPlayer.vo.metrics.RepresentationSwitch;return f.t=b,f.mt=c,f.to=d,f.lto=e,this.getMetricsFor(a).RepSwitchList.push(f),f},addBufferLevel:function(a,b,c){var d=new MediaPlayer.vo.metrics.BufferLevel;return d.t=b,d.level=c,this.getMetricsFor(a).BufferLevel.push(d),d},addPlayList:function(a,b,c,d){var e=new MediaPlayer.vo.metrics.PlayList;return e.start=b,e.mstart=c,e.starttype=d,this.getMetricsFor(a).PlayList.push(e),e},appendPlayListTrace:function(a,b,c,d,e,f,g,h){var i=new MediaPlayer.vo.metrics.PlayList.Trace;return i.representationid=b,i.subreplevel=c,i.start=d,i.mstart=e,i.duration=f,i.playbackspeed=g,i.stopreason=h,a.trace.push(i),i}}},MediaPlayer.models.MetricsModel.prototype={constructor:MediaPlayer.models.MetricsModel},MediaPlayer.dependencies.ProtectionController=function(){"use strict";var a=null,b=null,c=function(a){var b=this;b.protectionModel.removeKeySystem(a)},d=function(a,c){for(var d=this,e=0;ee;e+=1)if(g=f.start(e),h=f.end(e),null===i){if(k=Math.abs(g-b),b>=g&&h>b){i=g,j=h;continue}if(l>=k){i=g,j=h;continue}}else{if(k=g-j,!(l>=k))break;j=h}if(null!==i)return Q.when({start:i,end:j})}return Q.when(null)},getAllRanges:function(a){var b=null;try{return b=a.buffered,Q.when(b)}catch(c){return Q.when(null)}},getBufferLength:function(a,b,c){"use strict";var d=this,e=Q.defer();return d.getBufferRange(a,b,c).then(function(a){null===a?e.resolve(0):e.resolve(a.end-b)}),e.promise},waitForUpdateEnd:function(a){"use strict";var b,c=Q.defer(),d=50,e=function(){a.updating||(clearInterval(b),c.resolve(!0))},f=function(){a.removeEventListener("updateend",f,!1),c.resolve(!0)};if(a.hasOwnProperty("addEventListener"))try{a.addEventListener("updateend",f,!1)}catch(g){b=setInterval(e,d)}else b=setInterval(e,d);return c.promise},append:function(a,b){var c=Q.defer();try{"append"in a?a.append(b):"appendBuffer"in a&&a.appendBuffer(b),this.waitForUpdateEnd(a).then(function(){c.resolve()})}catch(d){c.reject({err:d,data:b})}return c.promise},remove:function(a,b,c,d,e){var f=Q.defer();try{b>=0&&d>b&&c>b&&"ended"!==e.readyState&&a.remove(b,c),this.waitForUpdateEnd(a).then(function(){f.resolve()})}catch(g){f.reject(g)}return f.promise},abort:function(a,b){"use strict";var c=Q.defer();try{"open"===a.readyState&&b.abort(),c.resolve()}catch(d){c.reject(d.description)}return c.promise}},MediaPlayer.dependencies.Stream=function(){"use strict";var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q=null,r=null,s=null,t=null,u=-1,v=null,w=-1,x=null,y=-1,z=!0,A=!1,B=!1,C=null,D=[],E=-1,F=null,G=function(){this.debug.log("Attempting play..."),A&&(this.debug.log("Do play."),this.videoModel.play())},H=function(){this.debug.log("Do pause."),this.videoModel.pause()},I=function(a){this.debug.log("Attempting seek..."),A&&(this.debug.log("Do seek: "+a),this.system.notify("setCurrentTime"),this.videoModel.setCurrentTime(a),t&&t.seek(a),v&&v.seek(a))},J=function(a){var b,c=this;if(b="msneedkey"!==a.type?a.type:q,D.push({type:b,initData:a.initData}),this.debug.log("DRM: Key required for - "+b),s&&q&&!C)try{C=c.protectionController.selectKeySystem(q,s)}catch(d){H.call(c),c.debug.log(d),c.errHandler.mediaKeySystemSelectionError(d)}C&&c.protectionController.ensureKeySession(C,b,a.initData)},K=function(a){var b=this,c=null,d=null,e=null,f=null;this.debug.log("DRM: Got a key message..."),c=a.target,d=new Uint16Array(a.message.buffer),e=String.fromCharCode.apply(null,d),f=a.destinationURL,b.protectionController.updateFromMessage(C,c,e,f).fail(function(a){H.call(b),b.debug.log(a),b.errHandler.mediaKeyMessageError(a)})},L=function(){this.debug.log("DRM: Key added.")},M=function(){var a,b=event.target;switch(a="DRM: MediaKeyError - sessionId: "+b.sessionId+" errorCode: "+b.error.code+" systemErrorCode: "+b.error.systemCode+" [",b.error.code){case 1:a+="MEDIA_KEYERR_UNKNOWN - An unspecified error occurred. This value is used for errors that don't match any of the other codes.";break;case 2:a+="MEDIA_KEYERR_CLIENT - The Key System could not be installed or updated.";break;case 3:a+="MEDIA_KEYERR_SERVICE - The message passed into update indicated an error from the license service.";break;case 4:a+="MEDIA_KEYERR_OUTPUT - There is no available output device with the required characteristics for the content protection system.";break;case 5:a+="MEDIA_KEYERR_HARDWARECHANGE - A hardware configuration change caused a content protection error.";break;case 6:a+="MEDIA_KEYERR_DOMAIN - An error occurred in a multi-device domain licensing configuration. The most common error is a failure to join the domain."}a+="]",this.debug.log(a),this.errHandler.mediaKeySessionError(a)},N=function(a){var b=Q.defer(),c=this,d=function(e){c.debug.log("MediaSource is open!"),c.debug.log(e),a.removeEventListener("sourceopen",d),a.removeEventListener("webkitsourceopen",d),b.resolve(a)};return c.debug.log("MediaSource should be closed. The actual readyState is: "+a.readyState),a.addEventListener("sourceopen",d,!1),a.addEventListener("webkitsourceopen",d,!1),c.mediaSourceExt.attachMediaSource(a,c.videoModel),c.debug.log("MediaSource attached to video. Waiting on open..."),b.promise},O=function(){var c=this;t&&t.reset(B),v&&v.reset(B),b&&c.mediaSourceExt.detachMediaSource(c.videoModel),A=!1,C=null,D=[],s=null,t=null,v=null,x=null,q=null,r=null,b=null,a=null},P=function(b,c,d,e){if(b&&c&&d)if(null===t&&null===v&&null===x){var f="No streams to play.";this.errHandler.manifestError(f,"nostreams",a),this.debug.log(f),e.reject()}else this.debug.log("MediaSource initialized!"),e.resolve(!0)},R=function(){this.debug.log("Getting MediaSource ready...");var a=Q.defer(),c=!1,d=!1,e=!1,f=this,g=f.manifestModel.getValue(),h=f.manifestExt.getIsLive(g);return f.debug.log("Gathering information for buffers. (1)"),f.manifestExt.getDuration(g,h).then(function(){f.manifestExt.getVideoData(g,E).then(function(h){return null!==h?(f.debug.log("Create video buffer."),f.manifestExt.getDataIndex(h,g,E).then(function(a){u=a,f.debug.log("Save video track: "+u)}),f.manifestExt.getCodec(h).then(function(a){return f.debug.log("Video codec: "+a),q=a,f.manifestExt.getContentProtectionData(h).then(function(c){if(f.debug.log("Video contentProtection"),c&&!f.capabilities.supportsMediaKeys())return f.errHandler.capabilityError("mediakeys"),Q.when(null);if(s=c,!f.capabilities.supportsCodec(f.videoModel.getElement(),a)){var d="Video Codec ("+a+") is not supported.";return f.errHandler.manifestError(d,"codec",g),f.debug.log(d),Q.when(null)}return f.sourceBufferExt.createSourceBuffer(b,a)})}).then(function(g){null===g?f.debug.log("No buffer was created, skipping video stream."):(t=f.system.getObject("bufferController"),t.initialize("video",E,h,g,f.videoModel,f.requestScheduler,f.fragmentController,b),f.debug.log("Video is ready!")),c=!0,P.call(f,c,d,e,a)},function(){f.errHandler.mediaSourceError("Error creating video source buffer."),c=!0,P.call(f,c,d,e,a)})):(f.debug.log("No video data."),c=!0,P.call(f,c,d,e,a)),f.manifestExt.getAudioDatas(g,E)}).then(function(h){return null!==h&&h.length>0?(f.debug.log("Have audio streams: "+h.length),f.manifestExt.getPrimaryAudioData(g,E).then(function(h){f.manifestExt.getDataIndex(h,g,E).then(function(a){w=a,f.debug.log("Save audio track: "+w)}),f.manifestExt.getCodec(h).then(function(a){return f.debug.log("Audio codec: "+a),r=a,f.manifestExt.getContentProtectionData(h).then(function(c){if(f.debug.log("Audio contentProtection"),c&&!f.capabilities.supportsMediaKeys())return f.errHandler.capabilityError("mediakeys"),Q.when(null);if(s=c,!f.capabilities.supportsCodec(f.videoModel.getElement(),a)){var d="Audio Codec ("+a+") is not supported.";return f.errHandler.manifestError(d,"codec",g),f.debug.log(d),Q.when(null)}return f.sourceBufferExt.createSourceBuffer(b,a)})}).then(function(g){null===g?f.debug.log("No buffer was created, skipping audio stream."):(v=f.system.getObject("bufferController"),v.initialize("audio",E,h,g,f.videoModel,f.requestScheduler,f.fragmentController,b),f.debug.log("Audio is ready!")),d=!0,P.call(f,c,d,e,a)},function(){f.errHandler.mediaSourceError("Error creating audio source buffer."),d=!0,P.call(f,c,d,e,a)})})):(f.debug.log("No audio streams."),d=!0,P.call(f,c,d,e,a)),f.manifestExt.getTextData(g,E)}).then(function(h){var i;null!==h?(f.manifestExt.getDataIndex(h,g,E).then(function(a){y=a,f.debug.log("Save text track: "+y)}),f.manifestExt.getMimeType(h).then(function(a){return i=a,f.sourceBufferExt.createSourceBuffer(b,i)}).then(function(b){null===b?f.debug.log("Source buffer was not created for text track"):(x=f.system.getObject("textController"),x.initialize(E,h,b,f.videoModel),b.hasOwnProperty("initialize")&&b.initialize(i,x),f.debug.log("Text is ready!"),e=!0,P.call(f,c,d,e,a))},function(b){f.debug.log("Error creating text source buffer:"),f.debug.log(b),f.errHandler.mediaSourceError("Error creating text source buffer."),e=!0,P.call(f,c,d,e,a)})):(f.debug.log("No text tracks."),e=!0,P.call(f,c,d,e,a))})}),a.promise},S=function(){var a=this,c=Q.defer(),d=a.manifestModel.getValue(),e=a.manifestExt.getIsLive(d);return a.debug.log("Getting ready for playback..."),a.manifestExt.getDurationForPeriod(E,a.manifestModel.getValue(),e).then(function(a){l=a}),a.manifestExt.getDuration(a.manifestModel.getValue(),e).then(function(c){return a.debug.log("Setting duration: "+c),a.mediaSourceExt.setDuration(b,c)}).then(function(){return a.debug.log("Duration successfully set."),a.manifestExt.getPeriodStart(a.manifestModel.getValue(),E)}).then(function(a){F=a,A=!0,c.resolve(!0)}),c.promise},T=function(){var a=this;a.debug.log("Got loadmetadata event."),c.resolve(null)},U=function(){this.debug.log("Got play event."),A&&(null!==F?(this.debug.log("Starting segment loading at offset: "+F),t&&t.seek(F),v&&v.seek(F),x&&x.seek(F)):(t&&t.start(),v&&v.start(),x&&x.start()))},V=function(){this.debug.log("Got pause event."),this.scheduleWhilePaused||ab.call(this)},W=function(a){var b=a.srcElement.error,c=b.code,d="";if(-1!==c){switch(c){case 1:d="MEDIA_ERR_ABORTED";break;case 2:d="MEDIA_ERR_NETWORK";break;case 3:d="MEDIA_ERR_DECODE";break;case 4:d="MEDIA_ERR_SRC_NOT_SUPPORTED";break;case 5:d="MEDIA_ERR_ENCRYPTED"}B=!0,this.debug.log("Video Element Error: "+d),this.debug.log(b),this.errHandler.mediaSourceError(d),this.reset()}},X=function(){this.debug.log("Got seeking event.");var a=this.videoModel.getCurrentTime();t&&t.seek(a),v&&v.seek(a)},Y=function(){this.debug.log("Seek complete."),this.videoModel.listen("seeking",h),this.videoModel.unlisten("seeked",i)},Z=function(){_.call(this)},$=function(){_.call(this)},_=function(){t&&t.updateBufferState(),v&&v.updateBufferState()},ab=function(){t&&t.stop(),v&&v.stop()},bb=function(d){var e=this;return e.debug.log("Stream start loading."),a=d,e.mediaSourceExt.createMediaSource().then(function(a){return e.debug.log("MediaSource created."),N.call(e,a)}).then(function(a){return b=a,e.debug.log("MediaSource set up."),R.call(e)}).then(function(){return e.debug.log("Start initializing playback."),S.call(e)}).then(function(){return z?(e.debug.log("Playback initialized!"),c.promise):void 0}).then(function(){e.debug.log("element loaded!"),0===E&&G.call(e)})},cb=function(){this.debug.log("Current time has changed, block programmatic seek."),this.videoModel.unlisten("seeking",h),this.videoModel.listen("seeked",i)},db=function(){t&&!t.isBufferingCompleted()||v&&!v.isBufferingCompleted()||b&&this.mediaSourceExt.signalEndOfStream(b)},eb=function(){ab.call(this)},fb=function(){var a,b,c=this,d=c.manifestModel.getValue();c.debug.log("Manifest updated... set new data on buffers."),t&&(a=t.getData(),a&&a.hasOwnProperty("id")?c.manifestExt.getDataForId(a.id,d,E).then(function(a){t.setData(a)}):c.manifestExt.getDataForIndex(u,d,E).then(function(a){t.setData(a)})),v&&(b=v.getData(),b&&b.hasOwnProperty("id")?c.manifestExt.getDataForId(b.id,d,E).then(function(a){v.setData(a)}):c.manifestExt.getDataForIndex(w,d,E).then(function(a){v.setData(a)}))};return{system:void 0,videoModel:void 0,manifestLoader:void 0,manifestModel:void 0,mediaSourceExt:void 0,sourceBufferExt:void 0,bufferExt:void 0,manifestExt:void 0,fragmentController:void 0,abrController:void 0,fragmentExt:void 0,protectionModel:void 0,protectionController:void 0,protectionExt:void 0,capabilities:void 0,debug:void 0,metricsExt:void 0,errHandler:void 0,requestScheduler:void 0,scheduleWhilePaused:void 0,setup:function(){this.system.mapHandler("manifestUpdated",void 0,fb.bind(this)),this.system.mapHandler("setCurrentTime",void 0,cb.bind(this)),this.system.mapHandler("bufferingCompleted",void 0,db.bind(this)),this.system.mapHandler("segmentLoadingFailed",void 0,eb.bind(this)),c=Q.defer(),e=U.bind(this),f=V.bind(this),g=W.bind(this),h=X.bind(this),i=Y.bind(this),k=Z.bind(this),j=$.bind(this),d=T.bind(this)},load:function(a,b){E=b,bb.call(this,a)},setVideoModel:function(a){this.videoModel=a,this.videoModel.listen("play",e),this.videoModel.listen("pause",f),this.videoModel.listen("error",g),this.videoModel.listen("seeking",h),this.videoModel.listen("timeupdate",j),this.videoModel.listen("progress",k),this.videoModel.listen("loadedmetadata",d)},initProtection:function(){m=J.bind(this),n=K.bind(this),o=L.bind(this),p=M.bind(this),this.protectionModel=this.system.getObject("protectionModel"),this.protectionModel.init(this.getVideoModel()),this.protectionController=this.system.getObject("protectionController"),this.protectionController.init(this.videoModel,this.protectionModel),this.protectionModel.listenToNeedKey(m),this.protectionModel.listenToKeyMessage(n),this.protectionModel.listenToKeyError(p),this.protectionModel.listenToKeyAdded(o)},getVideoModel:function(){return this.videoModel},getManifestExt:function(){var a=this;return a.manifestExt},setAutoPlay:function(a){z=a},getAutoPlay:function(){return z},reset:function(){H.call(this),this.videoModel.unlisten("play",e),this.videoModel.unlisten("pause",f),this.videoModel.unlisten("error",g),this.videoModel.unlisten("seeking",h),this.videoModel.unlisten("timeupdate",j),this.videoModel.unlisten("progress",k),this.videoModel.unlisten("loadedmetadata",d),O.call(this),this.protectionController&&this.protectionController.teardownKeySystem(C),this.protectionController=void 0,this.protectionModel=void 0,this.fragmentController=void 0,this.requestScheduler=void 0,c=Q.defer()},getDuration:function(){return l},setPeriodIndex:function(a){E=a},getPeriodIndex:function(){return E},getStartTime:function(){return F},play:G,seek:I,pause:H}},MediaPlayer.dependencies.Stream.prototype={constructor:MediaPlayer.dependencies.Stream},MediaPlayer.dependencies.StreamController=function(){"use strict";var a,b=[],c=4,d=3,e=!0,f=null,g=function(){a.play()},h=function(){a.pause()},i=function(b){a.seek(b)},j=function(a,b){var c=a.getElement(),d=b.getElement();return d.parentNode||c.parentNode.insertBefore(d,c),c.style.width="0px",d.style.width="100%",m(c,d),l(a),k(b),Q.when(!0)},k=function(a){a.listen("seeking",p),a.listen("progress",n),r()&&a.listen("timeupdate",o)},l=function(a){a.unlisten("seeking",p),a.unlisten("progress",n),a.unlisten("timeupdate",o)},m=function(a,b){["controls","loop","muted","playbackRate","volume"].forEach(function(c){b[c]=a[c]})},n=function(){var b=a.getVideoModel().getElement().buffered;if(b.length){var d=b.length-1,e=b.end(d),f=a.getStartTime()+a.getDuration()-e;c>f&&(a.getVideoModel().unlisten("progress",n),q())}},o=function(){if(!a.getVideoModel().getElement().seeking){var b=a.getStartTime()+a.getDuration(),c=a.getVideoModel().getCurrentTime();d>b-c&&v(a,r())}},p=function(){var b=a.getVideoModel().getCurrentTime(),c=s(b);c&&c!==a&&v(a,c,b)},q=function(){var a=r();a&&a.seek(a.getStartTime())},r=function(){var c=a.getPeriodIndex()+1;return ce;e++)if(d=b[e],c+=d.getDuration(),c>a)return d},t=function(){var a=this.system.getObject("videoModel"),b=document.createElement("video");return a.setElement(b),a},u=function(a){a.parentNode&&a.parentNode.removeChild(a)},v=function(b,c,d){b&&c&&b!==c&&Q.when(f||!0).then(function(){b.pause(),a=c,f=j(b.getVideoModel(),c.getVideoModel()),d?i(b.getVideoModel().getCurrentTime()):i(c.getStartTime()),g()})};return{system:void 0,videoModel:void 0,manifestLoader:void 0,manifestUpdater:void 0,manifestModel:void 0,mediaSourceExt:void 0,sourceBufferExt:void 0,bufferExt:void 0,manifestExt:void 0,fragmentController:void 0,abrController:void 0,fragmentExt:void 0,capabilities:void 0,debug:void 0,metricsExt:void 0,errHandler:void 0,getManifestExt:function(){return a.getManifestExt()},setAutoPlay:function(a){e=a},getAutoPlay:function(){return e},getVideoModel:function(){return this.videoModel},setVideoModel:function(a){this.videoModel=a},load:function(c){var d,f=this;f.manifestLoader.load(c).then(function(c){f.manifestModel.setValue(c),f.debug.log("Manifest has loaded."),f.debug.log(f.manifestModel.getValue()),f.manifestUpdater.init(),f.manifestExt.getPeriodCount(c).then(function(g){for(var h=0;g>h;h++)d=f.system.getObject("stream"),d.setVideoModel(0===h?f.videoModel:t.call(f)),d.initProtection(),d.setAutoPlay(e),d.load(c,h),b.push(d);a=b[0],k(a.getVideoModel())})},function(){f.reset()})},reset:function(){a&&l(a.getVideoModel());for(var c=0,d=b.length;d>c;c++){var e=b[c];e.reset(),e!==a&&u(e.getVideoModel().getElement())}b=[],this.manifestUpdater.stop(),this.manifestModel.setValue(null),f=null,a=null},play:g,seek:i,pause:h}},MediaPlayer.dependencies.StreamController.prototype={constructor:MediaPlayer.dependencies.StreamController},MediaPlayer.models.VideoModel=function(){"use strict";var a,b=[],c=function(){return b.length>0},d=function(c){null!==c&&b[c]!==!0&&(b.push(c),b[c]=!0,a.playbackRate=0)},e=function(d){if(null!==d){b[d]=!1;var e=b.indexOf(d);-1!==e&&b.splice(e,1),c()===!1&&(a.playbackRate=1)}},f=function(a,b){b?d(a):e(a)};return{system:void 0,setup:function(){},play:function(){a.play()},pause:function(){a.pause()},isPaused:function(){return a.paused},getPlaybackRate:function(){return a.playbackRate},setPlaybackRate:function(b){a.playbackRate=b},getCurrentTime:function(){return a.currentTime},setCurrentTime:function(b){a.currentTime!=b&&(a.currentTime=b)},listen:function(b,c){a.addEventListener(b,c,!1)},unlisten:function(b,c){a.removeEventListener(b,c,!1)},getElement:function(){return a},setElement:function(b){a=b},setSource:function(b){a.src=b},stallStream:f,isStalled:c}},MediaPlayer.models.VideoModel.prototype={constructor:MediaPlayer.models.VideoModel},MediaPlayer.dependencies.VideoModelExtensions=function(){"use strict";return{getDroppedFrames:function(a){var b=null!==a.webkitDroppedFrameCount,c=-1;return b&&(c=a.webkitDroppedFrameCount),c}}},MediaPlayer.dependencies.VideoModelExtensions.prototype={constructor:MediaPlayer.dependencies.VideoModelExtensions},MediaPlayer.dependencies.TextController=function(){var a,b,c="LOADING",d="READY",e=!1,f=-1,g=d,h=function(a){this.debug.log("TextController setState to:"+a),g=a},i=function(){if(e&&g===d){var b=this;h.call(b,c),b.indexHandler.getInitRequest(0,a).then(function(a){b.debug.log("Loading text track initialization: "+a.url),b.debug.log(a),b.fragmentLoader.load(a).then(k.bind(b,a),l.bind(b,a)),h.call(b,c)})}},j=function(){i.call(this)},k=function(a,c){var d=this;d.debug.log(" Text track Bytes finished loading: "+a.url),d.fragmentController.process(c.data).then(function(a){null!==a&&(d.debug.log("Push text track bytes: "+a.byteLength),d.sourceBufferExt.append(b,a,d.videoModel))})},l=function(){};return{videoModel:void 0,fragmentLoader:void 0,fragmentController:void 0,indexHandler:void 0,sourceBufferExt:void 0,debug:void 0,initialize:function(a,b,c,d){var f=this;f.setVideoModel(d),f.setPeriodIndex(a),f.setData(b),f.setBuffer(c),e=!0},getPeriodIndex:function(){return f},setPeriodIndex:function(a){f=a},getVideoModel:function(){return this.videoModel},setVideoModel:function(a){this.videoModel=a},getData:function(){return a},setData:function(b){a=b},getBuffer:function(){return b},setBuffer:function(a){b=a},reset:function(a,c){a||(this.sourceBufferExt.abort(c,b),this.sourceBufferExt.removeSourceBuffer(c,b))},start:j}},MediaPlayer.dependencies.TextController.prototype={constructor:MediaPlayer.dependencies.TextController},MediaPlayer.utils.TextTrackExtensions=function(){"use strict";return{addTextTrack:function(a,b,c,d,e){var f=a.addTextTrack("captions",c,d);f.default=e,f.mode="showing";for(var g in b){var h=b[g];f.addCue(new TextTrackCue(h.start,h.end,h.data))}return Q.when(f)},deleteCues:function(a){for(var b=a.textTracks[0],c=b.cues,d=c.length;d>=0;d--)b.removeCue(c[d]);b.mode="disabled"}}},MediaPlayer.dependencies.TextVTTSourceBuffer=function(){var a,b,c;return{system:void 0,eventBus:void 0,initialize:function(d,e){c=d,a=e.getVideoModel().getElement(),b=e.getData()},append:function(c){var d=this;d.getParser().parse(String.fromCharCode.apply(null,new Uint16Array(c))).then(function(c){var e=b.Representation_asArray[0].id,f=b.lang;d.getTextTrackExtensions().addTextTrack(a,c,e,f,!0).then(function(){d.eventBus.dispatchEvent({type:"updateend"})})})},abort:function(){this.getTextTrackExtensions().deleteCues(a)},getParser:function(){var a;return"text/vtt"===c&&(a=this.system.getObject("vttParser")),a},getTextTrackExtensions:function(){return this.system.getObject("textTrackExtensions")},addEventListener:function(a,b,c){this.eventBus.addEventListener(a,b,c)},removeEventListener:function(a,b,c){this.eventBus.removeEventListener(a,b,c)}}},MediaPlayer.dependencies.TextVTTSourceBuffer.prototype={constructor:MediaPlayer.dependencies.TextVTTSourceBuffer},MediaPlayer.utils.VTTParser=function(){"use strict";var a=function(a){var b=a.split(":"),c=b.length-1;return a=60*parseInt(b[c-1],10)+parseFloat(b[c],10),2===c&&(a+=3600*parseInt(b[0],10)),a};return{parse:function(b){var c,d=/(?:\r\n|\r|\n)/gm,e=/-->/,f=/(^[\s]+|[\s]+$)/g,g=[];b=b.split(d),c=b.length;for(var h=0;c>h;h++){var i=b[h];if(i.length>0&&"WEBVTT"!==i&&i.match(e)){var j=i.split(e),k=b[h+1];g.push({start:a(j[0].replace(f,"")),end:a(j[1].replace(f,"")),data:k})}}return Q.when(g)}}},MediaPlayer.rules.BaseRulesCollection=function(){"use strict";var a=[];return{downloadRatioRule:void 0,insufficientBufferRule:void 0,getRules:function(){return Q.when(a)},setup:function(){var a=this;a.getRules().then(function(b){b.push(a.downloadRatioRule),b.push(a.insufficientBufferRule)})}}},MediaPlayer.rules.BaseRulesCollection.prototype={constructor:MediaPlayer.rules.BaseRulesCollection},MediaPlayer.rules.DownloadRatioRule=function(){"use strict";var a=function(a,b,c){var d=this,e=Q.defer();return d.manifestExt.getRepresentationFor(a,c).then(function(a){d.manifestExt.getBandwidth(a).then(function(a){e.resolve(a/b)})}),e.promise};return{debug:void 0,manifestExt:void 0,checkIndex:function(b,c,d){var e,f,g,h,i,j,k,l,m,n,o=this,p=c.HttpList,q=.75;return o.debug.log("Checking download ratio rule..."),c?null===p||void 0===p||0===p.length?(o.debug.log("No requests made for this stream yet, bailing."),Q.when(new MediaPlayer.rules.SwitchRequest)):(e=p[p.length-1],g=(e.tfinish.getTime()-e.trequest.getTime())/1e3,f=(e.tfinish.getTime()-e.tresponse.getTime())/1e3,0>=g?(o.debug.log("Don't know how long the download of the last fragment took, bailing."),Q.when(new MediaPlayer.rules.SwitchRequest)):null===e.mediaduration||void 0===e.mediaduration||e.mediaduration<=0?(o.debug.log("Don't know the duration of the last media fragment, bailing."),Q.when(new MediaPlayer.rules.SwitchRequest)):(k=Q.defer(),i=e.mediaduration/g,h=e.mediaduration/f*q,isNaN(h)||isNaN(i)?(o.debug.log("Total time: "+g+"s"),o.debug.log("Download time: "+f+"s"),o.debug.log("The ratios are NaN, bailing."),Q.when(new MediaPlayer.rules.SwitchRequest)):(o.debug.log("Total ratio: "+i),o.debug.log("Download ratio: "+h),o.debug.log("Download ratio: "+h),isNaN(h)?(o.debug.log("Invalid ratio, bailing."),k.resolve(new MediaPlayer.rules.SwitchRequest)):1>h?(o.debug.log("Download ratio is poor."),b>0?(o.debug.log("We are not at the lowest bitrate, so switch down."),o.manifestExt.getRepresentationFor(b-1,d).then(function(a){o.manifestExt.getBandwidth(a).then(function(a){o.manifestExt.getRepresentationFor(b,d).then(function(c){o.manifestExt.getBandwidth(c).then(function(c){j=a/c,o.debug.log("Switch ratio: "+j),j>h?(o.debug.log("Things must be going pretty bad, switch all the way down."),k.resolve(new MediaPlayer.rules.SwitchRequest(0))):(o.debug.log("Things could be better, so just switch down one index."),k.resolve(new MediaPlayer.rules.SwitchRequest(b-1))) })})})})):(o.debug.log("We are at the lowest bitrate and cannot switch down, use current."),k.resolve(new MediaPlayer.rules.SwitchRequest(b)))):(o.debug.log("Download ratio is good."),o.manifestExt.getRepresentationCount(d).then(function(c){c-=1,c>b?(o.debug.log("We are not at the highest bitrate, so switch up."),o.manifestExt.getRepresentationFor(b+1,d).then(function(e){o.manifestExt.getBandwidth(e).then(function(e){o.manifestExt.getRepresentationFor(b,d).then(function(f){o.manifestExt.getBandwidth(f).then(function(f){if(j=e/f,o.debug.log("Switch ratio: "+j),h>=j)if(h>1e3)o.debug.log("Tons of bandwidth available, go all the way up."),k.resolve(new MediaPlayer.rules.SwitchRequest(c-1));else if(h>100)o.debug.log("Just enough bandwidth available, switch up one."),k.resolve(new MediaPlayer.rules.SwitchRequest(b+1));else{for(o.debug.log("Not exactly sure where to go, so do some math."),m=-1,l=[];(m+=1)m&&!(hb&&(i=MediaPlayer.rules.SwitchRequest.prototype.STRONG,g.debug.log("Apply STRONG to buffer rule.")),h?(g.debug.log("The buffer ran dry recently, switch down."),Q.when(new MediaPlayer.rules.SwitchRequest(c-1,i))):a>b?(g.debug.log("Too many dry buffer hits, quit switching bitrates."),Q.when(new MediaPlayer.rules.SwitchRequest(c,i))):Q.when(new MediaPlayer.rules.SwitchRequest(MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE,i)))))}}},MediaPlayer.rules.InsufficientBufferRule.prototype={constructor:MediaPlayer.rules.InsufficientBufferRule},MediaPlayer.rules.LimitSwitchesRule=function(){"use strict";var a=10,b=2e4,c=5,d=0;return{debug:void 0,checkIndex:function(e,f){if(d>0)return d-=1,Q.when(new MediaPlayer.rules.SwitchRequest(e,MediaPlayer.rules.SwitchRequest.prototype.STRONG));var g,h,i,j=this,k=!1,l=(new Date).getTime(),m=f.RepSwitchList.length;for(j.debug.log("Checking limit switches rule..."),i=m-1;i>=0;i-=1){if(g=f.RepSwitchList[i],h=l-g.t.getTime(),h>=b){j.debug.log("Reached time limit, bailing.");break}if(i>=a){j.debug.log("Found too many switches within validation time, force the stream to not change."),k=!0;break}}return k?(j.debug.log("Wait some time before allowing another switch."),d=c,Q.when(new MediaPlayer.rules.SwitchRequest(e,MediaPlayer.rules.SwitchRequest.prototype.STRONG))):Q.when(new MediaPlayer.rules.SwitchRequest(MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE,MediaPlayer.rules.SwitchRequest.prototype.STRONG))}}},MediaPlayer.rules.LimitSwitchesRule.prototype={constructor:MediaPlayer.rules.LimitSwitchesRule},MediaPlayer.rules.SwitchRequest=function(a,b){"use strict";this.quality=a,this.priority=b,void 0===this.quality&&(this.quality=999),void 0===this.priority&&(this.priority=.5)},MediaPlayer.rules.SwitchRequest.prototype={constructor:MediaPlayer.rules.SwitchRequest,NO_CHANGE:999,DEFAULT:.5,STRONG:1,WEAK:0},MediaPlayer.models.MetricsList=function(){"use strict";return{TcpList:[],HttpList:[],RepSwitchList:[],BufferLevel:[],PlayList:[],DroppedFrames:[]}},MediaPlayer.models.MetricsList.prototype={constructor:MediaPlayer.models.MetricsList},MediaPlayer.vo.SegmentRequest=function(){"use strict";this.action="download",this.startTime=0/0,this.streamType=null,this.type=null,this.duration=0/0,this.timescale=0/0,this.range=null,this.url=null,this.requestStartDate=null,this.firstByteDate=null,this.requestEndDate=null,this.deferred=null,this.quality=0/0,this.index=0/0},MediaPlayer.vo.SegmentRequest.prototype={constructor:MediaPlayer.vo.SegmentRequest,ACTION_DOWNLOAD:"download",ACTION_COMPLETE:"complete"},MediaPlayer.vo.metrics.BufferLevel=function(){"use strict";this.t=null,this.level=null},MediaPlayer.vo.metrics.BufferLevel.prototype={constructor:MediaPlayer.vo.metrics.BufferLevel},MediaPlayer.vo.metrics.DroppedFrames=function(){"use strict";this.time=null,this.droppedFrames=null},MediaPlayer.vo.metrics.DroppedFrames.prototype={constructor:MediaPlayer.vo.metrics.DroppedFrames},MediaPlayer.vo.metrics.HTTPRequest=function(){"use strict";this.tcpid=null,this.type=null,this.url=null,this.actualurl=null,this.range=null,this.trequest=null,this.tresponse=null,this.tfinish=null,this.responsecode=null,this.interval=null,this.mediaduration=null,this.trace=[]},MediaPlayer.vo.metrics.HTTPRequest.prototype={constructor:MediaPlayer.vo.metrics.HTTPRequest},MediaPlayer.vo.metrics.HTTPRequest.Trace=function(){"use strict";this.s=null,this.d=null,this.b=[]},MediaPlayer.vo.metrics.HTTPRequest.Trace.prototype={constructor:MediaPlayer.vo.metrics.HTTPRequest.Trace},MediaPlayer.vo.metrics.PlayList=function(){"use strict";this.start=null,this.mstart=null,this.starttype=null,this.trace=[]},MediaPlayer.vo.metrics.PlayList.Trace=function(){"use strict";this.representationid=null,this.subreplevel=null,this.start=null,this.mstart=null,this.duration=null,this.playbackspeed=null,this.stopreason=null},MediaPlayer.vo.metrics.PlayList.prototype={constructor:MediaPlayer.vo.metrics.PlayList},MediaPlayer.vo.metrics.PlayList.INITIAL_PLAY_START_REASON="initial_start",MediaPlayer.vo.metrics.PlayList.SEEK_START_REASON="seek",MediaPlayer.vo.metrics.PlayList.Trace.prototype={constructor:MediaPlayer.vo.metrics.PlayList.Trace()},MediaPlayer.vo.metrics.PlayList.Trace.USER_REQUEST_STOP_REASON="user_request",MediaPlayer.vo.metrics.PlayList.Trace.REPRESENTATION_SWITCH_STOP_REASON="representation_switch",MediaPlayer.vo.metrics.PlayList.Trace.END_OF_CONTENT_STOP_REASON="end_of_content",MediaPlayer.vo.metrics.PlayList.Trace.REBUFFERING_REASON="rebuffering",MediaPlayer.vo.metrics.RepresentationSwitch=function(){"use strict";this.t=null,this.mt=null,this.to=null,this.lto=null},MediaPlayer.vo.metrics.RepresentationSwitch.prototype={constructor:MediaPlayer.vo.metrics.RepresentationSwitch},MediaPlayer.vo.metrics.TCPConnection=function(){"use strict";this.tcpid=null,this.dest=null,this.topen=null,this.tclose=null,this.tconnect=null},MediaPlayer.vo.metrics.TCPConnection.prototype={constructor:MediaPlayer.vo.metrics.TCPConnection}; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJkYXNoLmFsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBYMkpTKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBiPWEubG9jYWxOYW1lO3JldHVybiBudWxsPT1iJiYoYj1hLmJhc2VOYW1lKSwobnVsbD09Ynx8XCJcIj09YikmJihiPWEubm9kZU5hbWUpLGJ9ZnVuY3Rpb24gZShhKXtyZXR1cm4gYS5wcmVmaXh9ZnVuY3Rpb24gZihhKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYT9hLnJlcGxhY2UoLyYvZyxcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZyxcIiZsdDtcIikucmVwbGFjZSgvPi9nLFwiJmd0O1wiKS5yZXBsYWNlKC9cIi9nLFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZyxcIiYjeDI3O1wiKS5yZXBsYWNlKC9cXC8vZyxcIiYjeDJGO1wiKTphfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGEucmVwbGFjZSgvJmFtcDsvZyxcIiZcIikucmVwbGFjZSgvJmx0Oy9nLFwiPFwiKS5yZXBsYWNlKC8mZ3Q7L2csXCI+XCIpLnJlcGxhY2UoLyZxdW90Oy9nLCdcIicpLnJlcGxhY2UoLyYjeDI3Oy9nLFwiJ1wiKS5yZXBsYWNlKC8mI3gyRjsvZyxcIi9cIil9ZnVuY3Rpb24gaChmKXtpZihmLm5vZGVUeXBlPT11LkRPQ1VNRU5UX05PREUpe3ZhciBpLGosayxsPWYuZmlyc3RDaGlsZDtmb3Ioaj0wLGs9Zi5jaGlsZE5vZGVzLmxlbmd0aDtrPmo7ais9MSlpZihmLmNoaWxkTm9kZXNbal0ubm9kZVR5cGUhPT11LkNPTU1FTlRfTk9ERSl7bD1mLmNoaWxkTm9kZXNbal07YnJlYWt9aWYoYylpPWgobCk7ZWxzZXtpPXt9O3ZhciBtPWQobCk7aVttXT1oKGwpfXJldHVybiBpfWlmKGYubm9kZVR5cGU9PXUuRUxFTUVOVF9OT0RFKXt2YXIgaT1uZXcgT2JqZWN0O2kuX19jbnQ9MDtmb3IodmFyIG49Zi5jaGlsZE5vZGVzLG89MDtvPG4ubGVuZ3RoO28rKyl7dmFyIGw9bi5pdGVtKG8pLG09ZChsKTtpZihpLl9fY250KyssbnVsbD09aVttXSlpW21dPWgobCksaVttK1wiX2FzQXJyYXlcIl09bmV3IEFycmF5KDEpLGlbbStcIl9hc0FycmF5XCJdWzBdPWlbbV07ZWxzZXtpZihudWxsIT1pW21dJiYhKGlbbV1pbnN0YW5jZW9mIEFycmF5KSl7dmFyIHA9aVttXTtpW21dPW5ldyBBcnJheSxpW21dWzBdPXAsaVttK1wiX2FzQXJyYXlcIl09aVttXX1mb3IodmFyIHE9MDtudWxsIT1pW21dW3FdOylxKys7aVttXVtxXT1oKGwpfX1mb3IodmFyIHI9MDtyPGYuYXR0cmlidXRlcy5sZW5ndGg7cisrKXt2YXIgcz1mLmF0dHJpYnV0ZXMuaXRlbShyKTtpLl9fY250Kys7Zm9yKHZhciB2PXMudmFsdWUsdz0wLHg9YS5sZW5ndGg7eD53O3crKyl7dmFyIHk9YVt3XTt5LnRlc3QuY2FsbCh0aGlzLHMudmFsdWUpJiYodj15LmNvbnZlcnRlci5jYWxsKHRoaXMscy52YWx1ZSkpfWlbYitzLm5hbWVdPXZ9dmFyIHo9ZShmKTtyZXR1cm4gbnVsbCE9eiYmXCJcIiE9eiYmKGkuX19jbnQrKyxpLl9fcHJlZml4PXopLDE9PWkuX19jbnQmJm51bGwhPWlbXCIjdGV4dFwiXSYmKGk9aVtcIiN0ZXh0XCJdKSxudWxsIT1pW1wiI3RleHRcIl0mJihpLl9fdGV4dD1pW1wiI3RleHRcIl0sdCYmKGkuX190ZXh0PWcoaS5fX3RleHQpKSxkZWxldGUgaVtcIiN0ZXh0XCJdLGRlbGV0ZSBpW1wiI3RleHRfYXNBcnJheVwiXSksbnVsbCE9aVtcIiNjZGF0YS1zZWN0aW9uXCJdJiYoaS5fX2NkYXRhPWlbXCIjY2RhdGEtc2VjdGlvblwiXSxkZWxldGUgaVtcIiNjZGF0YS1zZWN0aW9uXCJdLGRlbGV0ZSBpW1wiI2NkYXRhLXNlY3Rpb25fYXNBcnJheVwiXSksKG51bGwhPWkuX190ZXh0fHxudWxsIT1pLl9fY2RhdGEpJiYoaS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybihudWxsIT10aGlzLl9fdGV4dD90aGlzLl9fdGV4dDpcIlwiKSsobnVsbCE9dGhpcy5fX2NkYXRhP3RoaXMuX19jZGF0YTpcIlwiKX0pLGl9cmV0dXJuIGYubm9kZVR5cGU9PXUuVEVYVF9OT0RFfHxmLm5vZGVUeXBlPT11LkNEQVRBX1NFQ1RJT05fTk9ERT9mLm5vZGVWYWx1ZTpmLm5vZGVUeXBlPT11LkNPTU1FTlRfTk9ERT9udWxsOnZvaWQgMH1mdW5jdGlvbiBpKGEsYixjLGQpe3ZhciBlPVwiPFwiKyhudWxsIT1hJiZudWxsIT1hLl9fcHJlZml4P2EuX19wcmVmaXgrXCI6XCI6XCJcIikrYjtpZihudWxsIT1jKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdLGg9YVtnXTtlKz1cIiBcIitnLnN1YnN0cigxKStcIj0nXCIraCtcIidcIn1yZXR1cm4gZSs9ZD9cIi8+XCI6XCI+XCJ9ZnVuY3Rpb24gaihhLGIpe3JldHVyblwiPC9cIisobnVsbCE9YS5fX3ByZWZpeD9hLl9fcHJlZml4K1wiOlwiOlwiXCIpK2IrXCI+XCJ9ZnVuY3Rpb24gayhhLGIpe3JldHVybi0xIT09YS5pbmRleE9mKGIsYS5sZW5ndGgtYi5sZW5ndGgpfWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gayhiLnRvU3RyaW5nKCksXCJfYXNBcnJheVwiKXx8MD09Yi50b1N0cmluZygpLmluZGV4T2YoXCJfXCIpfHxhW2JdaW5zdGFuY2VvZiBGdW5jdGlvbj8hMDohMX1mdW5jdGlvbiBtKGEpe3ZhciBiPTA7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClmb3IodmFyIGMgaW4gYSlsKGEsYyl8fGIrKztyZXR1cm4gYn1mdW5jdGlvbiBuKGEpe3ZhciBiPVtdO2lmKGEgaW5zdGFuY2VvZiBPYmplY3QpZm9yKHZhciBjIGluIGEpLTE9PWMudG9TdHJpbmcoKS5pbmRleE9mKFwiX19cIikmJjA9PWMudG9TdHJpbmcoKS5pbmRleE9mKFwiX1wiKSYmYi5wdXNoKGMpO3JldHVybiBifWZ1bmN0aW9uIG8oYSl7dmFyIGI9XCJcIjtyZXR1cm4gbnVsbCE9YS5fX2NkYXRhJiYoYis9XCI8IVtDREFUQVtcIithLl9fY2RhdGErXCJdXT5cIiksbnVsbCE9YS5fX3RleHQmJihiKz10P2YoYS5fX3RleHQpOmEuX190ZXh0KSxifWZ1bmN0aW9uIHAoYSl7dmFyIGI9XCJcIjtyZXR1cm4gYSBpbnN0YW5jZW9mIE9iamVjdD9iKz1vKGEpOm51bGwhPWEmJihiKz10P2YoYSk6YSksYn1mdW5jdGlvbiBxKGEsYixjKXt2YXIgZD1cIlwiO2lmKDA9PWEubGVuZ3RoKWQrPWkoYSxiLGMsITApO2Vsc2UgZm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZCs9aShhW2VdLGIsbihhW2VdKSwhMSksZCs9cihhW2VdKSxkKz1qKGFbZV0sYik7cmV0dXJuIGR9ZnVuY3Rpb24gcihhKXt2YXIgYj1cIlwiLGM9bShhKTtpZihjPjApZm9yKHZhciBkIGluIGEpaWYoIWwoYSxkKSl7dmFyIGU9YVtkXSxmPW4oZSk7aWYobnVsbD09ZXx8dm9pZCAwPT1lKWIrPWkoZSxkLGYsITApO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIE9iamVjdClpZihlIGluc3RhbmNlb2YgQXJyYXkpYis9cShlLGQsZik7ZWxzZXt2YXIgZz1tKGUpO2c+MHx8bnVsbCE9ZS5fX3RleHR8fG51bGwhPWUuX19jZGF0YT8oYis9aShlLGQsZiwhMSksYis9cihlKSxiKz1qKGUsZCkpOmIrPWkoZSxkLGYsITApfWVsc2UgYis9aShlLGQsZiwhMSksYis9cChlKSxiKz1qKGUsZCl9cmV0dXJuIGIrPXAoYSl9KG51bGw9PT1ifHx2b2lkIDA9PT1iKSYmKGI9XCJfXCIpLChudWxsPT09Y3x8dm9pZCAwPT09YykmJihjPSExKTt2YXIgcz1cIjEuMC4xMVwiLHQ9ITEsdT17RUxFTUVOVF9OT0RFOjEsVEVYVF9OT0RFOjMsQ0RBVEFfU0VDVElPTl9OT0RFOjQsQ09NTUVOVF9OT0RFOjgsRE9DVU1FTlRfTk9ERTo5fTt0aGlzLnBhcnNlWG1sU3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKHdpbmRvdy5ET01QYXJzZXIpe3ZhciBjPW5ldyB3aW5kb3cuRE9NUGFyc2VyO2I9Yy5wYXJzZUZyb21TdHJpbmcoYSxcInRleHQveG1sXCIpfWVsc2UgMD09YS5pbmRleE9mKFwiPD9cIikmJihhPWEuc3Vic3RyKGEuaW5kZXhPZihcIj8+XCIpKzIpKSxiPW5ldyBBY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTERPTVwiKSxiLmFzeW5jPVwiZmFsc2VcIixiLmxvYWRYTUwoYSk7cmV0dXJuIGJ9LHRoaXMueG1sMmpzb249ZnVuY3Rpb24oYSl7cmV0dXJuIGgoYSl9LHRoaXMueG1sX3N0cjJqc29uPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGFyc2VYbWxTdHJpbmcoYSk7cmV0dXJuIHRoaXMueG1sMmpzb24oYil9LHRoaXMuanNvbjJ4bWxfc3RyPWZ1bmN0aW9uKGEpe3JldHVybiByKGEpfSx0aGlzLmpzb24yeG1sPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanNvbjJ4bWxfc3RyKGEpO3JldHVybiB0aGlzLnBhcnNlWG1sU3RyaW5nKGIpfSx0aGlzLmdldFZlcnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gc30sdGhpcy5lc2NhcGVNb2RlPWZ1bmN0aW9uKGEpe3Q9YX19ZnVuY3Rpb24gT2JqZWN0SXJvbihhKXt2YXIgYjtmb3IoYj1bXSxpPTAsbGVuPWEubGVuZ3RoO2xlbj5pO2krPTEpYVtpXS5pc1Jvb3Q/Yi5wdXNoKFwicm9vdFwiKTpiLnB1c2goYVtpXS5uYW1lKTt2YXIgYz1mdW5jdGlvbihhLGIpe3ZhciBjO2lmKG51bGwhPT1hJiZudWxsIT09Yilmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJihiLmhhc093blByb3BlcnR5KGMpfHwoYltjXT1hW2NdKSl9LGQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGYsZyxoLGk7aWYobnVsbCE9PWEmJjAhPT1hLmxlbmd0aClmb3IoZT0wLGY9YS5sZW5ndGg7Zj5lO2UrPTEpZz1hW2VdLGIuaGFzT3duUHJvcGVydHkoZy5uYW1lKSYmKGQuaGFzT3duUHJvcGVydHkoZy5uYW1lKT9nLm1lcmdlJiYoaD1iW2cubmFtZV0saT1kW2cubmFtZV0sXCJvYmplY3RcIj09dHlwZW9mIGgmJlwib2JqZWN0XCI9PXR5cGVvZiBpP2MoaCxpKTpkW2cubmFtZV09bnVsbCE9Zy5tZXJnZUZ1bmN0aW9uP2cubWVyZ2VGdW5jdGlvbihoLGkpOmgraSk6ZFtnLm5hbWVdPWJbZy5uYW1lXSl9LGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxmLGcsaCxpLGosayxsPWE7aWYobnVsbCE9PWwuY2hpbGRyZW4mJjAhPT1sLmNoaWxkcmVuLmxlbmd0aClmb3IoYz0wLGY9bC5jaGlsZHJlbi5sZW5ndGg7Zj5jO2MrPTEpaWYoaj1sLmNoaWxkcmVuW2NdLGIuaGFzT3duUHJvcGVydHkoai5uYW1lKSlpZihqLmlzQXJyYXkpZm9yKGk9YltqLm5hbWUrXCJfYXNBcnJheVwiXSxnPTAsaD1pLmxlbmd0aDtoPmc7Zys9MSlrPWlbZ10sZChsLnByb3BlcnRpZXMsYixrKSxlKGosayk7ZWxzZSBrPWJbai5uYW1lXSxkKGwucHJvcGVydGllcyxiLGspLGUoaixrKX0sZj1mdW5jdGlvbihjKXt2YXIgZCxnLGgsaSxqLGssbDtpZihudWxsPT09YylyZXR1cm4gYztpZihcIm9iamVjdFwiIT10eXBlb2YgYylyZXR1cm4gYztmb3IoZD0wLGc9Yi5sZW5ndGg7Zz5kO2QrPTEpXCJyb290XCI9PT1iW2RdJiYoaj1hW2RdLGs9YyxlKGosaykpO2ZvcihpIGluIGMpaWYoYy5oYXNPd25Qcm9wZXJ0eShpKSl7aWYoaD1iLmluZGV4T2YoaSksLTEhPT1oKWlmKGo9YVtoXSxqLmlzQXJyYXkpZm9yKGw9Y1tpK1wiX2FzQXJyYXlcIl0sZD0wLGc9bC5sZW5ndGg7Zz5kO2QrPTEpaz1sW2RdLGUoaixrKTtlbHNlIGs9Y1tpXSxlKGosayk7ZihjW2ldKX1yZXR1cm4gY307cmV0dXJue3J1bjpmfX1pZihmdW5jdGlvbihhKXthKHZvaWQgMCxRPXt9KX0oZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5zdGFjayYmXCJvYmplY3RcIj09dHlwZW9mIGEmJm51bGwhPT1hJiZhLnN0YWNrJiYtMT09PWEuc3RhY2suaW5kZXhPZihOKSYmKGEuc3RhY2s9ZChhLnN0YWNrKStcIlxcblwiK04rXCJcXG5cIitkKGIuc3RhY2spKX1mdW5jdGlvbiBkKGEpe2Zvcih2YXIgYT1hLnNwbGl0KFwiXFxuXCIpLGI9W10sYz0wO2M8YS5sZW5ndGg7KytjKXt2YXIgZCxlPWFbY107aWYoZD0vYXQgLisgXFwoKC4qKTooXFxkKyk6XFxkK1xcKS8uZXhlYyhlKSl7dmFyIGY9ZFsyXTtkPWRbMV09PT13JiZmPj14JiZUPj1mfWVsc2UgZD0hMTshZCYmISgtMSE9PWUuaW5kZXhPZihcIihtb2R1bGUuanM6XCIpfHwtMSE9PWUuaW5kZXhPZihcIihub2RlLmpzOlwiKSkmJmIucHVzaChlKX1yZXR1cm4gYi5qb2luKFwiXFxuXCIpfWZ1bmN0aW9uIGUoKXtpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSl7dmFyIGEsYixjPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO3JldHVybiBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1mdW5jdGlvbihjLGQpe2E9ZFsxXS5nZXRGaWxlTmFtZSgpLGI9ZFsxXS5nZXRMaW5lTnVtYmVyKCl9LEVycm9yKCkuc3RhY2ssRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9Yyx3PWEsYn19ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNvbnNvbGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGIrXCIgaXMgZGVwcmVjYXRlZCwgdXNlIFwiK2MrXCIgaW5zdGVhZC5cIixFcnJvcihcIlwiKS5zdGFjayksYS5hcHBseShhLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGcoKXtmdW5jdGlvbiBhKGEpe2MmJihiPW4oYSksSChjLGZ1bmN0aW9uKGEsYyl7QShmdW5jdGlvbigpe2IucHJvbWlzZURpc3BhdGNoLmFwcGx5KGIsYyl9KX0sdm9pZCAwKSxkPWM9dm9pZCAwKX12YXIgYixjPVtdLGQ9W10sZT1LKGcucHJvdG90eXBlKSxmPUsoaC5wcm90b3R5cGUpO3JldHVybiBmLnByb21pc2VEaXNwYXRjaD1mdW5jdGlvbihhLGUsZil7dmFyIGc9Ryhhcmd1bWVudHMpO2M/KGMucHVzaChnKSxcIndoZW5cIj09PWUmJmZbMV0mJmQucHVzaChmWzFdKSk6QShmdW5jdGlvbigpe2IucHJvbWlzZURpc3BhdGNoLmFwcGx5KGIsZyl9KX0sZi52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIGM/ZjpiLnZhbHVlT2YoKX0sRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShmLGcpLGYuc3RhY2s9Zi5zdGFjay5zdWJzdHJpbmcoZi5zdGFjay5pbmRleE9mKFwiXFxuXCIpKzEpKSx6KGYpLGUucHJvbWlzZT1mLGUucmVzb2x2ZT1hLGUucmVqZWN0PWZ1bmN0aW9uKGIpe2EobShiKSl9LGUubm90aWZ5PWZ1bmN0aW9uKGEpe2MmJkgoZCxmdW5jdGlvbihiLGMpe0EoZnVuY3Rpb24oKXtjKGEpfSl9LHZvaWQgMCl9LGV9ZnVuY3Rpb24gaChhLGIsYyxkKXt2b2lkIDA9PT1iJiYoYj1mdW5jdGlvbihhKXtyZXR1cm4gbShFcnJvcihcIlByb21pc2UgZG9lcyBub3Qgc3VwcG9ydCBvcGVyYXRpb246IFwiK2EpKX0pO3ZhciBlPUsoaC5wcm90b3R5cGUpO3JldHVybiBlLnByb21pc2VEaXNwYXRjaD1mdW5jdGlvbihjLGQsZil7dmFyIGc7dHJ5e2c9YVtkXT9hW2RdLmFwcGx5KGUsZik6Yi5jYWxsKGUsZCxmKX1jYXRjaChoKXtnPW0oaCl9YyYmYyhnKX0sYyYmKGUudmFsdWVPZj1jKSxkJiYoZS5leGNlcHRpb249ZCkseihlKSxlfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGooYSk/YS52YWx1ZU9mKCk6YX1mdW5jdGlvbiBqKGEpe3JldHVybiBhJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLnByb21pc2VEaXNwYXRjaH1mdW5jdGlvbiBrKGEpe3JldHVybiFqKGkoYSkpfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGE9aShhKSxqKGEpJiZcImV4Y2VwdGlvblwiaW4gYX1mdW5jdGlvbiBtKGEpe3ZhciBhPWF8fEVycm9yKCksYj1oKHt3aGVuOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBjPUkoUCx0aGlzKTstMSE9PWMmJihRLnNwbGljZShjLDEpLFAuc3BsaWNlKGMsMSkpfXJldHVybiBiP2IoYSk6bShhKX19LGZ1bmN0aW9uKCl7cmV0dXJuIG0oYSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGEpO3JldHVybiFPJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYhd2luZG93LlRvdWNoJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2coXCJTaG91bGQgYmUgZW1wdHk6XCIsUSksTz0hMCxQLnB1c2goYiksUS5wdXNoKGEpLGJ9ZnVuY3Rpb24gbihhKXtpZihqKGEpKXJldHVybiBhO2lmKChhPWkoYSkpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLnRoZW4pe3ZhciBiPWcoKTtyZXR1cm4gYS50aGVuKGIucmVzb2x2ZSxiLnJlamVjdCxiLm5vdGlmeSksYi5wcm9taXNlfXJldHVybiBoKHt3aGVuOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGdldDpmdW5jdGlvbihiKXtyZXR1cm4gYVtiXX0scHV0OmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGFbYl09YyxhfSxkZWw6ZnVuY3Rpb24oYil7cmV0dXJuIGRlbGV0ZSBhW2JdLGF9LHBvc3Q6ZnVuY3Rpb24oYixjKXtyZXR1cm4gYVtiXS5hcHBseShhLGMpfSxhcHBseTpmdW5jdGlvbihiKXtyZXR1cm4gYS5hcHBseSh2b2lkIDAsYil9LGtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gTChhKX19LHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBhfSl9ZnVuY3Rpb24gbyhhLGIsZCxlKXtmdW5jdGlvbiBmKGEpe3RyeXtyZXR1cm4gYj9iKGEpOmF9Y2F0Y2goYyl7cmV0dXJuIG0oYyl9fWZ1bmN0aW9uIGgoYSl7aWYoZCl7YyhhLGspO3RyeXtyZXR1cm4gZChhKX1jYXRjaChiKXtyZXR1cm4gbShiKX19cmV0dXJuIG0oYSl9dmFyIGk9ZygpLGo9ITEsaz1uKGEpO3JldHVybiBBKGZ1bmN0aW9uKCl7ay5wcm9taXNlRGlzcGF0Y2goZnVuY3Rpb24oYSl7anx8KGo9ITAsaS5yZXNvbHZlKGYoYSkpKX0sXCJ3aGVuXCIsW2Z1bmN0aW9uKGEpe2p8fChqPSEwLGkucmVzb2x2ZShoKGEpKSl9XSl9KSxrLnByb21pc2VEaXNwYXRjaCh2b2lkIDAsXCJ3aGVuXCIsW3ZvaWQgMCxmdW5jdGlvbihhKXtpLm5vdGlmeShlP2UoYSk6YSl9XSksaS5wcm9taXNlfWZ1bmN0aW9uIHAoYSxiLGMpe3JldHVybiBvKGEsZnVuY3Rpb24oYSl7cmV0dXJuIHQoYSkudGhlbihmdW5jdGlvbihhKXtyZXR1cm4gYi5hcHBseSh2b2lkIDAsYSl9LGMpfSxjKX1mdW5jdGlvbiBxKGEsYixjKXt2YXIgZD1nKCk7cmV0dXJuIEEoZnVuY3Rpb24oKXtuKGEpLnByb21pc2VEaXNwYXRjaChkLnJlc29sdmUsYixjKX0pLGQucHJvbWlzZX1mdW5jdGlvbiByKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1HKGFyZ3VtZW50cywxKTtyZXR1cm4gcShiLGEsYyl9fWZ1bmN0aW9uIHMoYSl7dmFyIGI9Ryhhcmd1bWVudHMsMSk7cmV0dXJuIFMoYSxiKX1mdW5jdGlvbiB0KGEpe3JldHVybiBvKGEsZnVuY3Rpb24oYSl7dmFyIGI9YS5sZW5ndGg7aWYoMD09PWIpcmV0dXJuIG4oYSk7dmFyIGM9ZygpO3JldHVybiBIKGEsZnVuY3Rpb24oZCxlLGYpe2soZSk/KGFbZl09aShlKSwwPT09LS1iJiZjLnJlc29sdmUoYSkpOm8oZSxmdW5jdGlvbihkKXthW2ZdPWQsMD09PS0tYiYmYy5yZXNvbHZlKGEpfSkuZmFpbChjLnJlamVjdCl9LHZvaWQgMCksYy5wcm9taXNlfSl9ZnVuY3Rpb24gdShhLGIpe3JldHVybiBvKGEsdm9pZCAwLGIpfWZ1bmN0aW9uIHYoYSxiKXt2YXIgYz1HKGFyZ3VtZW50cywyKSxkPWcoKTtyZXR1cm4gYy5wdXNoKGQubWFrZU5vZGVSZXNvbHZlcigpKSxSKGEsYixjKS5mYWlsKGQucmVqZWN0KSxkLnByb21pc2V9dmFyIHcseD1lKCkseT1mdW5jdGlvbigpe30sej1PYmplY3QuZnJlZXplfHx5O1widW5kZWZpbmVkXCIhPXR5cGVvZiBjYWphVk0mJih6PWNhamFWTS5kZWYpO3ZhciBBO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBwcm9jZXNzKUE9cHJvY2Vzcy5uZXh0VGljaztlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHNldEltbWVkaWF0ZSlBPXNldEltbWVkaWF0ZTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCl7dmFyIEI9bmV3IE1lc3NhZ2VDaGFubmVsLEM9e30sRD1DO0IucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKCl7Qz1DLm5leHQ7dmFyIGE9Qy50YXNrO2RlbGV0ZSBDLnRhc2ssYSgpfSxBPWZ1bmN0aW9uKGEpe0Q9RC5uZXh0PXt0YXNrOmF9LEIucG9ydDIucG9zdE1lc3NhZ2UoMCl9fWVsc2UgQT1mdW5jdGlvbihhKXtzZXRUaW1lb3V0KGEsMCl9O3ZhciBFO0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kPyhFPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLEU9RS5iaW5kKEUuY2FsbCkpOkU9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuY2FsbC5hcHBseShhLGFyZ3VtZW50cyl9fTt2YXIgRixHPUUoQXJyYXkucHJvdG90eXBlLnNsaWNlKSxIPUUoQXJyYXkucHJvdG90eXBlLnJlZHVjZXx8ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDs7KXtpZihjIGluIHRoaXMpe2I9dGhpc1tjKytdO2JyZWFrfWlmKCsrYz49ZCl0aHJvdyBuZXcgVHlwZUVycm9yfWZvcig7ZD5jO2MrKyljIGluIHRoaXMmJihiPWEoYix0aGlzW2NdLGMpKTtyZXR1cm4gYn0pLEk9RShBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxlbmd0aDtiKyspaWYodGhpc1tiXT09PWEpcmV0dXJuIGI7cmV0dXJuLTF9KSxKPUUoQXJyYXkucHJvdG90eXBlLm1hcHx8ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9W107cmV0dXJuIEgoYyxmdW5jdGlvbihlLGYsZyl7ZC5wdXNoKGEuY2FsbChiLGYsZyxjKSl9LHZvaWQgMCksZH0pLEs9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe31yZXR1cm4gYi5wcm90b3R5cGU9YSxuZXcgYn0sTD1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYiBpbiBhKWMucHVzaChiKTtyZXR1cm4gY30sTT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO0Y9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFJldHVyblZhbHVlP1JldHVyblZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMudmFsdWU9YX07dmFyIE49XCJGcm9tIHByZXZpb3VzIGV2ZW50OlwiO2IubmV4dFRpY2s9QSxiLmRlZmVyPWcsZy5wcm90b3R5cGUubWFrZU5vZGVSZXNvbHZlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Yj9hLnJlamVjdChiKTphcmd1bWVudHMubGVuZ3RoPjI/YS5yZXNvbHZlKEcoYXJndW1lbnRzLDEpKTphLnJlc29sdmUoYyl9fSxiLnByb21pc2U9ZnVuY3Rpb24oYSl7dmFyIGI9ZygpO3JldHVybiBzKGEsYi5yZXNvbHZlLGIucmVqZWN0LGIubm90aWZ5KS5mYWlsKGIucmVqZWN0KSxiLnByb21pc2V9LGIubWFrZVByb21pc2U9aCxoLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbyh0aGlzLGEsYixjKX0saC5wcm90b3R5cGUudGhlblJlc29sdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIG8odGhpcyxmdW5jdGlvbigpe3JldHVybiBhfSl9LEgoXCJpc1Jlc29sdmVkIGlzRnVsZmlsbGVkIGlzUmVqZWN0ZWQgZGlzcGF0Y2ggd2hlbiBzcHJlYWQgZ2V0IHB1dCBkZWwgcG9zdCBzZW5kIGludm9rZSBrZXlzIGZhcHBseSBmY2FsbCBmYmluZCBhbGwgYWxsUmVzb2x2ZWQgdGltZW91dCBkZWxheSBjYXRjaCBmaW5hbGx5IGZhaWwgZmluIHByb2dyZXNzIGVuZCBkb25lIG5mY2FsbCBuZmFwcGx5IG5mYmluZCBuY2FsbCBuYXBwbHkgbmJpbmQgbnBvc3QgbnNlbmQgbmludm9rZSBuZW5kIG5vZGVpZnlcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oYSxjKXtoLnByb3RvdHlwZVtjXT1mdW5jdGlvbigpe3JldHVybiBiW2NdLmFwcGx5KGIsW3RoaXNdLmNvbmNhdChHKGFyZ3VtZW50cykpKX19LHZvaWQgMCksaC5wcm90b3R5cGUudG9Tb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpfSxoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiW29iamVjdCBQcm9taXNlXVwifSx6KGgucHJvdG90eXBlKSxiLm5lYXJlcj1pLGIuaXNQcm9taXNlPWosYi5pc1Jlc29sdmVkPWZ1bmN0aW9uKGEpe3JldHVybiBrKGEpfHxsKGEpfSxiLmlzRnVsZmlsbGVkPWssYi5pc1JlamVjdGVkPWw7dmFyIE8sUD1bXSxRPVtdO2IucmVqZWN0PW0sYi5yZXNvbHZlPW4sYi5tYXN0ZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIGgoe2lzRGVmOmZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24oYixjKXtyZXR1cm4gcShhLGIsYyl9LGZ1bmN0aW9uKCl7cmV0dXJuIGkoYSl9KX0sYi53aGVuPW8sYi5zcHJlYWQ9cCxiLmFzeW5jPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZjt0cnl7Zj1jW2FdKGIpfWNhdGNoKGcpe3JldHVyblwiW29iamVjdCBTdG9wSXRlcmF0aW9uXVwiPT09TShnKXx8ZyBpbnN0YW5jZW9mIEY/Zy52YWx1ZTptKGcpfXJldHVybiBvKGYsZCxlKX12YXIgYz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxkPWIuYmluZChiLFwic2VuZFwiKSxlPWIuYmluZChiLFwidGhyb3dcIik7cmV0dXJuIGQoKX19LGJbXCJyZXR1cm5cIl09ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEYoYSl9LGIucHJvbWlzZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHAoW3RoaXMsdChhcmd1bWVudHMpXSxmdW5jdGlvbihiLGMpe3JldHVybiBhLmFwcGx5KGIsYyl9KX19LGIuZGlzcGF0Y2g9cSxiLmRpc3BhdGNoZXI9cixiLmdldD1yKFwiZ2V0XCIpLGIucHV0PXIoXCJwdXRcIiksYltcImRlbGV0ZVwiXT1iLmRlbD1yKFwiZGVsXCIpO3ZhciBSPWIucG9zdD1yKFwicG9zdFwiKTtiLnNlbmQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1HKGFyZ3VtZW50cywyKTtyZXR1cm4gUihhLGIsYyl9LGIuaW52b2tlPWYoYi5zZW5kLFwiaW52b2tlXCIsXCJzZW5kXCIpO3ZhciBTPWIuZmFwcGx5PXIoXCJhcHBseVwiKTtiW1widHJ5XCJdPXMsYi5mY2FsbD1zLGIuZmJpbmQ9ZnVuY3Rpb24oYSl7dmFyIGI9Ryhhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9Yi5jb25jYXQoRyhhcmd1bWVudHMpKTtyZXR1cm4gUyhhLGMpfX0sYi5rZXlzPXIoXCJrZXlzXCIpLGIuYWxsPXQsYi5hbGxSZXNvbHZlZD1mdW5jdGlvbihhKXtyZXR1cm4gbyhhLGZ1bmN0aW9uKGEpe3JldHVybiBvKHQoSihhLGZ1bmN0aW9uKGEpe3JldHVybiBvKGEseSx5KX0pKSxmdW5jdGlvbigpe3JldHVybiBKKGEsbil9KX0pfSxiW1wiY2F0Y2hcIl09Yi5mYWlsPXUsYi5wcm9ncmVzcz1mdW5jdGlvbihhLGIpe3JldHVybiBvKGEsdm9pZCAwLHZvaWQgMCxiKX0sYltcImZpbmFsbHlcIl09Yi5maW49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbyhhLGZ1bmN0aW9uKGEpe3JldHVybiBvKGIoKSxmdW5jdGlvbigpe3JldHVybiBhfSl9LGZ1bmN0aW9uKGEpe3JldHVybiBvKGIoKSxmdW5jdGlvbigpe3JldHVybiBtKGEpfSl9KX0sYi5kb25lPWZ1bmN0aW9uKGEsZCxlLGYpe2Q9ZHx8ZXx8Zj9vKGEsZCxlLGYpOmEsdShkLGZ1bmN0aW9uKGQpe0EoZnVuY3Rpb24oKXtpZihjKGQsYSksIWIub25lcnJvcil0aHJvdyBkO2Iub25lcnJvcihkKX0pfSl9LGIudGltZW91dD1mdW5jdGlvbihhLGIpe3ZhciBjPWcoKSxkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjLnJlamVjdChFcnJvcihcIlRpbWVkIG91dCBhZnRlciBcIitiK1wiIG1zXCIpKX0sYik7cmV0dXJuIG8oYSxmdW5jdGlvbihhKXtjbGVhclRpbWVvdXQoZCksYy5yZXNvbHZlKGEpfSxmdW5jdGlvbihhKXtjbGVhclRpbWVvdXQoZCksYy5yZWplY3QoYSl9KSxjLnByb21pc2V9LGIuZGVsYXk9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj1hLGE9dm9pZCAwKTt2YXIgYz1nKCk7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjLnJlc29sdmUoYSl9LGIpLGMucHJvbWlzZX0sYi5uZmFwcGx5PWZ1bmN0aW9uKGEsYil7dmFyIGM9RyhiKSxkPWcoKTtyZXR1cm4gYy5wdXNoKGQubWFrZU5vZGVSZXNvbHZlcigpKSxTKGEsYykuZmFpbChkLnJlamVjdCksZC5wcm9taXNlfSxiLm5mY2FsbD1mdW5jdGlvbihhKXt2YXIgYj1HKGFyZ3VtZW50cywxKSxjPWcoKTtyZXR1cm4gYi5wdXNoKGMubWFrZU5vZGVSZXNvbHZlcigpKSxTKGEsYikuZmFpbChjLnJlamVjdCksYy5wcm9taXNlfSxiLm5mYmluZD1mdW5jdGlvbihhKXt2YXIgYj1HKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1iLmNvbmNhdChHKGFyZ3VtZW50cykpLGQ9ZygpO3JldHVybiBjLnB1c2goZC5tYWtlTm9kZVJlc29sdmVyKCkpLFMoYSxjKS5mYWlsKGQucmVqZWN0KSxkLnByb21pc2V9fSxiLm5wb3N0PWZ1bmN0aW9uKGEsYixjKXt2YXIgYz1HKGMpLGQ9ZygpO3JldHVybiBjLnB1c2goZC5tYWtlTm9kZVJlc29sdmVyKCkpLFIoYSxiLGMpLmZhaWwoZC5yZWplY3QpLGQucHJvbWlzZX0sYi5uc2VuZD12LGIubmludm9rZT1mKHYsXCJuaW52b2tlXCIsXCJuc2VuZFwiKSxiLm5vZGVpZnk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj8oYS50aGVuKGZ1bmN0aW9uKGEpe0EoZnVuY3Rpb24oKXtiKG51bGwsYSl9KX0sZnVuY3Rpb24oYSl7QShmdW5jdGlvbigpe2IoYSl9KX0pLHZvaWQgMCk6YX07dmFyIFQ9ZSgpfSksZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9e1ZFUlNJT046XCIwLjUuM1wifTtiLlN5c3RlbT1mdW5jdGlvbigpe3RoaXMuX21hcHBpbmdzPXt9LHRoaXMuX291dGxldHM9e30sdGhpcy5faGFuZGxlcnM9e30sdGhpcy5zdHJpY3RJbmplY3Rpb25zPSEwLHRoaXMuYXV0b01hcE91dGxldHM9ITEsdGhpcy5wb3N0SW5qZWN0aW9uSG9vaz1cInNldHVwXCJ9LGIuU3lzdGVtLnByb3RvdHlwZT17X2NyZWF0ZUFuZFNldHVwSW5zdGFuY2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgYjtyZXR1cm4gdGhpcy5pbmplY3RJbnRvKGMsYSksY30sX3JldHJpZXZlRnJvbUNhY2hlT3JDcmVhdGU6ZnVuY3Rpb24oYSxiKXtcInVuZGVmaW5lZFwiPT10eXBlb2YgYiYmKGI9ITEpO3ZhciBjO2lmKCF0aGlzLl9tYXBwaW5ncy5oYXNPd25Qcm9wZXJ0eShhKSl0aHJvdyBuZXcgRXJyb3IoMWUzKTt2YXIgZD10aGlzLl9tYXBwaW5nc1thXTtyZXR1cm4hYiYmZC5pc1NpbmdsZXRvbj8obnVsbD09ZC5vYmplY3QmJihkLm9iamVjdD10aGlzLl9jcmVhdGVBbmRTZXR1cEluc3RhbmNlKGEsZC5jbGF6eikpLGM9ZC5vYmplY3QpOmM9ZC5jbGF6ej90aGlzLl9jcmVhdGVBbmRTZXR1cEluc3RhbmNlKGEsZC5jbGF6eik6ZC5vYmplY3QsY30sbWFwT3V0bGV0OmZ1bmN0aW9uKGEsYixjKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTAxMCk7cmV0dXJuIGI9Ynx8XCJnbG9iYWxcIixjPWN8fGEsdGhpcy5fb3V0bGV0cy5oYXNPd25Qcm9wZXJ0eShiKXx8KHRoaXMuX291dGxldHNbYl09e30pLHRoaXMuX291dGxldHNbYl1bY109YSx0aGlzfSxnZXRPYmplY3Q6ZnVuY3Rpb24oYSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKDEwMjApO3JldHVybiB0aGlzLl9yZXRyaWV2ZUZyb21DYWNoZU9yQ3JlYXRlKGEpfSxtYXBWYWx1ZTpmdW5jdGlvbihhLGIpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigxMDMwKTtyZXR1cm4gdGhpcy5fbWFwcGluZ3NbYV09e2NsYXp6Om51bGwsb2JqZWN0OmIsaXNTaW5nbGV0b246ITB9LHRoaXMuYXV0b01hcE91dGxldHMmJnRoaXMubWFwT3V0bGV0KGEpLHRoaXMuaGFzTWFwcGluZyhhKSYmdGhpcy5pbmplY3RJbnRvKGIsYSksdGhpc30saGFzTWFwcGluZzpmdW5jdGlvbihhKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTA0MCk7cmV0dXJuIHRoaXMuX21hcHBpbmdzLmhhc093blByb3BlcnR5KGEpfSxtYXBDbGFzczpmdW5jdGlvbihhLGIpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigxMDUwKTtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYil0aHJvdyBuZXcgRXJyb3IoMTA1MSk7cmV0dXJuIHRoaXMuX21hcHBpbmdzW2FdPXtjbGF6ejpiLG9iamVjdDpudWxsLGlzU2luZ2xldG9uOiExfSx0aGlzLmF1dG9NYXBPdXRsZXRzJiZ0aGlzLm1hcE91dGxldChhKSx0aGlzfSxtYXBTaW5nbGV0b246ZnVuY3Rpb24oYSxiKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTA2MCk7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGIpdGhyb3cgbmV3IEVycm9yKDEwNjEpO3JldHVybiB0aGlzLl9tYXBwaW5nc1thXT17Y2xheno6YixvYmplY3Q6bnVsbCxpc1NpbmdsZXRvbjohMH0sdGhpcy5hdXRvTWFwT3V0bGV0cyYmdGhpcy5tYXBPdXRsZXQoYSksdGhpc30saW5zdGFudGlhdGU6ZnVuY3Rpb24oYSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKDEwNzApO3JldHVybiB0aGlzLl9yZXRyaWV2ZUZyb21DYWNoZU9yQ3JlYXRlKGEsITApfSxpbmplY3RJbnRvOmZ1bmN0aW9uKGEsYil7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKDEwODApO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBhKXt2YXIgYz1bXTt0aGlzLl9vdXRsZXRzLmhhc093blByb3BlcnR5KFwiZ2xvYmFsXCIpJiZjLnB1c2godGhpcy5fb3V0bGV0cy5nbG9iYWwpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBiJiZ0aGlzLl9vdXRsZXRzLmhhc093blByb3BlcnR5KGIpJiZjLnB1c2godGhpcy5fb3V0bGV0c1tiXSk7Zm9yKHZhciBkIGluIGMpe3ZhciBlPWNbZF07Zm9yKHZhciBmIGluIGUpe3ZhciBnPWVbZl07KCF0aGlzLnN0cmljdEluamVjdGlvbnN8fGYgaW4gYSkmJihhW2ZdPXRoaXMuZ2V0T2JqZWN0KGcpKX19XCJzZXR1cFwiaW4gYSYmYS5zZXR1cC5jYWxsKGEpfXJldHVybiB0aGlzfSx1bm1hcDpmdW5jdGlvbihhKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTA5MCk7cmV0dXJuIGRlbGV0ZSB0aGlzLl9tYXBwaW5nc1thXSx0aGlzfSx1bm1hcE91dGxldDpmdW5jdGlvbihhLGIpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigxMTAwKTtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYil0aHJvdyBuZXcgRXJyb3IoMTEwMSk7cmV0dXJuIGRlbGV0ZSB0aGlzLl9vdXRsZXRzW2FdW2JdLHRoaXN9LG1hcEhhbmRsZXI6ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTExMCk7cmV0dXJuIGI9Ynx8XCJnbG9iYWxcIixjPWN8fGEsXCJ1bmRlZmluZWRcIj09dHlwZW9mIGQmJihkPSExKSxcInVuZGVmaW5lZFwiPT10eXBlb2YgZSYmKGU9ITEpLHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGEpfHwodGhpcy5faGFuZGxlcnNbYV09e30pLHRoaXMuX2hhbmRsZXJzW2FdLmhhc093blByb3BlcnR5KGIpfHwodGhpcy5faGFuZGxlcnNbYV1bYl09W10pLHRoaXMuX2hhbmRsZXJzW2FdW2JdLnB1c2goe2hhbmRsZXI6YyxvbmVTaG90OmQscGFzc0V2ZW50OmV9KSx0aGlzfSx1bm1hcEhhbmRsZXI6ZnVuY3Rpb24oYSxiLGMpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigxMTIwKTtpZihiPWJ8fFwiZ2xvYmFsXCIsYz1jfHxhLHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGEpJiZ0aGlzLl9oYW5kbGVyc1thXS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGQ9dGhpcy5faGFuZGxlcnNbYV1bYl07Zm9yKHZhciBlIGluIGQpe3ZhciBmPWRbZV07aWYoZi5oYW5kbGVyPT09Yyl7ZC5zcGxpY2UoZSwxKTticmVha319fXJldHVybiB0aGlzfSxub3RpZnk6ZnVuY3Rpb24oYSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKDExMzApO3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksYz1iLnNsaWNlKDEpO2lmKHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgZD10aGlzLl9oYW5kbGVyc1thXTtmb3IodmFyIGUgaW4gZCl7dmFyIGYsZz1kW2VdO1wiZ2xvYmFsXCIhPT1lJiYoZj10aGlzLmdldE9iamVjdChlKSk7dmFyIGgsaSxqPVtdO2ZvcihoPTAsaT1nLmxlbmd0aDtpPmg7aCsrKXt2YXIgayxsPWdbaF07az1mJiZcInN0cmluZ1wiPT10eXBlb2YgbC5oYW5kbGVyP2ZbbC5oYW5kbGVyXTpsLmhhbmRsZXIsbC5vbmVTaG90JiZqLnVuc2hpZnQoaCksbC5wYXNzRXZlbnQ/ay5hcHBseShmLGIpOmsuYXBwbHkoZixjKX1mb3IoaD0wLGk9ai5sZW5ndGg7aT5oO2grKylnLnNwbGljZShqW2hdLDEpfX1yZXR1cm4gdGhpc319LGEuZGlqb249Yn0odGhpcyksXCJ1bmRlZmluZWRcIj09dHlwZW9mIHV0aWxzKXZhciB1dGlscz17fTtcInVuZGVmaW5lZFwiPT10eXBlb2YgdXRpbHMuTWF0aCYmKHV0aWxzLk1hdGg9e30pLHV0aWxzLk1hdGgudG82NEJpdE51bWJlcj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZTtyZXR1cm4gYz1uZXcgZ29vZy5tYXRoLkxvbmcoMCxiKSxkPW5ldyBnb29nLm1hdGguTG9uZyhhLDApLGU9Yy5hZGQoZCksZS50b051bWJlcigpfSxnb29nPXt9LGdvb2cubWF0aD17fSxnb29nLm1hdGguTG9uZz1mdW5jdGlvbihhLGIpe3RoaXMubG93Xz0wfGEsdGhpcy5oaWdoXz0wfGJ9LGdvb2cubWF0aC5Mb25nLkludENhY2hlXz17fSxnb29nLm1hdGguTG9uZy5mcm9tSW50PWZ1bmN0aW9uKGEpe2lmKGE+PS0xMjgmJjEyOD5hKXt2YXIgYj1nb29nLm1hdGguTG9uZy5JbnRDYWNoZV9bYV07aWYoYilyZXR1cm4gYn12YXIgYz1uZXcgZ29vZy5tYXRoLkxvbmcoMHxhLDA+YT8tMTowKTtyZXR1cm4gYT49LTEyOCYmMTI4PmEmJihnb29nLm1hdGguTG9uZy5JbnRDYWNoZV9bYV09YyksY30sZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcj1mdW5jdGlvbihhKXtyZXR1cm4gaXNOYU4oYSl8fCFpc0Zpbml0ZShhKT9nb29nLm1hdGguTG9uZy5aRVJPOmE8PS1nb29nLm1hdGguTG9uZy5UV09fUFdSXzYzX0RCTF8/Z29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFOmErMT49Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl82M19EQkxfP2dvb2cubWF0aC5Mb25nLk1BWF9WQUxVRTowPmE/Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcigtYSkubmVnYXRlKCk6bmV3IGdvb2cubWF0aC5Mb25nKDB8YSVnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8sMHxhL2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXyl9LGdvb2cubWF0aC5Mb25nLmZyb21CaXRzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBnb29nLm1hdGguTG9uZyhhLGIpfSxnb29nLm1hdGguTG9uZy5mcm9tU3RyaW5nPWZ1bmN0aW9uKGEsYil7aWYoMD09YS5sZW5ndGgpdGhyb3cgRXJyb3IoXCJudW1iZXIgZm9ybWF0IGVycm9yOiBlbXB0eSBzdHJpbmdcIik7dmFyIGM9Ynx8MTA7aWYoMj5jfHxjPjM2KXRocm93IEVycm9yKFwicmFkaXggb3V0IG9mIHJhbmdlOiBcIitjKTtpZihcIi1cIj09YS5jaGFyQXQoMCkpcmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21TdHJpbmcoYS5zdWJzdHJpbmcoMSksYykubmVnYXRlKCk7aWYoYS5pbmRleE9mKFwiLVwiKT49MCl0aHJvdyBFcnJvcignbnVtYmVyIGZvcm1hdCBlcnJvcjogaW50ZXJpb3IgXCItXCIgY2hhcmFjdGVyOiAnK2EpO2Zvcih2YXIgZD1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKE1hdGgucG93KGMsOCkpLGU9Z29vZy5tYXRoLkxvbmcuWkVSTyxmPTA7ZjxhLmxlbmd0aDtmKz04KXt2YXIgZz1NYXRoLm1pbig4LGEubGVuZ3RoLWYpLGg9cGFyc2VJbnQoYS5zdWJzdHJpbmcoZixmK2cpLGMpO2lmKDg+Zyl7dmFyIGk9Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihNYXRoLnBvdyhjLGcpKTtlPWUubXVsdGlwbHkoaSkuYWRkKGdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoaCkpfWVsc2UgZT1lLm11bHRpcGx5KGQpLGU9ZS5hZGQoZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihoKSl9cmV0dXJuIGV9LGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMTZfREJMXz02NTUzNixnb29nLm1hdGguTG9uZy5UV09fUFdSXzI0X0RCTF89MTw8MjQsZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMl9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMTZfREJMXypnb29nLm1hdGguTG9uZy5UV09fUFdSXzE2X0RCTF8sZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMV9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXy8yLGdvb2cubWF0aC5Mb25nLlRXT19QV1JfNDhfREJMXz1nb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8qZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8xNl9EQkxfLGdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjRfREJMXz1nb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8qZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMl9EQkxfLGdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjNfREJMXz1nb29nLm1hdGguTG9uZy5UV09fUFdSXzY0X0RCTF8vMixnb29nLm1hdGguTG9uZy5aRVJPPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMCksZ29vZy5tYXRoLkxvbmcuT05FPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMSksZ29vZy5tYXRoLkxvbmcuTkVHX09ORT1nb29nLm1hdGguTG9uZy5mcm9tSW50KC0xKSxnb29nLm1hdGguTG9uZy5NQVhfVkFMVUU9Z29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoLTEsMjE0NzQ4MzY0NyksZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFPWdvb2cubWF0aC5Mb25nLmZyb21CaXRzKDAsLTIxNDc0ODM2NDgpLGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMTw8MjQpLGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS50b0ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvd199LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hfKmdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXyt0aGlzLmdldExvd0JpdHNVbnNpZ25lZCgpfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oYSl7dmFyIGI9YXx8MTA7aWYoMj5ifHxiPjM2KXRocm93IEVycm9yKFwicmFkaXggb3V0IG9mIHJhbmdlOiBcIitiKTtpZih0aGlzLmlzWmVybygpKXJldHVyblwiMFwiO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXtpZih0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXt2YXIgYz1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKGIpLGQ9dGhpcy5kaXYoYyksZT1kLm11bHRpcGx5KGMpLnN1YnRyYWN0KHRoaXMpO3JldHVybiBkLnRvU3RyaW5nKGIpK2UudG9JbnQoKS50b1N0cmluZyhiKX1yZXR1cm5cIi1cIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGIpfWZvcih2YXIgZj1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKE1hdGgucG93KGIsNikpLGU9dGhpcyxnPVwiXCI7Oyl7dmFyIGg9ZS5kaXYoZiksaT1lLnN1YnRyYWN0KGgubXVsdGlwbHkoZikpLnRvSW50KCksaj1pLnRvU3RyaW5nKGIpO2lmKGU9aCxlLmlzWmVybygpKXJldHVybiBqK2c7Zm9yKDtqLmxlbmd0aDw2OylqPVwiMFwiK2o7Zz1cIlwiK2orZ319LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5nZXRIaWdoQml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hffSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0TG93Qml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvd199LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5nZXRMb3dCaXRzVW5zaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dfPj0wP3RoaXMubG93Xzpnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8rdGhpcy5sb3dffSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0TnVtQml0c0Ficz1mdW5jdGlvbigpe2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpPzY0OnRoaXMubmVnYXRlKCkuZ2V0TnVtQml0c0FicygpO2Zvcih2YXIgYT0wIT10aGlzLmhpZ2hfP3RoaXMuaGlnaF86dGhpcy5sb3dfLGI9MzE7Yj4wJiYwPT0oYSYxPDxiKTtiLS0pO3JldHVybiAwIT10aGlzLmhpZ2hfP2IrMzM6YisxfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PXRoaXMuaGlnaF8mJjA9PXRoaXMubG93X30sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmlzTmVnYXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoXzwwfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNPZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09KDEmdGhpcy5sb3dfKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oaWdoXz09YS5oaWdoXyYmdGhpcy5sb3dfPT1hLmxvd199LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ub3RFcXVhbHM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGlnaF8hPWEuaGlnaF98fHRoaXMubG93XyE9YS5sb3dffSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubGVzc1RoYW49ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcGFyZShhKTwwfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubGVzc1RoYW5PckVxdWFsPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbXBhcmUoYSk8PTB9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ncmVhdGVyVGhhbj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb21wYXJlKGEpPjB9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcGFyZShhKT49MH0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oYSl7aWYodGhpcy5lcXVhbHMoYSkpcmV0dXJuIDA7dmFyIGI9dGhpcy5pc05lZ2F0aXZlKCksYz1hLmlzTmVnYXRpdmUoKTtyZXR1cm4gYiYmIWM/LTE6IWImJmM/MTp0aGlzLnN1YnRyYWN0KGEpLmlzTmVnYXRpdmUoKT8tMToxfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubmVnYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSk/Z29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFOnRoaXMubm90KCkuYWRkKGdvb2cubWF0aC5Mb25nLk9ORSl9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oaWdoXz4+PjE2LGM9NjU1MzUmdGhpcy5oaWdoXyxkPXRoaXMubG93Xz4+PjE2LGU9NjU1MzUmdGhpcy5sb3dfLGY9YS5oaWdoXz4+PjE2LGc9NjU1MzUmYS5oaWdoXyxoPWEubG93Xz4+PjE2LGk9NjU1MzUmYS5sb3dfLGo9MCxrPTAsbD0wLG09MDtyZXR1cm4gbSs9ZStpLGwrPW0+Pj4xNixtJj02NTUzNSxsKz1kK2gsays9bD4+PjE2LGwmPTY1NTM1LGsrPWMrZyxqKz1rPj4+MTYsayY9NjU1MzUsais9YitmLGomPTY1NTM1LGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGw8PDE2fG0sajw8MTZ8ayl9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5zdWJ0cmFjdD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQoYS5uZWdhdGUoKSl9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbihhKXtpZih0aGlzLmlzWmVybygpKXJldHVybiBnb29nLm1hdGguTG9uZy5aRVJPO2lmKGEuaXNaZXJvKCkpcmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk87aWYodGhpcy5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSlyZXR1cm4gYS5pc09kZCgpP2dvb2cubWF0aC5Mb25nLk1JTl9WQUxVRTpnb29nLm1hdGguTG9uZy5aRVJPO2lmKGEuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMuaXNPZGQoKT9nb29nLm1hdGguTG9uZy5NSU5fVkFMVUU6Z29vZy5tYXRoLkxvbmcuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gYS5pc05lZ2F0aXZlKCk/dGhpcy5uZWdhdGUoKS5tdWx0aXBseShhLm5lZ2F0ZSgpKTp0aGlzLm5lZ2F0ZSgpLm11bHRpcGx5KGEpLm5lZ2F0ZSgpO2lmKGEuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bHRpcGx5KGEubmVnYXRlKCkpLm5lZ2F0ZSgpO2lmKHRoaXMubGVzc1RoYW4oZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8yNF8pJiZhLmxlc3NUaGFuKGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfKSlyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkqYS50b051bWJlcigpKTt2YXIgYj10aGlzLmhpZ2hfPj4+MTYsYz02NTUzNSZ0aGlzLmhpZ2hfLGQ9dGhpcy5sb3dfPj4+MTYsZT02NTUzNSZ0aGlzLmxvd18sZj1hLmhpZ2hfPj4+MTYsZz02NTUzNSZhLmhpZ2hfLGg9YS5sb3dfPj4+MTYsaT02NTUzNSZhLmxvd18saj0wLGs9MCxsPTAsbT0wO3JldHVybiBtKz1lKmksbCs9bT4+PjE2LG0mPTY1NTM1LGwrPWQqaSxrKz1sPj4+MTYsbCY9NjU1MzUsbCs9ZSpoLGsrPWw+Pj4xNixsJj02NTUzNSxrKz1jKmksais9az4+PjE2LGsmPTY1NTM1LGsrPWQqaCxqKz1rPj4+MTYsayY9NjU1MzUsays9ZSpnLGorPWs+Pj4xNixrJj02NTUzNSxqKz1iKmkrYypoK2QqZytlKmYsaiY9NjU1MzUsZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHMobDw8MTZ8bSxqPDwxNnxrKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmRpdj1mdW5jdGlvbihhKXtpZihhLmlzWmVybygpKXRocm93IEVycm9yKFwiZGl2aXNpb24gYnkgemVyb1wiKTtpZih0aGlzLmlzWmVybygpKXJldHVybiBnb29nLm1hdGguTG9uZy5aRVJPO2lmKHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpe2lmKGEuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk9ORSl8fGEuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk5FR19PTkUpKXJldHVybiBnb29nLm1hdGguTG9uZy5NSU5fVkFMVUU7aWYoYS5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSlyZXR1cm4gZ29vZy5tYXRoLkxvbmcuT05FO3ZhciBiPXRoaXMuc2hpZnRSaWdodCgxKSxjPWIuZGl2KGEpLnNoaWZ0TGVmdCgxKTtpZihjLmVxdWFscyhnb29nLm1hdGguTG9uZy5aRVJPKSlyZXR1cm4gYS5pc05lZ2F0aXZlKCk/Z29vZy5tYXRoLkxvbmcuT05FOmdvb2cubWF0aC5Mb25nLk5FR19PTkU7dmFyIGQ9dGhpcy5zdWJ0cmFjdChhLm11bHRpcGx5KGMpKSxlPWMuYWRkKGQuZGl2KGEpKTtyZXR1cm4gZX1pZihhLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXJldHVybiBnb29nLm1hdGguTG9uZy5aRVJPO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBhLmlzTmVnYXRpdmUoKT90aGlzLm5lZ2F0ZSgpLmRpdihhLm5lZ2F0ZSgpKTp0aGlzLm5lZ2F0ZSgpLmRpdihhKS5uZWdhdGUoKTtpZihhLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5kaXYoYS5uZWdhdGUoKSkubmVnYXRlKCk7Zm9yKHZhciBmPWdvb2cubWF0aC5Mb25nLlpFUk8sZD10aGlzO2QuZ3JlYXRlclRoYW5PckVxdWFsKGEpOyl7Zm9yKHZhciBjPU1hdGgubWF4KDEsTWF0aC5mbG9vcihkLnRvTnVtYmVyKCkvYS50b051bWJlcigpKSksZz1NYXRoLmNlaWwoTWF0aC5sb2coYykvTWF0aC5MTjIpLGg9NDg+PWc/MTpNYXRoLnBvdygyLGctNDgpLGk9Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihjKSxqPWkubXVsdGlwbHkoYSk7ai5pc05lZ2F0aXZlKCl8fGouZ3JlYXRlclRoYW4oZCk7KWMtPWgsaT1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKGMpLGo9aS5tdWx0aXBseShhKTtpLmlzWmVybygpJiYoaT1nb29nLm1hdGguTG9uZy5PTkUpLGY9Zi5hZGQoaSksZD1kLnN1YnRyYWN0KGopfXJldHVybiBmfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubW9kdWxvPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN1YnRyYWN0KHRoaXMuZGl2KGEpLm11bHRpcGx5KGEpKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyh+dGhpcy5sb3dfLH50aGlzLmhpZ2hfKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmFuZD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHModGhpcy5sb3dfJmEubG93Xyx0aGlzLmhpZ2hfJmEuaGlnaF8pfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUub3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKHRoaXMubG93X3xhLmxvd18sdGhpcy5oaWdoX3xhLmhpZ2hfKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnhvcj1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHModGhpcy5sb3dfXmEubG93Xyx0aGlzLmhpZ2hfXmEuaGlnaF8pfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuc2hpZnRMZWZ0PWZ1bmN0aW9uKGEpe2lmKGEmPTYzLDA9PWEpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5sb3dfO2lmKDMyPmEpe3ZhciBjPXRoaXMuaGlnaF87cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGI8PGEsYzw8YXxiPj4+MzItYSl9cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKDAsYjw8YS0zMil9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5zaGlmdFJpZ2h0PWZ1bmN0aW9uKGEpe2lmKGEmPTYzLDA9PWEpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5oaWdoXztpZigzMj5hKXt2YXIgYz10aGlzLmxvd187cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGM+Pj5hfGI8PDMyLWEsYj4+YSl9cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGI+PmEtMzIsYj49MD8wOi0xKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZD1mdW5jdGlvbihhKXtpZihhJj02MywwPT1hKXJldHVybiB0aGlzO3ZhciBiPXRoaXMuaGlnaF87aWYoMzI+YSl7dmFyIGM9dGhpcy5sb3dfO3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyhjPj4+YXxiPDwzMi1hLGI+Pj5hKX1yZXR1cm4gMzI9PWE/Z29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoYiwwKTpnb29nLm1hdGguTG9uZy5mcm9tQml0cyhiPj4+YS0zMiwwKX07dmFyIFVURjg9e307VVRGOC5lbmNvZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoOysrYyl7dmFyIGQ9YS5jaGFyQ29kZUF0KGMpOzEyOD5kP2IucHVzaChkKToyMDQ4PmQ/KGIucHVzaCgxOTJ8ZD4+NiksYi5wdXNoKDEyOHw2MyZkKSk6NjU1MzY+ZD8oYi5wdXNoKDIyNHxkPj4xMiksYi5wdXNoKDEyOHw2MyZkPj42KSxiLnB1c2goMTI4fDYzJmQpKTooYi5wdXNoKDI0MHxkPj4xOCksYi5wdXNoKDEyOHw2MyZkPj4xMiksYi5wdXNoKDEyOHw2MyZkPj42KSxiLnB1c2goMTI4fDYzJmQpKX1yZXR1cm4gYn0sVVRGOC5kZWNvZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoOyl7dmFyIGQ9YVtjKytdOzEyOD5kfHwoMjI0PmQ/KGQ9KDMxJmQpPDw2LGR8PTYzJmFbYysrXSk6MjQwPmQ/KGQ9KDE1JmQpPDwxMixkfD0oNjMmYVtjKytdKTw8NixkfD02MyZhW2MrK10pOihkPSg3JmQpPDwxOCxkfD0oNjMmYVtjKytdKTw8MTIsZHw9KDYzJmFbYysrXSk8PDYsZHw9NjMmYVtjKytdKSksYi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZCkpfXJldHVybiBiLmpvaW4oXCJcIil9O3ZhciBCQVNFNjQ9e307aWYoZnVuY3Rpb24oYil7dmFyIGM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZD1bXSxlPTB8YS5sZW5ndGgvMzswPGUtLTspe3ZhciBmPShhW2NdPDwxNikrKGFbYysxXTw8OCkrYVtjKzJdO2MrPTMsZC5wdXNoKGIuY2hhckF0KDYzJmY+PjE4KSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjEyKSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjYpKSxkLnB1c2goYi5jaGFyQXQoNjMmZikpfWlmKDI9PWEubGVuZ3RoLWMpe3ZhciBmPShhW2NdPDwxNikrKGFbYysxXTw8OCk7ZC5wdXNoKGIuY2hhckF0KDYzJmY+PjE4KSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjEyKSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjYpKSxkLnB1c2goXCI9XCIpfWVsc2UgaWYoMT09YS5sZW5ndGgtYyl7dmFyIGY9YVtjXTw8MTY7ZC5wdXNoKGIuY2hhckF0KDYzJmY+PjE4KSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjEyKSksZC5wdXNoKFwiPT1cIil9cmV0dXJuIGQuam9pbihcIlwiKX0sZD1mdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7YzxiLmxlbmd0aDsrK2MpYVtiLmNoYXJDb2RlQXQoYyldPWM7cmV0dXJuIGFbXCI9XCIuY2hhckNvZGVBdCgwKV09MCxhfSgpLGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1bXSxlPTB8YS5sZW5ndGgvNDswPGUtLTspe3ZhciBmPShkW2EuY2hhckNvZGVBdChiKV08PDE4KSsoZFthLmNoYXJDb2RlQXQoYisxKV08PDEyKSsoZFthLmNoYXJDb2RlQXQoYisyKV08PDYpK2RbYS5jaGFyQ29kZUF0KGIrMyldO2MucHVzaCgyNTUmZj4+MTYpLGMucHVzaCgyNTUmZj4+OCksYy5wdXNoKDI1NSZmKSxiKz00fXJldHVybiBjJiYoXCI9XCI9PWEuY2hhckF0KGItMik/KGMucG9wKCksYy5wb3AoKSk6XCI9XCI9PWEuY2hhckF0KGItMSkmJmMucG9wKCkpLGN9LGY9e307Zi5lbmNvZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoOysrYyliLnB1c2goYS5jaGFyQ29kZUF0KGMpKTtyZXR1cm4gYn0sZi5kZWNvZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPHMubGVuZ3RoOysrYilhW2JdPVN0cmluZy5mcm9tQ2hhckNvZGUoYVtiXSk7cmV0dXJuIGEuam9pbihcIlwiKX0sQkFTRTY0LmRlY29kZUFycmF5PWZ1bmN0aW9uKGEpe3ZhciBiPWUoYSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KGIpfSxCQVNFNjQuZW5jb2RlQVNDSUk9ZnVuY3Rpb24oYSl7dmFyIGI9Zi5lbmNvZGUoYSk7cmV0dXJuIGMoYil9LEJBU0U2NC5kZWNvZGVBU0NJST1mdW5jdGlvbihhKXt2YXIgYj1lKGEpO3JldHVybiBmLmRlY29kZShiKX0sQkFTRTY0LmVuY29kZT1mdW5jdGlvbihhKXt2YXIgYj1VVEY4LmVuY29kZShhKTtyZXR1cm4gYyhiKX0sQkFTRTY0LmRlY29kZT1mdW5jdGlvbihhKXt2YXIgYj1lKGEpO3JldHVybiBVVEY4LmRlY29kZShiKX19KFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiKSx2b2lkIDA9PT1idG9hKXZhciBidG9hPUJBU0U2NC5lbmNvZGU7aWYodm9pZCAwPT09YXRvYil2YXIgYXRvYj1CQVNFNjQuZGVjb2RlO01lZGlhUGxheWVyPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiLGMsZCxlLGYsZz1cIjEuMC4wXCIsaD1hLGk9ITEsaj0hMSxrPSEwLGw9ITEsbT1NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfU0laRV9SRVFVSVJFRCxuPWZ1bmN0aW9uKCl7cmV0dXJuISFjJiYhIWR9LG89ZnVuY3Rpb24oKXtpZighaSl0aHJvd1wiTWVkaWFQbGF5ZXIgbm90IGluaXRpYWxpemVkIVwiO2lmKCF0aGlzLmNhcGFiaWxpdGllcy5zdXBwb3J0c01lZGlhU291cmNlKCkpcmV0dXJuIHRoaXMuZXJySGFuZGxlci5jYXBhYmlsaXR5RXJyb3IoXCJtZWRpYXNvdXJjZVwiKSx2b2lkIDA7aWYoIWN8fCFkKXRocm93XCJNaXNzaW5nIHZpZXcgb3Igc291cmNlLlwiO2o9ITAsdGhpcy5kZWJ1Zy5sb2coXCJQbGF5YmFjayBpbml0aWF0ZWQhXCIpLGU9Yi5nZXRPYmplY3QoXCJzdHJlYW1Db250cm9sbGVyXCIpLGUuc2V0VmlkZW9Nb2RlbChmKSxlLnNldEF1dG9QbGF5KGspLGUubG9hZChkKSxiLm1hcFZhbHVlKFwic2NoZWR1bGVXaGlsZVBhdXNlZFwiLGwpLGIubWFwT3V0bGV0KFwic2NoZWR1bGVXaGlsZVBhdXNlZFwiLFwic3RyZWFtXCIpLGIubWFwVmFsdWUoXCJidWZmZXJNYXhcIixtKSxiLmluamVjdEludG8odGhpcy5idWZmZXJFeHQsXCJidWZmZXJNYXhcIil9LHA9ZnVuY3Rpb24oKXtuKCkmJm8uY2FsbCh0aGlzKX07cmV0dXJuIGI9bmV3IGRpam9uLlN5c3RlbSxiLm1hcFZhbHVlKFwic3lzdGVtXCIsYiksYi5tYXBPdXRsZXQoXCJzeXN0ZW1cIiksYi5pbmplY3RJbnRvKGgpLHtkZWJ1Zzp2b2lkIDAsZXZlbnRCdXM6dm9pZCAwLGNhcGFiaWxpdGllczp2b2lkIDAsYWJyQ29udHJvbGxlcjp2b2lkIDAsbWV0cmljc01vZGVsOnZvaWQgMCxtZXRyaWNzRXh0OnZvaWQgMCxidWZmZXJFeHQ6dm9pZCAwLGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMuYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyl9LGdldFZlcnNpb246ZnVuY3Rpb24oKXtyZXR1cm4gZ30sc3RhcnR1cDpmdW5jdGlvbigpe2l8fChiLmluamVjdEludG8odGhpcyksaT0hMCl9LGdldERlYnVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVidWd9LGdldFZpZGVvTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gZn0sc2V0QXV0b1BsYXk6ZnVuY3Rpb24oYSl7az1hfSxnZXRBdXRvUGxheTpmdW5jdGlvbigpe3JldHVybiBrfSxzZXRTY2hlZHVsZVdoaWxlUGF1c2VkOmZ1bmN0aW9uKGEpe2w9YX0sZ2V0U2NoZWR1bGVXaGlsZVBhdXNlZDpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRCdWZmZXJNYXg6ZnVuY3Rpb24oYSl7bT1hfSxnZXRCdWZmZXJNYXg6ZnVuY3Rpb24oKXtyZXR1cm4gbX0sZ2V0TWV0cmljc0V4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1ldHJpY3NFeHR9LGdldE1ldHJpY3NGb3I6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZXRyaWNzTW9kZWwuZ2V0UmVhZE9ubHlNZXRyaWNzRm9yKGEpO3JldHVybiBifSxnZXRRdWFsaXR5Rm9yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFickNvbnRyb2xsZXIuZ2V0UXVhbGl0eUZvcihhKX0sc2V0UXVhbGl0eUZvcjpmdW5jdGlvbihhLGIpe3RoaXMuYWJyQ29udHJvbGxlci5zZXRQbGF5YmFja1F1YWxpdHkoYSxiKX0sZ2V0QXV0b1N3aXRjaFF1YWxpdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hYnJDb250cm9sbGVyLmdldEF1dG9Td2l0Y2hCaXRyYXRlKCl9LHNldEF1dG9Td2l0Y2hRdWFsaXR5OmZ1bmN0aW9uKGEpe3RoaXMuYWJyQ29udHJvbGxlci5zZXRBdXRvU3dpdGNoQml0cmF0ZShhKX0sYXR0YWNoVmlldzpmdW5jdGlvbihhKXtpZighaSl0aHJvd1wiTWVkaWFQbGF5ZXIgbm90IGluaXRpYWxpemVkIVwiO2M9YSxmPW51bGwsYyYmKGY9Yi5nZXRPYmplY3QoXCJ2aWRlb01vZGVsXCIpLGYuc2V0RWxlbWVudChjKSksaiYmZSYmKGUucmVzZXQoKSxlPW51bGwsaj0hMSksbi5jYWxsKHRoaXMpJiZwLmNhbGwodGhpcyl9LGF0dGFjaFNvdXJjZTpmdW5jdGlvbihhKXtpZighaSl0aHJvd1wiTWVkaWFQbGF5ZXIgbm90IGluaXRpYWxpemVkIVwiO2Q9YSx0aGlzLnNldFF1YWxpdHlGb3IoXCJ2aWRlb1wiLDApLHRoaXMuc2V0UXVhbGl0eUZvcihcImF1ZGlvXCIsMCksaiYmZSYmKGUucmVzZXQoKSxlPW51bGwsaj0hMSksbi5jYWxsKHRoaXMpJiZwLmNhbGwodGhpcyl9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5hdHRhY2hTb3VyY2UobnVsbCksdGhpcy5hdHRhY2hWaWV3KG51bGwpfSxwbGF5Om8saXNSZWFkeTpufX0sTWVkaWFQbGF5ZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllcn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzPXt9LE1lZGlhUGxheWVyLnV0aWxzPXt9LE1lZGlhUGxheWVyLm1vZGVscz17fSxNZWRpYVBsYXllci52bz17fSxNZWRpYVBsYXllci52by5tZXRyaWNzPXt9LE1lZGlhUGxheWVyLnJ1bGVzPXt9LE1lZGlhUGxheWVyLmRpPXt9LE1lZGlhUGxheWVyLmRpLkNvbnRleHQ9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm57c3lzdGVtOnZvaWQgMCxzZXR1cDpmdW5jdGlvbigpe3RoaXMuc3lzdGVtLmF1dG9NYXBPdXRsZXRzPSEwLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImRlYnVnXCIsTWVkaWFQbGF5ZXIudXRpbHMuRGVidWcpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImV2ZW50QnVzXCIsTWVkaWFQbGF5ZXIudXRpbHMuRXZlbnRCdXMpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImNhcGFiaWxpdGllc1wiLE1lZGlhUGxheWVyLnV0aWxzLkNhcGFiaWxpdGllcyksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwidGV4dFRyYWNrRXh0ZW5zaW9uc1wiLE1lZGlhUGxheWVyLnV0aWxzLlRleHRUcmFja0V4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcInZ0dFBhcnNlclwiLE1lZGlhUGxheWVyLnV0aWxzLlZUVFBhcnNlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJ2aWRlb01vZGVsXCIsTWVkaWFQbGF5ZXIubW9kZWxzLlZpZGVvTW9kZWwpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcIm1hbmlmZXN0TW9kZWxcIixNZWRpYVBsYXllci5tb2RlbHMuTWFuaWZlc3RNb2RlbCksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwibWV0cmljc01vZGVsXCIsTWVkaWFQbGF5ZXIubW9kZWxzLk1ldHJpY3NNb2RlbCksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJwcm90ZWN0aW9uTW9kZWxcIixNZWRpYVBsYXllci5tb2RlbHMuUHJvdGVjdGlvbk1vZGVsKSx0aGlzLnN5c3RlbS5tYXBTaW5nbGV0b24oXCJ0ZXh0VlRUU291cmNlQnVmZmVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlRleHRWVFRTb3VyY2VCdWZmZXIpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcIm1lZGlhU291cmNlRXh0XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1lZGlhU291cmNlRXh0ZW5zaW9ucyksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwic291cmNlQnVmZmVyRXh0XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNvdXJjZUJ1ZmZlckV4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImJ1ZmZlckV4dFwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zKSx0aGlzLnN5c3RlbS5tYXBTaW5nbGV0b24oXCJhYnJDb250cm9sbGVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkFickNvbnRyb2xsZXIpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImVyckhhbmRsZXJcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRXJyb3JIYW5kbGVyKSx0aGlzLnN5c3RlbS5tYXBTaW5nbGV0b24oXCJwcm90ZWN0aW9uRXh0XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25FeHRlbnNpb25zKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcInByb3RlY3Rpb25Db250cm9sbGVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25Db250cm9sbGVyKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcIm1ldHJpY3NcIixNZWRpYVBsYXllci5tb2RlbHMuTWV0cmljc0xpc3QpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiZG93bmxvYWRSYXRpb1J1bGVcIixNZWRpYVBsYXllci5ydWxlcy5Eb3dubG9hZFJhdGlvUnVsZSksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJpbnN1ZmZpY2llbnRCdWZmZXJSdWxlXCIsTWVkaWFQbGF5ZXIucnVsZXMuSW5zdWZmaWNpZW50QnVmZmVyUnVsZSksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJsaW1pdFN3aXRjaGVzUnVsZVwiLE1lZGlhUGxheWVyLnJ1bGVzLkxpbWl0U3dpdGNoZXNSdWxlKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcImFiclJ1bGVzQ29sbGVjdGlvblwiLE1lZGlhUGxheWVyLnJ1bGVzLkJhc2VSdWxlc0NvbGxlY3Rpb24pLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwidGV4dENvbnRyb2xsZXJcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dENvbnRyb2xsZXIpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiYnVmZmVyQ29udHJvbGxlclwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJDb250cm9sbGVyKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcIm1hbmlmZXN0TG9hZGVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1hbmlmZXN0TG9hZGVyKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcIm1hbmlmZXN0VXBkYXRlclwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5NYW5pZmVzdFVwZGF0ZXIpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiZnJhZ21lbnRDb250cm9sbGVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkZyYWdtZW50Q29udHJvbGxlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJmcmFnbWVudExvYWRlclwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudExvYWRlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJmcmFnbWVudE1vZGVsXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkZyYWdtZW50TW9kZWwpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcInN0cmVhbUNvbnRyb2xsZXJcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtQ29udHJvbGxlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJzdHJlYW1cIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcInJlcXVlc3RTY2hlZHVsZXJcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUmVxdWVzdFNjaGVkdWxlciksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwic2NoZWR1bGVyRXh0XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNjaGVkdWxlckV4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwic2NoZWR1bGVyTW9kZWxcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU2NoZWR1bGVyTW9kZWwpXG59fX0sRGFzaD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3JldHVybnttb2R1bGVzOnt9LGRlcGVuZGVuY2llczp7fSx2bzp7fSxkaTp7fX19KCksRGFzaC5kaS5EYXNoQ29udGV4dD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3JldHVybntzeXN0ZW06dm9pZCAwLHNldHVwOmZ1bmN0aW9uKCl7RGFzaC5kaS5EYXNoQ29udGV4dC5wcm90b3R5cGUuc2V0dXAuY2FsbCh0aGlzKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcInBhcnNlclwiLERhc2guZGVwZW5kZW5jaWVzLkRhc2hQYXJzZXIpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiaW5kZXhIYW5kbGVyXCIsRGFzaC5kZXBlbmRlbmNpZXMuRGFzaEhhbmRsZXIpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiYmFzZVVSTEV4dFwiLERhc2guZGVwZW5kZW5jaWVzLkJhc2VVUkxFeHRlbnNpb25zKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcImZyYWdtZW50RXh0XCIsRGFzaC5kZXBlbmRlbmNpZXMuRnJhZ21lbnRFeHRlbnNpb25zKSx0aGlzLnN5c3RlbS5tYXBTaW5nbGV0b24oXCJtYW5pZmVzdEV4dFwiLERhc2guZGVwZW5kZW5jaWVzLkRhc2hNYW5pZmVzdEV4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcIm1ldHJpY3NFeHRcIixEYXNoLmRlcGVuZGVuY2llcy5EYXNoTWV0cmljc0V4dGVuc2lvbnMpfX19LERhc2guZGkuRGFzaENvbnRleHQucHJvdG90eXBlPW5ldyBNZWRpYVBsYXllci5kaS5Db250ZXh0LERhc2guZGkuRGFzaENvbnRleHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPURhc2guZGkuRGFzaENvbnRleHQsRGFzaC5kZXBlbmRlbmNpZXMuQmFzZVVSTEV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkLGUsZixnLGgsaSxqLGssbCxtPW5ldyBEYXRhVmlldyhhKSxuPXt9LG89MDtcInNpZHhcIiE9PWomJm88bS5ieXRlTGVuZ3RoOyl7Zm9yKGs9bS5nZXRVaW50MzIobyksbys9NCxqPVwiXCIsZj0wOzQ+ZjtmKz0xKWw9bS5nZXRJbnQ4KG8pLGorPVN0cmluZy5mcm9tQ2hhckNvZGUobCksbys9MTtcIm1vb2ZcIiE9PWomJlwidHJhZlwiIT09aiYmXCJzaWR4XCIhPT1qP28rPWstODpcInNpZHhcIj09PWomJihvLT04KX1pZihlPW0uZ2V0VWludDMyKG8sITEpK28sZT5hLmJ5dGVMZW5ndGgpdGhyb3dcInNpZHggdGVybWluYXRlcyBhZnRlciBhcnJheSBidWZmZXJcIjtmb3Iobi52ZXJzaW9uPW0uZ2V0VWludDgobys4KSxvKz0xMixuLnRpbWVzY2FsZT1tLmdldFVpbnQzMihvKzQsITEpLG8rPTgsMD09PW4udmVyc2lvbj8obi5lYXJsaWVzdF9wcmVzZW50YXRpb25fdGltZT1tLmdldFVpbnQzMihvLCExKSxuLmZpcnN0X29mZnNldD1tLmdldFVpbnQzMihvKzQsITEpLG8rPTgpOihuLmVhcmxpZXN0X3ByZXNlbnRhdGlvbl90aW1lPXV0aWxzLk1hdGgudG82NEJpdE51bWJlcihtLmdldFVpbnQzMihvKzQsITEpLG0uZ2V0VWludDMyKG8sITEpKSxuLmZpcnN0X29mZnNldD0obS5nZXRVaW50MzIobys4LCExKTw8MzIpK20uZ2V0VWludDMyKG8rMTIsITEpLG8rPTE2KSxuLmZpcnN0X29mZnNldCs9ZSsoYnx8MCksbi5yZWZlcmVuY2VfY291bnQ9bS5nZXRVaW50MTYobysyLCExKSxvKz00LG4ucmVmZXJlbmNlcz1bXSxjPW4uZmlyc3Rfb2Zmc2V0LGQ9bi5lYXJsaWVzdF9wcmVzZW50YXRpb25fdGltZSxmPTA7ZjxuLnJlZmVyZW5jZV9jb3VudDtmKz0xKWg9bS5nZXRVaW50MzIobywhMSksZz1oPj4+MzEsaD0yMTQ3NDgzNjQ3JmgsaT1tLmdldFVpbnQzMihvKzQsITEpLG8rPTEyLG4ucmVmZXJlbmNlcy5wdXNoKHtzaXplOmgsdHlwZTpnLG9mZnNldDpjLGR1cmF0aW9uOmksdGltZTpkLHRpbWVzY2FsZTpuLnRpbWVzY2FsZX0pLGMrPWgsZCs9aTtpZihvIT09ZSl0aHJvd1wiRXJyb3I6IGZpbmFsIHBvcyBcIitvK1wiIGRpZmZlcnMgZnJvbSBTSURYIGVuZCBcIitlO3JldHVybiBufSxiPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaCxpLGosayxsO2ZvcihlPWEuY2FsbCh0aGlzLGIsZCksZj1lLnJlZmVyZW5jZXMsZz1bXSxpPTAsaj1mLmxlbmd0aDtqPmk7aSs9MSloPW5ldyBEYXNoLnZvLlNlZ21lbnQsaC5kdXJhdGlvbj1mW2ldLmR1cmF0aW9uLGgubWVkaWE9YyxoLnN0YXJ0VGltZT1mW2ldLnRpbWUsaC50aW1lc2NhbGU9ZltpXS50aW1lc2NhbGUsaz1mW2ldLm9mZnNldCxsPWZbaV0ub2Zmc2V0K2ZbaV0uc2l6ZS0xLGgubWVkaWFSYW5nZT1rK1wiLVwiK2wsZy5wdXNoKGgpO3JldHVybiB0aGlzLmRlYnVnLmxvZyhcIlBhcnNlZCBTSURYIGJveDogXCIrZy5sZW5ndGgrXCIgc2VnbWVudHMuXCIpLFEud2hlbihnKX0sYz1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZixnLGgsaSxqLGs9US5kZWZlcigpLGw9bmV3IERhdGFWaWV3KGEpLG09MCxuPVwiXCIsbz0wLHA9ITEscT10aGlzO2ZvcihxLmRlYnVnLmxvZyhcIlNlYXJjaGluZyBmb3IgaW5pdGlhbGl6YXRpb24uXCIpO1wibW9vdlwiIT09biYmbTxsLmJ5dGVMZW5ndGg7KXtmb3Iobz1sLmdldFVpbnQzMihtKSxtKz00LG49XCJcIixnPTA7ND5nO2crPTEpaD1sLmdldEludDgobSksbis9U3RyaW5nLmZyb21DaGFyQ29kZShoKSxtKz0xO1wibW9vdlwiIT09biYmKG0rPW8tOCl9cmV0dXJuIGY9bC5ieXRlTGVuZ3RoLW0sXCJtb292XCIhPT1uPyhxLmRlYnVnLmxvZyhcIkxvYWRpbmcgbW9yZSBieXRlcyB0byBmaW5kIGluaXRpYWxpemF0aW9uLlwiKSxiLnJhbmdlLnN0YXJ0PTAsYi5yYW5nZS5lbmQ9Yi5ieXRlc0xvYWRlZCtiLmJ5dGVzVG9Mb2FkLGk9bmV3IFhNTEh0dHBSZXF1ZXN0LGkub25sb2FkZW5kPWZ1bmN0aW9uKCl7cHx8ay5yZWplY3QoXCJFcnJvciBsb2FkaW5nIGluaXRpYWxpemF0aW9uLlwiKX0saS5vbmxvYWQ9ZnVuY3Rpb24oKXtwPSEwLGIuYnl0ZXNMb2FkZWQ9Yi5yYW5nZS5lbmQsYy5jYWxsKHEsaS5yZXNwb25zZSkudGhlbihmdW5jdGlvbihhKXtrLnJlc29sdmUoYSl9KX0saS5vbmVycm9yPWZ1bmN0aW9uKCl7ay5yZWplY3QoXCJFcnJvciBsb2FkaW5nIGluaXRpYWxpemF0aW9uLlwiKX0saS5vcGVuKFwiR0VUXCIsYi51cmwpLGkucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixpLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLFwiYnl0ZXM9XCIrYi5yYW5nZS5zdGFydCtcIi1cIitiLnJhbmdlLmVuZCksaS5zZW5kKG51bGwpKTooZD1tLTgsZT1kK28tMSxqPWQrXCItXCIrZSxxLmRlYnVnLmxvZyhcIkZvdW5kIHRoZSBpbml0aWFsaXphdGlvbi4gIFJhbmdlOiBcIitqKSxrLnJlc29sdmUoaikpLGsucHJvbWlzZX0sZD1mdW5jdGlvbihhKXt2YXIgYj1RLmRlZmVyKCksZD1uZXcgWE1MSHR0cFJlcXVlc3QsZT0hMCxmPXRoaXMsZz17dXJsOmEscmFuZ2U6e30sc2VhcmNoaW5nOiExLGJ5dGVzTG9hZGVkOjAsYnl0ZXNUb0xvYWQ6MTUwMCxyZXF1ZXN0OmR9O3JldHVybiBmLmRlYnVnLmxvZyhcIlN0YXJ0IHNlYXJjaGluZyBmb3IgaW5pdGlhbGl6YXRpb24uXCIpLGcucmFuZ2Uuc3RhcnQ9MCxnLnJhbmdlLmVuZD1nLmJ5dGVzVG9Mb2FkLGQub25sb2FkPWZ1bmN0aW9uKCl7ZC5zdGF0dXM8MjAwfHxkLnN0YXR1cz4yOTl8fChlPSExLGcuYnl0ZXNMb2FkZWQ9Zy5yYW5nZS5lbmQsYy5jYWxsKGYsZC5yZXNwb25zZSxnKS50aGVuKGZ1bmN0aW9uKGEpe2IucmVzb2x2ZShhKX0pKX0sZC5vbmxvYWRlbmQ9ZC5vbmVycm9yPWZ1bmN0aW9uKCl7ZSYmKGU9ITEsZi5lcnJIYW5kbGVyLmRvd25sb2FkRXJyb3IoXCJpbml0aWFsaXphdGlvblwiLGcudXJsLGQpLGIucmVqZWN0KGQpKX0sZC5vcGVuKFwiR0VUXCIsZy51cmwpLGQucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixkLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLFwiYnl0ZXM9XCIrZy5yYW5nZS5zdGFydCtcIi1cIitnLnJhbmdlLmVuZCksZC5zZW5kKG51bGwpLGYuZGVidWcubG9nKFwiUGVyZm9ybSBpbml0IHNlYXJjaDogXCIrZy51cmwpLGIucHJvbWlzZX0sZT1mdW5jdGlvbihhLGMpe3ZhciBkLGYsZyxoLGksaixrLGwsbT1RLmRlZmVyKCksbj1uZXcgRGF0YVZpZXcoYSksbz1uZXcgWE1MSHR0cFJlcXVlc3QscD0wLHE9XCJcIixyPTAscz0hMCx0PSExLHU9dGhpcztmb3IodS5kZWJ1Zy5sb2coXCJTZWFyY2hpbmcgZm9yIFNJRFggYm94LlwiKSx1LmRlYnVnLmxvZyhjLmJ5dGVzTG9hZGVkK1wiIGJ5dGVzIGxvYWRlZC5cIik7XCJzaWR4XCIhPT1xJiZwPG4uYnl0ZUxlbmd0aDspe2ZvcihyPW4uZ2V0VWludDMyKHApLHArPTQscT1cIlwiLGk9MDs0Pmk7aSs9MSlqPW4uZ2V0SW50OChwKSxxKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGopLHArPTE7XCJzaWR4XCIhPT1xJiYocCs9ci04KX1pZihkPW4uYnl0ZUxlbmd0aC1wLFwic2lkeFwiIT09cSltLnJlamVjdCgpO2Vsc2UgaWYoci04PmQpdS5kZWJ1Zy5sb2coXCJGb3VuZCBTSURYIGJ1dCB3ZSBkb24ndCBoYXZlIGFsbCBvZiBpdC5cIiksYy5yYW5nZS5zdGFydD0wLGMucmFuZ2UuZW5kPWMuYnl0ZXNMb2FkZWQrKHItZCksby5vbmxvYWQ9ZnVuY3Rpb24oKXtvLnN0YXR1czwyMDB8fG8uc3RhdHVzPjI5OXx8KHM9ITEsYy5ieXRlc0xvYWRlZD1jLnJhbmdlLmVuZCxlLmNhbGwodSxvLnJlc3BvbnNlLGMpLnRoZW4oZnVuY3Rpb24oYSl7bS5yZXNvbHZlKGEpfSkpfSxvLm9ubG9hZGVuZD1vLm9uZXJyb3I9ZnVuY3Rpb24oKXtzJiYocz0hMSx1LmVyckhhbmRsZXIuZG93bmxvYWRFcnJvcihcIlNJRFhcIixjLnVybCxvKSxtLnJlamVjdChvKSl9LG8ub3BlbihcIkdFVFwiLGMudXJsKSxvLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCIsby5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIixcImJ5dGVzPVwiK2MucmFuZ2Uuc3RhcnQrXCItXCIrYy5yYW5nZS5lbmQpLG8uc2VuZChudWxsKTtlbHNlIGlmKGMucmFuZ2Uuc3RhcnQ9cC04LGMucmFuZ2UuZW5kPWMucmFuZ2Uuc3RhcnQrcix1LmRlYnVnLmxvZyhcIkZvdW5kIHRoZSBTSURYIGJveC4gIFN0YXJ0OiBcIitjLnJhbmdlLnN0YXJ0K1wiIHwgRW5kOiBcIitjLnJhbmdlLmVuZCksZj1uZXcgQXJyYXlCdWZmZXIoYy5yYW5nZS5lbmQtYy5yYW5nZS5zdGFydCksaD1uZXcgVWludDhBcnJheShmKSxnPW5ldyBVaW50OEFycmF5KGEsYy5yYW5nZS5zdGFydCxjLnJhbmdlLmVuZC1jLnJhbmdlLnN0YXJ0KSxoLnNldChnKSxrPXRoaXMucGFyc2VTSURYLmNhbGwodGhpcyxmLGMucmFuZ2Uuc3RhcnQpLGw9ay5yZWZlcmVuY2VzLG51bGwhPT1sJiZ2b2lkIDAhPT1sJiZsLmxlbmd0aD4wJiYodD0xPT09bFswXS50eXBlKSx0KXt1LmRlYnVnLmxvZyhcIkluaXRpYXRlIG11bHRpcGxlIFNJRFggbG9hZC5cIik7dmFyIHYsdyx4LHkseixBLEI9W107Zm9yKHY9MCx3PWwubGVuZ3RoO3c+djt2Kz0xKXg9bFt2XS5vZmZzZXQseT1sW3ZdLm9mZnNldCtsW3ZdLnNpemUtMSx6PXgrXCItXCIreSxCLnB1c2godGhpcy5sb2FkU2VnbWVudHMuY2FsbCh1LGMudXJsLHopKTtRLmFsbChCKS50aGVuKGZ1bmN0aW9uKGEpe2ZvcihBPVtdLHY9MCx3PWEubGVuZ3RoO3c+djt2Kz0xKUE9QS5jb25jYXQoYVt2XSk7bS5yZXNvbHZlKEEpfSxmdW5jdGlvbihhKXttLnJlamVjdChhKX0pfWVsc2UgdS5kZWJ1Zy5sb2coXCJQYXJzaW5nIHNlZ21lbnRzIGZyb20gU0lEWC5cIiksYi5jYWxsKHUsZixjLnVybCxjLnJhbmdlLnN0YXJ0KS50aGVuKGZ1bmN0aW9uKGEpe20ucmVzb2x2ZShhKX0pO3JldHVybiBtLnByb21pc2V9LGY9ZnVuY3Rpb24oYSxjKXt2YXIgZCxmPVEuZGVmZXIoKSxnPW5ldyBYTUxIdHRwUmVxdWVzdCxoPSEwLGk9dGhpcyxqPXt1cmw6YSxyYW5nZTp7fSxzZWFyY2hpbmc6ITEsYnl0ZXNMb2FkZWQ6MCxieXRlc1RvTG9hZDoxNTAwLHJlcXVlc3Q6Z307cmV0dXJuIG51bGw9PT1jPyhpLmRlYnVnLmxvZyhcIk5vIGtub3duIHJhbmdlIGZvciBTSURYIHJlcXVlc3QuXCIpLGouc2VhcmNoaW5nPSEwLGoucmFuZ2Uuc3RhcnQ9MCxqLnJhbmdlLmVuZD1qLmJ5dGVzVG9Mb2FkKTooZD1jLnNwbGl0KFwiLVwiKSxqLnJhbmdlLnN0YXJ0PXBhcnNlRmxvYXQoZFswXSksai5yYW5nZS5lbmQ9cGFyc2VGbG9hdChkWzFdKSksZy5vbmxvYWQ9ZnVuY3Rpb24oKXtnLnN0YXR1czwyMDB8fGcuc3RhdHVzPjI5OXx8KGg9ITEsai5zZWFyY2hpbmc/KGouYnl0ZXNMb2FkZWQ9ai5yYW5nZS5lbmQsZS5jYWxsKGksZy5yZXNwb25zZSxqKS50aGVuKGZ1bmN0aW9uKGEpe2YucmVzb2x2ZShhKX0pKTpiLmNhbGwoaSxnLnJlc3BvbnNlLGoudXJsLGoucmFuZ2Uuc3RhcnQpLnRoZW4oZnVuY3Rpb24oYSl7Zi5yZXNvbHZlKGEpfSkpfSxnLm9ubG9hZGVuZD1nLm9uZXJyb3I9ZnVuY3Rpb24oKXtoJiYoaD0hMSxpLmVyckhhbmRsZXIuZG93bmxvYWRFcnJvcihcIlNJRFhcIixqLnVybCxnKSxmLnJlamVjdChnKSl9LGcub3BlbihcIkdFVFwiLGoudXJsKSxnLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCIsZy5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIixcImJ5dGVzPVwiK2oucmFuZ2Uuc3RhcnQrXCItXCIrai5yYW5nZS5lbmQpLGcuc2VuZChudWxsKSxpLmRlYnVnLmxvZyhcIlBlcmZvcm0gU0lEWCBsb2FkOiBcIitqLnVybCksZi5wcm9taXNlfTtyZXR1cm57ZGVidWc6dm9pZCAwLGVyckhhbmRsZXI6dm9pZCAwLGxvYWRTZWdtZW50czpmLGxvYWRJbml0aWFsaXphdGlvbjpkLHBhcnNlU2VnbWVudHM6YixwYXJzZVNJRFg6YSxmaW5kU0lEWDplfX0sRGFzaC5kZXBlbmRlbmNpZXMuQmFzZVVSTEV4dGVuc2lvbnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpEYXNoLmRlcGVuZGVuY2llcy5CYXNlVVJMRXh0ZW5zaW9uc30sRGFzaC5kZXBlbmRlbmNpZXMuRGFzaEhhbmRsZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYSxiLGMsZD0tMSxlPWZ1bmN0aW9uKGEsYil7dmFyIGM9bnVsbDtyZXR1cm4gYiYmYi5SZXByZXNlbnRhdGlvbl9hc0FycmF5JiZiLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkubGVuZ3RoPjAmJihjPWIuUmVwcmVzZW50YXRpb25fYXNBcnJheVthXSksY30sZj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudG9TdHJpbmcoKTtyZXR1cm4gYS5zcGxpdChcIiROdW1iZXIkXCIpLmpvaW4oYyl9LGc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnRvU3RyaW5nKCk7cmV0dXJuIGEuc3BsaXQoXCIkVGltZSRcIikuam9pbihjKX0saD1mdW5jdGlvbihhLGIpe3ZhciBjPWIudG9TdHJpbmcoKTtyZXR1cm4gYS5zcGxpdChcIiRCYW5kd2lkdGgkXCIpLmpvaW4oYyl9LGk9ZnVuY3Rpb24oYSxiKXtpZihudWxsPT09Ynx8LTE9PT1hLmluZGV4T2YoXCIkUmVwcmVzZW50YXRpb25JRCRcIikpcmV0dXJuIGE7dmFyIGM9Yi50b1N0cmluZygpO3JldHVybiBhLnNwbGl0KFwiJFJlcHJlc2VudGF0aW9uSUQkXCIpLmpvaW4oYyl9LGo9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gYz1hPT09Yj9hOi0xIT09YS5pbmRleE9mKFwiaHR0cDovL1wiKT9hOmIrYX0saz1mdW5jdGlvbihhLGIpe3ZhciBkPVEuZGVmZXIoKSxmPWUoYSxiKSxnPW51bGwsaz1udWxsLGw9bnVsbCxtPW51bGwsbj10aGlzO3JldHVybiBmPyhuLmRlYnVnLmxvZyhcIkdldHRpbmcgdGhlIGluaXRpYWxpemF0aW9uIHJlcXVlc3QuXCIpLGYuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGVtcGxhdGVcIik/Zi5TZWdtZW50VGVtcGxhdGUuaGFzT3duUHJvcGVydHkoXCJpbml0aWFsaXphdGlvblwiKSYmKGs9Zi5TZWdtZW50VGVtcGxhdGUuaW5pdGlhbGl6YXRpb24saz1oKGssZi5iYW5kd2lkdGgpLGs9aShrLGYuaWQpKTpmLmhhc093blByb3BlcnR5KFwiU2VnbWVudExpc3RcIikmJmYuU2VnbWVudExpc3QuaGFzT3duUHJvcGVydHkoXCJJbml0aWFsaXphdGlvblwiKSYmZi5TZWdtZW50TGlzdC5Jbml0aWFsaXphdGlvbi5oYXNPd25Qcm9wZXJ0eShcInJhbmdlXCIpPyhrPWYuU2VnbWVudExpc3QuSW5pdGlhbGl6YXRpb24uaGFzT3duUHJvcGVydHkoXCJzb3VyY2VVUkxcIik/Zi5TZWdtZW50TGlzdC5Jbml0aWFsaXphdGlvbi5zb3VyY2VVUkw6Zi5CYXNlVVJMLG09Zi5TZWdtZW50TGlzdC5Jbml0aWFsaXphdGlvbi5yYW5nZSk6Zi5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRMaXN0XCIpJiZmLlNlZ21lbnRMaXN0Lmhhc093blByb3BlcnR5KFwiSW5pdGlhbGl6YXRpb25cIikmJmYuU2VnbWVudExpc3QuSW5pdGlhbGl6YXRpb24uaGFzT3duUHJvcGVydHkoXCJzb3VyY2VVUkxcIik/az1mLlNlZ21lbnRMaXN0LkluaXRpYWxpemF0aW9uLnNvdXJjZVVSTDpmLmhhc093blByb3BlcnR5KFwiU2VnbWVudEJhc2VcIikmJmYuU2VnbWVudEJhc2UuaGFzT3duUHJvcGVydHkoXCJJbml0aWFsaXphdGlvblwiKSYmZi5TZWdtZW50QmFzZS5Jbml0aWFsaXphdGlvbi5oYXNPd25Qcm9wZXJ0eShcInJhbmdlXCIpPyhrPWYuQmFzZVVSTCxtPWYuU2VnbWVudEJhc2UuSW5pdGlhbGl6YXRpb24ucmFuZ2UpOmYuaGFzT3duUHJvcGVydHkoXCJtaW1lVHlwZVwiKSYmbi5tYW5pZmVzdEV4dC5nZXRJc1RleHRUcmFjayhmLm1pbWVUeXBlKT8oaz1mLkJhc2VVUkwsbT0wKToobD1mLkJhc2VVUkwsbi5iYXNlVVJMRXh0LmxvYWRJbml0aWFsaXphdGlvbihsKS50aGVuKGZ1bmN0aW9uKGIpe24uZGVidWcubG9nKFwiR290IGFuIGluaXRpYWxpemF0aW9uLlwiKSxnPW5ldyBNZWRpYVBsYXllci52by5TZWdtZW50UmVxdWVzdCxnLnN0cmVhbVR5cGU9YyxnLnR5cGU9XCJJbml0aWFsaXphdGlvbiBTZWdtZW50XCIsZy51cmw9aihsLGYuQmFzZVVSTCksZy5yYW5nZT1iLGcucXVhbGl0eT1hLGQucmVzb2x2ZShnKX0sZnVuY3Rpb24oYSl7ZC5yZWplY3QoYSl9KSksayYmay5sZW5ndGg+MCYmKG4uZGVidWcubG9nKFwiR290IGFuIGluaXRpYWxpemF0aW9uLlwiKSxnPW5ldyBNZWRpYVBsYXllci52by5TZWdtZW50UmVxdWVzdCxnLnN0cmVhbVR5cGU9YyxnLnR5cGU9XCJJbml0aWFsaXphdGlvbiBTZWdtZW50XCIsZy51cmw9aihrLGYuQmFzZVVSTCksZy5yYW5nZT1tLGcucXVhbGl0eT1hLGQucmVzb2x2ZShnKSksZC5wcm9taXNlKTpRLnJlamVjdChcIm5vIHJlcHJlc2VuYXRpb25cIil9LGw9ZnVuY3Rpb24oYyl7dmFyIGUsZixnLGgsaSxqLGs9ITE7cmV0dXJuIHRoaXMuZGVidWcubG9nKFwiQ2hlY2tpbmcgZm9yIHN0cmVhbSBlbmQuLi5cIiksYT8odGhpcy5kZWJ1Zy5sb2coXCJMaXZlIG5ldmVyIGVuZHMhIChUT0RPKVwiKSxrPSExKTpjLmhhc093blByb3BlcnR5KFwic2VnbWVudHNcIikmJm51bGwhPT1jLnNlZ21lbnRzPyh0aGlzLmRlYnVnLmxvZyhcIlNlZ21lbnRzOiBcIitkK1wiIC8gXCIrYy5zZWdtZW50cy5sZW5ndGgpLGs9ZD49Yy5zZWdtZW50cy5sZW5ndGgpOmMuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGVtcGxhdGVcIikmJiFjLlNlZ21lbnRUZW1wbGF0ZS5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUaW1lbGluZVwiKSYmKGY9MSxpPTEsaD1iLGMuU2VnbWVudFRlbXBsYXRlLmhhc093blByb3BlcnR5KFwiZHVyYXRpb25cIikmJihlPWMuU2VnbWVudFRlbXBsYXRlLmR1cmF0aW9uLGMuU2VnbWVudFRlbXBsYXRlLmhhc093blByb3BlcnR5KFwidGltZXNjYWxlXCIpJiYoZj1jLlNlZ21lbnRUZW1wbGF0ZS50aW1lc2NhbGUpLGMuU2VnbWVudFRlbXBsYXRlLmhhc093blByb3BlcnR5KFwic3RhcnROdW1iZXJcIikmJihpPWMuU2VnbWVudFRlbXBsYXRlLnN0YXJ0TnVtYmVyKSxnPWUvZixqPWQtaSx0aGlzLmRlYnVnLmxvZyhcIlNlZ21lbnRUZW1wbGF0ZTogXCIrZytcIiAqIFwiK2orXCIgPSBcIitnKmorXCIgLyBcIitoKSxrPWcqaj49aCkpLFEud2hlbihrKX0sbT1mdW5jdGlvbihhLGMpe3ZhciBkLGUsaCxpLGosayxsLG0sbj1bXSxvPTAscD0xLHE9MTtmb3IoYS5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0TnVtYmVyXCIpJiYocD1hLnN0YXJ0TnVtYmVyKSxhLmhhc093blByb3BlcnR5KFwidGltZXNjYWxlXCIpJiYocT1hLnRpbWVzY2FsZSksZD1jLlNfYXNBcnJheSxoPTAsaT1kLmxlbmd0aDtpPmg7aCs9MSlmb3IoZT1kW2hdLGs9MCxlLmhhc093blByb3BlcnR5KFwiclwiKSYmKGs9ZS5yKSwwPmsmJihrPShiLW8vcSkvKGUuZC9xKS0xKSxqPTA7az49ajtqKz0xKWw9bmV3IERhc2gudm8uU2VnbWVudCxsLnRpbWVzY2FsZT1xLDA9PT1qJiZlLmhhc093blByb3BlcnR5KFwidFwiKT8obC5zdGFydFRpbWU9ZS50LG89ZS50KTpsLnN0YXJ0VGltZT1vLGwuZHVyYXRpb249ZS5kLG09YS5tZWRpYSxtPWYobSxwKSxtPWcobSxsLnN0YXJ0VGltZSksbC5tZWRpYT1tLG4ucHVzaChsKSxvKz1sLmR1cmF0aW9uLHArPTE7cmV0dXJuIFEud2hlbihuKX0sbj1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGc9W10saD0xO2ZvcihhLmhhc093blByb3BlcnR5KFwic3RhcnROdW1iZXJcIikmJihoPU1hdGgubWF4KGEuc3RhcnROdW1iZXIsMSkpLGY9KGgtMSkqYS5kdXJhdGlvbixiPTAsYz1hLlNlZ21lbnRVUkxfYXNBcnJheS5sZW5ndGg7Yz5iO2IrPTEpZT1hLlNlZ21lbnRVUkxfYXNBcnJheVtiXSxkPW5ldyBEYXNoLnZvLlNlZ21lbnQsZC5tZWRpYT1lLm1lZGlhLGQubWVkaWFSYW5nZT1lLm1lZGlhUmFuZ2UsZC5pbmRleD1lLmluZGV4LGQuaW5kZXhSYW5nZT1lLmluZGV4UmFuZ2UsZC50aW1lc2NhbGU9YS50aW1lc2NhbGUsZC5kdXJhdGlvbj1hLmR1cmF0aW9uLGQuc3RhcnRUaW1lPWYrYiphLmR1cmF0aW9uLGcucHVzaChkKTtyZXR1cm4gUS53aGVuKGcpfSxvPWZ1bmN0aW9uKGEpe3ZhciBiPWEuQmFzZVVSTCxjPW51bGw7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50QmFzZVwiKSYmYS5TZWdtZW50QmFzZS5oYXNPd25Qcm9wZXJ0eShcImluZGV4UmFuZ2VcIikmJihjPWEuU2VnbWVudEJhc2UuaW5kZXhSYW5nZSksdGhpcy5iYXNlVVJMRXh0LmxvYWRTZWdtZW50cyhiLGMpfSxwPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBiPWEuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGVtcGxhdGVcIikmJiFhLlNlZ21lbnRUZW1wbGF0ZS5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUaW1lbGluZVwiKT9RLndoZW4obnVsbCk6YS5oYXNPd25Qcm9wZXJ0eShcInNlZ21lbnRzXCIpJiZudWxsIT09YS5zZWdtZW50cz9RLndoZW4oYS5zZWdtZW50cyk6YS5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUZW1wbGF0ZVwiKSYmYS5TZWdtZW50VGVtcGxhdGUuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGltZWxpbmVcIik/bS5jYWxsKHRoaXMsYS5TZWdtZW50VGVtcGxhdGUsYS5TZWdtZW50VGVtcGxhdGUuU2VnbWVudFRpbWVsaW5lKTphLmhhc093blByb3BlcnR5KFwiU2VnbWVudExpc3RcIik/bi5jYWxsKHRoaXMsYS5TZWdtZW50TGlzdCk6by5jYWxsKHRoaXMsYSl9LHE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPS0xO2lmKGImJmIubGVuZ3RoPjApZm9yKGY9Yi5sZW5ndGgtMTtmPj0wO2YtLSl7aWYoYz1iW2ZdLGQ9Yy5zdGFydFRpbWUvYy50aW1lc2NhbGUsZT1jLmR1cmF0aW9uL2MudGltZXNjYWxlLGErRGFzaC5kZXBlbmRlbmNpZXMuRGFzaEhhbmRsZXIuRVBTSUxPTj49ZCYmYS1EYXNoLmRlcGVuZGVuY2llcy5EYXNoSGFuZGxlci5FUFNJTE9OPD1kK2Upe2c9ZjticmVha30tMT09PWcmJmEtRGFzaC5kZXBlbmRlbmNpZXMuRGFzaEhhbmRsZXIuRVBTSUxPTj5kK2UmJihnPWYrMSl9cmV0dXJuLTE9PT1nJiYoY29uc29sZS5sb2coXCJDb3VsZG4ndCBmaWd1cmUgb3V0IGEgdGltZSFcIiksY29uc29sZS5sb2coXCJUaW1lOiBcIithKSxjb25zb2xlLmxvZyhiKSksUS53aGVuKGcpfSxyPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPS0xLGY9MSxnPTE7aWYoIWIuaGFzT3duUHJvcGVydHkoXCJkdXJhdGlvblwiKSl0aHJvd1wiRXhwZWN0ZWQgJ2R1cmF0aW9uJyBhdHRyaWJ1dGUgb24gU2VnbWVudFRlbXBsYXRlIVwiO3JldHVybiBjPWIuZHVyYXRpb24sYi5oYXNPd25Qcm9wZXJ0eShcInRpbWVzY2FsZVwiKSYmKGY9Yi50aW1lc2NhbGUpLGIuaGFzT3duUHJvcGVydHkoXCJzdGFydE51bWJlclwiKSYmKGc9Yi5zdGFydE51bWJlciksZD1jL2YsZT1NYXRoLmZsb29yKGEvZCksZSs9ZyxRLndoZW4oZSl9LHM9ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGssbCxtPW5ldyBNZWRpYVBsYXllci52by5TZWdtZW50UmVxdWVzdCxuPTEsbz0xO3JldHVybiBiLmhhc093blByb3BlcnR5KFwidGltZXNjYWxlXCIpJiYobj1iLnRpbWVzY2FsZSksYi5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0TnVtYmVyXCIpJiYobz1iLnN0YXJ0TnVtYmVyKSxsPWIuZHVyYXRpb24qYS9uLGw9TWF0aC5mbG9vcihsKSxrPWIubWVkaWEsaz1mKGssYSksaz1nKGssbCksaz1oKGssZC5iYW5kd2lkdGgpLGs9aShrLGQuaWQpLG0uc3RyZWFtVHlwZT1jLG0udHlwZT1cIk1lZGlhIFNlZ21lbnRcIixtLnVybD1qKGssZC5CYXNlVVJMKSxtLmR1cmF0aW9uPWIuZHVyYXRpb24vbixtLnRpbWVzY2FsZT1uLG0uc3RhcnRUaW1lPShhLW8pKmIuZHVyYXRpb24vbixtLnF1YWxpdHk9ZSxtLmluZGV4PWEsUS53aGVuKG0pfSx0PWZ1bmN0aW9uKGEsYixkLGUpe2lmKG51bGw9PT1ifHx2b2lkIDA9PT1iKXJldHVybiBRLndoZW4obnVsbCk7dmFyIGssbD1uZXcgTWVkaWFQbGF5ZXIudm8uU2VnbWVudFJlcXVlc3Q7cmV0dXJuIGs9aihiLm1lZGlhLGQuQmFzZVVSTCksaz1mKGssYSksaz1nKGssYi5zdGFydFRpbWUpLGs9aChrLGQuYmFuZHdpZHRoKSxrPWkoayxkLmlkKSxsLnN0cmVhbVR5cGU9YyxsLnR5cGU9XCJNZWRpYSBTZWdtZW50XCIsbC51cmw9ayxsLnJhbmdlPWIubWVkaWFSYW5nZSxsLnN0YXJ0VGltZT1iLnN0YXJ0VGltZS9iLnRpbWVzY2FsZSxsLmR1cmF0aW9uPWIuZHVyYXRpb24vYi50aW1lc2NhbGUsbC50aW1lc2NhbGU9Yi50aW1lc2NhbGUsbC5xdWFsaXR5PWUsbC5pbmRleD1hLFEud2hlbihsKX0sdT1mdW5jdGlvbihhLGIsYyl7dmFyIGYsZyxoLGk9ZShiLGMpLGo9ITEsaz10aGlzO3JldHVybiBpPyhrLmRlYnVnLmxvZyhcIkdldHRpbmcgdGhlIHJlcXVlc3QgZm9yIHRpbWU6IFwiK2EpLGY9US5kZWZlcigpLHAuY2FsbChrLGkpLnRoZW4oZnVuY3Rpb24oYil7dmFyIGM7aWYoay5kZWJ1Zy5sb2coXCJHb3Qgc2VnbWVudHMuXCIpLGsuZGVidWcubG9nKGIpLG51bGw9PT1iKXtpZighaS5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUZW1wbGF0ZVwiKSl0aHJvd1wiRXhwZWN0ZWQgU2VnbWVudFRlbXBsYXRlIVwiO2o9ITAsay5kZWJ1Zy5sb2coXCJObyBzZWdtZW50cyBmb3VuZCwgc28gd2UgbXVzdCBiZSB1c2luZyBhIFNlZ21lbnRUZW1wbGF0ZS5cIiksYz1yLmNhbGwoayxhLGkuU2VnbWVudFRlbXBsYXRlKX1lbHNlIGsuZGVidWcubG9nKFwiR290IGEgbGlzdCBvZiBzZWdtZW50cywgc28gZGlnIGRlZXBlci5cIiksaS5zZWdtZW50cz1iLGo9ITEsYz1xLmNhbGwoayxhLGIpO3JldHVybiBjfSxmdW5jdGlvbigpe2YucmVqZWN0KCl9KS50aGVuKGZ1bmN0aW9uKGIpe3JldHVybiBrLmRlYnVnLmxvZyhcIkluZGV4IGZvciB0aW1lIFwiK2ErXCIgaXMgXCIrYiksZD1iLGwuY2FsbChrLGkpfSkudGhlbihmdW5jdGlvbihhKXt2YXIgYz1udWxsO3JldHVybiBrLmRlYnVnLmxvZyhcIlN0cmVhbSBmaW5pc2hlZD8gXCIrYSksYT8oZz1uZXcgTWVkaWFQbGF5ZXIudm8uU2VnbWVudFJlcXVlc3QsZy5hY3Rpb249Zy5BQ1RJT05fQ09NUExFVEUsZy5pbmRleD1kLGsuZGVidWcubG9nKFwiU2lnbmFsIGNvbXBsZXRlLlwiKSxrLmRlYnVnLmxvZyhnKSxmLnJlc29sdmUoZykpOmo/Yz1zLmNhbGwoayxkLGkuU2VnbWVudFRlbXBsYXRlLGksYik6KGg9aS5zZWdtZW50c1tkXSxjPXQuY2FsbChrLGQsaCxpLGIpKSxjfSkudGhlbihmdW5jdGlvbihhKXtrLmRlYnVnLmxvZyhcIkdvdCBhIHJlcXVlc3QuXCIpLGsuZGVidWcubG9nKGEpLGYucmVzb2x2ZShhKX0pLGYucHJvbWlzZSk6US5yZWplY3QoXCJubyByZXByZXNlbmF0aW9uXCIpfSx2PWZ1bmN0aW9uKGEsYil7dmFyIGMsZixnLGg9ZShhLGIpLGk9dGhpcztpZighaClyZXR1cm4gUS5yZWplY3QoXCJubyByZXByZXNlbmF0aW9uXCIpO2lmKGkuZGVidWcubG9nKFwiR2V0dGluZyB0aGUgbmV4dCByZXF1ZXN0LlwiKSwtMT09PWQpdGhyb3dcIllvdSBtdXN0IGNhbGwgZ2V0U2VnbWVudFJlcXVlc3RGb3JUaW1lIGZpcnN0LlwiO3JldHVybiBkKz0xLGkuZGVidWcubG9nKFwiTmV3IGluZGV4OiBcIitkKSxjPVEuZGVmZXIoKSxsLmNhbGwoaSxoKS50aGVuKGZ1bmN0aW9uKGIpe2kuZGVidWcubG9nKFwiU3RyZWFtIGZpbmlzaGVkPyBcIitiKSxiPyhmPW5ldyBNZWRpYVBsYXllci52by5TZWdtZW50UmVxdWVzdCxmLmFjdGlvbj1mLkFDVElPTl9DT01QTEVURSxmLmluZGV4PWQsaS5kZWJ1Zy5sb2coXCJTaWduYWwgY29tcGxldGUuXCIpLGkuZGVidWcubG9nKGYpLGMucmVzb2x2ZShmKSk6cC5jYWxsKGksaCkudGhlbihmdW5jdGlvbihiKXt2YXIgYztpZihpLmRlYnVnLmxvZyhcIkdvdCBzZWdtZW50cy5cIiksaS5kZWJ1Zy5sb2coYiksbnVsbD09PWIpe2lmKCFoLmhhc093blByb3BlcnR5KFwiU2VnbWVudFRlbXBsYXRlXCIpKXRocm93XCJFeHBlY3RlZCBTZWdtZW50VGVtcGxhdGUhXCI7aS5kZWJ1Zy5sb2coXCJObyBzZWdtZW50cyBmb3VuZCwgc28gd2UgbXVzdCBiZSB1c2luZyBhIFNlZ21lbnRUZW1wbGF0ZS5cIiksYz1zLmNhbGwoaSxkLGguU2VnbWVudFRlbXBsYXRlLGgsYSl9ZWxzZSBoLnNlZ21lbnRzPWIsZz1oLnNlZ21lbnRzW2RdLGM9dC5jYWxsKGksZCxnLGgsYSk7cmV0dXJuIGN9LGZ1bmN0aW9uKCl7Yy5yZWplY3QoKX0pLnRoZW4oZnVuY3Rpb24oYSl7aS5kZWJ1Zy5sb2coXCJHb3QgYSByZXF1ZXN0LlwiKSxpLmRlYnVnLmxvZyhhKSxjLnJlc29sdmUoYSl9KX0pLGMucHJvbWlzZX0sdz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZixnLGgsaT10aGlzLGo9ZShhLGIpLGs9TWF0aC5tYXgoYy1kLDApLGw9US5kZWZlcigpLG09MCxuPTE7cmV0dXJuIGo/KHAuY2FsbChpLGopLnRoZW4oZnVuY3Rpb24oYSl7aWYobnVsbD09PWF8fHZvaWQgMD09PWEpe2lmKCFqLmhhc093blByb3BlcnR5KFwiU2VnbWVudFRlbXBsYXRlXCIpKXRocm93XCJFeHBlY3RlZCBTZWdtZW50VGVtcGxhdGUhXCI7ai5TZWdtZW50VGVtcGxhdGUuaGFzT3duUHJvcGVydHkoXCJ0aW1lc2NhbGVcIikmJihuPWouU2VnbWVudFRlbXBsYXRlLnRpbWVzY2FsZSksaD1qLlNlZ21lbnRUZW1wbGF0ZS5kdXJhdGlvbixmPWgvbn1lbHNlIGc9YVswXSxnLmhhc093blByb3BlcnR5KFwidGltZXNjYWxlXCIpJiYobj1nLnRpbWVzY2FsZSksaD1nLmR1cmF0aW9uLGY9aC9uO209TWF0aC5jZWlsKGsvZiksbC5yZXNvbHZlKG0pfSxmdW5jdGlvbigpe2wucmVzb2x2ZSgwKX0pLGwucHJvbWlzZSk6US5yZWplY3QoXCJubyByZXByZXNlbmF0aW9uXCIpfSx4PWZ1bmN0aW9uKGIsYyl7dmFyIGYsZyxoLGksaj10aGlzLGs9ZShiLGMpLGw9ITEsbT0xLG49MSxvPVEuZGVmZXIoKTtyZXR1cm4gaz8oZz1kLDA+ZyYmKGw9YSxnPTApLHAuY2FsbChqLGspLnRoZW4oZnVuY3Rpb24oYSl7aWYobnVsbD09PWF8fHZvaWQgMD09PWEpe2lmKCFrLmhhc093blByb3BlcnR5KFwiU2VnbWVudFRlbXBsYXRlXCIpKXRocm93XCJFeHBlY3RlZCBTZWdtZW50VGVtcGxhdGUhXCI7aT1rLlNlZ21lbnRUZW1wbGF0ZS5kdXJhdGlvbixrLlNlZ21lbnRUZW1wbGF0ZS5oYXNPd25Qcm9wZXJ0eShcInRpbWVzY2FsZVwiKSYmKG09ay5TZWdtZW50VGVtcGxhdGUudGltZXNjYWxlKSxrLlNlZ21lbnRUZW1wbGF0ZS5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0TnVtYmVyXCIpJiYobj1rLlNlZ21lbnRUZW1wbGF0ZS5zdGFydE51bWJlciksZj1pL20qTWF0aC5tYXgoZy1uLDApfWVsc2UobHx8Zz49YS5sZW5ndGgpJiYoZz1hLmxlbmd0aC0xKSxoPWFbZ10uc3RhcnRUaW1lLGk9YVtnXS5kdXJhdGlvbixhW2ddLmhhc093blByb3BlcnR5KFwidGltZXNjYWxlXCIpJiYobT1hW2ddLnRpbWVzY2FsZSksZj1oL207by5yZXNvbHZlKGYpfSxmdW5jdGlvbigpe28ucmVqZWN0KCl9KSxvLnByb21pc2UpOlEucmVqZWN0KFwibm8gcmVwcmVzZW5hdGlvblwiKX07cmV0dXJue2RlYnVnOnZvaWQgMCxiYXNlVVJMRXh0OnZvaWQgMCxtYW5pZmVzdE1vZGVsOnZvaWQgMCxtYW5pZmVzdEV4dDp2b2lkIDAsZXJySGFuZGxlcjp2b2lkIDAsZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiBjfSxzZXRUeXBlOmZ1bmN0aW9uKGEpe2M9YX0sZ2V0SXNMaXZlOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldElzTGl2ZTpmdW5jdGlvbihiKXthPWJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGJ9LHNldER1cmF0aW9uOmZ1bmN0aW9uKGEpe2I9YX0sZ2V0SW5pdFJlcXVlc3Q6ayxnZXRTZWdtZW50UmVxdWVzdEZvclRpbWU6dSxnZXROZXh0U2VnbWVudFJlcXVlc3Q6dixnZXRDdXJyZW50VGltZTp4LGdldFNlZ21lbnRDb3VudEZvckR1cmF0aW9uOnd9fSxEYXNoLmRlcGVuZGVuY2llcy5EYXNoSGFuZGxlci5FUFNJTE9OPS4wMDMsRGFzaC5kZXBlbmRlbmNpZXMuRGFzaEhhbmRsZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpEYXNoLmRlcGVuZGVuY2llcy5EYXNoSGFuZGxlcn0sRGFzaC5kZXBlbmRlbmNpZXMuRGFzaE1hbmlmZXN0RXh0ZW5zaW9ucz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwifSxEYXNoLmRlcGVuZGVuY2llcy5EYXNoTWFuaWZlc3RFeHRlbnNpb25zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6RGFzaC5kZXBlbmRlbmNpZXMuRGFzaE1hbmlmZXN0RXh0ZW5zaW9ucyxnZXRJc0F1ZGlvOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiLGMsZCxlPWEuQ29udGVudENvbXBvbmVudF9hc0FycmF5LGY9ITEsZz0hMTtpZihlKWZvcihiPTAsYz1lLmxlbmd0aDtjPmI7Yis9MSlcImF1ZGlvXCI9PT1lW2JdLmNvbnRlbnRUeXBlJiYoZj0hMCxnPSEwKTtpZihhLmhhc093blByb3BlcnR5KFwibWltZVR5cGVcIikmJihmPS0xIT09YS5taW1lVHlwZS5pbmRleE9mKFwiYXVkaW9cIiksZz0hMCksIWcpZm9yKGI9MCxjPWEuUmVwcmVzZW50YXRpb25fYXNBcnJheS5sZW5ndGg7IWcmJmM+YjspZD1hLlJlcHJlc2VudGF0aW9uX2FzQXJyYXlbYl0sZC5oYXNPd25Qcm9wZXJ0eShcIm1pbWVUeXBlXCIpJiYoZj0tMSE9PWQubWltZVR5cGUuaW5kZXhPZihcImF1ZGlvXCIpLGc9ITApLGIrPTE7cmV0dXJuIGYmJihhLnR5cGU9XCJhdWRpb1wiKSxRLndoZW4oZil9LGdldElzVmlkZW86ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGIsYyxkLGU9YS5Db250ZW50Q29tcG9uZW50X2FzQXJyYXksZj0hMSxnPSExO2lmKGUpZm9yKGI9MCxjPWUubGVuZ3RoO2M+YjtiKz0xKVwidmlkZW9cIj09PWVbYl0uY29udGVudFR5cGUmJihmPSEwLGc9ITApO2lmKGEuaGFzT3duUHJvcGVydHkoXCJtaW1lVHlwZVwiKSYmKGY9LTEhPT1hLm1pbWVUeXBlLmluZGV4T2YoXCJ2aWRlb1wiKSxnPSEwKSwhZylmb3IoYj0wLGM9YS5SZXByZXNlbnRhdGlvbl9hc0FycmF5Lmxlbmd0aDshZyYmYz5iOylkPWEuUmVwcmVzZW50YXRpb25fYXNBcnJheVtiXSxkLmhhc093blByb3BlcnR5KFwibWltZVR5cGVcIikmJihmPS0xIT09ZC5taW1lVHlwZS5pbmRleE9mKFwidmlkZW9cIiksZz0hMCksYis9MTtyZXR1cm4gZiYmKGEudHlwZT1cInZpZGVvXCIpLFEud2hlbihmKX0sZ2V0SXNUZXh0OmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiLGMsZCxlPWEuQ29udGVudENvbXBvbmVudF9hc0FycmF5LGY9ITEsZz0hMTtpZihlKWZvcihiPTAsYz1lLmxlbmd0aDtjPmI7Yis9MSlcInRleHRcIj09PWVbYl0uY29udGVudFR5cGUmJihmPSEwLGc9ITApO2lmKGEuaGFzT3duUHJvcGVydHkoXCJtaW1lVHlwZVwiKSYmKGY9LTEhPT1hLm1pbWVUeXBlLmluZGV4T2YoXCJ0ZXh0XCIpLGc9ITApLCFnKWZvcihiPTAsYz1hLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkubGVuZ3RoOyFnJiZjPmI7KWQ9YS5SZXByZXNlbnRhdGlvbl9hc0FycmF5W2JdLGQuaGFzT3duUHJvcGVydHkoXCJtaW1lVHlwZVwiKSYmKGY9LTEhPT1kLm1pbWVUeXBlLmluZGV4T2YoXCJ0ZXh0XCIpLGc9ITApLGIrPTE7cmV0dXJuIFEud2hlbihmKX0sZ2V0SXNUZXh0VHJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuXCJ0ZXh0L3Z0dFwiPT09YXx8XCJhcHBsaWNhdGlvbi90dG1sK3htbFwiPT09YX0sZ2V0SXNNYWluOmZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIFEud2hlbighMSl9LHByb2Nlc3NBZGFwdGF0aW9uOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiB2b2lkIDAhPT1hLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkmJm51bGwhPT1hLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkmJmEuUmVwcmVzZW50YXRpb25fYXNBcnJheS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYmFuZHdpZHRoLWIuYmFuZHdpZHRofSksYX0sZ2V0RGF0YUZvcklkOmZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjt2YXIgZCxlLGY9Yi5QZXJpb2RfYXNBcnJheVtjXS5BZGFwdGF0aW9uU2V0X2FzQXJyYXk7Zm9yKGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKz0xKWlmKGZbZF0uaGFzT3duUHJvcGVydHkoXCJpZFwiKSYmZltkXS5pZD09PWEpcmV0dXJuIFEud2hlbihmW2RdKTtyZXR1cm4gUS53aGVuKG51bGwpfSxnZXREYXRhRm9ySW5kZXg6ZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkPWIuUGVyaW9kX2FzQXJyYXlbY10uQWRhcHRhdGlvblNldF9hc0FycmF5O3JldHVybiBRLndoZW4oZFthXSl9LGdldERhdGFJbmRleDpmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGQsZSxmPWIuUGVyaW9kX2FzQXJyYXlbY10uQWRhcHRhdGlvblNldF9hc0FycmF5O2ZvcihkPTAsZT1mLmxlbmd0aDtlPmQ7ZCs9MSlpZihmW2RdPT09YSlyZXR1cm4gUS53aGVuKGQpO3JldHVybiBRLndoZW4oLTEpfSxnZXRWaWRlb0RhdGE6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYyxkLGU9dGhpcyxmPWEuUGVyaW9kX2FzQXJyYXlbYl0uQWRhcHRhdGlvblNldF9hc0FycmF5LGc9US5kZWZlcigpLGg9W107Zm9yKGM9MCxkPWYubGVuZ3RoO2Q+YztjKz0xKWgucHVzaCh0aGlzLmdldElzVmlkZW8oZltjXSkpO3JldHVybiBRLmFsbChoKS50aGVuKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2ZvcihjPTAsZD1hLmxlbmd0aDtkPmM7Yys9MSlhW2NdPT09ITAmJihiPSEwLGcucmVzb2x2ZShlLnByb2Nlc3NBZGFwdGF0aW9uKGZbY10pKSk7Ynx8Zy5yZXNvbHZlKG51bGwpfSksZy5wcm9taXNlfSxnZXRUZXh0RGF0YTpmdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjLGQsZT10aGlzLGY9YS5QZXJpb2RfYXNBcnJheVtiXS5BZGFwdGF0aW9uU2V0X2FzQXJyYXksZz1RLmRlZmVyKCksaD1bXTtmb3IoYz0wLGQ9Zi5sZW5ndGg7ZD5jO2MrPTEpaC5wdXNoKHRoaXMuZ2V0SXNUZXh0KGZbY10pKTtyZXR1cm4gUS5hbGwoaCkudGhlbihmdW5jdGlvbihhKXt2YXIgYj0hMTtmb3IoYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrPTEpYVtjXT09PSEwJiYoYj0hMCxnLnJlc29sdmUoZS5wcm9jZXNzQWRhcHRhdGlvbihmW2NdKSkpO2J8fGcucmVzb2x2ZShudWxsKX0pLGcucHJvbWlzZX0sZ2V0QXVkaW9EYXRhczpmdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjLGQsZT10aGlzLGY9YS5QZXJpb2RfYXNBcnJheVtiXS5BZGFwdGF0aW9uU2V0X2FzQXJyYXksZz1RLmRlZmVyKCksaD1bXTtmb3IoYz0wLGQ9Zi5sZW5ndGg7ZD5jO2MrPTEpaC5wdXNoKHRoaXMuZ2V0SXNBdWRpbyhmW2NdKSk7cmV0dXJuIFEuYWxsKGgpLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGI9W107Zm9yKGM9MCxkPWEubGVuZ3RoO2Q+YztjKz0xKWFbY109PT0hMCYmYi5wdXNoKGUucHJvY2Vzc0FkYXB0YXRpb24oZltjXSkpO2cucmVzb2x2ZShiKX0pLGcucHJvbWlzZX0sZ2V0UHJpbWFyeUF1ZGlvRGF0YTpmdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjLGQsZT1RLmRlZmVyKCksZj1bXSxnPXRoaXM7cmV0dXJuIHRoaXMuZ2V0QXVkaW9EYXRhcyhhLGIpLnRoZW4oZnVuY3Rpb24oYSl7Zm9yKGEmJjAhPT1hLmxlbmd0aHx8ZS5yZXNvbHZlKG51bGwpLGM9MCxkPWEubGVuZ3RoO2Q+YztjKz0xKWYucHVzaChnLmdldElzTWFpbihhW2NdKSk7US5hbGwoZikudGhlbihmdW5jdGlvbihiKXt2YXIgZj0hMTtmb3IoYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrPTEpYltjXT09PSEwJiYoZj0hMCxlLnJlc29sdmUoZy5wcm9jZXNzQWRhcHRhdGlvbihhW2NdKSkpO2Z8fGUucmVzb2x2ZShhWzBdKX0pfSksZS5wcm9taXNlfSxnZXRDb2RlYzpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj1hLlJlcHJlc2VudGF0aW9uX2FzQXJyYXlbMF0sYz1iLm1pbWVUeXBlKyc7Y29kZWNzPVwiJytiLmNvZGVjcysnXCInO3JldHVybiBRLndoZW4oYyl9LGdldE1pbWVUeXBlOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBRLndoZW4oYS5SZXByZXNlbnRhdGlvbl9hc0FycmF5WzBdLm1pbWVUeXBlKX0sZ2V0S0lEOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBhJiZhLmhhc093blByb3BlcnR5KFwiY2VuYzpkZWZhdWx0X0tJRFwiKT9hW1wiY2VuYzpkZWZhdWx0X0tJRFwiXTpudWxsfSxnZXRDb250ZW50UHJvdGVjdGlvbkRhdGE6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGEmJmEuaGFzT3duUHJvcGVydHkoXCJDb250ZW50UHJvdGVjdGlvbl9hc0FycmF5XCIpJiYwIT09YS5Db250ZW50UHJvdGVjdGlvbl9hc0FycmF5Lmxlbmd0aD9RLndoZW4oYS5Db250ZW50UHJvdGVjdGlvbl9hc0FycmF5KTpRLndoZW4obnVsbCl9LGdldFNlZ21lbnRJbmZvRm9yOmZ1bmN0aW9uKGEpe3JldHVybiBhLmhhc093blByb3BlcnR5KFwiU2VnbWVudEJhc2VcIik/YS5TZWdtZW50QmFzZTphLmhhc093blByb3BlcnR5KFwiU2VnbWVudExpc3RcIik/YS5TZWdtZW50TGlzdDphLmhhc093blByb3BlcnR5KFwiU2VnbWVudFRlbXBsYXRlXCIpP2EuU2VnbWVudFRlbXBsYXRlOm51bGx9LGdldExpdmVPZmZzZXQ6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9MTU7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoXCJzdWdnZXN0ZWRQcmVzZW50YXRpb25EZWxheVwiKSYmKGI9YS5zdWdnZXN0ZWRQcmVzZW50YXRpb25EZWxheSksUS53aGVuKGIpfSxnZXRMaXZlU3RhcnQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPTEsZz0xLGg9bnVsbCxpPW51bGw7cmV0dXJuIGQ9YS5QZXJpb2RfYXNBcnJheVtiXS5BZGFwdGF0aW9uU2V0X2FzQXJyYXlbMV0uUmVwcmVzZW50YXRpb25fYXNBcnJheVswXSxkLmhhc093blByb3BlcnR5KFwiU2VnbWVudExpc3RcIik/KGg9ZC5TZWdtZW50TGlzdCxoLmhhc093blByb3BlcnR5KFwic3RhcnROdW1iZXJcIikmJihmPU1hdGgubWF4KGguc3RhcnROdW1iZXIsMSkpLGguaGFzT3duUHJvcGVydHkoXCJ0aW1lc2NhbGVcIikmJihnPWgudGltZXNjYWxlKSxjPWguZHVyYXRpb24sZT0oZi0xKSpjL2cpOmQuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGVtcGxhdGVcIikmJihpPWQuU2VnbWVudFRlbXBsYXRlLGkuaGFzT3duUHJvcGVydHkoXCJzdGFydE51bWJlclwiKSYmKGY9TWF0aC5tYXgoaS5zdGFydE51bWJlciwxKSksaS5oYXNPd25Qcm9wZXJ0eShcInRpbWVzY2FsZVwiKSYmKGc9aS50aW1lc2NhbGUpLGM9aS5kdXJhdGlvbixlPWkuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGltZWxpbmVcIik/aS5TZWdtZW50VGltZWxpbmUuU19hc0FycmF5WzBdLnQvZzooZi0xKSpjL2cpLFEud2hlbihlKX0sZ2V0TGl2ZUVkZ2U6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYyxkPXRoaXMsZT1RLmRlZmVyKCksZj0wLGc9bmV3IERhdGUsaD1hLmF2YWlsYWJpbGl0eVN0YXJ0VGltZTtyZXR1cm4gZC5nZXRMaXZlT2Zmc2V0KGEpLnRoZW4oZnVuY3Rpb24oaSl7YS5oYXNPd25Qcm9wZXJ0eShcImF2YWlsYWJpbGl0eUVuZFRpbWVcIik/KGM9YS5hdmFpbGFiaWxpdHlFbmRUaW1lLGY9KGMuZ2V0VGltZSgpLWguZ2V0VGltZSgpKS8xZTMpOmY9KGcuZ2V0VGltZSgpLWguZ2V0VGltZSgpKS8xZTMsZC5nZXRMaXZlU3RhcnQoYSxiKS50aGVuKGZ1bmN0aW9uKGEpe2YrPWEsZi09aSxlLnJlc29sdmUoZil9KX0pLGUucHJvbWlzZX0sZ2V0UHJlc2VudGF0aW9uT2Zmc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPXRoaXMsZj1RLmRlZmVyKCksZz0wLGg9MTtyZXR1cm4gZS5nZXRSZXByZXNlbnRhdGlvbkZvcihhLGIpLnRoZW4oZnVuY3Rpb24oYSl7ZD1lLmdldFNlZ21lbnRJbmZvRm9yKGEpLG51bGwhPT1kJiZ2b2lkIDAhPT1kJiZkLmhhc093blByb3BlcnR5KFwicHJlc2VudGF0aW9uVGltZU9mZnNldFwiKSYmKGM9ZC5wcmVzZW50YXRpb25UaW1lT2Zmc2V0LGQuaGFzT3duUHJvcGVydHkoXCJ0aW1lc2NhbGVcIikmJihoPWQudGltZXNjYWxlKSxnPWMvaCksZi5yZXNvbHZlKGcpfSksZi5wcm9taXNlfSxnZXRJc0xpdmU6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9ITEsYz1cImR5bmFtaWNcIjtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShcInR5cGVcIikmJihiPWEudHlwZT09PWMpLGJ9LGdldElzRFZSOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGMsZDtyZXR1cm4gYz0haXNOYU4oYS50aW1lU2hpZnRCdWZmZXJEZXB0aCksZD1iJiZjLFEud2hlbihkKX0sZ2V0SXNPbkRlbWFuZDpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj0hMTtyZXR1cm4gYS5wcm9maWxlcyYmYS5wcm9maWxlcy5sZW5ndGg+MCYmKGI9LTEhPT1hLnByb2ZpbGVzLmluZGV4T2YoXCJ1cm46bXBlZzpkYXNoOnByb2ZpbGU6aXNvZmYtb24tZGVtYW5kOjIwMTFcIikpLFEud2hlbihiKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYz0wLzA7cmV0dXJuIGI/Yz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6YS5tZWRpYVByZXNlbnRhdGlvbkR1cmF0aW9uP2M9YS5tZWRpYVByZXNlbnRhdGlvbkR1cmF0aW9uOmEuYXZhaWxhYmlsaXR5RW5kVGltZSYmYS5hdmFpbGFiaWxpdHlTdGFydFRpbWUmJihjPWEuYXZhaWxhYmlsaXR5RW5kVGltZS5nZXRUaW1lKCktYS5hdmFpbGFiaWxpdHlTdGFydFRpbWUuZ2V0VGltZSgpKSxRLndoZW4oYyl9LGdldER1cmF0aW9uRm9yUGVyaW9kOmZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjt2YXIgZD0wLzA7cmV0dXJuIGM/ZD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6Yi5QZXJpb2RfYXNBcnJheS5sZW5ndGg+MSYmdm9pZCAwIT09Yi5QZXJpb2RfYXNBcnJheVthXS5kdXJhdGlvbj9kPWIuUGVyaW9kX2FzQXJyYXlbYV0uZHVyYXRpb246Yi5tZWRpYVByZXNlbnRhdGlvbkR1cmF0aW9uP2Q9Yi5tZWRpYVByZXNlbnRhdGlvbkR1cmF0aW9uOmIuYXZhaWxhYmlsaXR5RW5kVGltZSYmYi5hdmFpbGFiaWxpdHlTdGFydFRpbWUmJihkPWIuYXZhaWxhYmlsaXR5RW5kVGltZS5nZXRUaW1lKCktYi5hdmFpbGFiaWxpdHlTdGFydFRpbWUuZ2V0VGltZSgpKSxRLndoZW4oZCl9LGdldEJhbmR3aWR0aDpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gUS53aGVuKGEuYmFuZHdpZHRoKX0sZ2V0UmVmcmVzaERlbGF5OmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPTAvMDtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShcIm1pbmltdW1VcGRhdGVQZXJpb2RcIikmJihiPXBhcnNlRmxvYXQoYS5taW5pbXVtVXBkYXRlUGVyaW9kKSksUS53aGVuKGIpfSxnZXRSZXByZXNlbnRhdGlvbkNvdW50OmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBRLndoZW4oYS5SZXByZXNlbnRhdGlvbl9hc0FycmF5Lmxlbmd0aCl9LGdldFJlcHJlc2VudGF0aW9uRm9yOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIFEud2hlbihiLlJlcHJlc2VudGF0aW9uX2FzQXJyYXlbYV0pfSxnZXRQZXJpb2RDb3VudDpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gUS53aGVuKGEuUGVyaW9kX2FzQXJyYXkubGVuZ3RoKX0sZ2V0VGltZXN0YW1wT2Zmc2V0Rm9yUGVyaW9kOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGY9dGhpcyxnPVEuZGVmZXIoKTtyZXR1cm4gZi5nZXRQcmVzZW50YXRpb25PZmZzZXQoYyxkKS50aGVuKGZ1bmN0aW9uKGMpe2YuZ2V0UGVyaW9kU3RhcnQoYixhKS50aGVuKGZ1bmN0aW9uKGEpe2U9YS1jLGcucmVzb2x2ZShlKX0pfSksZy5wcm9taXNlfSxnZXRQZXJpb2RTdGFydDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT10aGlzLGY9ZS5nZXRJc0xpdmUoYSksZz1udWxsLGg9bnVsbCxpPW51bGw7Zm9yKGM9MDtiPj1jO2MrPTEpZz1hLlBlcmlvZF9hc0FycmF5W2NdLGcuaGFzT3duUHJvcGVydHkoXCJzdGFydFwiKT9kPWcuc3RhcnQ6bnVsbCE9PWgmJm51bGwhPT1pP2Q9aCtpOjAhPT1jfHxmfHwoZD0wKSxnLmhhc093blByb3BlcnR5KFwiZHVyYXRpb25cIikmJihpPWcuZHVyYXRpb24pLGg9ZDtyZXR1cm4gUS53aGVuKGQpfX0sRGFzaC5kZXBlbmRlbmNpZXMuRGFzaE1ldHJpY3NFeHRlbnNpb25zPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2ZvcihoPTA7aDxhLmxlbmd0aDtoKz0xKWZvcihjPWFbaF0sZT1jLkFkYXB0YXRpb25TZXRfYXNBcnJheSxpPTA7aTxlLmxlbmd0aDtpKz0xKWZvcihkPWVbaV0sZz1kLlJlcHJlc2VudGF0aW9uX2FzQXJyYXksaj0wO2o8Zy5sZW5ndGg7ais9MSlpZihmPWdbal0sYj09PWYuaWQpcmV0dXJuIGo7cmV0dXJuLTF9LGI9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2ZvcihoPTA7aDxhLmxlbmd0aDtoKz0xKWZvcihjPWFbaF0sZT1jLkFkYXB0YXRpb25TZXRfYXNBcnJheSxpPTA7aTxlLmxlbmd0aDtpKz0xKWZvcihkPWVbaV0sZz1kLlJlcHJlc2VudGF0aW9uX2FzQXJyYXksaj0wO2o8Zy5sZW5ndGg7ais9MSlpZihmPWdbal0sYj09PWYuaWQpcmV0dXJuIGY7cmV0dXJuIG51bGx9LGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz0hMTtyZXR1cm5cInZpZGVvXCI9PT1iPyh0aGlzLm1hbmlmZXN0RXh0LmdldElzVmlkZW8oYSksXCJ2aWRlb1wiPT09YS50eXBlJiYoYz0hMCkpOlwiYXVkaW9cIj09PWI/KHRoaXMubWFuaWZlc3RFeHQuZ2V0SXNBdWRpbyhhKSxcImF1ZGlvXCI9PT1hLnR5cGUmJihjPSEwKSk6Yz0hMSxjfSxkPWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmLGcsaCxpO2ZvcihoPTA7aDxhLmxlbmd0aDtoKz0xKWZvcihkPWFbaF0sZj1kLkFkYXB0YXRpb25TZXRfYXNBcnJheSxpPTA7aTxmLmxlbmd0aDtpKz0xKWlmKGU9ZltpXSxnPWUuUmVwcmVzZW50YXRpb25fYXNBcnJheSxjLmNhbGwodGhpcyxlLGIpKXJldHVybiBnLmxlbmd0aDtyZXR1cm4tMX0sZT1mdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1kLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxmPWUuUGVyaW9kX2FzQXJyYXk7cmV0dXJuIGM9Yi5jYWxsKGQsZixhKSxudWxsPT09Yz9udWxsOmMuYmFuZHdpZHRofSxmPWZ1bmN0aW9uKGIpe3ZhciBjLGQ9dGhpcyxlPWQubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGY9ZS5QZXJpb2RfYXNBcnJheTtyZXR1cm4gYz1hLmNhbGwoZCxmLGIpfSxnPWZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcyxlPWMubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGY9ZS5QZXJpb2RfYXNBcnJheTtyZXR1cm4gYj1kLmNhbGwodGhpcyxmLGEpfSxoPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiBudWxsO3ZhciBiLGMsZCxlPWEuUmVwU3dpdGNoTGlzdDtyZXR1cm4gbnVsbD09PWV8fGUubGVuZ3RoPD0wP251bGw6KGI9ZS5sZW5ndGgsYz1iLTEsZD1lW2NdKX0saT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDt2YXIgYixjLGQsZT1hLkJ1ZmZlckxldmVsO3JldHVybiBudWxsPT09ZXx8ZS5sZW5ndGg8PTA/bnVsbDooYj1lLmxlbmd0aCxjPWItMSxkPWVbY10pfSxqPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiBudWxsO3ZhciBiLGMsZCxlPWEuSHR0cExpc3Q7cmV0dXJuIG51bGw9PT1lfHxlLmxlbmd0aDw9MD9udWxsOihiPWUubGVuZ3RoLGM9Yi0xLGQ9ZVtjXSl9LGs9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7dmFyIGIsYyxkLGU9YS5Ecm9wcGVkRnJhbWVzO3JldHVybiBudWxsPT09ZXx8ZS5sZW5ndGg8PTA/bnVsbDooYj1lLmxlbmd0aCxjPWItMSxkPWVbY10pfTtyZXR1cm57bWFuaWZlc3RNb2RlbDp2b2lkIDAsbWFuaWZlc3RFeHQ6dm9pZCAwLGdldEJhbmR3aWR0aEZvclJlcHJlc2VudGF0aW9uOmUsZ2V0SW5kZXhGb3JSZXByZXNlbnRhdGlvbjpmLGdldE1heEluZGV4Rm9yQnVmZmVyVHlwZTpnLGdldEN1cnJlbnRSZXByZXNlbnRhdGlvblN3aXRjaDpoLGdldEN1cnJlbnRCdWZmZXJMZXZlbDppLGdldEN1cnJlbnRIdHRwUmVxdWVzdDpqLGdldEN1cnJlbnREcm9wcGVkRnJhbWVzOmt9fSxEYXNoLmRlcGVuZGVuY2llcy5EYXNoTWV0cmljc0V4dGVuc2lvbnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpEYXNoLmRlcGVuZGVuY2llcy5EYXNoTWV0cmljc0V4dGVuc2lvbnN9LERhc2guZGVwZW5kZW5jaWVzLkRhc2hQYXJzZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT0zMTUzNmUzLGI9MjU5MmUzLGM9ODY0MDAsZD0zNjAwLGU9NjAsZj0vXlAoKFtcXGQuXSopWSk/KChbXFxkLl0qKU0pPygoW1xcZC5dKilEKT9UKChbXFxkLl0qKUgpPygoW1xcZC5dKilNKT8oKFtcXGQuXSopUyk/LyxnPS9eKFxcZHs0fVxcLVxcZFxcZFxcLVxcZFxcZChbdFRdW1xcZDpcXC5dKik/KShbelpdfChbK1xcLV0pKFxcZFxcZCk6KFxcZFxcZCkpPyQvLGg9L15bLStdP1swLTldK1suXT9bMC05XSooW2VFXVstK10/WzAtOV0rKT8kLyxpPVt7dHlwZTpcImR1cmF0aW9uXCIsdGVzdDpmdW5jdGlvbihhKXtyZXR1cm4gZi50ZXN0KGEpfSxjb252ZXJ0ZXI6ZnVuY3Rpb24oZyl7dmFyIGg9Zi5leGVjKGcpO3JldHVybiBwYXJzZUZsb2F0KGhbMl18fDApKmErcGFyc2VGbG9hdChoWzRdfHwwKSpiK3BhcnNlRmxvYXQoaFs2XXx8MCkqYytwYXJzZUZsb2F0KGhbOF18fDApKmQrcGFyc2VGbG9hdChoWzEwXXx8MCkqZStwYXJzZUZsb2F0KGhbMTJdfHwwKX19LHt0eXBlOlwiZGF0ZXRpbWVcIix0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiBnLnRlc3QoYSl9LGNvbnZlcnRlcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IERhdGUoYSl9fSx7dHlwZTpcIm51bWVyaWNcIix0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiBoLnRlc3QoYSl9LGNvbnZlcnRlcjpmdW5jdGlvbihhKXtyZXR1cm4gcGFyc2VGbG9hdChhKX19XSxqPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7cmV0dXJuIGQ9W3tuYW1lOlwicHJvZmlsZXNcIixtZXJnZTohMX0se25hbWU6XCJ3aWR0aFwiLG1lcmdlOiExfSx7bmFtZTpcImhlaWdodFwiLG1lcmdlOiExfSx7bmFtZTpcInNhclwiLG1lcmdlOiExfSx7bmFtZTpcImZyYW1lUmF0ZVwiLG1lcmdlOiExfSx7bmFtZTpcImF1ZGlvU2FtcGxpbmdSYXRlXCIsbWVyZ2U6ITF9LHtuYW1lOlwibWltZVR5cGVcIixtZXJnZTohMX0se25hbWU6XCJzZWdtZW50UHJvZmlsZXNcIixtZXJnZTohMX0se25hbWU6XCJjb2RlY3NcIixtZXJnZTohMX0se25hbWU6XCJtYXhpbXVtU0FQUGVyaW9kXCIsbWVyZ2U6ITF9LHtuYW1lOlwic3RhcnRzV2l0aFNhcFwiLG1lcmdlOiExfSx7bmFtZTpcIm1heFBsYXlvdXRSYXRlXCIsbWVyZ2U6ITF9LHtuYW1lOlwiY29kaW5nRGVwZW5kZW5jeVwiLG1lcmdlOiExfSx7bmFtZTpcInNjYW5UeXBlXCIsbWVyZ2U6ITF9LHtuYW1lOlwiRnJhbWVQYWNraW5nXCIsbWVyZ2U6ITB9LHtuYW1lOlwiQXVkaW9DaGFubmVsQ29uZmlndXJhdGlvblwiLG1lcmdlOiEwfSx7bmFtZTpcIkNvbnRlbnRQcm90ZWN0aW9uXCIsbWVyZ2U6ITB9XSxhPXt9LGEubmFtZT1cIkFkYXB0YXRpb25TZXRcIixhLmlzUm9vdD0hMSxhLmlzQXJyYXk9ITAsYS5wYXJlbnQ9bnVsbCxhLmNoaWxkcmVuPVtdLGEucHJvcGVydGllcz1kLGI9e30sYi5uYW1lPVwiUmVwcmVzZW50YXRpb25cIixiLmlzUm9vdD0hMSxiLmlzQXJyYXk9ITAsYi5wYXJlbnQ9YSxiLmNoaWxkcmVuPVtdLGIucHJvcGVydGllcz1kLGEuY2hpbGRyZW4ucHVzaChiKSxjPXt9LGMubmFtZT1cIlN1YlJlcHJlc2VudGF0aW9uXCIsYy5pc1Jvb3Q9ITEsYy5pc0FycmF5PSEwLGMucGFyZW50PWIsYy5jaGlsZHJlbj1bXSxjLnByb3BlcnRpZXM9ZCxiLmNoaWxkcmVuLnB1c2goYyksYX0saz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkO3JldHVybiBkPVt7bmFtZTpcIlNlZ21lbnRCYXNlXCIsbWVyZ2U6ITB9LHtuYW1lOlwiU2VnbWVudFRlbXBsYXRlXCIsbWVyZ2U6ITB9LHtuYW1lOlwiU2VnbWVudExpc3RcIixtZXJnZTohMH1dLGE9e30sYS5uYW1lPVwiUGVyaW9kXCIsYS5pc1Jvb3Q9ITEsYS5pc0FycmF5PSEwLGEucGFyZW50PW51bGwsYS5jaGlsZHJlbj1bXSxhLnByb3BlcnRpZXM9ZCxiPXt9LGIubmFtZT1cIkFkYXB0YXRpb25TZXRcIixiLmlzUm9vdD0hMSxiLmlzQXJyYXk9ITAsYi5wYXJlbnQ9YSxiLmNoaWxkcmVuPVtdLGIucHJvcGVydGllcz1kLGEuY2hpbGRyZW4ucHVzaChiKSxjPXt9LGMubmFtZT1cIlJlcHJlc2VudGF0aW9uXCIsYy5pc1Jvb3Q9ITEsYy5pc0FycmF5PSEwLGMucGFyZW50PWIsYy5jaGlsZHJlbj1bXSxjLnByb3BlcnRpZXM9ZCxiLmNoaWxkcmVuLnB1c2goYyksYX0sbD1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU7cmV0dXJuIGU9W3tuYW1lOlwiQmFzZVVSTFwiLG1lcmdlOiEwLG1lcmdlRnVuY3Rpb246ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gYz0wPT09Yi5pbmRleE9mKFwiaHR0cDovL1wiKT9iOmErYn19XSxhPXt9LGEubmFtZT1cIm1wZFwiLGEuaXNSb290PSEwLGEuaXNBcnJheT0hMCxhLnBhcmVudD1udWxsLGEuY2hpbGRyZW49W10sYS5wcm9wZXJ0aWVzPWUsYj17fSxiLm5hbWU9XCJQZXJpb2RcIixiLmlzUm9vdD0hMSxiLmlzQXJyYXk9ITAsYi5wYXJlbnQ9bnVsbCxiLmNoaWxkcmVuPVtdLGIucHJvcGVydGllcz1lLGEuY2hpbGRyZW4ucHVzaChiKSxjPXt9LGMubmFtZT1cIkFkYXB0YXRpb25TZXRcIixjLmlzUm9vdD0hMSxjLmlzQXJyYXk9ITAsYy5wYXJlbnQ9YixjLmNoaWxkcmVuPVtdLGMucHJvcGVydGllcz1lLGIuY2hpbGRyZW4ucHVzaChjKSxkPXt9LGQubmFtZT1cIlJlcHJlc2VudGF0aW9uXCIsZC5pc1Jvb3Q9ITEsZC5pc0FycmF5PSEwLGQucGFyZW50PWMsZC5jaGlsZHJlbj1bXSxkLnByb3BlcnRpZXM9ZSxjLmNoaWxkcmVuLnB1c2goZCksYX0sbT1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiBhLnB1c2goaigpKSxhLnB1c2goaygpKSxhLnB1c2gobCgpKSxhfSxuPWZ1bmN0aW9uKGEsYil7dGhpcy5kZWJ1Zy5sb2coXCJEb2luZyBwYXJzZS5cIik7dmFyIGMsZD1uZXcgWDJKUyhpLFwiXCIsITApLGU9bmV3IE9iamVjdElyb24obSgpKTt0cnl7dGhpcy5kZWJ1Zy5sb2coXCJDb252ZXJ0aW5nIGZyb20gWE1MLlwiKSxjPWQueG1sX3N0cjJqc29uKGEpLGMuaGFzT3duUHJvcGVydHkoXCJCYXNlVVJMXCIpPyhjLkJhc2VVUkw9Yy5CYXNlVVJMX2FzQXJyYXlbMF0sMCE9PWMuQmFzZVVSTC50b1N0cmluZygpLmluZGV4T2YoXCJodHRwXCIpJiYoYy5CYXNlVVJMPWIrYy5CYXNlVVJMKSk6KHRoaXMuZGVidWcubG9nKFwiU2V0dGluZyBiYXNlVVJMOiBcIitiKSxjLkJhc2VVUkw9YiksdGhpcy5kZWJ1Zy5sb2coXCJGbGF0dGVuIG1hbmlmZXN0IHByb3BlcnRpZXMuXCIpLGUucnVuKGMpLHRoaXMuZGVidWcubG9nKFwiUGFyc2luZyBjb21wbGV0ZS5cIil9Y2F0Y2goZil7cmV0dXJuIHRoaXMuZXJySGFuZGxlci5tYW5pZmVzdEVycm9yKFwicGFyc2luZyB0aGUgbWFuaWZlc3QgZmFpbGVkXCIsXCJwYXJzZVwiLGEpLFEucmVqZWN0KGYpfXJldHVybiBRLndoZW4oYyl9O3JldHVybntkZWJ1Zzp2b2lkIDAsZXJySGFuZGxlcjp2b2lkIDAscGFyc2U6bn19LERhc2guZGVwZW5kZW5jaWVzLkRhc2hQYXJzZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpEYXNoLmRlcGVuZGVuY2llcy5EYXNoUGFyc2VyfSxEYXNoLmRlcGVuZGVuY2llcy5GcmFnbWVudEV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1mdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkLGUsZixnLGg9US5kZWZlcigpLGk9bmV3IERhdGFWaWV3KGEpLGo9MDtcInRmZHRcIiE9PWUmJmo8aS5ieXRlTGVuZ3RoOyl7Zm9yKGQ9aS5nZXRVaW50MzIoaiksais9NCxlPVwiXCIsZj0wOzQ+ZjtmKz0xKWc9aS5nZXRJbnQ4KGopLGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoZyksais9MTtcIm1vb2ZcIiE9PWUmJlwidHJhZlwiIT09ZSYmXCJ0ZmR0XCIhPT1lJiYoais9ZC04KX1pZihqPT09aS5ieXRlTGVuZ3RoKXRocm93XCJFcnJvciBmaW5kaW5nIGxpdmUgb2Zmc2V0LlwiO3JldHVybiBjPWkuZ2V0VWludDgoaiksdGhpcy5kZWJ1Zy5sb2coXCJwb3NpdGlvbjogXCIraiksMD09PWM/KGorPTQsYj1pLmdldFVpbnQzMihqLCExKSk6KGorPWQtMTYsYj11dGlscy5NYXRoLnRvNjRCaXROdW1iZXIoaS5nZXRVaW50MzIoais0LCExKSxpLmdldFVpbnQzMihqLCExKSkpLGgucmVzb2x2ZSh7dmVyc2lvbjpjLGJhc2VfbWVkaWFfZGVjb2RlX3RpbWU6Yn0pLGgucHJvbWlzZX0sYj1mdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkLGUsZixnLGgsaT1uZXcgRGF0YVZpZXcoYSksaj0wO1wic2lkeFwiIT09ZiYmajxpLmJ5dGVMZW5ndGg7KXtmb3IoZz1pLmdldFVpbnQzMihqKSxqKz00LGY9XCJcIixlPTA7ND5lO2UrPTEpaD1pLmdldEludDgoaiksZis9U3RyaW5nLmZyb21DaGFyQ29kZShoKSxqKz0xO1wibW9vZlwiIT09ZiYmXCJ0cmFmXCIhPT1mJiZcInNpZHhcIiE9PWY/ais9Zy04Olwic2lkeFwiPT09ZiYmKGotPTgpfXJldHVybiBiPWkuZ2V0VWludDgoais4KSxqKz0xMixjPWkuZ2V0VWludDMyKGorNCwhMSksais9OCxkPTA9PT1iP2kuZ2V0VWludDMyKGosITEpOnV0aWxzLk1hdGgudG82NEJpdE51bWJlcihpLmdldFVpbnQzMihqKzQsITEpLGkuZ2V0VWludDMyKGosITEpKSxRLndoZW4oe2VhcmxpZXN0UHJlc2VudGF0aW9uVGltZTpkLHRpbWVzY2FsZTpjfSl9LGM9ZnVuY3Rpb24oYil7dmFyIGMsZCxlLGY9US5kZWZlcigpLGc9bmV3IFhNTEh0dHBSZXF1ZXN0LGg9ITE7cmV0dXJuIGM9YixnLm9ubG9hZGVuZD1mdW5jdGlvbigpe2h8fChkPVwiRXJyb3IgbG9hZGluZyBmcmFnbWVudDogXCIrYyxmLnJlamVjdChkKSl9LGcub25sb2FkPWZ1bmN0aW9uKCl7aD0hMCxlPWEoZy5yZXNwb25zZSksZi5yZXNvbHZlKGUpfSxnLm9uZXJyb3I9ZnVuY3Rpb24oKXtkPVwiRXJyb3IgbG9hZGluZyBmcmFnbWVudDogXCIrYyxmLnJlamVjdChkKX0sZy5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiLGcub3BlbihcIkdFVFwiLGMpLGcuc2VuZChudWxsKSxmLnByb21pc2V9O3JldHVybntkZWJ1Zzp2b2lkIDAsbG9hZEZyYWdtZW50OmMscGFyc2VURkRUOmEscGFyc2VTSURYOmJ9fSxEYXNoLmRlcGVuZGVuY2llcy5GcmFnbWVudEV4dGVuc2lvbnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpEYXNoLmRlcGVuZGVuY2llcy5GcmFnbWVudEV4dGVuc2lvbnN9LERhc2gudm8uU2VnbWVudD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3RoaXMuaW5kZXhSYW5nZT1udWxsLHRoaXMuaW5kZXg9bnVsbCx0aGlzLm1lZGlhUmFuZ2U9bnVsbCx0aGlzLm1lZGlhPW51bGwsdGhpcy5kdXJhdGlvbj0wLzAsdGhpcy5zdGFydFRpbWU9MC8wLHRoaXMudGltZXNjYWxlPTAvMH0sRGFzaC52by5TZWdtZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6RGFzaC52by5TZWdtZW50fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQWJyQ29udHJvbGxlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPSEwLGI9e30sYz17fSxkPWZ1bmN0aW9uKGEpe3ZhciBjO3JldHVybiBiLmhhc093blByb3BlcnR5KGEpfHwoYlthXT0wKSxjPWJbYV19LGU9ZnVuY3Rpb24oYSxjKXtiW2FdPWN9LGY9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGMuaGFzT3duUHJvcGVydHkoYSl8fChjW2FdPTApLGI9Y1thXX0sZz1mdW5jdGlvbihhLGIpe2NbYV09Yn07cmV0dXJue2RlYnVnOnZvaWQgMCxhYnJSdWxlc0NvbGxlY3Rpb246dm9pZCAwLG1hbmlmZXN0RXh0OnZvaWQgMCxtZXRyaWNzTW9kZWw6dm9pZCAwLGdldEF1dG9Td2l0Y2hCaXRyYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldEF1dG9Td2l0Y2hCaXRyYXRlOmZ1bmN0aW9uKGIpe2E9Yn0sZ2V0TWV0cmljc0ZvcjpmdW5jdGlvbihhKXt2YXIgYj1RLmRlZmVyKCksYz10aGlzO3JldHVybiBjLm1hbmlmZXN0RXh0LmdldElzVmlkZW8oYSkudGhlbihmdW5jdGlvbihkKXtkP2IucmVzb2x2ZShjLm1ldHJpY3NNb2RlbC5nZXRNZXRyaWNzRm9yKFwidmlkZW9cIikpOmMubWFuaWZlc3RFeHQuZ2V0SXNBdWRpbyhhKS50aGVuKGZ1bmN0aW9uKGEpe2E/Yi5yZXNvbHZlKGMubWV0cmljc01vZGVsLmdldE1ldHJpY3NGb3IoXCJhdWRpb1wiKSk6Yi5yZXNvbHZlKGMubWV0cmljc01vZGVsLmdldE1ldHJpY3NGb3IoXCJzdHJlYW1cIikpfSl9KSxiLnByb21pc2V9LGdldFBsYXliYWNrUXVhbGl0eTpmdW5jdGlvbihiLGMpe3ZhciBoLGksaixrLGwsbSxuPXRoaXMsbz1RLmRlZmVyKCkscD1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0UscT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0Uscj1bXTtyZXR1cm4gbD1kKGIpLG09ZihiKSxuLmRlYnVnLmxvZyhcIkFCUiBlbmFibGVkPyAoXCIrYStcIilcIiksYT8obi5kZWJ1Zy5sb2coXCJDaGVjayBBQlIgcnVsZXMuXCIpLG4uZ2V0TWV0cmljc0ZvcihjKS50aGVuKGZ1bmN0aW9uKGEpe24uYWJyUnVsZXNDb2xsZWN0aW9uLmdldFJ1bGVzKCkudGhlbihmdW5jdGlvbihkKXtmb3IoaD0wLGk9ZC5sZW5ndGg7aT5oO2grPTEpci5wdXNoKGRbaF0uY2hlY2tJbmRleChsLGEsYykpO1xuUS5hbGwocikudGhlbihmdW5jdGlvbihhKXtmb3Iobi5kZWJ1Zy5sb2coYSksaz17fSxrW01lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9OR109TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuTk9fQ0hBTkdFLGtbTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuV0VBS109TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuTk9fQ0hBTkdFLGtbTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuREVGQVVMVF09TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuTk9fQ0hBTkdFLGg9MCxpPWEubGVuZ3RoO2k+aDtoKz0xKWo9YVtoXSxqLnF1YWxpdHkhPT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0UmJihrW2oucHJpb3JpdHldPU1hdGgubWluKGtbai5wcmlvcml0eV0sai5xdWFsaXR5KSk7a1tNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5XRUFLXSE9PU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSYmKHE9TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuV0VBSyxwPWtbTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuV0VBS10pLGtbTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuREVGQVVMVF0hPT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0UmJihxPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLkRFRkFVTFQscD1rW01lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLkRFRkFVTFRdKSxrW01lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9OR10hPT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0UmJihxPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9ORyxwPWtbTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuU1RST05HXSkscCE9PU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSYmdm9pZCAwIT09cCYmKGw9cCkscSE9PU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSYmdm9pZCAwIT09cSYmKG09cSksbi5tYW5pZmVzdEV4dC5nZXRSZXByZXNlbnRhdGlvbkNvdW50KGMpLnRoZW4oZnVuY3Rpb24oYSl7MD5sJiYobD0wKSxsPj1hJiYobD1hLTEpLG0hPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9ORyYmbSE9TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuV0VBSyYmKG09TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuREVGQVVMVCksZShiLGwpLG4uZGVidWcubG9nKFwiTmV3IHF1YWxpdHkgb2YgXCIrbCksZyhiLG0pLG4uZGVidWcubG9nKFwiTmV3IGNvbmZpZGVuY2Ugb2YgXCIrbSksby5yZXNvbHZlKHtxdWFsaXR5OmwsY29uZmlkZW5jZTptfSl9KX0pfSl9KSk6KG4uZGVidWcubG9nKFwiVW5jaGFuZ2VkIHF1YWxpdHkgb2YgXCIrbCksby5yZXNvbHZlKHtxdWFsaXR5OmwsY29uZmlkZW5jZTptfSkpLG8ucHJvbWlzZX0sc2V0UGxheWJhY2tRdWFsaXR5OmZ1bmN0aW9uKGEsYil7dmFyIGM9ZChhKTtiIT09YyYmZShhLGIpfSxnZXRRdWFsaXR5Rm9yOmZ1bmN0aW9uKGEpe3JldHVybiBkKGEpfX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5BYnJDb250cm9sbGVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkFickNvbnRyb2xsZXJ9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJDb250cm9sbGVyPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGEsYixjLGQsZT0uNSxmPTIyLGc9XCJXQUlUSU5HXCIsaD1cIlJFQURZXCIsaT1cIlZBTElEQVRJTkdcIixqPVwiTE9BRElOR1wiLGs9ZyxsPSExLG09ITEsbj0hMSxvPSEwLHA9W10scT0hMSxyPS0xLHM9ITAsdD0tMSx1PSExLHY9ITEsdz0hMSx4PSExLHk9W10sej1udWxsLEE9US5kZWZlcigpLEI9bnVsbCxDPW51bGwsRD0tMSxFPTAsRj0wLEc9bnVsbCxIPTAsST0hMSxKPW51bGwsSz0wLEw9ITEsTT1udWxsLE49bnVsbCxPPW51bGwsUD1udWxsLFI9ITAsUz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2IuZGVidWcubG9nKFwiQnVmZmVyQ29udHJvbGxlciBcIitjK1wiIHNldFN0YXRlIHRvOlwiK2EpLGs9YSxudWxsIT09RyYmYi5mcmFnbWVudENvbnRyb2xsZXIub25CdWZmZXJDb250cm9sbGVyU3RhdGVDaGFuZ2UoKX0sVD1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1udWxsO1I9PT0hMSYmKGQ9UC5zdGFydCxjPWEuZ2V0VGltZSgpLWQuZ2V0VGltZSgpLFAuZHVyYXRpb249YyxQLnN0b3ByZWFzb249YixSPSEwKX0sVT1mdW5jdGlvbigpe3ZhciBhPXRoaXMubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGI9dGhpcy5tYW5pZmVzdEV4dC5nZXRJc0xpdmUoYSk7cmV0dXJuIHc9ITAsUS53aGVuKGIpfSxWPWZ1bmN0aW9uKCl7aWYobCYmbSl7dmFyIGE9dGhpcztVLmNhbGwodGhpcykudGhlbihmdW5jdGlvbihiKXt2PWIsYS5kZWJ1Zy5sb2coXCJCdWZmZXJDb250cm9sbGVyIGJlZ2luIFwiK2MrXCIgdmFsaWRhdGlvblwiKSxTLmNhbGwoYSxoKSxhLnJlcXVlc3RTY2hlZHVsZXIuc3RhcnRTY2hlZHVsaW5nKGEscmIpLEc9YS5mcmFnbWVudENvbnRyb2xsZXIuYXR0YWNoQnVmZmVyQ29udHJvbGxlcihhKX0pfX0sVz1mdW5jdGlvbigpe3ZhciBhO3RoaXMucmVxdWVzdFNjaGVkdWxlci5pc1NjaGVkdWxlZCh0aGlzKXx8KHE9PT0hMSYmKGE9bmV3IERhdGUsVChhLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2UuVVNFUl9SRVFVRVNUX1NUT1BfUkVBU09OKSxPPXRoaXMubWV0cmljc01vZGVsLmFkZFBsYXlMaXN0KGMsYSwwLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuSU5JVElBTF9QTEFZX1NUQVJUX1JFQVNPTikpLHRoaXMuZGVidWcubG9nKFwiQnVmZmVyQ29udHJvbGxlciBcIitjK1wiIHN0YXJ0LlwiKSxtPSEwLG49ITAsVi5jYWxsKHRoaXMpKX0sWD1mdW5jdGlvbihhKXt2YXIgYjt0aGlzLmRlYnVnLmxvZyhcIkJ1ZmZlckNvbnRyb2xsZXIgXCIrYytcIiBzZWVrOiBcIithKSxxPSEwLHI9YSxiPW5ldyBEYXRlLFQoYixNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlLlVTRVJfUkVRVUVTVF9TVE9QX1JFQVNPTiksTz10aGlzLm1ldHJpY3NNb2RlbC5hZGRQbGF5TGlzdChjLGIscixNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlNFRUtfU1RBUlRfUkVBU09OKSxXLmNhbGwodGhpcyl9LFk9ZnVuY3Rpb24oKXtrIT09ZyYmKHRoaXMuZGVidWcubG9nKFwiQnVmZmVyQ29udHJvbGxlciBcIitjK1wiIHN0b3AuXCIpLFMuY2FsbCh0aGlzLGcpLHRoaXMucmVxdWVzdFNjaGVkdWxlci5zdG9wU2NoZWR1bGluZyh0aGlzKSx0aGlzLmZyYWdtZW50Q29udHJvbGxlci5jYW5jZWxQZW5kaW5nUmVxdWVzdHNGb3JNb2RlbChHKSxtPSExLG49ITEsVChuZXcgRGF0ZSxNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlLlVTRVJfUkVRVUVTVF9TVE9QX1JFQVNPTikpfSxaPWZ1bmN0aW9uKGEsYil7dmFyIGM9bnVsbDtyZXR1cm4gYiYmYi5SZXByZXNlbnRhdGlvbl9hc0FycmF5JiZiLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkubGVuZ3RoPjAmJihjPWIuUmVwcmVzZW50YXRpb25fYXNBcnJheVthXSksY30sJD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7az09PWomJih1JiYodT0hMSx0aGlzLnZpZGVvTW9kZWwuc3RhbGxTdHJlYW0oYyx1KSksUy5jYWxsKGEsaCkpfSxfPWZ1bmN0aW9uKGEpe2lmKHRoaXMuZnJhZ21lbnRDb250cm9sbGVyLmlzSW5pdGlhbGl6YXRpb25SZXF1ZXN0KGEpKVMuY2FsbCh0aGlzLGgpO2Vsc2V7Uy5jYWxsKHRoaXMsaik7dmFyIGI9dGhpcyxjPWIuZnJhZ21lbnRDb250cm9sbGVyLmdldExvYWRpbmdUaW1lKGIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXsoTXx8TikmJihTLmNhbGwoYixoKSxxYi5jYWxsKGIpKX0sYyl9fSxhYj1mdW5jdGlvbihhLGIpe3RoaXMuZnJhZ21lbnRDb250cm9sbGVyLmlzSW5pdGlhbGl6YXRpb25SZXF1ZXN0KGEpP2hiLmNhbGwodGhpcyxhLGIpOmJiLmNhbGwodGhpcyxhLGIpfSxiYj1mdW5jdGlvbihhLGIpe3ZhciBkPXRoaXM7ZC5kZWJ1Zy5sb2coYytcIiBCeXRlcyBmaW5pc2hlZCBsb2FkaW5nOiBcIithLnVybCksS3x8aXNOYU4oYS5kdXJhdGlvbil8fChLPWEuZHVyYXRpb24pLGQuZnJhZ21lbnRDb250cm9sbGVyLnByb2Nlc3MoYi5kYXRhKS50aGVuKGZ1bmN0aW9uKGIpe251bGwhPT1iJiZudWxsIT09ej9RLndoZW4oei5wcm9taXNlKS50aGVuKGZ1bmN0aW9uKCl7Y2IuY2FsbChkLGIsYS5xdWFsaXR5KS50aGVuKGZ1bmN0aW9uKCl7QS5wcm9taXNlLnRoZW4oZnVuY3Rpb24oYil7Yi5pbmRleC0xIT09YS5pbmRleHx8eHx8KHg9ITAsdSYmKHU9ITEsZC52aWRlb01vZGVsLnN0YWxsU3RyZWFtKGMsdSkpLFMuY2FsbChkLGgpLGQuc3lzdGVtLm5vdGlmeShcImJ1ZmZlcmluZ0NvbXBsZXRlZFwiKSl9KX0pfSk6ZC5kZWJ1Zy5sb2coXCJObyBcIitjK1wiIGJ5dGVzIHRvIHB1c2guXCIpfSl9LGNiPWZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcyxlPWE9PUosaD1lP0I6US5kZWZlcigpLGk9ZT95Lmxlbmd0aDp5LnB1c2goaCksaj1aKHQsZC5nZXREYXRhKCkpLGw9ZC52aWRlb01vZGVsLmdldEN1cnJlbnRUaW1lKCksbT1uZXcgRGF0ZTtyZXR1cm4gZC5kZWJ1Zy5sb2coXCJQdXNoIChcIitjK1wiKSBieXRlczogXCIrYS5ieXRlTGVuZ3RoKSxSPT09ITAmJmshPT1nJiYtMSE9PXQmJihSPSExLFA9ZC5tZXRyaWNzTW9kZWwuYXBwZW5kUGxheUxpc3RUcmFjZShPLGouaWQsbnVsbCxtLGwsbnVsbCwxLG51bGwpKSxRLndoZW4oZXx8Mj5pfHx5W2ktMl0ucHJvbWlzZSkudGhlbihmdW5jdGlvbigpe04mJmZiLmNhbGwoZCkudGhlbihmdW5jdGlvbigpe3JldHVybiBiIT09dD8oaC5yZXNvbHZlKCksZSYmKEI9bnVsbCxKPW51bGwpLHZvaWQgMCk6KFEud2hlbihDP0MucHJvbWlzZTohMCkudGhlbihmdW5jdGlvbigpe2Quc291cmNlQnVmZmVyRXh0LmFwcGVuZChOLGEsZC52aWRlb01vZGVsKS50aGVuKGZ1bmN0aW9uKCl7ZSYmKEI9bnVsbCxKPW51bGwpLGQucmVxdWVzdFNjaGVkdWxlci5pc1NjaGVkdWxlZChkKXx8Vy5jYWxsKGQpLEk9ITEsZGIuY2FsbChkKS50aGVuKGZ1bmN0aW9uKCl7aC5yZXNvbHZlKCl9KSxOJiZkLnNvdXJjZUJ1ZmZlckV4dC5nZXRBbGxSYW5nZXMoTikudGhlbihmdW5jdGlvbihhKXtpZihhJiYoZC5kZWJ1Zy5sb2coXCJBcHBlbmQgXCIrYytcIiBjb21wbGV0ZTogXCIrYS5sZW5ndGgpLGEubGVuZ3RoPjApKXt2YXIgYixlO2ZvcihkLmRlYnVnLmxvZyhcIk51bWJlciBvZiBidWZmZXJlZCBcIitjK1wiIHJhbmdlczogXCIrYS5sZW5ndGgpLGI9MCxlPWEubGVuZ3RoO2U+YjtiKz0xKWQuZGVidWcubG9nKFwiQnVmZmVyZWQgXCIrYytcIiBSYW5nZTogXCIrYS5zdGFydChiKStcIiAtIFwiK2EuZW5kKGIpKX19KX0sZnVuY3Rpb24oYil7Yi5lcnIuY29kZT09PWYmJihKPWEsQj1oLEk9ITAsRj0wLFkuY2FsbChkKSl9KX0pLHZvaWQgMCl9KX0pLGgucHJvbWlzZX0sZGI9ZnVuY3Rpb24oKXtpZighTSYmIU4pcmV0dXJuIFEud2hlbighMSk7dmFyIGE9dGhpcyxiPVEuZGVmZXIoKSxkPW9iLmNhbGwoYSk7cmV0dXJuIGEuc291cmNlQnVmZmVyRXh0LmdldEJ1ZmZlckxlbmd0aChOLGQpLnRoZW4oZnVuY3Rpb24oZCl7SD1kLGEubWV0cmljc01vZGVsLmFkZEJ1ZmZlckxldmVsKGMsbmV3IERhdGUsSCksZWIuY2FsbChhKSxiLnJlc29sdmUoKX0pLGIucHJvbWlzZX0sZWI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ1ZmZlckV4dC5nZXRMZWFzdEJ1ZmZlckxldmVsKCksYj0yKkssYz1ILWE7Yz5iJiYhQz8oRj0wLEM9US5kZWZlcigpKTpiPmMmJkMmJihDLnJlc29sdmUoKSxDPW51bGwpfSxmYj1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcyxjPVEuZGVmZXIoKSxkPTA7cmV0dXJuIEk/KGE9ZnVuY3Rpb24oKXtnYi5jYWxsKGIpLnRoZW4oZnVuY3Rpb24oYil7ZCs9YixkPj1LP2MucmVzb2x2ZSgpOnNldFRpbWVvdXQoYSwxZTMqSyl9KX0sYS5jYWxsKGIpLGMucHJvbWlzZSk6US53aGVuKCEwKX0sZ2I9ZnVuY3Rpb24oKXt2YXIgYSxjLGQ9dGhpcyxlPVEuZGVmZXIoKSxmPWQudmlkZW9Nb2RlbC5nZXRDdXJyZW50VGltZSgpLGc9MDtyZXR1cm4gYz1kLmZyYWdtZW50Q29udHJvbGxlci5nZXRFeGVjdXRlZFJlcXVlc3RGb3JUaW1lKEcsZiksYT1jJiYhaXNOYU4oYy5zdGFydFRpbWUpP2Muc3RhcnRUaW1lOk1hdGguZmxvb3IoZiksSz1jJiYhaXNOYU4oYy5kdXJhdGlvbik/Yy5kdXJhdGlvbjoxLGQuc291cmNlQnVmZmVyRXh0LmdldEJ1ZmZlclJhbmdlKE4sZikudGhlbihmdW5jdGlvbihjKXtudWxsPT09YyYmcj09PWYmJk4uYnVmZmVyZWQubGVuZ3RoPjAmJihhPU4uYnVmZmVyZWQuZW5kKE4uYnVmZmVyZWQubGVuZ3RoLTEpKSxnPU4uYnVmZmVyZWQuc3RhcnQoMCksZC5zb3VyY2VCdWZmZXJFeHQucmVtb3ZlKE4sZyxhLEUsYikudGhlbihmdW5jdGlvbigpe2QuZnJhZ21lbnRDb250cm9sbGVyLnJlbW92ZUV4ZWN1dGVkUmVxdWVzdHNCZWZvcmVUaW1lKEcsYSksZS5yZXNvbHZlKGEtZyl9KX0pLGUucHJvbWlzZX0saGI9ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzLGU9Yi5kYXRhLGY9YS5xdWFsaXR5O2QuZGVidWcubG9nKGMrXCIgSW5pdGlhbGl6YXRpb24gZmluaXNoZWQgbG9hZGluZzogXCIrYS51cmwpLGQuZnJhZ21lbnRDb250cm9sbGVyLnByb2Nlc3MoZSkudGhlbihmdW5jdGlvbihiKXtudWxsIT09Yj8ocFtmXT1iLGY9PT10JiZjYi5jYWxsKGQsYixhLnF1YWxpdHkpLnRoZW4oZnVuY3Rpb24oKXt6LnJlc29sdmUoKX0pKTpkLmRlYnVnLmxvZyhcIk5vIFwiK2MrXCIgYnl0ZXMgdG8gcHVzaC5cIil9KX0saWI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5tYW5pZmVzdE1vZGVsLmdldFZhbHVlKCksYz1hLm1hbmlmZXN0RXh0LmdldElzTGl2ZShiKTtrPT09aiYmUy5jYWxsKGEsaCksY3x8YS5zeXN0ZW0ubm90aWZ5KFwic2VnbWVudExvYWRpbmdGYWlsZWRcIil9LGpiPWZ1bmN0aW9uKGEpe3RoaXMuZGVidWcubG9nKGMrXCIgU3RyZWFtIGlzIGNvbXBsZXRlLlwiKSxUKG5ldyBEYXRlLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2UuRU5EX09GX0NPTlRFTlRfU1RPUF9SRUFTT04pLFkuY2FsbCh0aGlzKSxBLnJlc29sdmUoYSl9LGtiPWZ1bmN0aW9uKGEsYil7dmFyIGQsZT1udWxsLGY9dGhpcy5idWZmZXJFeHQuZ2V0VG9wUXVhbGl0eUluZGV4KGMpLGc9W107aWYobyYmKHRoaXMuZGVidWcubG9nKFwiTWFya2luZyBhIHNwZWNpYWwgc2VlayBmb3IgaW5pdGlhbCBcIitjK1wiIHBsYXliYWNrLlwiKSxxfHwocT0hMCxyPTApLG89ITEpLHMpe2Zvcih6PVEuZGVmZXIoKSxwPVtdLGQ9MDtmPj1kO2QrPTEpZy5wdXNoKHRoaXMuaW5kZXhIYW5kbGVyLmdldEluaXRSZXF1ZXN0KGQsTSkpO3Q9YixlPVEuYWxsKGcpfWVsc2UgZT1RLndoZW4obnVsbCksYSYmKHo9US5kZWZlcigpLHQ9YixwW2JdJiZjYi5jYWxsKHRoaXMscFtiXSxiKS50aGVuKGZ1bmN0aW9uKCl7ei5yZXNvbHZlKCl9KSk7cmV0dXJuIGV9LGxiPWZ1bmN0aW9uKGIpe3ZhciBkLGU9dGhpcztpZihzJiYhcSllLmRlYnVnLmxvZyhcIkRhdGEgY2hhbmdlZCAtIGxvYWRpbmcgdGhlIFwiK2MrXCIgZnJhZ21lbnQgZm9yIHRpbWU6IFwiK2EpLGQ9ZS5pbmRleEhhbmRsZXIuZ2V0U2VnbWVudFJlcXVlc3RGb3JUaW1lKGEsYixNKTtlbHNle3ZhciBmPVEuZGVmZXIoKSxnPWUudmlkZW9Nb2RlbC5nZXRDdXJyZW50VGltZSgpO2Q9Zi5wcm9taXNlLGUuc291cmNlQnVmZmVyRXh0LmdldEJ1ZmZlclJhbmdlKE4sZykudGhlbihmdW5jdGlvbihhKXtxPSExLG51bGwhPT1hJiYoZz1hLmVuZCksZS5kZWJ1Zy5sb2coXCJMb2FkaW5nIHRoZSBcIitjK1wiIGZyYWdtZW50IGZvciB0aW1lOiBcIitnKSxlLmluZGV4SGFuZGxlci5nZXRTZWdtZW50UmVxdWVzdEZvclRpbWUoZyxiLE0pLnRoZW4oZnVuY3Rpb24oYSl7Zi5yZXNvbHZlKGEpfSxmdW5jdGlvbigpe2YucmVqZWN0KCl9KX0sZnVuY3Rpb24oKXtmLnJlamVjdCgpfSl9cmV0dXJuIHM9ITEsZH0sbWI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztudWxsIT09YT9iLmZyYWdtZW50Q29udHJvbGxlci5pc0ZyYWdtZW50TG9hZGVkT3JQZW5kaW5nKGIsYSk/XCJjb21wbGV0ZVwiIT09YS5hY3Rpb24/Yi5pbmRleEhhbmRsZXIuZ2V0TmV4dFNlZ21lbnRSZXF1ZXN0KHQsTSkudGhlbihtYi5iaW5kKGIpKTooWS5jYWxsKGIpLFMuY2FsbChiLGgpKTooYi5kZWJ1Zy5sb2coXCJMb2FkaW5nIGFuIFwiK2MrXCIgZnJhZ21lbnQ6IFwiK2EudXJsKSxRLndoZW4oQz9DLnByb21pc2U6ITApLnRoZW4oZnVuY3Rpb24oKXtiLmZyYWdtZW50Q29udHJvbGxlci5wcmVwYXJlRnJhZ21lbnRGb3JMb2FkaW5nKGIsYSxfLGFiLGliLGpiKS50aGVuKGZ1bmN0aW9uKCl7Uy5jYWxsKGIsaCl9KX0pKTpTLmNhbGwoYixoKX0sbmI9ZnVuY3Rpb24oKXtuJiYoZD5IJiZkPEUtdGhpcy52aWRlb01vZGVsLmdldEN1cnJlbnRUaW1lKCk/dXx8KHRoaXMuZGVidWcubG9nKFwiV2FpdGluZyBmb3IgbW9yZSBcIitjK1wiIGJ1ZmZlciBiZWZvcmUgc3RhcnRpbmcgcGxheWJhY2suXCIpLHU9ITAsdGhpcy52aWRlb01vZGVsLnN0YWxsU3RyZWFtKGMsdSkpOih0aGlzLmRlYnVnLmxvZyhcIkdvdCBlbm91Z2ggXCIrYytcIiBidWZmZXIgdG8gc3RhcnQuXCIpLG49ITEsdT0hMSx0aGlzLnZpZGVvTW9kZWwuc3RhbGxTdHJlYW0oYyx1KSkpfSxvYj1mdW5jdGlvbigpe3ZhciBhPS0xO3JldHVybiBhPXRoaXMudmlkZW9Nb2RlbC5nZXRDdXJyZW50VGltZSgpfSxwYj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9Yi52aWRlb01vZGVsLmdldFBsYXliYWNrUmF0ZSgpLGQ9SC9NYXRoLm1heChjLDEpLGU9US5kZWZlcigpO3JldHVybiBiLmJ1ZmZlckV4dC5nZXRSZXF1aXJlZEJ1ZmZlckxlbmd0aChuLGIucmVxdWVzdFNjaGVkdWxlci5nZXRFeGVjdXRlSW50ZXJ2YWwoYikvMWUzLHYsRSkudGhlbihmdW5jdGlvbihjKXtiLmluZGV4SGFuZGxlci5nZXRTZWdtZW50Q291bnRGb3JEdXJhdGlvbihhLE0sYyxkKS50aGVuKGZ1bmN0aW9uKGEpe2UucmVzb2x2ZShhKX0pfSksZS5wcm9taXNlfSxxYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmZyYWdtZW50Q29udHJvbGxlci5nZXRQZW5kaW5nUmVxdWVzdHMoYSksYz1hLmZyYWdtZW50Q29udHJvbGxlci5nZXRMb2FkaW5nUmVxdWVzdHMoYSksZD0oYj9iLmxlbmd0aDowKSsoYz9jLmxlbmd0aDowKTtGLWQ+MD8oRi0tLGxiLmNhbGwoYSx0KS50aGVuKG1iLmJpbmQoYSkpKTooaz09PWkmJlMuY2FsbChhLGgpLCQuY2FsbChhKSl9LHJiPWZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLGQ9ITEsZj1udWxsLGc9bmV3IERhdGUsbD1iLnZpZGVvTW9kZWwuZ2V0Q3VycmVudFRpbWUoKSxtPW9iLmNhbGwoYik7aWYoYi5kZWJ1Zy5sb2coXCJCdWZmZXJDb250cm9sbGVyLnZhbGlkYXRlKCkgXCIrYytcIiB8IHN0YXRlOiBcIitrKSxiLmRlYnVnLmxvZyhjK1wiIFBsYXliYWNrIHJhdGU6IFwiK2IudmlkZW9Nb2RlbC5nZXRFbGVtZW50KCkucGxheWJhY2tSYXRlKSxiLmRlYnVnLmxvZyhjK1wiIFdvcmtpbmcgdGltZTogXCIrbSksYi5kZWJ1Zy5sb2coYytcIiBWaWRlbyB0aW1lOiBcIitsKSxiLmRlYnVnLmxvZyhcIkN1cnJlbnQgXCIrYytcIiBidWZmZXIgbGVuZ3RoOiBcIitIKSxuYi5jYWxsKGIpLGs9PT1qJiZlPkgpdXx8KGIuZGVidWcubG9nKFwiU3RhbGxpbmcgXCIrYytcIiBCdWZmZXI6IFwiK2MpLFQobmV3IERhdGUsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5SRUJVRkZFUklOR19SRUFTT04pLHU9ITAsbj0hMCxiLnZpZGVvTW9kZWwuc3RhbGxTdHJlYW0oYyx1KSk7ZWxzZSBpZihrPT09aCl7Uy5jYWxsKGIsaSk7dmFyIG89Yi5tYW5pZmVzdE1vZGVsLmdldFZhbHVlKCkubWluQnVmZmVyVGltZTtiLmJ1ZmZlckV4dC5kZWNpZGVCdWZmZXJMZW5ndGgobyxFLG4pLnRoZW4oZnVuY3Rpb24oYSl7Yi5kZWJ1Zy5sb2coXCJCdWZmZXIgdGltZTogXCIrYSksYi5zZXRNaW5CdWZmZXJUaW1lKGEpLGIucmVxdWVzdFNjaGVkdWxlci5hZGp1c3RFeGVjdXRlSW50ZXJ2YWwoKX0pLGIuYWJyQ29udHJvbGxlci5nZXRQbGF5YmFja1F1YWxpdHkoYyxNKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciBoPWUucXVhbGl0eTtpZihiLmRlYnVnLmxvZyhjK1wiIFBsYXliYWNrIHF1YWxpdHk6IFwiK2gpLGIuZGVidWcubG9nKFwiUG9wdWxhdGUgXCIrYytcIiBidWZmZXJzLlwiKSx2b2lkIDAhPT1oJiYoYT1oKSxkPWghPT10LGQ9PT0hMCl7aWYoYi5mcmFnbWVudENvbnRyb2xsZXIuYWJvcnRSZXF1ZXN0c0Zvck1vZGVsKEcpLGY9WihhLGIuZ2V0RGF0YSgpKSxudWxsPT09Znx8dm9pZCAwPT09Zil0aHJvd1wiVW5leHBlY3RlZCBlcnJvciFcIjtiLm1hbmlmZXN0RXh0LmdldFRpbWVzdGFtcE9mZnNldEZvclBlcmlvZChELGIubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGgsTSkudGhlbihmdW5jdGlvbihhKXtOLnRpbWVzdGFtcE9mZnNldCE9PWEmJihOLnRpbWVzdGFtcE9mZnNldD1hKX0pLFQobmV3IERhdGUsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5SRVBSRVNFTlRBVElPTl9TV0lUQ0hfU1RPUF9SRUFTT04pLGIubWV0cmljc01vZGVsLmFkZFJlcHJlc2VudGF0aW9uU3dpdGNoKGMsZyxsLGYuaWQpfXJldHVybiBiLmRlYnVnLmxvZyhkP2MrXCIgUXVhbGl0eSBjaGFuZ2VkIHRvOiBcIitoOlwiUXVhbGl0eSBkaWRuJ3QgY2hhbmdlLlwiKSxwYi5jYWxsKGIsaCl9KS50aGVuKGZ1bmN0aW9uKGUpe0Y9ZSxrYi5jYWxsKGIsZCxhKS50aGVuKGZ1bmN0aW9uKGEpe2lmKG51bGwhPT1hKXt2YXIgZCxlLGY9YS5sZW5ndGg7Zm9yKGU9MDtmPmU7ZSs9MSlkPWFbZV0sYi5kZWJ1Zy5sb2coXCJMb2FkaW5nIFwiK2MrXCIgaW5pdGlhbGl6YXRpb246IFwiK2QudXJsKSxiLmRlYnVnLmxvZyhkKSxiLmZyYWdtZW50Q29udHJvbGxlci5wcmVwYXJlRnJhZ21lbnRGb3JMb2FkaW5nKGIsZCxfLGFiLGliLGpiKS50aGVuKGZ1bmN0aW9uKCl7Uy5jYWxsKGIsaCl9KX19KSxxYi5jYWxsKGIpfSl9ZWxzZSBrPT09aSYmUy5jYWxsKGIsaCl9O3JldHVybnt2aWRlb01vZGVsOnZvaWQgMCxtZXRyaWNzTW9kZWw6dm9pZCAwLG1hbmlmZXN0RXh0OnZvaWQgMCxtYW5pZmVzdE1vZGVsOnZvaWQgMCxidWZmZXJFeHQ6dm9pZCAwLHNvdXJjZUJ1ZmZlckV4dDp2b2lkIDAsYWJyQ29udHJvbGxlcjp2b2lkIDAsZnJhZ21lbnRFeHQ6dm9pZCAwLGluZGV4SGFuZGxlcjp2b2lkIDAsZGVidWc6dm9pZCAwLHN5c3RlbTp2b2lkIDAsZXJySGFuZGxlcjp2b2lkIDAsaW5pdGlhbGl6ZTpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe3ZhciBpPXRoaXMsaj1pLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxrPWkubWFuaWZlc3RFeHQuZ2V0SXNMaXZlKGopO2kuc2V0TWVkaWFTb3VyY2UoaCksaS5zZXRWaWRlb01vZGVsKGUpLGkuc2V0VHlwZShhKSxpLnNldFBlcmlvZEluZGV4KGIpLGkuc2V0RGF0YShjKS50aGVuKGZ1bmN0aW9uKCl7bD0hMCxWLmNhbGwoaSl9KSxpLnNldEJ1ZmZlcihkKSxpLnNldFNjaGVkdWxlcihmKSxpLnNldEZyYWdtZW50Q29udHJvbGxlcihnKSxpLmluZGV4SGFuZGxlci5zZXRJc0xpdmUoayksaS5tYW5pZmVzdEV4dC5nZXREdXJhdGlvbkZvclBlcmlvZChiLGkubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpKS50aGVuKGZ1bmN0aW9uKGEpe0U9YSxpLmluZGV4SGFuZGxlci5zZXREdXJhdGlvbihhKSxpLmJ1ZmZlckV4dC5kZWNpZGVCdWZmZXJMZW5ndGgoai5taW5CdWZmZXJUaW1lLEUsbikudGhlbihmdW5jdGlvbihhKXtpLnNldE1pbkJ1ZmZlclRpbWUoYSl9KX0pfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIGN9LHNldFR5cGU6ZnVuY3Rpb24oYSl7Yz1hLHZvaWQgMCE9PXRoaXMuaW5kZXhIYW5kbGVyJiZ0aGlzLmluZGV4SGFuZGxlci5zZXRUeXBlKGEpfSxnZXRQZXJpb2RJbmRleDpmdW5jdGlvbigpe3JldHVybiBEfSxzZXRQZXJpb2RJbmRleDpmdW5jdGlvbihhKXtEPWF9LGdldFZpZGVvTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb01vZGVsfSxzZXRWaWRlb01vZGVsOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9Nb2RlbD1hfSxnZXRTY2hlZHVsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1ZXN0U2NoZWR1bGVyfSxzZXRTY2hlZHVsZXI6ZnVuY3Rpb24oYSl7dGhpcy5yZXF1ZXN0U2NoZWR1bGVyPWF9LGdldEZyYWdtZW50Q29udHJvbGxlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYWdtZW50Q29udHJvbGxlcn0sc2V0RnJhZ21lbnRDb250cm9sbGVyOmZ1bmN0aW9uKGEpe3RoaXMuZnJhZ21lbnRDb250cm9sbGVyPWF9LGdldEF1dG9Td2l0Y2hCaXRyYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gYS5hYnJDb250cm9sbGVyLmdldEF1dG9Td2l0Y2hCaXRyYXRlKCl9LHNldEF1dG9Td2l0Y2hCaXRyYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7Yi5hYnJDb250cm9sbGVyLnNldEF1dG9Td2l0Y2hCaXRyYXRlKGEpfSxnZXREYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIE19LHNldERhdGE6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcyxlPVEuZGVmZXIoKSxmPU07cmV0dXJuIGZ8fChmPWIpLGQuYWJyQ29udHJvbGxlci5nZXRQbGF5YmFja1F1YWxpdHkoYyxmKS50aGVuKGZ1bmN0aW9uKGcpe2QuaW5kZXhIYW5kbGVyLmdldEN1cnJlbnRUaW1lKGcucXVhbGl0eSxmKS50aGVuKGZ1bmN0aW9uKGYpe3M9ITAsYT1mLE09YixkLnNlZWsoZiksZC5idWZmZXJFeHQudXBkYXRlRGF0YShNLGMpLGUucmVzb2x2ZSgpfSl9KSxlLnByb21pc2V9LGdldEJ1ZmZlcjpmdW5jdGlvbigpe3JldHVybiBOfSxzZXRCdWZmZXI6ZnVuY3Rpb24oYSl7Tj1hfSxnZXRNaW5CdWZmZXJUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIGR9LHNldE1pbkJ1ZmZlclRpbWU6ZnVuY3Rpb24oYSl7ZD1hfSxzZXRNZWRpYVNvdXJjZTpmdW5jdGlvbihhKXtiPWF9LGlzUmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gaz09PWh9LGlzQnVmZmVyaW5nQ29tcGxldGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHh9LGNsZWFyTWV0cmljczpmdW5jdGlvbigpe3ZhciBhPXRoaXM7bnVsbCE9PWMmJlwiXCIhPT1jJiZhLm1ldHJpY3NNb2RlbC5jbGVhckN1cnJlbnRNZXRyaWNzRm9yVHlwZShjKX0sdXBkYXRlQnVmZmVyU3RhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO0kmJkomJiFMPyhMPSEwLGNiLmNhbGwoYSxKLHQpLnRoZW4oZnVuY3Rpb24oKXtMPSExfSkpOmRiLmNhbGwoYSl9LHJlc2V0OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7WS5jYWxsKGMpLGMuY2xlYXJNZXRyaWNzKCksYy5mcmFnbWVudENvbnRyb2xsZXIuYWJvcnRSZXF1ZXN0c0Zvck1vZGVsKEcpLGMuZnJhZ21lbnRDb250cm9sbGVyLmRldGFjaEJ1ZmZlckNvbnRyb2xsZXIoRyksRz1udWxsLHk9W10sej1udWxsLHA9W10sQT1RLmRlZmVyKCksYXx8KGMuc291cmNlQnVmZmVyRXh0LmFib3J0KGIsTiksYy5zb3VyY2VCdWZmZXJFeHQucmVtb3ZlU291cmNlQnVmZmVyKGIsTikpLE09bnVsbCxOPW51bGx9LHN0YXJ0Olcsc2VlazpYLHN0b3A6WX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJDb250cm9sbGVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckNvbnRyb2xsZXJ9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGEsYixjPTAsZD0wLGU9bnVsbCxmPW51bGwsZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLm1ldHJpY3NFeHQuZ2V0Q3VycmVudEh0dHBSZXF1ZXN0KGEpO3JldHVybiBudWxsIT09Yj8oYi50cmVzcG9uc2UuZ2V0VGltZSgpLWIudHJlcXVlc3QuZ2V0VGltZSgpKS8xZTM6MH0saD1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcyxnPVEuZGVmZXIoKTtyZXR1cm4gUS53aGVuKGU/Yi5hYnJDb250cm9sbGVyLmdldFBsYXliYWNrUXVhbGl0eShcImF1ZGlvXCIsZSk6YykudGhlbihmdW5jdGlvbihlKXtRLndoZW4oZj9iLmFickNvbnRyb2xsZXIuZ2V0UGxheWJhY2tRdWFsaXR5KFwidmlkZW9cIixmKTpkKS50aGVuKGZ1bmN0aW9uKGIpe2E9ZS5xdWFsaXR5PT09YyYmYi5xdWFsaXR5PT09ZCxhPWF8fGUuY29uZmlkZW5jZT09PU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9ORyYmYi5jb25maWRlbmNlPT09TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuU1RST05HLGcucmVzb2x2ZShhKX0pfSksZy5wcm9taXNlfTtyZXR1cm57c3lzdGVtOnZvaWQgMCx2aWRlb01vZGVsOnZvaWQgMCxtYW5pZmVzdEV4dDp2b2lkIDAsbWV0cmljc0V4dDp2b2lkIDAsbWV0cmljc01vZGVsOnZvaWQgMCxhYnJDb250cm9sbGVyOnZvaWQgMCxidWZmZXJNYXg6dm9pZCAwLHVwZGF0ZURhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgZz1hLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkubGVuZ3RoLTE7XCJhdWRpb1wiPT09Yj8oYz1nLGU9YSk6XCJ2aWRlb1wiPT09YiYmKGQ9ZyxmPWEpfSxnZXRUb3BRdWFsaXR5SW5kZXg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtyZXR1cm5cImF1ZGlvXCI9PT1hP2I9YzpcInZpZGVvXCI9PT1hJiYoYj1kKSxifSxkZWNpZGVCdWZmZXJMZW5ndGg6ZnVuY3Rpb24oYixjKXtyZXR1cm4gYT1NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5ERUZBVUxUX01JTl9CVUZGRVJfVElNRTxjJiZjPmI/TWF0aC5tYXgoTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuREVGQVVMVF9NSU5fQlVGRkVSX1RJTUUsYik6Yj49Yz9NYXRoLm1pbihjLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkRFRkFVTFRfTUlOX0JVRkZFUl9USU1FKTpNYXRoLm1pbihjLGIpLFEud2hlbihhKX0sZ2V0TGVhc3RCdWZmZXJMZXZlbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWV0cmljc01vZGVsLmdldFJlYWRPbmx5TWV0cmljc0ZvcihcInZpZGVvXCIpLGI9dGhpcy5tZXRyaWNzRXh0LmdldEN1cnJlbnRCdWZmZXJMZXZlbChhKSxjPXRoaXMubWV0cmljc01vZGVsLmdldFJlYWRPbmx5TWV0cmljc0ZvcihcImF1ZGlvXCIpLGQ9dGhpcy5tZXRyaWNzRXh0LmdldEN1cnJlbnRCdWZmZXJMZXZlbChjKSxlPW51bGw7cmV0dXJuIGU9bnVsbD09PWJ8fG51bGw9PT1kP251bGwhPT1kP2QubGV2ZWw6bnVsbCE9PWI/Yi5sZXZlbDpudWxsOk1hdGgubWluKGQubGV2ZWwsYi5sZXZlbCl9LGdldFJlcXVpcmVkQnVmZmVyTGVuZ3RoOmZ1bmN0aW9uKGMsZCxlLGYpe3ZhciBpLGo9dGhpcyxrPWoubWV0cmljc01vZGVsLmdldFJlYWRPbmx5TWV0cmljc0ZvcihcInZpZGVvXCIpLGw9ai5tZXRyaWNzTW9kZWwuZ2V0UmVhZE9ubHlNZXRyaWNzRm9yKFwiYXVkaW9cIiksbT1mPj1NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5MT05HX0ZPUk1fQ09OVEVOVF9EVVJBVElPTl9USFJFU0hPTEQsbj1RLmRlZmVyKCksbz1udWxsO3JldHVybiBqLmJ1ZmZlck1heD09PU1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkJVRkZFUl9TSVpFX01JTj8oaT1hLG4ucmVzb2x2ZShpKSk6ai5idWZmZXJNYXg9PT1NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfU0laRV9JTkZJTklUWT8oaT1mLG4ucmVzb2x2ZShpKSk6ai5idWZmZXJNYXg9PT1NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfU0laRV9SRVFVSVJFRD8oYj1hLGV8fGN8fChvPWguY2FsbChqKSksUS53aGVuKG8pLnRoZW4oZnVuY3Rpb24oYSl7YSYmKGI9bT9NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfVElNRV9BVF9UT1BfUVVBTElUWV9MT05HX0ZPUk06TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1RJTUVfQVRfVE9QX1FVQUxJVFkpLGk9YitkK01hdGgubWF4KGcuY2FsbChqLGspLGcuY2FsbChqLGwpKSxuLnJlc29sdmUoaSl9KSk6bi5yZWplY3QoXCJpbnZhbGlkIGJ1ZmZlck1heCB2YWx1ZTogXCIrai5idWZmZXJNYXgpLG4ucHJvbWlzZX0sZ2V0QnVmZmVyVGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PWI/YTpifX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkJVRkZFUl9TSVpFX1JFUVVJUkVEPVwicmVxdWlyZWRcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfU0laRV9NSU49XCJtaW5cIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfU0laRV9JTkZJTklUWT1cImluZmluaXR5XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1RJTUVfQVRfU1RBUlRVUD0xLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkRFRkFVTFRfTUlOX0JVRkZFUl9USU1FPTgsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1RJTUVfQVRfVE9QX1FVQUxJVFk9MzAsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1RJTUVfQVRfVE9QX1FVQUxJVFlfTE9OR19GT1JNPTMwMCxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5MT05HX0ZPUk1fQ09OVEVOVF9EVVJBVElPTl9USFJFU0hPTEQ9NjAwLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucyxNZWRpYVBsYXllci51dGlscy5DYXBhYmlsaXRpZXM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIn0sTWVkaWFQbGF5ZXIudXRpbHMuQ2FwYWJpbGl0aWVzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudXRpbHMuQ2FwYWJpbGl0aWVzLHN1cHBvcnRzTWVkaWFTb3VyY2U6ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1cIldlYktpdE1lZGlhU291cmNlXCJpbiB3aW5kb3csYj1cIk1lZGlhU291cmNlXCJpbiB3aW5kb3c7cmV0dXJuIGF8fGJ9LHN1cHBvcnRzTWVkaWFLZXlzOmZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9XCJXZWJLaXRNZWRpYUtleXNcImluIHdpbmRvdyxiPVwiTVNNZWRpYUtleXNcImluIHdpbmRvdyxjPVwiTWVkaWFLZXlzXCJpbiB3aW5kb3c7cmV0dXJuIGF8fGJ8fGN9LHN1cHBvcnRzQ29kZWM6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtpZighKGEgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSl0aHJvd1wiZWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgSFRNTFZpZGVvRWxlbWVudC5cIjt2YXIgYz1hLmNhblBsYXlUeXBlKGIpO3JldHVyblwicHJvYmFibHlcIj09PWN9fSxNZWRpYVBsYXllci51dGlscy5EZWJ1Zz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPSEwO3JldHVybntldmVudEJ1czp2b2lkIDAsc2V0TG9nVG9Ccm93c2VyQ29uc29sZTpmdW5jdGlvbihiKXthPWJ9LGdldExvZ1RvQnJvd3NlckNvbnNvbGU6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sbG9nOmZ1bmN0aW9uKGIpe2EmJmNvbnNvbGUubG9nKGIpLHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudCh7dHlwZTpcImxvZ1wiLG1lc3NhZ2U6Yn0pfX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5FcnJvckhhbmRsZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm57ZXZlbnRCdXM6dm9pZCAwLGNhcGFiaWxpdHlFcnJvcjpmdW5jdGlvbihhKXt0aGlzLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQoe3R5cGU6XCJlcnJvclwiLGVycm9yOlwiY2FwYWJpbGl0eVwiLGV2ZW50OmF9KX0sZG93bmxvYWRFcnJvcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5ldmVudEJ1cy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwiZXJyb3JcIixlcnJvcjpcImRvd25sb2FkXCIsZXZlbnQ6e2lkOmEsdXJsOmIscmVxdWVzdDpjfX0pfSxtYW5pZmVzdEVycm9yOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQoe3R5cGU6XCJlcnJvclwiLGVycm9yOlwibWFuaWZlc3RFcnJvclwiLGV2ZW50OnttZXNzYWdlOmEsaWQ6YixtYW5pZmVzdDpjfX0pfSxtZWRpYVNvdXJjZUVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudCh7dHlwZTpcImVycm9yXCIsZXJyb3I6XCJtZWRpYXNvdXJjZVwiLGV2ZW50OmF9KX0sbWVkaWFLZXlTZXNzaW9uRXJyb3I6ZnVuY3Rpb24oYSl7dGhpcy5ldmVudEJ1cy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwiZXJyb3JcIixlcnJvcjpcImtleV9zZXNzaW9uXCIsZXZlbnQ6YX0pfSxtZWRpYUtleU1lc3NhZ2VFcnJvcjpmdW5jdGlvbihhKXt0aGlzLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQoe3R5cGU6XCJlcnJvclwiLGVycm9yOlwia2V5X21lc3NhZ2VcIixldmVudDphfSl9LG1lZGlhS2V5U3lzdGVtU2VsZWN0aW9uRXJyb3I6ZnVuY3Rpb24oYSl7dGhpcy5ldmVudEJ1cy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwiZXJyb3JcIixlcnJvcjpcImtleV9zeXN0ZW1fc2VsZWN0aW9uXCIsZXZlbnQ6YX0pfX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5FcnJvckhhbmRsZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRXJyb3JIYW5kbGVyfSxNZWRpYVBsYXllci51dGlscy5FdmVudEJ1cz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhLGI9ZnVuY3Rpb24oYixjKXt2YXIgZD0oYz9cIjFcIjpcIjBcIikrYjtyZXR1cm4gZCBpbiBhfHwoYVtkXT1bXSksYVtkXX0sYz1mdW5jdGlvbigpe2E9e319O3JldHVybiBjKCkse2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWIoYSxkKSxmPWUuaW5kZXhPZihjKTstMT09PWYmJmUucHVzaChjKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMsZCl7dmFyIGU9YihhLGQpLGY9ZS5pbmRleE9mKGMpOy0xIT09ZiYmZS5zcGxpY2UoZiwxKX0sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihhKXtmb3IodmFyIGM9YihhLnR5cGUsITEpLnNsaWNlKCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF0uY2FsbCh0aGlzLGEpO3JldHVybiFhLmRlZmF1bHRQcmV2ZW50ZWR9fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkZyYWdtZW50Q29udHJvbGxlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPVtdLGI9ZnVuY3Rpb24oYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9MDtjPmQ7ZCsrKWlmKGFbZF0uZ2V0Q29udGV4dCgpPT1iKXJldHVybiBhW2RdO3JldHVybiBudWxsfSxjPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPSEwLGM9YS5sZW5ndGgsZD0wO2M+ZDtkKyspaWYoIWFbZF0uaXNSZWFkeSgpKXtiPSExO2JyZWFrfXJldHVybiBifSxkPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5leGVjdXRlQ3VycmVudFJlcXVlc3QoKX07cmV0dXJue3N5c3RlbTp2b2lkIDAsZGVidWc6dm9pZCAwLHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWEmJmEuYnl0ZUxlbmd0aD4wJiYoYj1uZXcgVWludDhBcnJheShhKSksUS53aGVuKGIpfSxhdHRhY2hCdWZmZXJDb250cm9sbGVyOmZ1bmN0aW9uKGMpe2lmKCFjKXJldHVybiBudWxsO3ZhciBkPWIoYyk7cmV0dXJuIGR8fChkPXRoaXMuc3lzdGVtLmdldE9iamVjdChcImZyYWdtZW50TW9kZWxcIiksZC5zZXRDb250ZXh0KGMpLGEucHVzaChkKSksZH0sZGV0YWNoQnVmZmVyQ29udHJvbGxlcjpmdW5jdGlvbihiKXt2YXIgYz1hLmluZGV4T2YoYik7Yz4tMSYmYS5zcGxpY2UoYywxKX0sb25CdWZmZXJDb250cm9sbGVyU3RhdGVDaGFuZ2U6ZnVuY3Rpb24oKXtjKCkmJmQuY2FsbCh0aGlzKX0saXNGcmFnbWVudExvYWRlZE9yUGVuZGluZzpmdW5jdGlvbihhLGMpe3ZhciBkLGU9YihhKTtyZXR1cm4gZT9kPWUuaXNGcmFnbWVudExvYWRlZE9yUGVuZGluZyhjKTohMX0sZ2V0UGVuZGluZ1JlcXVlc3RzOmZ1bmN0aW9uKGEpe3ZhciBjPWIoYSk7cmV0dXJuIGM/Yy5nZXRQZW5kaW5nUmVxdWVzdHMoKTpudWxsfSxnZXRMb2FkaW5nUmVxdWVzdHM6ZnVuY3Rpb24oYSl7dmFyIGM9YihhKTtyZXR1cm4gYz9jLmdldExvYWRpbmdSZXF1ZXN0cygpOm51bGx9LGlzSW5pdGlhbGl6YXRpb25SZXF1ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLnR5cGUmJlwiaW5pdGlhbGl6YXRpb24gc2VnbWVudFwiPT09YS50eXBlLnRvTG93ZXJDYXNlKCl9LGdldExvYWRpbmdUaW1lOmZ1bmN0aW9uKGEpe3ZhciBjPWIoYSk7cmV0dXJuIGM/Yy5nZXRMb2FkaW5nVGltZSgpOm51bGx9LGdldEV4ZWN1dGVkUmVxdWVzdEZvclRpbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT9hLmdldEV4ZWN1dGVkUmVxdWVzdEZvclRpbWUoYik6bnVsbH0scmVtb3ZlRXhlY3V0ZWRSZXF1ZXN0OmZ1bmN0aW9uKGEsYil7YSYmYS5yZW1vdmVFeGVjdXRlZFJlcXVlc3QoYil9LHJlbW92ZUV4ZWN1dGVkUmVxdWVzdHNCZWZvcmVUaW1lOmZ1bmN0aW9uKGEsYil7YSYmYS5yZW1vdmVFeGVjdXRlZFJlcXVlc3RzQmVmb3JlVGltZShiKX0sY2FuY2VsUGVuZGluZ1JlcXVlc3RzRm9yTW9kZWw6ZnVuY3Rpb24oYSl7YSYmYS5jYW5jZWxQZW5kaW5nUmVxdWVzdHMoKX0sYWJvcnRSZXF1ZXN0c0Zvck1vZGVsOmZ1bmN0aW9uKGEpe2EmJmEuYWJvcnRSZXF1ZXN0cygpfSxwcmVwYXJlRnJhZ21lbnRGb3JMb2FkaW5nOmZ1bmN0aW9uKGEsYyxkLGUsZixnKXt2YXIgaD1iKGEpO3JldHVybiBoJiZjJiYhdGhpcy5pc0ZyYWdtZW50TG9hZGVkT3JQZW5kaW5nKGEsYyk/KGguYWRkUmVxdWVzdChjKSxoLnNldENhbGxiYWNrcyhkLGUsZixnKSxRLndoZW4oITApKTpRLndoZW4obnVsbCl9fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkZyYWdtZW50Q29udHJvbGxlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudENvbnRyb2xsZXJ9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudExvYWRlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPTMsYj01MDAsYz1bXSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGY9bmV3IFhNTEh0dHBSZXF1ZXN0LGc9bnVsbCxoPSEwLGk9ITAsaj10aGlzO2MucHVzaChmKSxhLnJlcXVlc3RTdGFydERhdGU9bmV3IERhdGUsYS5maXJzdEJ5dGVEYXRlPWEucmVxdWVzdFN0YXJ0RGF0ZSxmLm9wZW4oXCJHRVRcIixhLnVybCwhMCksZi5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiLGEucmFuZ2UmJmYuc2V0UmVxdWVzdEhlYWRlcihcIlJhbmdlXCIsXCJieXRlcz1cIithLnJhbmdlKSxmLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24oYil7aCYmKGg9ITEsKCFiLmxlbmd0aENvbXB1dGFibGV8fGIubGVuZ3RoQ29tcHV0YWJsZSYmYi50b3RhbCE9Yi5sb2FkZWQpJiYoYS5maXJzdEJ5dGVEYXRlPW5ldyBEYXRlKSl9LGYub25sb2FkPWZ1bmN0aW9uKCl7aWYoIShmLnN0YXR1czwyMDB8fGYuc3RhdHVzPjI5OSkpe2k9ITEsYS5yZXF1ZXN0RW5kRGF0ZT1uZXcgRGF0ZTt2YXIgYj1hLnJlcXVlc3RFbmREYXRlLGM9Zi5yZXNwb25zZSxkPWEuZmlyc3RCeXRlRGF0ZS5nZXRUaW1lKCktYS5yZXF1ZXN0U3RhcnREYXRlLmdldFRpbWUoKSxlPWEucmVxdWVzdEVuZERhdGUuZ2V0VGltZSgpLWEuZmlyc3RCeXRlRGF0ZS5nZXRUaW1lKCksaD1hLnJlcXVlc3RFbmREYXRlLmdldFRpbWUoKS1hLnJlcXVlc3RTdGFydERhdGUuZ2V0VGltZSgpO2ouZGVidWcubG9nKFwic2VnbWVudCBsb2FkZWQ6IChcIitmLnN0YXR1cytcIiwgXCIrZCtcIm1zLCBcIitlK1wibXMsIFwiK2grXCJtcykgXCIrYS51cmwpLGc9ai5tZXRyaWNzTW9kZWwuYWRkSHR0cFJlcXVlc3QoYS5zdHJlYW1UeXBlLG51bGwsYS50eXBlLGEudXJsLG51bGwsYS5yYW5nZSxhLnJlcXVlc3RTdGFydERhdGUsYS5maXJzdEJ5dGVEYXRlLGEucmVxdWVzdEVuZERhdGUsZi5zdGF0dXMsbnVsbCxhLmR1cmF0aW9uKSxqLm1ldHJpY3NNb2RlbC5hcHBlbmRIdHRwVHJhY2UoZyxiLChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuZ2V0VGltZSgpLFtjLmJ5dGVMZW5ndGhdKSxhLmRlZmVycmVkLnJlc29sdmUoe2RhdGE6YyxyZXF1ZXN0OmF9KX19LGYub25sb2FkZW5kPWYub25lcnJvcj1mdW5jdGlvbigpe2lmKC0xIT09Yy5pbmRleE9mKGYpJiYoYy5zcGxpY2UoYy5pbmRleE9mKGYpLDEpLGkpKXtpPSExLGEucmVxdWVzdEVuZERhdGU9bmV3IERhdGU7dmFyIGg9YS5maXJzdEJ5dGVEYXRlLmdldFRpbWUoKS1hLnJlcXVlc3RTdGFydERhdGUuZ2V0VGltZSgpLGs9YS5yZXF1ZXN0RW5kRGF0ZS5nZXRUaW1lKCktYS5maXJzdEJ5dGVEYXRlLmdldFRpbWUoKSxsPWEucmVxdWVzdEVuZERhdGUuZ2V0VGltZSgpLWEucmVxdWVzdFN0YXJ0RGF0ZS5nZXRUaW1lKCk7ai5kZWJ1Zy5sb2coXCJzZWdtZW50IGxvYWRlZDogKFwiK2Yuc3RhdHVzK1wiLCBcIitoK1wibXMsIFwiK2srXCJtcywgXCIrbCtcIm1zKSBcIithLnVybCksZz1qLm1ldHJpY3NNb2RlbC5hZGRIdHRwUmVxdWVzdChhLnN0cmVhbVR5cGUsbnVsbCxhLnR5cGUsYS51cmwsbnVsbCxhLnJhbmdlLGEucmVxdWVzdFN0YXJ0RGF0ZSxhLmZpcnN0Qnl0ZURhdGUsYS5yZXF1ZXN0RW5kRGF0ZSxmLnN0YXR1cyxudWxsLGEuZHVyYXRpb24pLGU+MD8oai5kZWJ1Zy5sb2coXCJGYWlsZWQgbG9hZGluZyBzZWdtZW50OiBcIithLnVybCtcIiwgcmV0cnkgaW4gXCIrYitcIm1zXCIrXCIgYXR0ZW1wdHM6IFwiK2UpLGUtLSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5jYWxsKGosYSxlKX0sYikpOihqLmRlYnVnLmxvZyhcIkZhaWxlZCBsb2FkaW5nIHNlZ21lbnQ6IFwiK2EudXJsK1wiIG5vIHJldHJ5IGF0dGVtcHRzIGxlZnRcIiksai5lcnJIYW5kbGVyLmRvd25sb2FkRXJyb3IoXCJjb250ZW50XCIsYS51cmwsZiksYS5kZWZlcnJlZC5yZWplY3QoZikpfX0sZi5zZW5kKCl9O3JldHVybnttZXRyaWNzTW9kZWw6dm9pZCAwLGVyckhhbmRsZXI6dm9pZCAwLGRlYnVnOnZvaWQgMCxsb2FkOmZ1bmN0aW9uKGIpe3JldHVybiBiPyhiLmRlZmVycmVkPVEuZGVmZXIoKSxkLmNhbGwodGhpcyxiLGEpLGIuZGVmZXJyZWQucHJvbWlzZSk6US53aGVuKG51bGwpfSxhYm9ydDpmdW5jdGlvbigpe3ZhciBhLGIsZD1jLmxlbmd0aDtmb3IoYT0wO2Q+YTthKz0xKWI9Y1thXSxjW2FdPW51bGwsYi5hYm9ydCgpLGI9bnVsbDtjPVtdfX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudExvYWRlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudExvYWRlcn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkZyYWdtZW50TW9kZWw9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYSxiLGMsZCxlLGY9W10sZz1bXSxoPVtdLGk9NSxqPWZ1bmN0aW9uKGUpe3ZhciBnLGk9dGhpcztiLmNhbGwoYSxlKSxnPWZ1bmN0aW9uKGIsZCl7aC5zcGxpY2UoaC5pbmRleE9mKGIpLDEpLGYucHVzaChiKSxjLmNhbGwoYSxiLGQpLGIuZGVmZXJyZWQ9bnVsbH0saS5mcmFnbWVudExvYWRlci5sb2FkKGUpLnRoZW4oZy5iaW5kKGEsZSksZC5iaW5kKGEsZSkpfSxrPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYVtiXTxjW2JdPy0xOmFbYl0+Y1tiXT8xOjB9O2Euc29ydChjKX0sbD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLmxlbmd0aC0xO2ZvcihkPWU7ZD49MDtkLT0xKWlmKGM9YVtkXSxjLnVybD09PWIudXJsJiZjLnN0YXJ0VGltZT09PWIuc3RhcnRUaW1lKXJldHVybiEwO3JldHVybiExfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPWYuaW5kZXhPZihhKTstMSE9PWImJmYuc3BsaWNlKGIsMSl9O3JldHVybntzeXN0ZW06dm9pZCAwLGRlYnVnOnZvaWQgMCxmcmFnbWVudExvYWRlcjp2b2lkIDAsc2V0Q29udGV4dDpmdW5jdGlvbihiKXthPWJ9LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sYWRkUmVxdWVzdDpmdW5jdGlvbihhKXthJiYoZy5wdXNoKGEpLGsuY2FsbCh0aGlzLGcsXCJpbmRleFwiKSl9LHNldENhbGxiYWNrczpmdW5jdGlvbihhLGYsZyxoKXtiPWEsZT1oLGQ9ZyxjPWZ9LGlzRnJhZ21lbnRMb2FkZWRPclBlbmRpbmc6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGM9dGhpcyxkPSExLGU9Zi5sZW5ndGgtMSxpPWU7aT49MDtpLT0xKWlmKGI9ZltpXSxhLnN0YXJ0VGltZT09PWIuc3RhcnRUaW1lfHxcImNvbXBsZXRlXCI9PT1iLmFjdGlvbiYmYS5hY3Rpb249PT1iLmFjdGlvbil7aWYoYy5kZWJ1Zy5sb2coYS5zdHJlYW1UeXBlK1wiIEZyYWdtZW50IGFscmVhZHkgbG9hZGVkIGZvciB0aW1lOiBcIithLnN0YXJ0VGltZSksYS51cmw9PT1iLnVybCl7Yy5kZWJ1Zy5sb2coYS5zdHJlYW1UeXBlK1wiIEZyYWdtZW50IHVybCBhbHJlYWR5IGxvYWRlZDogXCIrYS51cmwpLGQ9ITA7YnJlYWt9bShhKX1yZXR1cm4gZHx8KGQ9bC5jYWxsKGMsZyxhKXx8bC5jYWxsKGMsaCxhKSksZH0saXNSZWFkeTpmdW5jdGlvbigpe3JldHVybiBhLmlzUmVhZHkoKX0sZ2V0UGVuZGluZ1JlcXVlc3RzOmZ1bmN0aW9uKCl7cmV0dXJuIGd9LGdldExvYWRpbmdSZXF1ZXN0czpmdW5jdGlvbigpe3JldHVybiBofSxnZXRMb2FkaW5nVGltZTpmdW5jdGlvbigpe3ZhciBhLGIsYz0wO2ZvcihiPWYubGVuZ3RoLTE7Yj49MDtiLT0xKWlmKGE9ZltiXSxhLnJlcXVlc3RFbmREYXRlIGluc3RhbmNlb2YgRGF0ZSYmYS5maXJzdEJ5dGVEYXRlIGluc3RhbmNlb2YgRGF0ZSl7Yz1hLnJlcXVlc3RFbmREYXRlLmdldFRpbWUoKS1hLmZpcnN0Qnl0ZURhdGUuZ2V0VGltZSgpO2JyZWFrfXJldHVybiBjfSxnZXRFeGVjdXRlZFJlcXVlc3RGb3JUaW1lOmZ1bmN0aW9uKGEpe3ZhciBiLGM9Zi5sZW5ndGgtMSxkPTAvMCxlPTAvMCxnPW51bGw7Zm9yKGI9YztiPj0wO2ItPTEpaWYoZz1mW2JdLGQ9Zy5zdGFydFRpbWUsZT1kK2cuZHVyYXRpb24sIWlzTmFOKGQpJiYhaXNOYU4oZSkmJmE+ZCYmZT5hKXJldHVybiBnO3JldHVybiBudWxsfSxyZW1vdmVFeGVjdXRlZFJlcXVlc3Q6ZnVuY3Rpb24oYSl7bS5jYWxsKHRoaXMsYSl9LHJlbW92ZUV4ZWN1dGVkUmVxdWVzdHNCZWZvcmVUaW1lOmZ1bmN0aW9uKGEpe3ZhciBiLGM9Zi5sZW5ndGgtMSxkPTAvMCxlPW51bGw7Zm9yKGI9YztiPj0wO2ItPTEpZT1mW2JdLGQ9ZS5zdGFydFRpbWUsIWlzTmFOKGQpJiZhPmQmJm0uY2FsbCh0aGlzLGUpfSxjYW5jZWxQZW5kaW5nUmVxdWVzdHM6ZnVuY3Rpb24oKXtnPVtdfSxhYm9ydFJlcXVlc3RzOmZ1bmN0aW9uKCl7dGhpcy5mcmFnbWVudExvYWRlci5hYm9ydCgpLGg9W119LGV4ZWN1dGVDdXJyZW50UmVxdWVzdDpmdW5jdGlvbigpe3ZhciBiLGM9dGhpcztpZigwIT09Zy5sZW5ndGgmJiEoaC5sZW5ndGg+PWkpKXN3aXRjaChiPWcuc2hpZnQoKSxiLmFjdGlvbil7Y2FzZVwiY29tcGxldGVcIjpmLnB1c2goYiksZS5jYWxsKGEsYik7YnJlYWs7Y2FzZVwiZG93bmxvYWRcIjpoLnB1c2goYiksai5jYWxsKGMsYik7YnJlYWs7ZGVmYXVsdDp0aGlzLmRlYnVnLmxvZyhcIlVua25vd24gcmVxdWVzdCBhY3Rpb24uXCIpfX19fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRnJhZ21lbnRNb2RlbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudE1vZGVsfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuTWFuaWZlc3RMb2FkZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT0zLGI9NTAwLGM9bnVsbCxkPWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuLTEhPT1hLmluZGV4T2YoXCIvXCIpJiYoYj1hLnN1YnN0cmluZygwLGEubGFzdEluZGV4T2YoXCIvXCIpKzEpKSxifSxlPWZ1bmN0aW9uKGEsZil7dmFyIGc9ZChhKSxoPW5ldyBYTUxIdHRwUmVxdWVzdCxpPW5ldyBEYXRlLGo9ITAsaz10aGlzO3RoaXMuZGVidWcubG9nKFwiU3RhcnQgbG9hZGluZyBtYW5pZmVzdDogXCIrYSksaC5vcGVuKFwiR0VUXCIsYSwhMCksaC5vbmxvYWQ9ZnVuY3Rpb24oKXtoLnN0YXR1czwyMDB8fGguc3RhdHVzPjI5OXx8KGo9ITEsay5tZXRyaWNzTW9kZWwuYWRkSHR0cFJlcXVlc3QoXCJzdHJlYW1cIixudWxsLFwiTVBEXCIsYSxudWxsLG51bGwsaSxuZXcgRGF0ZSxoLnN0YXR1cyxudWxsLG51bGwpLGsucGFyc2VyLnBhcnNlKGgucmVzcG9uc2VUZXh0LGcpLnRoZW4oZnVuY3Rpb24oYil7Yi5tcGRVcmw9YSxjLnJlc29sdmUoYil9LGZ1bmN0aW9uKCl7Yy5yZWplY3QoaCl9KSl9LGgub25sb2FkZW5kPWgub25lcnJvcj1mdW5jdGlvbigpe2omJihqPSExLGsubWV0cmljc01vZGVsLmFkZEh0dHBSZXF1ZXN0KFwic3RyZWFtXCIsbnVsbCxcIk1QRFwiLGEsbnVsbCxudWxsLGksbmV3IERhdGUsaC5zdGF0dXMsbnVsbCxudWxsKSxmPjA/KGsuZGVidWcubG9nKFwiRmFpbGVkIGxvYWRpbmcgbWFuaWZlc3Q6IFwiK2ErXCIsIHJldHJ5IGluIFwiK2IrXCJtc1wiK1wiIGF0dGVtcHRzOiBcIitmKSxmLS0sc2V0VGltZW91dChmdW5jdGlvbigpe2UuY2FsbChrLGEsZil9LGIpKTooay5kZWJ1Zy5sb2coXCJGYWlsZWQgbG9hZGluZyBtYW5pZmVzdDogXCIrYStcIiBubyByZXRyeSBhdHRlbXB0cyBsZWZ0XCIpLGsuZXJySGFuZGxlci5kb3dubG9hZEVycm9yKFwibWFuaWZlc3RcIixhLGgpLGMucmVqZWN0KGgpKSl9LGguc2VuZCgpfTtyZXR1cm57ZGVidWc6dm9pZCAwLHBhcnNlcjp2b2lkIDAsZXJySGFuZGxlcjp2b2lkIDAsbWV0cmljc01vZGVsOnZvaWQgMCxsb2FkOmZ1bmN0aW9uKGIpe3JldHVybiBjPVEuZGVmZXIoKSxlLmNhbGwodGhpcyxiLGEpLGMucHJvbWlzZX19fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuTWFuaWZlc3RMb2FkZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuTWFuaWZlc3RMb2FkZXJ9LE1lZGlhUGxheWVyLm1vZGVscy5NYW5pZmVzdE1vZGVsPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE7cmV0dXJue2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldFZhbHVlOmZ1bmN0aW9uKGIpe2E9Yn19fSxNZWRpYVBsYXllci5tb2RlbHMuTWFuaWZlc3RNb2RlbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLm1vZGVscy5NYW5pZmVzdE1vZGVsfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuTWFuaWZlc3RVcGRhdGVyPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9MC8wLGI9bnVsbCxjPW51bGwsZD1mdW5jdGlvbigpe251bGwhPT1iJiYoY2xlYXJJbnRlcnZhbChiKSxiPW51bGwpfSxlPWZ1bmN0aW9uKCl7ZC5jYWxsKHRoaXMpLGlzTmFOKGEpfHwodGhpcy5kZWJ1Zy5sb2coXCJSZWZyZXNoIG1hbmlmZXN0IGluIFwiK2ErXCIgc2Vjb25kcy5cIiksYj1zZXRJbnRlcnZhbChjLmJpbmQodGhpcyksMWUzKmEsdGhpcykpfSxmPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiZiLm1hbmlmZXN0RXh0LmdldFJlZnJlc2hEZWxheShjKS50aGVuKGZ1bmN0aW9uKGMpe2E9YyxlLmNhbGwoYil9KX07cmV0dXJuIGM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5tYW5pZmVzdE1vZGVsLmdldFZhbHVlKCksYz1iLm1wZFVybDtiLmhhc093blByb3BlcnR5KFwiTG9jYXRpb25cIikmJihjPWIuTG9jYXRpb24pLGEuZGVidWcubG9nKFwiUmVmcmVzaCBtYW5pZmVzdCBAIFwiK2MpLGEubWFuaWZlc3RMb2FkZXIubG9hZChjKS50aGVuKGZ1bmN0aW9uKGIpe2EubWFuaWZlc3RNb2RlbC5zZXRWYWx1ZShiKSxhLmRlYnVnLmxvZyhcIk1hbmlmZXN0IGhhcyBiZWVuIHJlZnJlc2hlZC5cIiksYS5kZWJ1Zy5sb2coYiksZi5jYWxsKGEpLGEuc3lzdGVtLm5vdGlmeShcIm1hbmlmZXN0VXBkYXRlZFwiKX0pfSx7ZGVidWc6dm9pZCAwLHN5c3RlbTp2b2lkIDAsbWFuaWZlc3RNb2RlbDp2b2lkIDAsbWFuaWZlc3RFeHQ6dm9pZCAwLG1hbmlmZXN0TG9hZGVyOnZvaWQgMCxzZXR1cDpmdW5jdGlvbigpe2YuY2FsbCh0aGlzKX0saW5pdDpmdW5jdGlvbigpe2YuY2FsbCh0aGlzKX0sc3RvcDpmdW5jdGlvbigpe2QuY2FsbCh0aGlzKX19fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuTWFuaWZlc3RVcGRhdGVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1hbmlmZXN0VXBkYXRlcn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1lZGlhU291cmNlRXh0ZW5zaW9ucz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwifSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuTWVkaWFTb3VyY2VFeHRlbnNpb25zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1lZGlhU291cmNlRXh0ZW5zaW9ucyxjcmVhdGVNZWRpYVNvdXJjZTpmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPVwiV2ViS2l0TWVkaWFTb3VyY2VcImluIHdpbmRvdyxiPVwiTWVkaWFTb3VyY2VcImluIHdpbmRvdztyZXR1cm4gYj9RLndoZW4obmV3IE1lZGlhU291cmNlKTphP1Eud2hlbihuZXcgV2ViS2l0TWVkaWFTb3VyY2UpOm51bGx9LGF0dGFjaE1lZGlhU291cmNlOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGIuc2V0U291cmNlKHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGEpKSxRLndoZW4oITApfSxkZXRhY2hNZWRpYVNvdXJjZTpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gYS5zZXRTb3VyY2UoXCJcIiksUS53aGVuKCEwKX0sc2V0RHVyYXRpb246ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gYS5kdXJhdGlvbj1iLFEud2hlbihhLmR1cmF0aW9uKX0sc2lnbmFsRW5kT2ZTdHJlYW06ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGEuZW5kT2ZTdHJlYW0oKSxRLndoZW4oITApfX0sTWVkaWFQbGF5ZXIubW9kZWxzLk1ldHJpY3NNb2RlbD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3JldHVybntzeXN0ZW06dm9pZCAwLHN0cmVhbU1ldHJpY3M6e30sY2xlYXJDdXJyZW50TWV0cmljc0ZvclR5cGU6ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMuc3RyZWFtTWV0cmljc1thXX0sY2xlYXJBbGxDdXJyZW50TWV0cmljczpmdW5jdGlvbigpe3RoaXMuc3RyZWFtTWV0cmljcz17fX0sZ2V0UmVhZE9ubHlNZXRyaWNzRm9yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0cmVhbU1ldHJpY3MuaGFzT3duUHJvcGVydHkoYSk/dGhpcy5zdHJlYW1NZXRyaWNzW2FdOm51bGx9LGdldE1ldHJpY3NGb3I6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIHRoaXMuc3RyZWFtTWV0cmljcy5oYXNPd25Qcm9wZXJ0eShhKT9iPXRoaXMuc3RyZWFtTWV0cmljc1thXTooYj10aGlzLnN5c3RlbS5nZXRPYmplY3QoXCJtZXRyaWNzXCIpLHRoaXMuc3RyZWFtTWV0cmljc1thXT1iKSxifSxhZGRUY3BDb25uZWN0aW9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1uZXcgTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5UQ1BDb25uZWN0aW9uO3JldHVybiBnLnRjcGlkPWIsZy5kZXN0PWMsZy50b3Blbj1kLGcudGNsb3NlPWUsZy50Y29ubmVjdD1mLHRoaXMuZ2V0TWV0cmljc0ZvcihhKS5UY3BMaXN0LnB1c2goZyksZ30sYWRkSHR0cFJlcXVlc3Q6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPW5ldyBNZWRpYVBsYXllci52by5tZXRyaWNzLkhUVFBSZXF1ZXN0O3JldHVybiBtLnRjcGlkPWIsbS50eXBlPWMsbS51cmw9ZCxtLmFjdHVhbHVybD1lLG0ucmFuZ2U9ZixtLnRyZXF1ZXN0PWcsbS50cmVzcG9uc2U9aCxtLnRmaW5pc2g9aSxtLnJlc3BvbnNlY29kZT1qLG0uaW50ZXJ2YWw9ayxtLm1lZGlhZHVyYXRpb249bCx0aGlzLmdldE1ldHJpY3NGb3IoYSkuSHR0cExpc3QucHVzaChtKSxtfSxhcHBlbmRIdHRwVHJhY2U6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bmV3IE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuSFRUUFJlcXVlc3QuVHJhY2U7cmV0dXJuIGUucz1iLGUuZD1jLGUuYj1kLGEudHJhY2UucHVzaChlKSxlfSxhZGRSZXByZXNlbnRhdGlvblN3aXRjaDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPW5ldyBNZWRpYVBsYXllci52by5tZXRyaWNzLlJlcHJlc2VudGF0aW9uU3dpdGNoO3JldHVybiBmLnQ9YixmLm10PWMsZi50bz1kLGYubHRvPWUsdGhpcy5nZXRNZXRyaWNzRm9yKGEpLlJlcFN3aXRjaExpc3QucHVzaChmKSxmfSxhZGRCdWZmZXJMZXZlbDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9bmV3IE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuQnVmZmVyTGV2ZWw7cmV0dXJuIGQudD1iLGQubGV2ZWw9Yyx0aGlzLmdldE1ldHJpY3NGb3IoYSkuQnVmZmVyTGV2ZWwucHVzaChkKSxkfSxhZGRQbGF5TGlzdDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uZXcgTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdDtyZXR1cm4gZS5zdGFydD1iLGUubXN0YXJ0PWMsZS5zdGFydHR5cGU9ZCx0aGlzLmdldE1ldHJpY3NGb3IoYSkuUGxheUxpc3QucHVzaChlKSxlfSxhcHBlbmRQbGF5TGlzdFRyYWNlOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7dmFyIGk9bmV3IE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2U7cmV0dXJuIGkucmVwcmVzZW50YXRpb25pZD1iLGkuc3VicmVwbGV2ZWw9YyxpLnN0YXJ0PWQsaS5tc3RhcnQ9ZSxpLmR1cmF0aW9uPWYsaS5wbGF5YmFja3NwZWVkPWcsaS5zdG9wcmVhc29uPWgsYS50cmFjZS5wdXNoKGkpLGl9fX0sTWVkaWFQbGF5ZXIubW9kZWxzLk1ldHJpY3NNb2RlbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLm1vZGVscy5NZXRyaWNzTW9kZWx9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5Qcm90ZWN0aW9uQ29udHJvbGxlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPW51bGwsYj1udWxsLGM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLnByb3RlY3Rpb25Nb2RlbC5yZW1vdmVLZXlTeXN0ZW0oYSl9LGQ9ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGQ9dGhpcyxlPTA7ZTxiLmxlbmd0aDsrK2UpZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDsrK2YpaWYoYltlXS5pc1N1cHBvcnRlZChjW2ZdKSYmZC5wcm90ZWN0aW9uRXh0LnN1cHBvcnRzQ29kZWMoYltlXS5rZXlzVHlwZVN0cmluZyxhKSl7dmFyIGc9ZC5tYW5pZmVzdEV4dC5nZXRLSUQoY1tmXSk7cmV0dXJuIGd8fChnPVwidW5rbm93blwiKSxkLnByb3RlY3Rpb25Nb2RlbC5hZGRLZXlTeXN0ZW0oZyxjW2ZdLGJbZV0pLGQuZGVidWcubG9nKFwiRFJNOiBTZWxlY3RlZCBLZXkgU3lzdGVtOiBcIitiW2VdLmtleXNUeXBlU3RyaW5nK1wiIEZvciBLSUQ6IFwiK2cpLGd9dGhyb3cgbmV3IEVycm9yKFwiRFJNOiBUaGUgcHJvdGVjdGlvbiBzeXN0ZW0gZm9yIHRoaXMgY29udGVudCBpcyBub3Qgc3VwcG9ydGVkLlwiKX0sZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcyxlPW51bGwsZj1udWxsO2QucHJvdGVjdGlvbk1vZGVsLm5lZWRUb0FkZEtleVNlc3Npb24oYSkmJihmPWQucHJvdGVjdGlvbk1vZGVsLmdldEluaXREYXRhKGEpLCFmJiZjPyhmPWMsZC5kZWJ1Zy5sb2coXCJEUk06IFVzaW5nIGluaXRkYXRhIGZyb20gbmVlZHNrZXkgZXZlbnQuIGxlbmd0aDogXCIrZi5sZW5ndGgpKTpmJiZkLmRlYnVnLmxvZyhcIkRSTTogVXNpbmcgaW5pdGRhdGEgZnJvbSBwcmhlYWRlciBpbiBtcGQuIGxlbmd0aDogXCIrZi5sZW5ndGgpLGY/KGU9ZC5wcm90ZWN0aW9uTW9kZWwuYWRkS2V5U2Vzc2lvbihhLGIsZiksZC5kZWJ1Zy5sb2coXCJEUk06IEFkZGVkIEtleSBTZXNzaW9uIFtcIitlLnNlc3Npb25JZCtcIl0gZm9yIEtJRDogXCIrYStcIiB0eXBlOiBcIitiK1wiIGluaXREYXRhIGxlbmd0aDogXCIrZi5sZW5ndGgpKTpkLmRlYnVnLmxvZyhcIkRSTTogaW5pdGRhdGEgaXMgbnVsbC5cIikpfSxmPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGY9dGhpcztyZXR1cm4gZT1mLnByb3RlY3Rpb25Nb2RlbC51cGRhdGVGcm9tTWVzc2FnZShhLGMsZCksZS50aGVuKGZ1bmN0aW9uKGEpe2IudXBkYXRlKGEpfSksZX07cmV0dXJue3N5c3RlbTp2b2lkIDAsZGVidWc6dm9pZCAwLG1hbmlmZXN0RXh0OnZvaWQgMCxjYXBhYmlsaXRpZXM6dm9pZCAwLHZpZGVvTW9kZWw6dm9pZCAwLHByb3RlY3Rpb25Nb2RlbDp2b2lkIDAscHJvdGVjdGlvbkV4dDp2b2lkIDAsc2V0dXA6ZnVuY3Rpb24oKXtiPXRoaXMucHJvdGVjdGlvbkV4dC5nZXRLZXlTeXN0ZW1zKCl9LGluaXQ6ZnVuY3Rpb24oYixjKXt0aGlzLnZpZGVvTW9kZWw9Yix0aGlzLnByb3RlY3Rpb25Nb2RlbD1jLGE9dGhpcy52aWRlb01vZGVsLmdldEVsZW1lbnQoKVxufSxzZWxlY3RLZXlTeXN0ZW06ZCxlbnN1cmVLZXlTZXNzaW9uOmUsdXBkYXRlRnJvbU1lc3NhZ2U6Zix0ZWFyZG93bktleVN5c3RlbTpjfX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25Db250cm9sbGVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25Db250cm9sbGVyfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUHJvdGVjdGlvbkV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25FeHRlbnNpb25zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25FeHRlbnNpb25zLHN1cHBvcnRzQ29kZWM6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYz1cIldlYktpdE1lZGlhS2V5c1wiaW4gd2luZG93LGQ9XCJNU01lZGlhS2V5c1wiaW4gd2luZG93LGU9XCJNZWRpYUtleXNcImluIHdpbmRvdztyZXR1cm4gZT9NZWRpYUtleXMuaXNUeXBlU3VwcG9ydGVkKGEsYik6Yz9XZWJLaXRNZWRpYUtleXMuaXNUeXBlU3VwcG9ydGVkKGEsYik6ZD9NU01lZGlhS2V5cy5pc1R5cGVTdXBwb3J0ZWQoYSxiKTohMX0sY3JlYXRlTWVkaWFLZXlzOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPVwiV2ViS2l0TWVkaWFLZXlzXCJpbiB3aW5kb3csYz1cIk1TTWVkaWFLZXlzXCJpbiB3aW5kb3csZD1cIk1lZGlhS2V5c1wiaW4gd2luZG93O3JldHVybiBkP25ldyBNZWRpYUtleXMoYSk6Yj9uZXcgV2ViS2l0TWVkaWFLZXlzKGEpOmM/bmV3IE1TTWVkaWFLZXlzKGEpOm51bGx9LHNldE1lZGlhS2V5OmZ1bmN0aW9uKGEsYil7dmFyIGM9XCJXZWJLaXRTZXRNZWRpYUtleXNcImluIGEsZD1cIm1zU2V0TWVkaWFLZXlzXCJpbiBhLGU9XCJTZXRNZWRpYUtleXNcImluIGE7cmV0dXJuIGU/YS5TZXRNZWRpYUtleXMoYik6Yz9hLldlYktpdFNldE1lZGlhS2V5cyhiKTpkP2EubXNTZXRNZWRpYUtleXMoYik6KHRoaXMuZGVidWcubG9nKFwibm8gc2V0bWVkaWFrZXlzIGZ1bmN0aW9uIGluIGVsZW1lbnRcIiksdm9pZCAwKX0sY3JlYXRlU2Vzc2lvbjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuY3JlYXRlU2Vzc2lvbihiLGMpfSxnZXRLZXlTeXN0ZW1zOmZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RLmRlZmVyKCksZD1udWxsLGU9W10sZj1uZXcgRE9NUGFyc2VyLGc9Zi5wYXJzZUZyb21TdHJpbmcoYSxcImFwcGxpY2F0aW9uL3htbFwiKTtpZighZy5nZXRFbGVtZW50c0J5VGFnTmFtZShcIkNoYWxsZW5nZVwiKVswXSlyZXR1cm4gYy5yZWplY3QoXCJEUk06IHBsYXlyZWFkeSB1cGRhdGUsIGNhbiBub3QgZmluZCBDaGFsbGVuZ2UgaW4ga2V5TWVzc2FnZVwiKSxjLnByb21pc2U7dmFyIGg9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZShcIkNoYWxsZW5nZVwiKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTtoJiYoZD1CQVNFNjQuZGVjb2RlKGgpKTt2YXIgaT1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibmFtZVwiKSxqPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ2YWx1ZVwiKTtpZihpLmxlbmd0aCE9ai5sZW5ndGgpcmV0dXJuIGMucmVqZWN0KFwiRFJNOiBwbGF5cmVhZHkgdXBkYXRlLCBpbnZhbGlkIGhlYWRlciBuYW1lL3ZhbHVlIHBhaXIgaW4ga2V5TWVzc2FnZVwiKSxjLnByb21pc2U7Zm9yKHZhciBrPTA7azxpLmxlbmd0aDtrKyspZVtrXT17bmFtZTppW2tdLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlLHZhbHVlOmpba10uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWV9O3ZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gbC5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PWwuc3RhdHVzP2MucmVzb2x2ZShuZXcgVWludDhBcnJheShsLnJlc3BvbnNlKSk6Yy5yZWplY3QoJ0RSTTogcGxheXJlYWR5IHVwZGF0ZSwgWEhSIHN0YXR1cyBpcyBcIicrbC5zdGF0dXNUZXh0KydcIiAoJytsLnN0YXR1cytcIiksIGV4cGVjdGVkIHRvIGJlIDIwMC4gcmVhZHlTdGF0ZSBpcyBcIitsLnJlYWR5U3RhdGUpfSxsLm9uYWJvcnQ9ZnVuY3Rpb24oKXtjLnJlamVjdCgnRFJNOiBwbGF5cmVhZHkgdXBkYXRlLCBYSFIgYWJvcnRlZC4gc3RhdHVzIGlzIFwiJytsLnN0YXR1c1RleHQrJ1wiICgnK2wuc3RhdHVzK1wiKSwgcmVhZHlTdGF0ZSBpcyBcIitsLnJlYWR5U3RhdGUpfSxsLm9uZXJyb3I9ZnVuY3Rpb24oKXtjLnJlamVjdCgnRFJNOiBwbGF5cmVhZHkgdXBkYXRlLCBYSFIgZXJyb3IuIHN0YXR1cyBpcyBcIicrbC5zdGF0dXNUZXh0KydcIiAoJytsLnN0YXR1cytcIiksIHJlYWR5U3RhdGUgaXMgXCIrbC5yZWFkeVN0YXRlKX0sbC5vcGVuKFwiUE9TVFwiLGIpLGwucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixlJiZlLmZvckVhY2goZnVuY3Rpb24oYSl7bC5zZXRSZXF1ZXN0SGVhZGVyKGEubmFtZSxhLnZhbHVlKX0pLGwuc2VuZChkKSxjLnByb21pc2V9LGI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09PWEmJjA9PT1iLmxlbmd0aH0sYz1mdW5jdGlvbihhKXt2YXIgYj0wLGM9MCxkPTAsZT1uZXcgVWludDhBcnJheShbMTEyLDExNSwxMTUsMTA0LDAsMCwwLDBdKSxmPW5ldyBVaW50OEFycmF5KFsxNTQsNCwyNDAsMTIxLDE1Miw2NCw2NiwxMzQsMTcxLDE0NiwyMzAsOTEsMjI0LDEzNiw5NSwxNDldKSxnPW51bGwsaD1udWxsLGk9bnVsbCxqPW51bGw7aWYoXCJwcm9cImluIGEpZz1CQVNFNjQuZGVjb2RlQXJyYXkoYS5wcm8uX190ZXh0KTtlbHNle2lmKCEoXCJwcmhlYWRlclwiaW4gYSkpcmV0dXJuIG51bGw7Zz1CQVNFNjQuZGVjb2RlQXJyYXkoYS5wcmhlYWRlci5fX3RleHQpfXJldHVybiBjPWcubGVuZ3RoLGQ9NCtlLmxlbmd0aCtmLmxlbmd0aCs0K2MsaD1uZXcgQXJyYXlCdWZmZXIoZCksaT1uZXcgVWludDhBcnJheShoKSxqPW5ldyBEYXRhVmlldyhoKSxqLnNldFVpbnQzMihiLGQpLGIrPTQsaS5zZXQoZSxiKSxiKz1lLmxlbmd0aCxpLnNldChmLGIpLGIrPWYubGVuZ3RoLGouc2V0VWludDMyKGIsYyksYis9NCxpLnNldChnLGIpLGIrPWMsaX07cmV0dXJuW3tzY2hlbWVJZFVyaTpcInVybjp1dWlkOjlhMDRmMDc5LTk4NDAtNDI4Ni1hYjkyLWU2NWJlMDg4NWY5NVwiLGtleXNUeXBlU3RyaW5nOlwiY29tLm1pY3Jvc29mdC5wbGF5cmVhZHlcIixpc1N1cHBvcnRlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zY2hlbWVJZFVyaT09PWEuc2NoZW1lSWRVcmkudG9Mb3dlckNhc2UoKX0sbmVlZFRvQWRkS2V5U2Vzc2lvbjpiLGdldEluaXREYXRhOmMsZ2V0VXBkYXRlOmF9LHtzY2hlbWVJZFVyaTpcInVybjptcGVnOmRhc2g6bXA0cHJvdGVjdGlvbjoyMDExXCIsa2V5c1R5cGVTdHJpbmc6XCJjb20ubWljcm9zb2Z0LnBsYXlyZWFkeVwiLGlzU3VwcG9ydGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNjaGVtZUlkVXJpPT09YS5zY2hlbWVJZFVyaS50b0xvd2VyQ2FzZSgpJiZcImNlbmNcIj09PWEudmFsdWUudG9Mb3dlckNhc2UoKX0sbmVlZFRvQWRkS2V5U2Vzc2lvbjpiLGdldEluaXREYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldFVwZGF0ZTphfSx7c2NoZW1lSWRVcmk6XCJ1cm46dXVpZDowMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixrZXlzVHlwZVN0cmluZzpcIndlYmtpdC1vcmcudzMuY2xlYXJrZXlcIixpc1N1cHBvcnRlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zY2hlbWVJZFVyaT09PWEuc2NoZW1lSWRVcmkudG9Mb3dlckNhc2UoKX0sbmVlZFRvQWRkS2V5U2Vzc2lvbjpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRJbml0RGF0YTpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRVcGRhdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIFEud2hlbihhKX19XX0sYWRkS2V5OmZ1bmN0aW9uKGEsYixjLGQsZSl7YS53ZWJraXRBZGRLZXkoYixjLGQsZSl9LGdlbmVyYXRlS2V5UmVxdWVzdDpmdW5jdGlvbihhLGIsYyl7YS53ZWJraXRHZW5lcmF0ZUtleVJlcXVlc3QoYixjKX0sbGlzdGVuVG9OZWVkS2V5OmZ1bmN0aW9uKGEsYil7YS5saXN0ZW4oXCJ3ZWJraXRuZWVka2V5XCIsYiksYS5saXN0ZW4oXCJtc25lZWRrZXlcIixiKSxhLmxpc3RlbihcIm5lZWRLZXlcIixiKX0sbGlzdGVuVG9LZXlFcnJvcjpmdW5jdGlvbihhLGIpe2EuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleWVycm9yXCIsYiwhMSksYS5hZGRFdmVudExpc3RlbmVyKFwibXNrZXllcnJvclwiLGIsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihcImtleWVycm9yXCIsYiwhMSl9LGxpc3RlblRvS2V5TWVzc2FnZTpmdW5jdGlvbihhLGIpe2EuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleW1lc3NhZ2VcIixiLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJtc2tleW1lc3NhZ2VcIixiLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXltZXNzYWdlXCIsYiwhMSl9LGxpc3RlblRvS2V5QWRkZWQ6ZnVuY3Rpb24oYSxiKXthLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJraXRrZXlhZGRlZFwiLGIsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihcIm1za2V5YWRkZWRcIixiLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlhZGRlZFwiLGIsITEpfSx1bmxpc3RlblRvS2V5RXJyb3I6ZnVuY3Rpb24oYSxiKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3ZWJraXRrZXllcnJvclwiLGIpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1za2V5ZXJyb3JcIixiKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXllcnJvclwiLGIpfSx1bmxpc3RlblRvS2V5TWVzc2FnZTpmdW5jdGlvbihhLGIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleW1lc3NhZ2VcIixiKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtc2tleW1lc3NhZ2VcIixiKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXltZXNzYWdlXCIsYil9LHVubGlzdGVuVG9LZXlBZGRlZDpmdW5jdGlvbihhLGIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleWFkZGVkXCIsYiksYS5yZW1vdmVFdmVudExpc3RlbmVyKFwibXNrZXlhZGRlZFwiLGIpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWFkZGVkXCIsYil9fSxNZWRpYVBsYXllci5tb2RlbHMuUHJvdGVjdGlvbk1vZGVsPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9bnVsbCxiPW51bGwsYz1udWxsLGQ9bnVsbCxlPVtdO3JldHVybntzeXN0ZW06dm9pZCAwLHZpZGVvTW9kZWw6dm9pZCAwLHByb3RlY3Rpb25FeHQ6dm9pZCAwLHNldHVwOmZ1bmN0aW9uKCl7YT10aGlzLnZpZGVvTW9kZWwuZ2V0RWxlbWVudCgpfSxpbml0OmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9Nb2RlbD1iLGE9dGhpcy52aWRlb01vZGVsLmdldEVsZW1lbnQoKX0sYWRkS2V5U2Vzc2lvbjpmdW5jdGlvbihhLGYsZyl7dmFyIGg9bnVsbDtyZXR1cm4gaD10aGlzLnByb3RlY3Rpb25FeHQuY3JlYXRlU2Vzc2lvbihlW2FdLmtleXMsZixnKSx0aGlzLnByb3RlY3Rpb25FeHQubGlzdGVuVG9LZXlBZGRlZChoLGIpLHRoaXMucHJvdGVjdGlvbkV4dC5saXN0ZW5Ub0tleUVycm9yKGgsYyksdGhpcy5wcm90ZWN0aW9uRXh0Lmxpc3RlblRvS2V5TWVzc2FnZShoLGQpLGVbYV0uaW5pdERhdGE9ZyxlW2FdLmtleVNlc3Npb25zLnB1c2goaCksaH0sYWRkS2V5U3lzdGVtOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZj1udWxsO2Y9dGhpcy5wcm90ZWN0aW9uRXh0LmNyZWF0ZU1lZGlhS2V5cyhkLmtleXNUeXBlU3RyaW5nKSx0aGlzLnByb3RlY3Rpb25FeHQuc2V0TWVkaWFLZXkoYSxmKSxlW2JdPXtrSUQ6Yixjb250ZW50UHJvdGVjdGlvbjpjLGtleVN5c3RlbTpkLGtleXM6Zixpbml0RGF0YTpudWxsLGtleVNlc3Npb25zOltdfX0scmVtb3ZlS2V5U3lzdGVtOmZ1bmN0aW9uKGEpe2lmKG51bGwhPT1hJiZ2b2lkIDAhPT1lW2FdJiYwIT09ZVthXS5rZXlTZXNzaW9ucy5sZW5ndGgpe2Zvcih2YXIgZj1lW2FdLmtleVNlc3Npb25zLGc9MDtnPGYubGVuZ3RoOysrZyl0aGlzLnByb3RlY3Rpb25FeHQudW5saXN0ZW5Ub0tleUVycm9yKGZbZ10sYyksdGhpcy5wcm90ZWN0aW9uRXh0LnVubGlzdGVuVG9LZXlBZGRlZChmW2ddLGIpLHRoaXMucHJvdGVjdGlvbkV4dC51bmxpc3RlblRvS2V5TWVzc2FnZShmW2ddLGQpLGZbZ10uY2xvc2UoKTtlW2FdPXZvaWQgMH19LG5lZWRUb0FkZEtleVNlc3Npb246ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtyZXR1cm4gYj1lW2FdLGIua2V5U3lzdGVtLm5lZWRUb0FkZEtleVNlc3Npb24oYi5pbml0RGF0YSxiLmtleVNlc3Npb25zKX0sZ2V0SW5pdERhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtyZXR1cm4gYj1lW2FdLGIua2V5U3lzdGVtLmdldEluaXREYXRhKGIuY29udGVudFByb3RlY3Rpb24pfSx1cGRhdGVGcm9tTWVzc2FnZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGVbYV0ua2V5U3lzdGVtLmdldFVwZGF0ZShiLGMpfSxsaXN0ZW5Ub05lZWRLZXk6ZnVuY3Rpb24oYSl7dGhpcy5wcm90ZWN0aW9uRXh0Lmxpc3RlblRvTmVlZEtleSh0aGlzLnZpZGVvTW9kZWwsYSl9LGxpc3RlblRvS2V5RXJyb3I6ZnVuY3Rpb24oYSl7Yz1hO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7KytiKWZvcih2YXIgZD1lW2JdLmtleVNlc3Npb25zLGY9MDtmPGQubGVuZ3RoOysrZil0aGlzLnByb3RlY3Rpb25FeHQubGlzdGVuVG9LZXlFcnJvcihkW2ZdLGEpfSxsaXN0ZW5Ub0tleU1lc3NhZ2U6ZnVuY3Rpb24oYSl7ZD1hO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7KytiKWZvcih2YXIgYz1lW2JdLmtleVNlc3Npb25zLGY9MDtmPGMubGVuZ3RoOysrZil0aGlzLnByb3RlY3Rpb25FeHQubGlzdGVuVG9LZXlNZXNzYWdlKGNbZl0sYSl9LGxpc3RlblRvS2V5QWRkZWQ6ZnVuY3Rpb24oYSl7Yj1hO2Zvcih2YXIgYz0wO2M8ZS5sZW5ndGg7KytjKWZvcih2YXIgZD1lW2NdLmtleVNlc3Npb25zLGY9MDtmPGQubGVuZ3RoOysrZil0aGlzLnByb3RlY3Rpb25FeHQubGlzdGVuVG9LZXlBZGRlZChkW2ZdLGEpfX19LE1lZGlhUGxheWVyLm1vZGVscy5Qcm90ZWN0aW9uTW9kZWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5tb2RlbHMuUHJvdGVjdGlvbk1vZGVsfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUmVxdWVzdFNjaGVkdWxlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPVtdLGI9bnVsbCxjPW51bGwsZD1mdW5jdGlvbihhLGIpe2lmKGEmJmIpe3ZhciBjPWcoYSk7Y3x8KGM9ZS5jYWxsKHRoaXMsYSkpLGMuc2V0SXNTY2hlZHVsZWQoITApLGMuc2V0U2NoZWR1bGVkVGFzayhiKSxqLmNhbGwodGhpcyksYi5jYWxsKGEpfX0sZT1mdW5jdGlvbihiKXtpZighYilyZXR1cm4gbnVsbDt2YXIgYz10aGlzLnN5c3RlbS5nZXRPYmplY3QoXCJzY2hlZHVsZXJNb2RlbFwiKTtyZXR1cm4gYy5zZXRDb250ZXh0KGIpLGEucHVzaChjKSxjfSxmPWZ1bmN0aW9uKGIpe3ZhciBjPWEuaW5kZXhPZihiKTstMSE9PWMmJmEuc3BsaWNlKGMsMSl9LGc9ZnVuY3Rpb24oYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYVtjXS5nZXRDb250ZXh0KCk9PT1iKXJldHVybiBhW2NdO3JldHVybiBudWxsfSxoPWZ1bmN0aW9uKCl7aS5jYWxsKHRoaXMpfSxpPWZ1bmN0aW9uKCl7Zm9yKHZhciBiLGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sYi5nZXRJc1NjaGVkdWxlZCgpJiZiLmV4ZWN1dGVTY2hlZHVsZWRUYXNrKCl9LGo9ZnVuY3Rpb24oKXtudWxsPT09YyYmKHRoaXMuYWRqdXN0RXhlY3V0ZUludGVydmFsKCksYz1zZXRJbnRlcnZhbChoLmJpbmQodGhpcyksYikpfSxrPWZ1bmN0aW9uKGIpe3ZhciBjPWcoYik7YyYmKGYoYyksMD09PWEubGVuZ3RoJiZsLmNhbGwodGhpcykpfSxsPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjKSxjPW51bGx9O3JldHVybntzeXN0ZW06dm9pZCAwLGRlYnVnOnZvaWQgMCxzY2hlZHVsZXJFeHQ6dm9pZCAwLGlzU2NoZWR1bGVkOmZ1bmN0aW9uKGEpe3ZhciBiPWcoYSk7cmV0dXJuISFiJiZiLmdldElzU2NoZWR1bGVkKCl9LGdldEV4ZWN1dGVJbnRlcnZhbDpmdW5jdGlvbigpe3JldHVybiBifSxhZGp1c3RFeGVjdXRlSW50ZXJ2YWw6ZnVuY3Rpb24oKXtpZighKGEubGVuZ3RoPDEpKXt2YXIgZD10aGlzLnNjaGVkdWxlckV4dC5nZXRFeGVjdXRlSW50ZXJ2YWwoYVswXS5nZXRDb250ZXh0KCkpO2IhPT1kJiYoYj1kLG51bGwhPT1jJiYodGhpcy5kZWJ1Zy5sb2coXCJDaGFuZ2luZyBleGVjdXRlIGludGVydmFsOiBcIitiKSxjbGVhckludGVydmFsKGMpLGM9c2V0SW50ZXJ2YWwoaC5iaW5kKHRoaXMpLGIpKSl9fSxzdGFydFNjaGVkdWxpbmc6ZCxzdG9wU2NoZWR1bGluZzprfX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlJlcXVlc3RTY2hlZHVsZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUmVxdWVzdFNjaGVkdWxlcn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNjaGVkdWxlckV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNjaGVkdWxlckV4dGVuc2lvbnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU2NoZWR1bGVyRXh0ZW5zaW9ucyxnZXRFeGVjdXRlSW50ZXJ2YWw6ZnVuY3Rpb24oYSl7dmFyIGI9MWUzO3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBhLmdldE1pbkJ1ZmZlclRpbWUmJihiPTFlMyphLmdldE1pbkJ1ZmZlclRpbWUoKS80LGI9TWF0aC5tYXgoYiwxZTMpKSxifX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNjaGVkdWxlck1vZGVsPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGEsYixjPSExO3JldHVybntzeXN0ZW06dm9pZCAwLGRlYnVnOnZvaWQgMCxzY2hlZHVsZXJFeHQ6dm9pZCAwLHNldENvbnRleHQ6ZnVuY3Rpb24oYil7YT1ifSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldFNjaGVkdWxlZFRhc2s6ZnVuY3Rpb24oYSl7Yj1hfSxleGVjdXRlU2NoZWR1bGVkVGFzazpmdW5jdGlvbigpe2IuY2FsbChhKX0sc2V0SXNTY2hlZHVsZWQ6ZnVuY3Rpb24oYSl7Yz1hfSxnZXRJc1NjaGVkdWxlZDpmdW5jdGlvbigpe3JldHVybiBjfX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5TY2hlZHVsZXJNb2RlbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5TY2hlZHVsZXJNb2RlbH0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNvdXJjZUJ1ZmZlckV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLnN5c3RlbT12b2lkIDAsdGhpcy5tYW5pZmVzdEV4dD12b2lkIDB9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5Tb3VyY2VCdWZmZXJFeHRlbnNpb25zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNvdXJjZUJ1ZmZlckV4dGVuc2lvbnMsY3JlYXRlU291cmNlQnVmZmVyOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGM9US5kZWZlcigpLGQ9dGhpczt0cnl7Yy5yZXNvbHZlKGEuYWRkU291cmNlQnVmZmVyKGIpKX1jYXRjaChlKXtkLm1hbmlmZXN0RXh0LmdldElzVGV4dFRyYWNrKGIpP2MucmVzb2x2ZShkLnN5c3RlbS5nZXRPYmplY3QoXCJ0ZXh0VlRUU291cmNlQnVmZmVyXCIpKTpjLnJlamVjdChlLmRlc2NyaXB0aW9uKX1yZXR1cm4gYy5wcm9taXNlfSxyZW1vdmVTb3VyY2VCdWZmZXI6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYz1RLmRlZmVyKCk7dHJ5e2MucmVzb2x2ZShhLnJlbW92ZVNvdXJjZUJ1ZmZlcihiKSl9Y2F0Y2goZCl7Yy5yZWplY3QoZC5kZXNjcmlwdGlvbil9cmV0dXJuIGMucHJvbWlzZX0sZ2V0QnVmZmVyUmFuZ2U6ZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkLGUsZj1udWxsLGc9MCxoPTAsaT1udWxsLGo9bnVsbCxrPTAsbD1jfHwuMTU7dHJ5e2Y9YS5idWZmZXJlZH1jYXRjaChtKXtyZXR1cm4gUS53aGVuKG51bGwpfWlmKG51bGwhPT1mKXtmb3IoZT0wLGQ9Zi5sZW5ndGg7ZD5lO2UrPTEpaWYoZz1mLnN0YXJ0KGUpLGg9Zi5lbmQoZSksbnVsbD09PWkpe2lmKGs9TWF0aC5hYnMoZy1iKSxiPj1nJiZoPmIpe2k9ZyxqPWg7Y29udGludWV9aWYobD49ayl7aT1nLGo9aDtjb250aW51ZX19ZWxzZXtpZihrPWctaiwhKGw+PWspKWJyZWFrO2o9aH1pZihudWxsIT09aSlyZXR1cm4gUS53aGVuKHtzdGFydDppLGVuZDpqfSl9cmV0dXJuIFEud2hlbihudWxsKX0sZ2V0QWxsUmFuZ2VzOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e3JldHVybiBiPWEuYnVmZmVyZWQsUS53aGVuKGIpfWNhdGNoKGMpe3JldHVybiBRLndoZW4obnVsbCl9fSxnZXRCdWZmZXJMZW5ndGg6ZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkPXRoaXMsZT1RLmRlZmVyKCk7cmV0dXJuIGQuZ2V0QnVmZmVyUmFuZ2UoYSxiLGMpLnRoZW4oZnVuY3Rpb24oYSl7bnVsbD09PWE/ZS5yZXNvbHZlKDApOmUucmVzb2x2ZShhLmVuZC1iKX0pLGUucHJvbWlzZX0sd2FpdEZvclVwZGF0ZUVuZDpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYixjPVEuZGVmZXIoKSxkPTUwLGU9ZnVuY3Rpb24oKXthLnVwZGF0aW5nfHwoY2xlYXJJbnRlcnZhbChiKSxjLnJlc29sdmUoITApKX0sZj1mdW5jdGlvbigpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWVuZFwiLGYsITEpLGMucmVzb2x2ZSghMCl9O2lmKGEuaGFzT3duUHJvcGVydHkoXCJhZGRFdmVudExpc3RlbmVyXCIpKXRyeXthLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVlbmRcIixmLCExKX1jYXRjaChnKXtiPXNldEludGVydmFsKGUsZCl9ZWxzZSBiPXNldEludGVydmFsKGUsZCk7cmV0dXJuIGMucHJvbWlzZX0sYXBwZW5kOmZ1bmN0aW9uKGEsYil7dmFyIGM9US5kZWZlcigpO3RyeXtcImFwcGVuZFwiaW4gYT9hLmFwcGVuZChiKTpcImFwcGVuZEJ1ZmZlclwiaW4gYSYmYS5hcHBlbmRCdWZmZXIoYiksdGhpcy53YWl0Rm9yVXBkYXRlRW5kKGEpLnRoZW4oZnVuY3Rpb24oKXtjLnJlc29sdmUoKX0pfWNhdGNoKGQpe2MucmVqZWN0KHtlcnI6ZCxkYXRhOmJ9KX1yZXR1cm4gYy5wcm9taXNlfSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1RLmRlZmVyKCk7dHJ5e2I+PTAmJmQ+YiYmYz5iJiZcImVuZGVkXCIhPT1lLnJlYWR5U3RhdGUmJmEucmVtb3ZlKGIsYyksdGhpcy53YWl0Rm9yVXBkYXRlRW5kKGEpLnRoZW4oZnVuY3Rpb24oKXtmLnJlc29sdmUoKX0pfWNhdGNoKGcpe2YucmVqZWN0KGcpfXJldHVybiBmLnByb21pc2V9LGFib3J0OmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGM9US5kZWZlcigpO3RyeXtcIm9wZW5cIj09PWEucmVhZHlTdGF0ZSYmYi5hYm9ydCgpLGMucmVzb2x2ZSgpfWNhdGNoKGQpe2MucmVqZWN0KGQuZGVzY3JpcHRpb24pfXJldHVybiBjLnByb21pc2V9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscT1udWxsLHI9bnVsbCxzPW51bGwsdD1udWxsLHU9LTEsdj1udWxsLHc9LTEseD1udWxsLHk9LTEsej0hMCxBPSExLEI9ITEsQz1udWxsLEQ9W10sRT0tMSxGPW51bGwsRz1mdW5jdGlvbigpe3RoaXMuZGVidWcubG9nKFwiQXR0ZW1wdGluZyBwbGF5Li4uXCIpLEEmJih0aGlzLmRlYnVnLmxvZyhcIkRvIHBsYXkuXCIpLHRoaXMudmlkZW9Nb2RlbC5wbGF5KCkpfSxIPWZ1bmN0aW9uKCl7dGhpcy5kZWJ1Zy5sb2coXCJEbyBwYXVzZS5cIiksdGhpcy52aWRlb01vZGVsLnBhdXNlKCl9LEk9ZnVuY3Rpb24oYSl7dGhpcy5kZWJ1Zy5sb2coXCJBdHRlbXB0aW5nIHNlZWsuLi5cIiksQSYmKHRoaXMuZGVidWcubG9nKFwiRG8gc2VlazogXCIrYSksdGhpcy5zeXN0ZW0ubm90aWZ5KFwic2V0Q3VycmVudFRpbWVcIiksdGhpcy52aWRlb01vZGVsLnNldEN1cnJlbnRUaW1lKGEpLHQmJnQuc2VlayhhKSx2JiZ2LnNlZWsoYSkpfSxKPWZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcztpZihiPVwibXNuZWVka2V5XCIhPT1hLnR5cGU/YS50eXBlOnEsRC5wdXNoKHt0eXBlOmIsaW5pdERhdGE6YS5pbml0RGF0YX0pLHRoaXMuZGVidWcubG9nKFwiRFJNOiBLZXkgcmVxdWlyZWQgZm9yIC0gXCIrYikscyYmcSYmIUMpdHJ5e0M9Yy5wcm90ZWN0aW9uQ29udHJvbGxlci5zZWxlY3RLZXlTeXN0ZW0ocSxzKX1jYXRjaChkKXtILmNhbGwoYyksYy5kZWJ1Zy5sb2coZCksYy5lcnJIYW5kbGVyLm1lZGlhS2V5U3lzdGVtU2VsZWN0aW9uRXJyb3IoZCl9QyYmYy5wcm90ZWN0aW9uQ29udHJvbGxlci5lbnN1cmVLZXlTZXNzaW9uKEMsYixhLmluaXREYXRhKX0sSz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9bnVsbCxkPW51bGwsZT1udWxsLGY9bnVsbDt0aGlzLmRlYnVnLmxvZyhcIkRSTTogR290IGEga2V5IG1lc3NhZ2UuLi5cIiksYz1hLnRhcmdldCxkPW5ldyBVaW50MTZBcnJheShhLm1lc3NhZ2UuYnVmZmVyKSxlPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxkKSxmPWEuZGVzdGluYXRpb25VUkwsYi5wcm90ZWN0aW9uQ29udHJvbGxlci51cGRhdGVGcm9tTWVzc2FnZShDLGMsZSxmKS5mYWlsKGZ1bmN0aW9uKGEpe0guY2FsbChiKSxiLmRlYnVnLmxvZyhhKSxiLmVyckhhbmRsZXIubWVkaWFLZXlNZXNzYWdlRXJyb3IoYSl9KX0sTD1mdW5jdGlvbigpe3RoaXMuZGVidWcubG9nKFwiRFJNOiBLZXkgYWRkZWQuXCIpfSxNPWZ1bmN0aW9uKCl7dmFyIGEsYj1ldmVudC50YXJnZXQ7c3dpdGNoKGE9XCJEUk06IE1lZGlhS2V5RXJyb3IgLSBzZXNzaW9uSWQ6IFwiK2Iuc2Vzc2lvbklkK1wiIGVycm9yQ29kZTogXCIrYi5lcnJvci5jb2RlK1wiIHN5c3RlbUVycm9yQ29kZTogXCIrYi5lcnJvci5zeXN0ZW1Db2RlK1wiIFtcIixiLmVycm9yLmNvZGUpe2Nhc2UgMTphKz1cIk1FRElBX0tFWUVSUl9VTktOT1dOIC0gQW4gdW5zcGVjaWZpZWQgZXJyb3Igb2NjdXJyZWQuIFRoaXMgdmFsdWUgaXMgdXNlZCBmb3IgZXJyb3JzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55IG9mIHRoZSBvdGhlciBjb2Rlcy5cIjticmVhaztjYXNlIDI6YSs9XCJNRURJQV9LRVlFUlJfQ0xJRU5UIC0gVGhlIEtleSBTeXN0ZW0gY291bGQgbm90IGJlIGluc3RhbGxlZCBvciB1cGRhdGVkLlwiO2JyZWFrO2Nhc2UgMzphKz1cIk1FRElBX0tFWUVSUl9TRVJWSUNFIC0gVGhlIG1lc3NhZ2UgcGFzc2VkIGludG8gdXBkYXRlIGluZGljYXRlZCBhbiBlcnJvciBmcm9tIHRoZSBsaWNlbnNlIHNlcnZpY2UuXCI7YnJlYWs7Y2FzZSA0OmErPVwiTUVESUFfS0VZRVJSX09VVFBVVCAtIFRoZXJlIGlzIG5vIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlIHdpdGggdGhlIHJlcXVpcmVkIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIGNvbnRlbnQgcHJvdGVjdGlvbiBzeXN0ZW0uXCI7YnJlYWs7Y2FzZSA1OmErPVwiTUVESUFfS0VZRVJSX0hBUkRXQVJFQ0hBTkdFIC0gQSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNoYW5nZSBjYXVzZWQgYSBjb250ZW50IHByb3RlY3Rpb24gZXJyb3IuXCI7YnJlYWs7Y2FzZSA2OmErPVwiTUVESUFfS0VZRVJSX0RPTUFJTiAtIEFuIGVycm9yIG9jY3VycmVkIGluIGEgbXVsdGktZGV2aWNlIGRvbWFpbiBsaWNlbnNpbmcgY29uZmlndXJhdGlvbi4gVGhlIG1vc3QgY29tbW9uIGVycm9yIGlzIGEgZmFpbHVyZSB0byBqb2luIHRoZSBkb21haW4uXCJ9YSs9XCJdXCIsdGhpcy5kZWJ1Zy5sb2coYSksdGhpcy5lcnJIYW5kbGVyLm1lZGlhS2V5U2Vzc2lvbkVycm9yKGEpfSxOPWZ1bmN0aW9uKGEpe3ZhciBiPVEuZGVmZXIoKSxjPXRoaXMsZD1mdW5jdGlvbihlKXtjLmRlYnVnLmxvZyhcIk1lZGlhU291cmNlIGlzIG9wZW4hXCIpLGMuZGVidWcubG9nKGUpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNvdXJjZW9wZW5cIixkKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3ZWJraXRzb3VyY2VvcGVuXCIsZCksYi5yZXNvbHZlKGEpfTtyZXR1cm4gYy5kZWJ1Zy5sb2coXCJNZWRpYVNvdXJjZSBzaG91bGQgYmUgY2xvc2VkLiBUaGUgYWN0dWFsIHJlYWR5U3RhdGUgaXM6IFwiK2EucmVhZHlTdGF0ZSksYS5hZGRFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLGQsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmtpdHNvdXJjZW9wZW5cIixkLCExKSxjLm1lZGlhU291cmNlRXh0LmF0dGFjaE1lZGlhU291cmNlKGEsYy52aWRlb01vZGVsKSxjLmRlYnVnLmxvZyhcIk1lZGlhU291cmNlIGF0dGFjaGVkIHRvIHZpZGVvLiAgV2FpdGluZyBvbiBvcGVuLi4uXCIpLGIucHJvbWlzZX0sTz1mdW5jdGlvbigpe3ZhciBjPXRoaXM7dCYmdC5yZXNldChCKSx2JiZ2LnJlc2V0KEIpLGImJmMubWVkaWFTb3VyY2VFeHQuZGV0YWNoTWVkaWFTb3VyY2UoYy52aWRlb01vZGVsKSxBPSExLEM9bnVsbCxEPVtdLHM9bnVsbCx0PW51bGwsdj1udWxsLHg9bnVsbCxxPW51bGwscj1udWxsLGI9bnVsbCxhPW51bGx9LFA9ZnVuY3Rpb24oYixjLGQsZSl7aWYoYiYmYyYmZClpZihudWxsPT09dCYmbnVsbD09PXYmJm51bGw9PT14KXt2YXIgZj1cIk5vIHN0cmVhbXMgdG8gcGxheS5cIjt0aGlzLmVyckhhbmRsZXIubWFuaWZlc3RFcnJvcihmLFwibm9zdHJlYW1zXCIsYSksdGhpcy5kZWJ1Zy5sb2coZiksZS5yZWplY3QoKX1lbHNlIHRoaXMuZGVidWcubG9nKFwiTWVkaWFTb3VyY2UgaW5pdGlhbGl6ZWQhXCIpLGUucmVzb2x2ZSghMCl9LFI9ZnVuY3Rpb24oKXt0aGlzLmRlYnVnLmxvZyhcIkdldHRpbmcgTWVkaWFTb3VyY2UgcmVhZHkuLi5cIik7dmFyIGE9US5kZWZlcigpLGM9ITEsZD0hMSxlPSExLGY9dGhpcyxnPWYubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGg9Zi5tYW5pZmVzdEV4dC5nZXRJc0xpdmUoZyk7cmV0dXJuIGYuZGVidWcubG9nKFwiR2F0aGVyaW5nIGluZm9ybWF0aW9uIGZvciBidWZmZXJzLiAoMSlcIiksZi5tYW5pZmVzdEV4dC5nZXREdXJhdGlvbihnLGgpLnRoZW4oZnVuY3Rpb24oKXtmLm1hbmlmZXN0RXh0LmdldFZpZGVvRGF0YShnLEUpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIG51bGwhPT1oPyhmLmRlYnVnLmxvZyhcIkNyZWF0ZSB2aWRlbyBidWZmZXIuXCIpLGYubWFuaWZlc3RFeHQuZ2V0RGF0YUluZGV4KGgsZyxFKS50aGVuKGZ1bmN0aW9uKGEpe3U9YSxmLmRlYnVnLmxvZyhcIlNhdmUgdmlkZW8gdHJhY2s6IFwiK3UpfSksZi5tYW5pZmVzdEV4dC5nZXRDb2RlYyhoKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBmLmRlYnVnLmxvZyhcIlZpZGVvIGNvZGVjOiBcIithKSxxPWEsZi5tYW5pZmVzdEV4dC5nZXRDb250ZW50UHJvdGVjdGlvbkRhdGEoaCkudGhlbihmdW5jdGlvbihjKXtpZihmLmRlYnVnLmxvZyhcIlZpZGVvIGNvbnRlbnRQcm90ZWN0aW9uXCIpLGMmJiFmLmNhcGFiaWxpdGllcy5zdXBwb3J0c01lZGlhS2V5cygpKXJldHVybiBmLmVyckhhbmRsZXIuY2FwYWJpbGl0eUVycm9yKFwibWVkaWFrZXlzXCIpLFEud2hlbihudWxsKTtpZihzPWMsIWYuY2FwYWJpbGl0aWVzLnN1cHBvcnRzQ29kZWMoZi52aWRlb01vZGVsLmdldEVsZW1lbnQoKSxhKSl7dmFyIGQ9XCJWaWRlbyBDb2RlYyAoXCIrYStcIikgaXMgbm90IHN1cHBvcnRlZC5cIjtyZXR1cm4gZi5lcnJIYW5kbGVyLm1hbmlmZXN0RXJyb3IoZCxcImNvZGVjXCIsZyksZi5kZWJ1Zy5sb2coZCksUS53aGVuKG51bGwpfXJldHVybiBmLnNvdXJjZUJ1ZmZlckV4dC5jcmVhdGVTb3VyY2VCdWZmZXIoYixhKX0pfSkudGhlbihmdW5jdGlvbihnKXtudWxsPT09Zz9mLmRlYnVnLmxvZyhcIk5vIGJ1ZmZlciB3YXMgY3JlYXRlZCwgc2tpcHBpbmcgdmlkZW8gc3RyZWFtLlwiKToodD1mLnN5c3RlbS5nZXRPYmplY3QoXCJidWZmZXJDb250cm9sbGVyXCIpLHQuaW5pdGlhbGl6ZShcInZpZGVvXCIsRSxoLGcsZi52aWRlb01vZGVsLGYucmVxdWVzdFNjaGVkdWxlcixmLmZyYWdtZW50Q29udHJvbGxlcixiKSxmLmRlYnVnLmxvZyhcIlZpZGVvIGlzIHJlYWR5IVwiKSksYz0hMCxQLmNhbGwoZixjLGQsZSxhKX0sZnVuY3Rpb24oKXtmLmVyckhhbmRsZXIubWVkaWFTb3VyY2VFcnJvcihcIkVycm9yIGNyZWF0aW5nIHZpZGVvIHNvdXJjZSBidWZmZXIuXCIpLGM9ITAsUC5jYWxsKGYsYyxkLGUsYSl9KSk6KGYuZGVidWcubG9nKFwiTm8gdmlkZW8gZGF0YS5cIiksYz0hMCxQLmNhbGwoZixjLGQsZSxhKSksZi5tYW5pZmVzdEV4dC5nZXRBdWRpb0RhdGFzKGcsRSl9KS50aGVuKGZ1bmN0aW9uKGgpe3JldHVybiBudWxsIT09aCYmaC5sZW5ndGg+MD8oZi5kZWJ1Zy5sb2coXCJIYXZlIGF1ZGlvIHN0cmVhbXM6IFwiK2gubGVuZ3RoKSxmLm1hbmlmZXN0RXh0LmdldFByaW1hcnlBdWRpb0RhdGEoZyxFKS50aGVuKGZ1bmN0aW9uKGgpe2YubWFuaWZlc3RFeHQuZ2V0RGF0YUluZGV4KGgsZyxFKS50aGVuKGZ1bmN0aW9uKGEpe3c9YSxmLmRlYnVnLmxvZyhcIlNhdmUgYXVkaW8gdHJhY2s6IFwiK3cpfSksZi5tYW5pZmVzdEV4dC5nZXRDb2RlYyhoKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBmLmRlYnVnLmxvZyhcIkF1ZGlvIGNvZGVjOiBcIithKSxyPWEsZi5tYW5pZmVzdEV4dC5nZXRDb250ZW50UHJvdGVjdGlvbkRhdGEoaCkudGhlbihmdW5jdGlvbihjKXtpZihmLmRlYnVnLmxvZyhcIkF1ZGlvIGNvbnRlbnRQcm90ZWN0aW9uXCIpLGMmJiFmLmNhcGFiaWxpdGllcy5zdXBwb3J0c01lZGlhS2V5cygpKXJldHVybiBmLmVyckhhbmRsZXIuY2FwYWJpbGl0eUVycm9yKFwibWVkaWFrZXlzXCIpLFEud2hlbihudWxsKTtpZihzPWMsIWYuY2FwYWJpbGl0aWVzLnN1cHBvcnRzQ29kZWMoZi52aWRlb01vZGVsLmdldEVsZW1lbnQoKSxhKSl7dmFyIGQ9XCJBdWRpbyBDb2RlYyAoXCIrYStcIikgaXMgbm90IHN1cHBvcnRlZC5cIjtyZXR1cm4gZi5lcnJIYW5kbGVyLm1hbmlmZXN0RXJyb3IoZCxcImNvZGVjXCIsZyksZi5kZWJ1Zy5sb2coZCksUS53aGVuKG51bGwpfXJldHVybiBmLnNvdXJjZUJ1ZmZlckV4dC5jcmVhdGVTb3VyY2VCdWZmZXIoYixhKX0pfSkudGhlbihmdW5jdGlvbihnKXtudWxsPT09Zz9mLmRlYnVnLmxvZyhcIk5vIGJ1ZmZlciB3YXMgY3JlYXRlZCwgc2tpcHBpbmcgYXVkaW8gc3RyZWFtLlwiKToodj1mLnN5c3RlbS5nZXRPYmplY3QoXCJidWZmZXJDb250cm9sbGVyXCIpLHYuaW5pdGlhbGl6ZShcImF1ZGlvXCIsRSxoLGcsZi52aWRlb01vZGVsLGYucmVxdWVzdFNjaGVkdWxlcixmLmZyYWdtZW50Q29udHJvbGxlcixiKSxmLmRlYnVnLmxvZyhcIkF1ZGlvIGlzIHJlYWR5IVwiKSksZD0hMCxQLmNhbGwoZixjLGQsZSxhKX0sZnVuY3Rpb24oKXtmLmVyckhhbmRsZXIubWVkaWFTb3VyY2VFcnJvcihcIkVycm9yIGNyZWF0aW5nIGF1ZGlvIHNvdXJjZSBidWZmZXIuXCIpLGQ9ITAsUC5jYWxsKGYsYyxkLGUsYSl9KX0pKTooZi5kZWJ1Zy5sb2coXCJObyBhdWRpbyBzdHJlYW1zLlwiKSxkPSEwLFAuY2FsbChmLGMsZCxlLGEpKSxmLm1hbmlmZXN0RXh0LmdldFRleHREYXRhKGcsRSl9KS50aGVuKGZ1bmN0aW9uKGgpe3ZhciBpO251bGwhPT1oPyhmLm1hbmlmZXN0RXh0LmdldERhdGFJbmRleChoLGcsRSkudGhlbihmdW5jdGlvbihhKXt5PWEsZi5kZWJ1Zy5sb2coXCJTYXZlIHRleHQgdHJhY2s6IFwiK3kpfSksZi5tYW5pZmVzdEV4dC5nZXRNaW1lVHlwZShoKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBpPWEsZi5zb3VyY2VCdWZmZXJFeHQuY3JlYXRlU291cmNlQnVmZmVyKGIsaSl9KS50aGVuKGZ1bmN0aW9uKGIpe251bGw9PT1iP2YuZGVidWcubG9nKFwiU291cmNlIGJ1ZmZlciB3YXMgbm90IGNyZWF0ZWQgZm9yIHRleHQgdHJhY2tcIik6KHg9Zi5zeXN0ZW0uZ2V0T2JqZWN0KFwidGV4dENvbnRyb2xsZXJcIikseC5pbml0aWFsaXplKEUsaCxiLGYudmlkZW9Nb2RlbCksYi5oYXNPd25Qcm9wZXJ0eShcImluaXRpYWxpemVcIikmJmIuaW5pdGlhbGl6ZShpLHgpLGYuZGVidWcubG9nKFwiVGV4dCBpcyByZWFkeSFcIiksZT0hMCxQLmNhbGwoZixjLGQsZSxhKSl9LGZ1bmN0aW9uKGIpe2YuZGVidWcubG9nKFwiRXJyb3IgY3JlYXRpbmcgdGV4dCBzb3VyY2UgYnVmZmVyOlwiKSxmLmRlYnVnLmxvZyhiKSxmLmVyckhhbmRsZXIubWVkaWFTb3VyY2VFcnJvcihcIkVycm9yIGNyZWF0aW5nIHRleHQgc291cmNlIGJ1ZmZlci5cIiksZT0hMCxQLmNhbGwoZixjLGQsZSxhKX0pKTooZi5kZWJ1Zy5sb2coXCJObyB0ZXh0IHRyYWNrcy5cIiksZT0hMCxQLmNhbGwoZixjLGQsZSxhKSl9KX0pLGEucHJvbWlzZX0sUz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1RLmRlZmVyKCksZD1hLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxlPWEubWFuaWZlc3RFeHQuZ2V0SXNMaXZlKGQpO3JldHVybiBhLmRlYnVnLmxvZyhcIkdldHRpbmcgcmVhZHkgZm9yIHBsYXliYWNrLi4uXCIpLGEubWFuaWZlc3RFeHQuZ2V0RHVyYXRpb25Gb3JQZXJpb2QoRSxhLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxlKS50aGVuKGZ1bmN0aW9uKGEpe2w9YX0pLGEubWFuaWZlc3RFeHQuZ2V0RHVyYXRpb24oYS5tYW5pZmVzdE1vZGVsLmdldFZhbHVlKCksZSkudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gYS5kZWJ1Zy5sb2coXCJTZXR0aW5nIGR1cmF0aW9uOiBcIitjKSxhLm1lZGlhU291cmNlRXh0LnNldER1cmF0aW9uKGIsYyl9KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGEuZGVidWcubG9nKFwiRHVyYXRpb24gc3VjY2Vzc2Z1bGx5IHNldC5cIiksYS5tYW5pZmVzdEV4dC5nZXRQZXJpb2RTdGFydChhLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxFKX0pLnRoZW4oZnVuY3Rpb24oYSl7Rj1hLEE9ITAsYy5yZXNvbHZlKCEwKX0pLGMucHJvbWlzZX0sVD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5kZWJ1Zy5sb2coXCJHb3QgbG9hZG1ldGFkYXRhIGV2ZW50LlwiKSxjLnJlc29sdmUobnVsbCl9LFU9ZnVuY3Rpb24oKXt0aGlzLmRlYnVnLmxvZyhcIkdvdCBwbGF5IGV2ZW50LlwiKSxBJiYobnVsbCE9PUY/KHRoaXMuZGVidWcubG9nKFwiU3RhcnRpbmcgc2VnbWVudCBsb2FkaW5nIGF0IG9mZnNldDogXCIrRiksdCYmdC5zZWVrKEYpLHYmJnYuc2VlayhGKSx4JiZ4LnNlZWsoRikpOih0JiZ0LnN0YXJ0KCksdiYmdi5zdGFydCgpLHgmJnguc3RhcnQoKSkpfSxWPWZ1bmN0aW9uKCl7dGhpcy5kZWJ1Zy5sb2coXCJHb3QgcGF1c2UgZXZlbnQuXCIpLHRoaXMuc2NoZWR1bGVXaGlsZVBhdXNlZHx8YWIuY2FsbCh0aGlzKX0sVz1mdW5jdGlvbihhKXt2YXIgYj1hLnNyY0VsZW1lbnQuZXJyb3IsYz1iLmNvZGUsZD1cIlwiO2lmKC0xIT09Yyl7c3dpdGNoKGMpe2Nhc2UgMTpkPVwiTUVESUFfRVJSX0FCT1JURURcIjticmVhaztjYXNlIDI6ZD1cIk1FRElBX0VSUl9ORVRXT1JLXCI7YnJlYWs7Y2FzZSAzOmQ9XCJNRURJQV9FUlJfREVDT0RFXCI7YnJlYWs7Y2FzZSA0OmQ9XCJNRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURURcIjticmVhaztjYXNlIDU6ZD1cIk1FRElBX0VSUl9FTkNSWVBURURcIn1CPSEwLHRoaXMuZGVidWcubG9nKFwiVmlkZW8gRWxlbWVudCBFcnJvcjogXCIrZCksdGhpcy5kZWJ1Zy5sb2coYiksdGhpcy5lcnJIYW5kbGVyLm1lZGlhU291cmNlRXJyb3IoZCksdGhpcy5yZXNldCgpfX0sWD1mdW5jdGlvbigpe3RoaXMuZGVidWcubG9nKFwiR290IHNlZWtpbmcgZXZlbnQuXCIpO3ZhciBhPXRoaXMudmlkZW9Nb2RlbC5nZXRDdXJyZW50VGltZSgpO3QmJnQuc2VlayhhKSx2JiZ2LnNlZWsoYSl9LFk9ZnVuY3Rpb24oKXt0aGlzLmRlYnVnLmxvZyhcIlNlZWsgY29tcGxldGUuXCIpLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJzZWVraW5nXCIsaCksdGhpcy52aWRlb01vZGVsLnVubGlzdGVuKFwic2Vla2VkXCIsaSl9LFo9ZnVuY3Rpb24oKXtfLmNhbGwodGhpcyl9LCQ9ZnVuY3Rpb24oKXtfLmNhbGwodGhpcyl9LF89ZnVuY3Rpb24oKXt0JiZ0LnVwZGF0ZUJ1ZmZlclN0YXRlKCksdiYmdi51cGRhdGVCdWZmZXJTdGF0ZSgpfSxhYj1mdW5jdGlvbigpe3QmJnQuc3RvcCgpLHYmJnYuc3RvcCgpfSxiYj1mdW5jdGlvbihkKXt2YXIgZT10aGlzO3JldHVybiBlLmRlYnVnLmxvZyhcIlN0cmVhbSBzdGFydCBsb2FkaW5nLlwiKSxhPWQsZS5tZWRpYVNvdXJjZUV4dC5jcmVhdGVNZWRpYVNvdXJjZSgpLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIGUuZGVidWcubG9nKFwiTWVkaWFTb3VyY2UgY3JlYXRlZC5cIiksTi5jYWxsKGUsYSl9KS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBiPWEsZS5kZWJ1Zy5sb2coXCJNZWRpYVNvdXJjZSBzZXQgdXAuXCIpLFIuY2FsbChlKX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWJ1Zy5sb2coXCJTdGFydCBpbml0aWFsaXppbmcgcGxheWJhY2suXCIpLFMuY2FsbChlKX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gej8oZS5kZWJ1Zy5sb2coXCJQbGF5YmFjayBpbml0aWFsaXplZCFcIiksYy5wcm9taXNlKTp2b2lkIDB9KS50aGVuKGZ1bmN0aW9uKCl7ZS5kZWJ1Zy5sb2coXCJlbGVtZW50IGxvYWRlZCFcIiksMD09PUUmJkcuY2FsbChlKX0pfSxjYj1mdW5jdGlvbigpe3RoaXMuZGVidWcubG9nKFwiQ3VycmVudCB0aW1lIGhhcyBjaGFuZ2VkLCBibG9jayBwcm9ncmFtbWF0aWMgc2Vlay5cIiksdGhpcy52aWRlb01vZGVsLnVubGlzdGVuKFwic2Vla2luZ1wiLGgpLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJzZWVrZWRcIixpKX0sZGI9ZnVuY3Rpb24oKXt0JiYhdC5pc0J1ZmZlcmluZ0NvbXBsZXRlZCgpfHx2JiYhdi5pc0J1ZmZlcmluZ0NvbXBsZXRlZCgpfHxiJiZ0aGlzLm1lZGlhU291cmNlRXh0LnNpZ25hbEVuZE9mU3RyZWFtKGIpfSxlYj1mdW5jdGlvbigpe2FiLmNhbGwodGhpcyl9LGZiPWZ1bmN0aW9uKCl7dmFyIGEsYixjPXRoaXMsZD1jLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKTtjLmRlYnVnLmxvZyhcIk1hbmlmZXN0IHVwZGF0ZWQuLi4gc2V0IG5ldyBkYXRhIG9uIGJ1ZmZlcnMuXCIpLHQmJihhPXQuZ2V0RGF0YSgpLGEmJmEuaGFzT3duUHJvcGVydHkoXCJpZFwiKT9jLm1hbmlmZXN0RXh0LmdldERhdGFGb3JJZChhLmlkLGQsRSkudGhlbihmdW5jdGlvbihhKXt0LnNldERhdGEoYSl9KTpjLm1hbmlmZXN0RXh0LmdldERhdGFGb3JJbmRleCh1LGQsRSkudGhlbihmdW5jdGlvbihhKXt0LnNldERhdGEoYSl9KSksdiYmKGI9di5nZXREYXRhKCksYiYmYi5oYXNPd25Qcm9wZXJ0eShcImlkXCIpP2MubWFuaWZlc3RFeHQuZ2V0RGF0YUZvcklkKGIuaWQsZCxFKS50aGVuKGZ1bmN0aW9uKGEpe3Yuc2V0RGF0YShhKX0pOmMubWFuaWZlc3RFeHQuZ2V0RGF0YUZvckluZGV4KHcsZCxFKS50aGVuKGZ1bmN0aW9uKGEpe3Yuc2V0RGF0YShhKX0pKX07cmV0dXJue3N5c3RlbTp2b2lkIDAsdmlkZW9Nb2RlbDp2b2lkIDAsbWFuaWZlc3RMb2FkZXI6dm9pZCAwLG1hbmlmZXN0TW9kZWw6dm9pZCAwLG1lZGlhU291cmNlRXh0OnZvaWQgMCxzb3VyY2VCdWZmZXJFeHQ6dm9pZCAwLGJ1ZmZlckV4dDp2b2lkIDAsbWFuaWZlc3RFeHQ6dm9pZCAwLGZyYWdtZW50Q29udHJvbGxlcjp2b2lkIDAsYWJyQ29udHJvbGxlcjp2b2lkIDAsZnJhZ21lbnRFeHQ6dm9pZCAwLHByb3RlY3Rpb25Nb2RlbDp2b2lkIDAscHJvdGVjdGlvbkNvbnRyb2xsZXI6dm9pZCAwLHByb3RlY3Rpb25FeHQ6dm9pZCAwLGNhcGFiaWxpdGllczp2b2lkIDAsZGVidWc6dm9pZCAwLG1ldHJpY3NFeHQ6dm9pZCAwLGVyckhhbmRsZXI6dm9pZCAwLHJlcXVlc3RTY2hlZHVsZXI6dm9pZCAwLHNjaGVkdWxlV2hpbGVQYXVzZWQ6dm9pZCAwLHNldHVwOmZ1bmN0aW9uKCl7dGhpcy5zeXN0ZW0ubWFwSGFuZGxlcihcIm1hbmlmZXN0VXBkYXRlZFwiLHZvaWQgMCxmYi5iaW5kKHRoaXMpKSx0aGlzLnN5c3RlbS5tYXBIYW5kbGVyKFwic2V0Q3VycmVudFRpbWVcIix2b2lkIDAsY2IuYmluZCh0aGlzKSksdGhpcy5zeXN0ZW0ubWFwSGFuZGxlcihcImJ1ZmZlcmluZ0NvbXBsZXRlZFwiLHZvaWQgMCxkYi5iaW5kKHRoaXMpKSx0aGlzLnN5c3RlbS5tYXBIYW5kbGVyKFwic2VnbWVudExvYWRpbmdGYWlsZWRcIix2b2lkIDAsZWIuYmluZCh0aGlzKSksYz1RLmRlZmVyKCksZT1VLmJpbmQodGhpcyksZj1WLmJpbmQodGhpcyksZz1XLmJpbmQodGhpcyksaD1YLmJpbmQodGhpcyksaT1ZLmJpbmQodGhpcyksaz1aLmJpbmQodGhpcyksaj0kLmJpbmQodGhpcyksZD1ULmJpbmQodGhpcyl9LGxvYWQ6ZnVuY3Rpb24oYSxiKXtFPWIsYmIuY2FsbCh0aGlzLGEpfSxzZXRWaWRlb01vZGVsOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9Nb2RlbD1hLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJwbGF5XCIsZSksdGhpcy52aWRlb01vZGVsLmxpc3RlbihcInBhdXNlXCIsZiksdGhpcy52aWRlb01vZGVsLmxpc3RlbihcImVycm9yXCIsZyksdGhpcy52aWRlb01vZGVsLmxpc3RlbihcInNlZWtpbmdcIixoKSx0aGlzLnZpZGVvTW9kZWwubGlzdGVuKFwidGltZXVwZGF0ZVwiLGopLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJwcm9ncmVzc1wiLGspLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJsb2FkZWRtZXRhZGF0YVwiLGQpfSxpbml0UHJvdGVjdGlvbjpmdW5jdGlvbigpe209Si5iaW5kKHRoaXMpLG49Sy5iaW5kKHRoaXMpLG89TC5iaW5kKHRoaXMpLHA9TS5iaW5kKHRoaXMpLHRoaXMucHJvdGVjdGlvbk1vZGVsPXRoaXMuc3lzdGVtLmdldE9iamVjdChcInByb3RlY3Rpb25Nb2RlbFwiKSx0aGlzLnByb3RlY3Rpb25Nb2RlbC5pbml0KHRoaXMuZ2V0VmlkZW9Nb2RlbCgpKSx0aGlzLnByb3RlY3Rpb25Db250cm9sbGVyPXRoaXMuc3lzdGVtLmdldE9iamVjdChcInByb3RlY3Rpb25Db250cm9sbGVyXCIpLHRoaXMucHJvdGVjdGlvbkNvbnRyb2xsZXIuaW5pdCh0aGlzLnZpZGVvTW9kZWwsdGhpcy5wcm90ZWN0aW9uTW9kZWwpLHRoaXMucHJvdGVjdGlvbk1vZGVsLmxpc3RlblRvTmVlZEtleShtKSx0aGlzLnByb3RlY3Rpb25Nb2RlbC5saXN0ZW5Ub0tleU1lc3NhZ2UobiksdGhpcy5wcm90ZWN0aW9uTW9kZWwubGlzdGVuVG9LZXlFcnJvcihwKSx0aGlzLnByb3RlY3Rpb25Nb2RlbC5saXN0ZW5Ub0tleUFkZGVkKG8pfSxnZXRWaWRlb01vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9Nb2RlbH0sZ2V0TWFuaWZlc3RFeHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBhLm1hbmlmZXN0RXh0fSxzZXRBdXRvUGxheTpmdW5jdGlvbihhKXt6PWF9LGdldEF1dG9QbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHp9LHJlc2V0OmZ1bmN0aW9uKCl7SC5jYWxsKHRoaXMpLHRoaXMudmlkZW9Nb2RlbC51bmxpc3RlbihcInBsYXlcIixlKSx0aGlzLnZpZGVvTW9kZWwudW5saXN0ZW4oXCJwYXVzZVwiLGYpLHRoaXMudmlkZW9Nb2RlbC51bmxpc3RlbihcImVycm9yXCIsZyksdGhpcy52aWRlb01vZGVsLnVubGlzdGVuKFwic2Vla2luZ1wiLGgpLHRoaXMudmlkZW9Nb2RlbC51bmxpc3RlbihcInRpbWV1cGRhdGVcIixqKSx0aGlzLnZpZGVvTW9kZWwudW5saXN0ZW4oXCJwcm9ncmVzc1wiLGspLHRoaXMudmlkZW9Nb2RlbC51bmxpc3RlbihcImxvYWRlZG1ldGFkYXRhXCIsZCksTy5jYWxsKHRoaXMpLHRoaXMucHJvdGVjdGlvbkNvbnRyb2xsZXImJnRoaXMucHJvdGVjdGlvbkNvbnRyb2xsZXIudGVhcmRvd25LZXlTeXN0ZW0oQyksdGhpcy5wcm90ZWN0aW9uQ29udHJvbGxlcj12b2lkIDAsdGhpcy5wcm90ZWN0aW9uTW9kZWw9dm9pZCAwLHRoaXMuZnJhZ21lbnRDb250cm9sbGVyPXZvaWQgMCx0aGlzLnJlcXVlc3RTY2hlZHVsZXI9dm9pZCAwLGM9US5kZWZlcigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRQZXJpb2RJbmRleDpmdW5jdGlvbihhKXtFPWF9LGdldFBlcmlvZEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIEV9LGdldFN0YXJ0VGltZTpmdW5jdGlvbigpe3JldHVybiBGfSxwbGF5Okcsc2VlazpJLHBhdXNlOkh9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlN0cmVhbX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlN0cmVhbUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYSxiPVtdLGM9NCxkPTMsZT0hMCxmPW51bGwsZz1mdW5jdGlvbigpe2EucGxheSgpfSxoPWZ1bmN0aW9uKCl7YS5wYXVzZSgpfSxpPWZ1bmN0aW9uKGIpe2Euc2VlayhiKX0saj1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0RWxlbWVudCgpLGQ9Yi5nZXRFbGVtZW50KCk7cmV0dXJuIGQucGFyZW50Tm9kZXx8Yy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGMpLGMuc3R5bGUud2lkdGg9XCIwcHhcIixkLnN0eWxlLndpZHRoPVwiMTAwJVwiLG0oYyxkKSxsKGEpLGsoYiksUS53aGVuKCEwKX0saz1mdW5jdGlvbihhKXthLmxpc3RlbihcInNlZWtpbmdcIixwKSxhLmxpc3RlbihcInByb2dyZXNzXCIsbikscigpJiZhLmxpc3RlbihcInRpbWV1cGRhdGVcIixvKX0sbD1mdW5jdGlvbihhKXthLnVubGlzdGVuKFwic2Vla2luZ1wiLHApLGEudW5saXN0ZW4oXCJwcm9ncmVzc1wiLG4pLGEudW5saXN0ZW4oXCJ0aW1ldXBkYXRlXCIsbyl9LG09ZnVuY3Rpb24oYSxiKXtbXCJjb250cm9sc1wiLFwibG9vcFwiLFwibXV0ZWRcIixcInBsYXliYWNrUmF0ZVwiLFwidm9sdW1lXCJdLmZvckVhY2goZnVuY3Rpb24oYyl7YltjXT1hW2NdfSl9LG49ZnVuY3Rpb24oKXt2YXIgYj1hLmdldFZpZGVvTW9kZWwoKS5nZXRFbGVtZW50KCkuYnVmZmVyZWQ7aWYoYi5sZW5ndGgpe3ZhciBkPWIubGVuZ3RoLTEsZT1iLmVuZChkKSxmPWEuZ2V0U3RhcnRUaW1lKCkrYS5nZXREdXJhdGlvbigpLWU7Yz5mJiYoYS5nZXRWaWRlb01vZGVsKCkudW5saXN0ZW4oXCJwcm9ncmVzc1wiLG4pLHEoKSl9fSxvPWZ1bmN0aW9uKCl7aWYoIWEuZ2V0VmlkZW9Nb2RlbCgpLmdldEVsZW1lbnQoKS5zZWVraW5nKXt2YXIgYj1hLmdldFN0YXJ0VGltZSgpK2EuZ2V0RHVyYXRpb24oKSxjPWEuZ2V0VmlkZW9Nb2RlbCgpLmdldEN1cnJlbnRUaW1lKCk7ZD5iLWMmJnYoYSxyKCkpfX0scD1mdW5jdGlvbigpe3ZhciBiPWEuZ2V0VmlkZW9Nb2RlbCgpLmdldEN1cnJlbnRUaW1lKCksYz1zKGIpO2MmJmMhPT1hJiZ2KGEsYyxiKX0scT1mdW5jdGlvbigpe3ZhciBhPXIoKTthJiZhLnNlZWsoYS5nZXRTdGFydFRpbWUoKSl9LHI9ZnVuY3Rpb24oKXt2YXIgYz1hLmdldFBlcmlvZEluZGV4KCkrMTtyZXR1cm4gYzxiLmxlbmd0aD9iW2NdOm51bGx9LHM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZD1udWxsLGU9MCxmPWIubGVuZ3RoO2Y+ZTtlKyspaWYoZD1iW2VdLGMrPWQuZ2V0RHVyYXRpb24oKSxjPmEpcmV0dXJuIGR9LHQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnN5c3RlbS5nZXRPYmplY3QoXCJ2aWRlb01vZGVsXCIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO3JldHVybiBhLnNldEVsZW1lbnQoYiksYX0sdT1mdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sdj1mdW5jdGlvbihiLGMsZCl7YiYmYyYmYiE9PWMmJlEud2hlbihmfHwhMCkudGhlbihmdW5jdGlvbigpe2IucGF1c2UoKSxhPWMsZj1qKGIuZ2V0VmlkZW9Nb2RlbCgpLGMuZ2V0VmlkZW9Nb2RlbCgpKSxkP2koYi5nZXRWaWRlb01vZGVsKCkuZ2V0Q3VycmVudFRpbWUoKSk6aShjLmdldFN0YXJ0VGltZSgpKSxnKCl9KX07cmV0dXJue3N5c3RlbTp2b2lkIDAsdmlkZW9Nb2RlbDp2b2lkIDAsbWFuaWZlc3RMb2FkZXI6dm9pZCAwLG1hbmlmZXN0VXBkYXRlcjp2b2lkIDAsbWFuaWZlc3RNb2RlbDp2b2lkIDAsbWVkaWFTb3VyY2VFeHQ6dm9pZCAwLHNvdXJjZUJ1ZmZlckV4dDp2b2lkIDAsYnVmZmVyRXh0OnZvaWQgMCxtYW5pZmVzdEV4dDp2b2lkIDAsZnJhZ21lbnRDb250cm9sbGVyOnZvaWQgMCxhYnJDb250cm9sbGVyOnZvaWQgMCxmcmFnbWVudEV4dDp2b2lkIDAsY2FwYWJpbGl0aWVzOnZvaWQgMCxkZWJ1Zzp2b2lkIDAsbWV0cmljc0V4dDp2b2lkIDAsZXJySGFuZGxlcjp2b2lkIDAsZ2V0TWFuaWZlc3RFeHQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRNYW5pZmVzdEV4dCgpfSxzZXRBdXRvUGxheTpmdW5jdGlvbihhKXtlPWF9LGdldEF1dG9QbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGdldFZpZGVvTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb01vZGVsfSxzZXRWaWRlb01vZGVsOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9Nb2RlbD1hfSxsb2FkOmZ1bmN0aW9uKGMpe3ZhciBkLGY9dGhpcztmLm1hbmlmZXN0TG9hZGVyLmxvYWQoYykudGhlbihmdW5jdGlvbihjKXtmLm1hbmlmZXN0TW9kZWwuc2V0VmFsdWUoYyksZi5kZWJ1Zy5sb2coXCJNYW5pZmVzdCBoYXMgbG9hZGVkLlwiKSxmLmRlYnVnLmxvZyhmLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSksZi5tYW5pZmVzdFVwZGF0ZXIuaW5pdCgpLGYubWFuaWZlc3RFeHQuZ2V0UGVyaW9kQ291bnQoYykudGhlbihmdW5jdGlvbihnKXtmb3IodmFyIGg9MDtnPmg7aCsrKWQ9Zi5zeXN0ZW0uZ2V0T2JqZWN0KFwic3RyZWFtXCIpLGQuc2V0VmlkZW9Nb2RlbCgwPT09aD9mLnZpZGVvTW9kZWw6dC5jYWxsKGYpKSxkLmluaXRQcm90ZWN0aW9uKCksZC5zZXRBdXRvUGxheShlKSxkLmxvYWQoYyxoKSxiLnB1c2goZCk7YT1iWzBdLGsoYS5nZXRWaWRlb01vZGVsKCkpfSl9LGZ1bmN0aW9uKCl7Zi5yZXNldCgpfSl9LHJlc2V0OmZ1bmN0aW9uKCl7YSYmbChhLmdldFZpZGVvTW9kZWwoKSk7Zm9yKHZhciBjPTAsZD1iLmxlbmd0aDtkPmM7YysrKXt2YXIgZT1iW2NdO2UucmVzZXQoKSxlIT09YSYmdShlLmdldFZpZGVvTW9kZWwoKS5nZXRFbGVtZW50KCkpfWI9W10sdGhpcy5tYW5pZmVzdFVwZGF0ZXIuc3RvcCgpLHRoaXMubWFuaWZlc3RNb2RlbC5zZXRWYWx1ZShudWxsKSxmPW51bGwsYT1udWxsfSxwbGF5Omcsc2VlazppLHBhdXNlOmh9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5TdHJlYW1Db250cm9sbGVyfSxNZWRpYVBsYXllci5tb2RlbHMuVmlkZW9Nb2RlbD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhLGI9W10sYz1mdW5jdGlvbigpe3JldHVybiBiLmxlbmd0aD4wfSxkPWZ1bmN0aW9uKGMpe251bGwhPT1jJiZiW2NdIT09ITAmJihiLnB1c2goYyksYltjXT0hMCxhLnBsYXliYWNrUmF0ZT0wKX0sZT1mdW5jdGlvbihkKXtpZihudWxsIT09ZCl7YltkXT0hMTt2YXIgZT1iLmluZGV4T2YoZCk7LTEhPT1lJiZiLnNwbGljZShlLDEpLGMoKT09PSExJiYoYS5wbGF5YmFja1JhdGU9MSl9fSxmPWZ1bmN0aW9uKGEsYil7Yj9kKGEpOmUoYSl9O3JldHVybntzeXN0ZW06dm9pZCAwLHNldHVwOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7YS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7YS5wYXVzZSgpfSxpc1BhdXNlZDpmdW5jdGlvbigpe3JldHVybiBhLnBhdXNlZH0sZ2V0UGxheWJhY2tSYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGEucGxheWJhY2tSYXRlfSxzZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oYil7YS5wbGF5YmFja1JhdGU9Yn0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gYS5jdXJyZW50VGltZX0sc2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oYil7YS5jdXJyZW50VGltZSE9YiYmKGEuY3VycmVudFRpbWU9Yil9LGxpc3RlbjpmdW5jdGlvbihiLGMpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx1bmxpc3RlbjpmdW5jdGlvbihiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldEVsZW1lbnQ6ZnVuY3Rpb24oYil7YT1ifSxzZXRTb3VyY2U6ZnVuY3Rpb24oYil7YS5zcmM9Yn0sc3RhbGxTdHJlYW06Zixpc1N0YWxsZWQ6Y319LE1lZGlhUGxheWVyLm1vZGVscy5WaWRlb01vZGVsLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIubW9kZWxzLlZpZGVvTW9kZWx9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5WaWRlb01vZGVsRXh0ZW5zaW9ucz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3JldHVybntnZXREcm9wcGVkRnJhbWVzOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwhPT1hLndlYmtpdERyb3BwZWRGcmFtZUNvdW50LGM9LTE7cmV0dXJuIGImJihjPWEud2Via2l0RHJvcHBlZEZyYW1lQ291bnQpLGN9fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlZpZGVvTW9kZWxFeHRlbnNpb25zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlZpZGVvTW9kZWxFeHRlbnNpb25zfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dENvbnRyb2xsZXI9ZnVuY3Rpb24oKXt2YXIgYSxiLGM9XCJMT0FESU5HXCIsZD1cIlJFQURZXCIsZT0hMSxmPS0xLGc9ZCxoPWZ1bmN0aW9uKGEpe3RoaXMuZGVidWcubG9nKFwiVGV4dENvbnRyb2xsZXIgc2V0U3RhdGUgdG86XCIrYSksZz1hfSxpPWZ1bmN0aW9uKCl7aWYoZSYmZz09PWQpe3ZhciBiPXRoaXM7aC5jYWxsKGIsYyksYi5pbmRleEhhbmRsZXIuZ2V0SW5pdFJlcXVlc3QoMCxhKS50aGVuKGZ1bmN0aW9uKGEpe2IuZGVidWcubG9nKFwiTG9hZGluZyB0ZXh0IHRyYWNrIGluaXRpYWxpemF0aW9uOiBcIithLnVybCksYi5kZWJ1Zy5sb2coYSksYi5mcmFnbWVudExvYWRlci5sb2FkKGEpLnRoZW4oay5iaW5kKGIsYSksbC5iaW5kKGIsYSkpLGguY2FsbChiLGMpfSl9fSxqPWZ1bmN0aW9uKCl7aS5jYWxsKHRoaXMpfSxrPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcztkLmRlYnVnLmxvZyhcIiBUZXh0IHRyYWNrIEJ5dGVzIGZpbmlzaGVkIGxvYWRpbmc6IFwiK2EudXJsKSxkLmZyYWdtZW50Q29udHJvbGxlci5wcm9jZXNzKGMuZGF0YSkudGhlbihmdW5jdGlvbihhKXtudWxsIT09YSYmKGQuZGVidWcubG9nKFwiUHVzaCB0ZXh0IHRyYWNrIGJ5dGVzOiBcIithLmJ5dGVMZW5ndGgpLGQuc291cmNlQnVmZmVyRXh0LmFwcGVuZChiLGEsZC52aWRlb01vZGVsKSl9KX0sbD1mdW5jdGlvbigpe307cmV0dXJue3ZpZGVvTW9kZWw6dm9pZCAwLGZyYWdtZW50TG9hZGVyOnZvaWQgMCxmcmFnbWVudENvbnRyb2xsZXI6dm9pZCAwLGluZGV4SGFuZGxlcjp2b2lkIDAsc291cmNlQnVmZmVyRXh0OnZvaWQgMCxkZWJ1Zzp2b2lkIDAsaW5pdGlhbGl6ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZj10aGlzO2Yuc2V0VmlkZW9Nb2RlbChkKSxmLnNldFBlcmlvZEluZGV4KGEpLGYuc2V0RGF0YShiKSxmLnNldEJ1ZmZlcihjKSxlPSEwfSxnZXRQZXJpb2RJbmRleDpmdW5jdGlvbigpe3JldHVybiBmfSxzZXRQZXJpb2RJbmRleDpmdW5jdGlvbihhKXtmPWF9LGdldFZpZGVvTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb01vZGVsfSxzZXRWaWRlb01vZGVsOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9Nb2RlbD1hfSxnZXREYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldERhdGE6ZnVuY3Rpb24oYil7YT1ifSxnZXRCdWZmZXI6ZnVuY3Rpb24oKXtyZXR1cm4gYn0sc2V0QnVmZmVyOmZ1bmN0aW9uKGEpe2I9YX0scmVzZXQ6ZnVuY3Rpb24oYSxjKXthfHwodGhpcy5zb3VyY2VCdWZmZXJFeHQuYWJvcnQoYyxiKSx0aGlzLnNvdXJjZUJ1ZmZlckV4dC5yZW1vdmVTb3VyY2VCdWZmZXIoYyxiKSl9LHN0YXJ0Omp9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dENvbnRyb2xsZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dENvbnRyb2xsZXJ9LE1lZGlhUGxheWVyLnV0aWxzLlRleHRUcmFja0V4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm57YWRkVGV4dFRyYWNrOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS5hZGRUZXh0VHJhY2soXCJjYXB0aW9uc1wiLGMsZCk7Zi5kZWZhdWx0PWUsZi5tb2RlPVwic2hvd2luZ1wiO2Zvcih2YXIgZyBpbiBiKXt2YXIgaD1iW2ddO2YuYWRkQ3VlKG5ldyBUZXh0VHJhY2tDdWUoaC5zdGFydCxoLmVuZCxoLmRhdGEpKX1yZXR1cm4gUS53aGVuKGYpfSxkZWxldGVDdWVzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hLnRleHRUcmFja3NbMF0sYz1iLmN1ZXMsZD1jLmxlbmd0aDtkPj0wO2QtLSliLnJlbW92ZUN1ZShjW2RdKTtiLm1vZGU9XCJkaXNhYmxlZFwifX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5UZXh0VlRUU291cmNlQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIGEsYixjO3JldHVybntzeXN0ZW06dm9pZCAwLGV2ZW50QnVzOnZvaWQgMCxpbml0aWFsaXplOmZ1bmN0aW9uKGQsZSl7Yz1kLGE9ZS5nZXRWaWRlb01vZGVsKCkuZ2V0RWxlbWVudCgpLGI9ZS5nZXREYXRhKCl9LGFwcGVuZDpmdW5jdGlvbihjKXt2YXIgZD10aGlzO2QuZ2V0UGFyc2VyKCkucGFyc2UoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50MTZBcnJheShjKSkpLnRoZW4oZnVuY3Rpb24oYyl7dmFyIGU9Yi5SZXByZXNlbnRhdGlvbl9hc0FycmF5WzBdLmlkLGY9Yi5sYW5nO2QuZ2V0VGV4dFRyYWNrRXh0ZW5zaW9ucygpLmFkZFRleHRUcmFjayhhLGMsZSxmLCEwKS50aGVuKGZ1bmN0aW9uKCl7ZC5ldmVudEJ1cy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwidXBkYXRlZW5kXCJ9KX0pfSl9LGFib3J0OmZ1bmN0aW9uKCl7dGhpcy5nZXRUZXh0VHJhY2tFeHRlbnNpb25zKCkuZGVsZXRlQ3VlcyhhKX0sZ2V0UGFyc2VyOmZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuXCJ0ZXh0L3Z0dFwiPT09YyYmKGE9dGhpcy5zeXN0ZW0uZ2V0T2JqZWN0KFwidnR0UGFyc2VyXCIpKSxhfSxnZXRUZXh0VHJhY2tFeHRlbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3lzdGVtLmdldE9iamVjdChcInRleHRUcmFja0V4dGVuc2lvbnNcIil9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMuYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyl9fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlRleHRWVFRTb3VyY2VCdWZmZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dFZUVFNvdXJjZUJ1ZmZlcn0sTWVkaWFQbGF5ZXIudXRpbHMuVlRUUGFyc2VyPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zcGxpdChcIjpcIiksYz1iLmxlbmd0aC0xO3JldHVybiBhPTYwKnBhcnNlSW50KGJbYy0xXSwxMCkrcGFyc2VGbG9hdChiW2NdLDEwKSwyPT09YyYmKGErPTM2MDAqcGFyc2VJbnQoYlswXSwxMCkpLGF9O3JldHVybntwYXJzZTpmdW5jdGlvbihiKXt2YXIgYyxkPS8oPzpcXHJcXG58XFxyfFxcbikvZ20sZT0vLS0+LyxmPS8oXltcXHNdK3xbXFxzXSskKS9nLGc9W107Yj1iLnNwbGl0KGQpLGM9Yi5sZW5ndGg7Zm9yKHZhciBoPTA7Yz5oO2grKyl7dmFyIGk9YltoXTtpZihpLmxlbmd0aD4wJiZcIldFQlZUVFwiIT09aSYmaS5tYXRjaChlKSl7dmFyIGo9aS5zcGxpdChlKSxrPWJbaCsxXTtnLnB1c2goe3N0YXJ0OmEoalswXS5yZXBsYWNlKGYsXCJcIikpLGVuZDphKGpbMV0ucmVwbGFjZShmLFwiXCIpKSxkYXRhOmt9KX19cmV0dXJuIFEud2hlbihnKX19fSxNZWRpYVBsYXllci5ydWxlcy5CYXNlUnVsZXNDb2xsZWN0aW9uPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9W107cmV0dXJue2Rvd25sb2FkUmF0aW9SdWxlOnZvaWQgMCxpbnN1ZmZpY2llbnRCdWZmZXJSdWxlOnZvaWQgMCxnZXRSdWxlczpmdW5jdGlvbigpe3JldHVybiBRLndoZW4oYSl9LHNldHVwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmdldFJ1bGVzKCkudGhlbihmdW5jdGlvbihiKXtiLnB1c2goYS5kb3dubG9hZFJhdGlvUnVsZSksYi5wdXNoKGEuaW5zdWZmaWNpZW50QnVmZmVyUnVsZSl9KX19fSxNZWRpYVBsYXllci5ydWxlcy5CYXNlUnVsZXNDb2xsZWN0aW9uLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIucnVsZXMuQmFzZVJ1bGVzQ29sbGVjdGlvbn0sTWVkaWFQbGF5ZXIucnVsZXMuRG93bmxvYWRSYXRpb1J1bGU9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcyxlPVEuZGVmZXIoKTtyZXR1cm4gZC5tYW5pZmVzdEV4dC5nZXRSZXByZXNlbnRhdGlvbkZvcihhLGMpLnRoZW4oZnVuY3Rpb24oYSl7ZC5tYW5pZmVzdEV4dC5nZXRCYW5kd2lkdGgoYSkudGhlbihmdW5jdGlvbihhKXtlLnJlc29sdmUoYS9iKX0pfSksZS5wcm9taXNlfTtyZXR1cm57ZGVidWc6dm9pZCAwLG1hbmlmZXN0RXh0OnZvaWQgMCxjaGVja0luZGV4OmZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaCxpLGosayxsLG0sbixvPXRoaXMscD1jLkh0dHBMaXN0LHE9Ljc1O3JldHVybiBvLmRlYnVnLmxvZyhcIkNoZWNraW5nIGRvd25sb2FkIHJhdGlvIHJ1bGUuLi5cIiksYz9udWxsPT09cHx8dm9pZCAwPT09cHx8MD09PXAubGVuZ3RoPyhvLmRlYnVnLmxvZyhcIk5vIHJlcXVlc3RzIG1hZGUgZm9yIHRoaXMgc3RyZWFtIHlldCwgYmFpbGluZy5cIiksUS53aGVuKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KSk6KGU9cFtwLmxlbmd0aC0xXSxnPShlLnRmaW5pc2guZ2V0VGltZSgpLWUudHJlcXVlc3QuZ2V0VGltZSgpKS8xZTMsZj0oZS50ZmluaXNoLmdldFRpbWUoKS1lLnRyZXNwb25zZS5nZXRUaW1lKCkpLzFlMywwPj1nPyhvLmRlYnVnLmxvZyhcIkRvbid0IGtub3cgaG93IGxvbmcgdGhlIGRvd25sb2FkIG9mIHRoZSBsYXN0IGZyYWdtZW50IHRvb2ssIGJhaWxpbmcuXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdCkpOm51bGw9PT1lLm1lZGlhZHVyYXRpb258fHZvaWQgMD09PWUubWVkaWFkdXJhdGlvbnx8ZS5tZWRpYWR1cmF0aW9uPD0wPyhvLmRlYnVnLmxvZyhcIkRvbid0IGtub3cgdGhlIGR1cmF0aW9uIG9mIHRoZSBsYXN0IG1lZGlhIGZyYWdtZW50LCBiYWlsaW5nLlwiKSxRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QpKTooaz1RLmRlZmVyKCksaT1lLm1lZGlhZHVyYXRpb24vZyxoPWUubWVkaWFkdXJhdGlvbi9mKnEsaXNOYU4oaCl8fGlzTmFOKGkpPyhvLmRlYnVnLmxvZyhcIlRvdGFsIHRpbWU6IFwiK2crXCJzXCIpLG8uZGVidWcubG9nKFwiRG93bmxvYWQgdGltZTogXCIrZitcInNcIiksby5kZWJ1Zy5sb2coXCJUaGUgcmF0aW9zIGFyZSBOYU4sIGJhaWxpbmcuXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdCkpOihvLmRlYnVnLmxvZyhcIlRvdGFsIHJhdGlvOiBcIitpKSxvLmRlYnVnLmxvZyhcIkRvd25sb2FkIHJhdGlvOiBcIitoKSxvLmRlYnVnLmxvZyhcIkRvd25sb2FkIHJhdGlvOiBcIitoKSxpc05hTihoKT8oby5kZWJ1Zy5sb2coXCJJbnZhbGlkIHJhdGlvLCBiYWlsaW5nLlwiKSxrLnJlc29sdmUobmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QpKToxPmg/KG8uZGVidWcubG9nKFwiRG93bmxvYWQgcmF0aW8gaXMgcG9vci5cIiksYj4wPyhvLmRlYnVnLmxvZyhcIldlIGFyZSBub3QgYXQgdGhlIGxvd2VzdCBiaXRyYXRlLCBzbyBzd2l0Y2ggZG93bi5cIiksby5tYW5pZmVzdEV4dC5nZXRSZXByZXNlbnRhdGlvbkZvcihiLTEsZCkudGhlbihmdW5jdGlvbihhKXtvLm1hbmlmZXN0RXh0LmdldEJhbmR3aWR0aChhKS50aGVuKGZ1bmN0aW9uKGEpe28ubWFuaWZlc3RFeHQuZ2V0UmVwcmVzZW50YXRpb25Gb3IoYixkKS50aGVuKGZ1bmN0aW9uKGMpe28ubWFuaWZlc3RFeHQuZ2V0QmFuZHdpZHRoKGMpLnRoZW4oZnVuY3Rpb24oYyl7aj1hL2Msby5kZWJ1Zy5sb2coXCJTd2l0Y2ggcmF0aW86IFwiK2opLGo+aD8oby5kZWJ1Zy5sb2coXCJUaGluZ3MgbXVzdCBiZSBnb2luZyBwcmV0dHkgYmFkLCBzd2l0Y2ggYWxsIHRoZSB3YXkgZG93bi5cIiksay5yZXNvbHZlKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KDApKSk6KG8uZGVidWcubG9nKFwiVGhpbmdzIGNvdWxkIGJlIGJldHRlciwgc28ganVzdCBzd2l0Y2ggZG93biBvbmUgaW5kZXguXCIpLGsucmVzb2x2ZShuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChiLTEpKSlcbn0pfSl9KX0pKTooby5kZWJ1Zy5sb2coXCJXZSBhcmUgYXQgdGhlIGxvd2VzdCBiaXRyYXRlIGFuZCBjYW5ub3Qgc3dpdGNoIGRvd24sIHVzZSBjdXJyZW50LlwiKSxrLnJlc29sdmUobmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QoYikpKSk6KG8uZGVidWcubG9nKFwiRG93bmxvYWQgcmF0aW8gaXMgZ29vZC5cIiksby5tYW5pZmVzdEV4dC5nZXRSZXByZXNlbnRhdGlvbkNvdW50KGQpLnRoZW4oZnVuY3Rpb24oYyl7Yy09MSxjPmI/KG8uZGVidWcubG9nKFwiV2UgYXJlIG5vdCBhdCB0aGUgaGlnaGVzdCBiaXRyYXRlLCBzbyBzd2l0Y2ggdXAuXCIpLG8ubWFuaWZlc3RFeHQuZ2V0UmVwcmVzZW50YXRpb25Gb3IoYisxLGQpLnRoZW4oZnVuY3Rpb24oZSl7by5tYW5pZmVzdEV4dC5nZXRCYW5kd2lkdGgoZSkudGhlbihmdW5jdGlvbihlKXtvLm1hbmlmZXN0RXh0LmdldFJlcHJlc2VudGF0aW9uRm9yKGIsZCkudGhlbihmdW5jdGlvbihmKXtvLm1hbmlmZXN0RXh0LmdldEJhbmR3aWR0aChmKS50aGVuKGZ1bmN0aW9uKGYpe2lmKGo9ZS9mLG8uZGVidWcubG9nKFwiU3dpdGNoIHJhdGlvOiBcIitqKSxoPj1qKWlmKGg+MWUzKW8uZGVidWcubG9nKFwiVG9ucyBvZiBiYW5kd2lkdGggYXZhaWxhYmxlLCBnbyBhbGwgdGhlIHdheSB1cC5cIiksay5yZXNvbHZlKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KGMtMSkpO2Vsc2UgaWYoaD4xMDApby5kZWJ1Zy5sb2coXCJKdXN0IGVub3VnaCBiYW5kd2lkdGggYXZhaWxhYmxlLCBzd2l0Y2ggdXAgb25lLlwiKSxrLnJlc29sdmUobmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QoYisxKSk7ZWxzZXtmb3Ioby5kZWJ1Zy5sb2coXCJOb3QgZXhhY3RseSBzdXJlIHdoZXJlIHRvIGdvLCBzbyBkbyBzb21lIG1hdGguXCIpLG09LTEsbD1bXTsobSs9MSk8YzspbC5wdXNoKGEuY2FsbChvLG0sZixkKSk7US5hbGwobCkudGhlbihmdW5jdGlvbihhKXtmb3IobT0wLG49YS5sZW5ndGg7bj5tJiYhKGg8YVttXSk7bSs9MSk7by5kZWJ1Zy5sb2coXCJDYWxjdWxhdGVkIGlkZWFsIG5ldyBxdWFsaXR5IGluZGV4IGlzOiBcIittKSxrLnJlc29sdmUobmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QobSkpfSl9ZWxzZSBvLmRlYnVnLmxvZyhcIk5vdCBlbm91Z2ggYmFuZHdpZHRoIHRvIHN3aXRjaCB1cC5cIiksay5yZXNvbHZlKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KX0pfSl9KX0pKTooby5kZWJ1Zy5sb2coXCJXZSBhcmUgYXQgdGhlIGhpZ2hlc3QgYml0cmF0ZSBhbmQgY2Fubm90IHN3aXRjaCB1cCwgdXNlIGN1cnJlbnQuXCIpLGsucmVzb2x2ZShuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChjKSkpfSkpLGsucHJvbWlzZSkpKTooby5kZWJ1Zy5sb2coXCJObyBtZXRyaWNzLCBiYWlsaW5nLlwiKSxRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QpKX19fSxNZWRpYVBsYXllci5ydWxlcy5Eb3dubG9hZFJhdGlvUnVsZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLnJ1bGVzLkRvd25sb2FkUmF0aW9SdWxlfSxNZWRpYVBsYXllci5ydWxlcy5JbnN1ZmZpY2llbnRCdWZmZXJSdWxlPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9MCxiPTM7cmV0dXJue2RlYnVnOnZvaWQgMCxjaGVja0luZGV4OmZ1bmN0aW9uKGMsZCl7dmFyIGUsZixnPXRoaXMsaD0hMSxpPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLkRFRkFVTFQ7cmV0dXJuIGcuZGVidWcubG9nKFwiQ2hlY2tpbmcgaW5zdWZmaWNpZW50IGJ1ZmZlciBydWxlLi4uXCIpLG51bGw9PT1kLlBsYXlMaXN0fHx2b2lkIDA9PT1kLlBsYXlMaXN0fHwwPT09ZC5QbGF5TGlzdC5sZW5ndGg/KGcuZGVidWcubG9nKFwiTm90IGVub3VnaCBpbmZvcm1hdGlvbiBmb3IgcnVsZS5cIiksUS53aGVuKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KSk6KGU9ZC5QbGF5TGlzdFtkLlBsYXlMaXN0Lmxlbmd0aC0xXSxudWxsPT09ZXx8dm9pZCAwPT09ZXx8MD09PWUudHJhY2UubGVuZ3RoPyhnLmRlYnVnLmxvZyhcIk5vdCBlbm91Z2ggaW5mb3JtYXRpb24gZm9yIHJ1bGUuXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdCkpOihmPWUudHJhY2VbZS50cmFjZS5sZW5ndGgtMl0sbnVsbD09PWZ8fHZvaWQgMD09PWZ8fG51bGw9PT1mLnN0b3ByZWFzb258fHZvaWQgMD09PWYuc3RvcHJlYXNvbj8oZy5kZWJ1Zy5sb2coXCJOb3QgZW5vdWdoIGluZm9ybWF0aW9uIGZvciBydWxlLlwiKSxRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QpKTooZi5zdG9wcmVhc29uPT09TWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5SRUJVRkZFUklOR19SRUFTT04mJihoPSEwLGErPTEsZy5kZWJ1Zy5sb2coXCJOdW1iZXIgb2YgdGltZXMgdGhlIGJ1ZmZlciBoYXMgcnVuIGRyeTogXCIrYSkpLGE+YiYmKGk9TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuU1RST05HLGcuZGVidWcubG9nKFwiQXBwbHkgU1RST05HIHRvIGJ1ZmZlciBydWxlLlwiKSksaD8oZy5kZWJ1Zy5sb2coXCJUaGUgYnVmZmVyIHJhbiBkcnkgcmVjZW50bHksIHN3aXRjaCBkb3duLlwiKSxRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QoYy0xLGkpKSk6YT5iPyhnLmRlYnVnLmxvZyhcIlRvbyBtYW55IGRyeSBidWZmZXIgaGl0cywgcXVpdCBzd2l0Y2hpbmcgYml0cmF0ZXMuXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChjLGkpKSk6US53aGVuKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSxpKSkpKSl9fX0sTWVkaWFQbGF5ZXIucnVsZXMuSW5zdWZmaWNpZW50QnVmZmVyUnVsZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLnJ1bGVzLkluc3VmZmljaWVudEJ1ZmZlclJ1bGV9LE1lZGlhUGxheWVyLnJ1bGVzLkxpbWl0U3dpdGNoZXNSdWxlPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9MTAsYj0yZTQsYz01LGQ9MDtyZXR1cm57ZGVidWc6dm9pZCAwLGNoZWNrSW5kZXg6ZnVuY3Rpb24oZSxmKXtpZihkPjApcmV0dXJuIGQtPTEsUS53aGVuKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KGUsTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuU1RST05HKSk7dmFyIGcsaCxpLGo9dGhpcyxrPSExLGw9KG5ldyBEYXRlKS5nZXRUaW1lKCksbT1mLlJlcFN3aXRjaExpc3QubGVuZ3RoO2ZvcihqLmRlYnVnLmxvZyhcIkNoZWNraW5nIGxpbWl0IHN3aXRjaGVzIHJ1bGUuLi5cIiksaT1tLTE7aT49MDtpLT0xKXtpZihnPWYuUmVwU3dpdGNoTGlzdFtpXSxoPWwtZy50LmdldFRpbWUoKSxoPj1iKXtqLmRlYnVnLmxvZyhcIlJlYWNoZWQgdGltZSBsaW1pdCwgYmFpbGluZy5cIik7YnJlYWt9aWYoaT49YSl7ai5kZWJ1Zy5sb2coXCJGb3VuZCB0b28gbWFueSBzd2l0Y2hlcyB3aXRoaW4gdmFsaWRhdGlvbiB0aW1lLCBmb3JjZSB0aGUgc3RyZWFtIHRvIG5vdCBjaGFuZ2UuXCIpLGs9ITA7YnJlYWt9fXJldHVybiBrPyhqLmRlYnVnLmxvZyhcIldhaXQgc29tZSB0aW1lIGJlZm9yZSBhbGxvd2luZyBhbm90aGVyIHN3aXRjaC5cIiksZD1jLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChlLE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9ORykpKTpRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QoTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuTk9fQ0hBTkdFLE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9ORykpfX19LE1lZGlhUGxheWVyLnJ1bGVzLkxpbWl0U3dpdGNoZXNSdWxlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIucnVsZXMuTGltaXRTd2l0Y2hlc1J1bGV9LE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3Q9ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt0aGlzLnF1YWxpdHk9YSx0aGlzLnByaW9yaXR5PWIsdm9pZCAwPT09dGhpcy5xdWFsaXR5JiYodGhpcy5xdWFsaXR5PTk5OSksdm9pZCAwPT09dGhpcy5wcmlvcml0eSYmKHRoaXMucHJpb3JpdHk9LjUpfSxNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdCxOT19DSEFOR0U6OTk5LERFRkFVTFQ6LjUsU1RST05HOjEsV0VBSzowfSxNZWRpYVBsYXllci5tb2RlbHMuTWV0cmljc0xpc3Q9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm57VGNwTGlzdDpbXSxIdHRwTGlzdDpbXSxSZXBTd2l0Y2hMaXN0OltdLEJ1ZmZlckxldmVsOltdLFBsYXlMaXN0OltdLERyb3BwZWRGcmFtZXM6W119fSxNZWRpYVBsYXllci5tb2RlbHMuTWV0cmljc0xpc3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5tb2RlbHMuTWV0cmljc0xpc3R9LE1lZGlhUGxheWVyLnZvLlNlZ21lbnRSZXF1ZXN0PWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy5hY3Rpb249XCJkb3dubG9hZFwiLHRoaXMuc3RhcnRUaW1lPTAvMCx0aGlzLnN0cmVhbVR5cGU9bnVsbCx0aGlzLnR5cGU9bnVsbCx0aGlzLmR1cmF0aW9uPTAvMCx0aGlzLnRpbWVzY2FsZT0wLzAsdGhpcy5yYW5nZT1udWxsLHRoaXMudXJsPW51bGwsdGhpcy5yZXF1ZXN0U3RhcnREYXRlPW51bGwsdGhpcy5maXJzdEJ5dGVEYXRlPW51bGwsdGhpcy5yZXF1ZXN0RW5kRGF0ZT1udWxsLHRoaXMuZGVmZXJyZWQ9bnVsbCx0aGlzLnF1YWxpdHk9MC8wLHRoaXMuaW5kZXg9MC8wfSxNZWRpYVBsYXllci52by5TZWdtZW50UmVxdWVzdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLnZvLlNlZ21lbnRSZXF1ZXN0LEFDVElPTl9ET1dOTE9BRDpcImRvd25sb2FkXCIsQUNUSU9OX0NPTVBMRVRFOlwiY29tcGxldGVcIn0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5CdWZmZXJMZXZlbD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3RoaXMudD1udWxsLHRoaXMubGV2ZWw9bnVsbH0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5CdWZmZXJMZXZlbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLnZvLm1ldHJpY3MuQnVmZmVyTGV2ZWx9LE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuRHJvcHBlZEZyYW1lcz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3RoaXMudGltZT1udWxsLHRoaXMuZHJvcHBlZEZyYW1lcz1udWxsfSxNZWRpYVBsYXllci52by5tZXRyaWNzLkRyb3BwZWRGcmFtZXMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci52by5tZXRyaWNzLkRyb3BwZWRGcmFtZXN9LE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuSFRUUFJlcXVlc3Q9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLnRjcGlkPW51bGwsdGhpcy50eXBlPW51bGwsdGhpcy51cmw9bnVsbCx0aGlzLmFjdHVhbHVybD1udWxsLHRoaXMucmFuZ2U9bnVsbCx0aGlzLnRyZXF1ZXN0PW51bGwsdGhpcy50cmVzcG9uc2U9bnVsbCx0aGlzLnRmaW5pc2g9bnVsbCx0aGlzLnJlc3BvbnNlY29kZT1udWxsLHRoaXMuaW50ZXJ2YWw9bnVsbCx0aGlzLm1lZGlhZHVyYXRpb249bnVsbCx0aGlzLnRyYWNlPVtdfSxNZWRpYVBsYXllci52by5tZXRyaWNzLkhUVFBSZXF1ZXN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudm8ubWV0cmljcy5IVFRQUmVxdWVzdH0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5IVFRQUmVxdWVzdC5UcmFjZT1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3RoaXMucz1udWxsLHRoaXMuZD1udWxsLHRoaXMuYj1bXX0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5IVFRQUmVxdWVzdC5UcmFjZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLnZvLm1ldHJpY3MuSFRUUFJlcXVlc3QuVHJhY2V9LE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3Q9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLnN0YXJ0PW51bGwsdGhpcy5tc3RhcnQ9bnVsbCx0aGlzLnN0YXJ0dHlwZT1udWxsLHRoaXMudHJhY2U9W119LE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2U9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLnJlcHJlc2VudGF0aW9uaWQ9bnVsbCx0aGlzLnN1YnJlcGxldmVsPW51bGwsdGhpcy5zdGFydD1udWxsLHRoaXMubXN0YXJ0PW51bGwsdGhpcy5kdXJhdGlvbj1udWxsLHRoaXMucGxheWJhY2tzcGVlZD1udWxsLHRoaXMuc3RvcHJlYXNvbj1udWxsfSxNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdH0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5JTklUSUFMX1BMQVlfU1RBUlRfUkVBU09OPVwiaW5pdGlhbF9zdGFydFwiLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuU0VFS19TVEFSVF9SRUFTT049XCJzZWVrXCIsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2UoKX0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5VU0VSX1JFUVVFU1RfU1RPUF9SRUFTT049XCJ1c2VyX3JlcXVlc3RcIixNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlLlJFUFJFU0VOVEFUSU9OX1NXSVRDSF9TVE9QX1JFQVNPTj1cInJlcHJlc2VudGF0aW9uX3N3aXRjaFwiLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2UuRU5EX09GX0NPTlRFTlRfU1RPUF9SRUFTT049XCJlbmRfb2ZfY29udGVudFwiLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2UuUkVCVUZGRVJJTkdfUkVBU09OPVwicmVidWZmZXJpbmdcIixNZWRpYVBsYXllci52by5tZXRyaWNzLlJlcHJlc2VudGF0aW9uU3dpdGNoPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy50PW51bGwsdGhpcy5tdD1udWxsLHRoaXMudG89bnVsbCx0aGlzLmx0bz1udWxsfSxNZWRpYVBsYXllci52by5tZXRyaWNzLlJlcHJlc2VudGF0aW9uU3dpdGNoLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudm8ubWV0cmljcy5SZXByZXNlbnRhdGlvblN3aXRjaH0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5UQ1BDb25uZWN0aW9uPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy50Y3BpZD1udWxsLHRoaXMuZGVzdD1udWxsLHRoaXMudG9wZW49bnVsbCx0aGlzLnRjbG9zZT1udWxsLHRoaXMudGNvbm5lY3Q9bnVsbH0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5UQ1BDb25uZWN0aW9uLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudm8ubWV0cmljcy5UQ1BDb25uZWN0aW9ufTsiXSwiZmlsZSI6ImRhc2guYWxsLmpzIiwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJkYXNoLmFsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBYMkpTKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBiPWEubG9jYWxOYW1lO3JldHVybiBudWxsPT1iJiYoYj1hLmJhc2VOYW1lKSwobnVsbD09Ynx8XCJcIj09YikmJihiPWEubm9kZU5hbWUpLGJ9ZnVuY3Rpb24gZShhKXtyZXR1cm4gYS5wcmVmaXh9ZnVuY3Rpb24gZihhKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYT9hLnJlcGxhY2UoLyYvZyxcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZyxcIiZsdDtcIikucmVwbGFjZSgvPi9nLFwiJmd0O1wiKS5yZXBsYWNlKC9cIi9nLFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZyxcIiYjeDI3O1wiKS5yZXBsYWNlKC9cXC8vZyxcIiYjeDJGO1wiKTphfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGEucmVwbGFjZSgvJmFtcDsvZyxcIiZcIikucmVwbGFjZSgvJmx0Oy9nLFwiPFwiKS5yZXBsYWNlKC8mZ3Q7L2csXCI+XCIpLnJlcGxhY2UoLyZxdW90Oy9nLCdcIicpLnJlcGxhY2UoLyYjeDI3Oy9nLFwiJ1wiKS5yZXBsYWNlKC8mI3gyRjsvZyxcIi9cIil9ZnVuY3Rpb24gaChmKXtpZihmLm5vZGVUeXBlPT11LkRPQ1VNRU5UX05PREUpe3ZhciBpLGosayxsPWYuZmlyc3RDaGlsZDtmb3Ioaj0wLGs9Zi5jaGlsZE5vZGVzLmxlbmd0aDtrPmo7ais9MSlpZihmLmNoaWxkTm9kZXNbal0ubm9kZVR5cGUhPT11LkNPTU1FTlRfTk9ERSl7bD1mLmNoaWxkTm9kZXNbal07YnJlYWt9aWYoYylpPWgobCk7ZWxzZXtpPXt9O3ZhciBtPWQobCk7aVttXT1oKGwpfXJldHVybiBpfWlmKGYubm9kZVR5cGU9PXUuRUxFTUVOVF9OT0RFKXt2YXIgaT1uZXcgT2JqZWN0O2kuX19jbnQ9MDtmb3IodmFyIG49Zi5jaGlsZE5vZGVzLG89MDtvPG4ubGVuZ3RoO28rKyl7dmFyIGw9bi5pdGVtKG8pLG09ZChsKTtpZihpLl9fY250KyssbnVsbD09aVttXSlpW21dPWgobCksaVttK1wiX2FzQXJyYXlcIl09bmV3IEFycmF5KDEpLGlbbStcIl9hc0FycmF5XCJdWzBdPWlbbV07ZWxzZXtpZihudWxsIT1pW21dJiYhKGlbbV1pbnN0YW5jZW9mIEFycmF5KSl7dmFyIHA9aVttXTtpW21dPW5ldyBBcnJheSxpW21dWzBdPXAsaVttK1wiX2FzQXJyYXlcIl09aVttXX1mb3IodmFyIHE9MDtudWxsIT1pW21dW3FdOylxKys7aVttXVtxXT1oKGwpfX1mb3IodmFyIHI9MDtyPGYuYXR0cmlidXRlcy5sZW5ndGg7cisrKXt2YXIgcz1mLmF0dHJpYnV0ZXMuaXRlbShyKTtpLl9fY250Kys7Zm9yKHZhciB2PXMudmFsdWUsdz0wLHg9YS5sZW5ndGg7eD53O3crKyl7dmFyIHk9YVt3XTt5LnRlc3QuY2FsbCh0aGlzLHMudmFsdWUpJiYodj15LmNvbnZlcnRlci5jYWxsKHRoaXMscy52YWx1ZSkpfWlbYitzLm5hbWVdPXZ9dmFyIHo9ZShmKTtyZXR1cm4gbnVsbCE9eiYmXCJcIiE9eiYmKGkuX19jbnQrKyxpLl9fcHJlZml4PXopLDE9PWkuX19jbnQmJm51bGwhPWlbXCIjdGV4dFwiXSYmKGk9aVtcIiN0ZXh0XCJdKSxudWxsIT1pW1wiI3RleHRcIl0mJihpLl9fdGV4dD1pW1wiI3RleHRcIl0sdCYmKGkuX190ZXh0PWcoaS5fX3RleHQpKSxkZWxldGUgaVtcIiN0ZXh0XCJdLGRlbGV0ZSBpW1wiI3RleHRfYXNBcnJheVwiXSksbnVsbCE9aVtcIiNjZGF0YS1zZWN0aW9uXCJdJiYoaS5fX2NkYXRhPWlbXCIjY2RhdGEtc2VjdGlvblwiXSxkZWxldGUgaVtcIiNjZGF0YS1zZWN0aW9uXCJdLGRlbGV0ZSBpW1wiI2NkYXRhLXNlY3Rpb25fYXNBcnJheVwiXSksKG51bGwhPWkuX190ZXh0fHxudWxsIT1pLl9fY2RhdGEpJiYoaS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybihudWxsIT10aGlzLl9fdGV4dD90aGlzLl9fdGV4dDpcIlwiKSsobnVsbCE9dGhpcy5fX2NkYXRhP3RoaXMuX19jZGF0YTpcIlwiKX0pLGl9cmV0dXJuIGYubm9kZVR5cGU9PXUuVEVYVF9OT0RFfHxmLm5vZGVUeXBlPT11LkNEQVRBX1NFQ1RJT05fTk9ERT9mLm5vZGVWYWx1ZTpmLm5vZGVUeXBlPT11LkNPTU1FTlRfTk9ERT9udWxsOnZvaWQgMH1mdW5jdGlvbiBpKGEsYixjLGQpe3ZhciBlPVwiPFwiKyhudWxsIT1hJiZudWxsIT1hLl9fcHJlZml4P2EuX19wcmVmaXgrXCI6XCI6XCJcIikrYjtpZihudWxsIT1jKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdLGg9YVtnXTtlKz1cIiBcIitnLnN1YnN0cigxKStcIj0nXCIraCtcIidcIn1yZXR1cm4gZSs9ZD9cIi8+XCI6XCI+XCJ9ZnVuY3Rpb24gaihhLGIpe3JldHVyblwiPC9cIisobnVsbCE9YS5fX3ByZWZpeD9hLl9fcHJlZml4K1wiOlwiOlwiXCIpK2IrXCI+XCJ9ZnVuY3Rpb24gayhhLGIpe3JldHVybi0xIT09YS5pbmRleE9mKGIsYS5sZW5ndGgtYi5sZW5ndGgpfWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gayhiLnRvU3RyaW5nKCksXCJfYXNBcnJheVwiKXx8MD09Yi50b1N0cmluZygpLmluZGV4T2YoXCJfXCIpfHxhW2JdaW5zdGFuY2VvZiBGdW5jdGlvbj8hMDohMX1mdW5jdGlvbiBtKGEpe3ZhciBiPTA7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClmb3IodmFyIGMgaW4gYSlsKGEsYyl8fGIrKztyZXR1cm4gYn1mdW5jdGlvbiBuKGEpe3ZhciBiPVtdO2lmKGEgaW5zdGFuY2VvZiBPYmplY3QpZm9yKHZhciBjIGluIGEpLTE9PWMudG9TdHJpbmcoKS5pbmRleE9mKFwiX19cIikmJjA9PWMudG9TdHJpbmcoKS5pbmRleE9mKFwiX1wiKSYmYi5wdXNoKGMpO3JldHVybiBifWZ1bmN0aW9uIG8oYSl7dmFyIGI9XCJcIjtyZXR1cm4gbnVsbCE9YS5fX2NkYXRhJiYoYis9XCI8IVtDREFUQVtcIithLl9fY2RhdGErXCJdXT5cIiksbnVsbCE9YS5fX3RleHQmJihiKz10P2YoYS5fX3RleHQpOmEuX190ZXh0KSxifWZ1bmN0aW9uIHAoYSl7dmFyIGI9XCJcIjtyZXR1cm4gYSBpbnN0YW5jZW9mIE9iamVjdD9iKz1vKGEpOm51bGwhPWEmJihiKz10P2YoYSk6YSksYn1mdW5jdGlvbiBxKGEsYixjKXt2YXIgZD1cIlwiO2lmKDA9PWEubGVuZ3RoKWQrPWkoYSxiLGMsITApO2Vsc2UgZm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZCs9aShhW2VdLGIsbihhW2VdKSwhMSksZCs9cihhW2VdKSxkKz1qKGFbZV0sYik7cmV0dXJuIGR9ZnVuY3Rpb24gcihhKXt2YXIgYj1cIlwiLGM9bShhKTtpZihjPjApZm9yKHZhciBkIGluIGEpaWYoIWwoYSxkKSl7dmFyIGU9YVtkXSxmPW4oZSk7aWYobnVsbD09ZXx8dm9pZCAwPT1lKWIrPWkoZSxkLGYsITApO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIE9iamVjdClpZihlIGluc3RhbmNlb2YgQXJyYXkpYis9cShlLGQsZik7ZWxzZXt2YXIgZz1tKGUpO2c+MHx8bnVsbCE9ZS5fX3RleHR8fG51bGwhPWUuX19jZGF0YT8oYis9aShlLGQsZiwhMSksYis9cihlKSxiKz1qKGUsZCkpOmIrPWkoZSxkLGYsITApfWVsc2UgYis9aShlLGQsZiwhMSksYis9cChlKSxiKz1qKGUsZCl9cmV0dXJuIGIrPXAoYSl9KG51bGw9PT1ifHx2b2lkIDA9PT1iKSYmKGI9XCJfXCIpLChudWxsPT09Y3x8dm9pZCAwPT09YykmJihjPSExKTt2YXIgcz1cIjEuMC4xMVwiLHQ9ITEsdT17RUxFTUVOVF9OT0RFOjEsVEVYVF9OT0RFOjMsQ0RBVEFfU0VDVElPTl9OT0RFOjQsQ09NTUVOVF9OT0RFOjgsRE9DVU1FTlRfTk9ERTo5fTt0aGlzLnBhcnNlWG1sU3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKHdpbmRvdy5ET01QYXJzZXIpe3ZhciBjPW5ldyB3aW5kb3cuRE9NUGFyc2VyO2I9Yy5wYXJzZUZyb21TdHJpbmcoYSxcInRleHQveG1sXCIpfWVsc2UgMD09YS5pbmRleE9mKFwiPD9cIikmJihhPWEuc3Vic3RyKGEuaW5kZXhPZihcIj8+XCIpKzIpKSxiPW5ldyBBY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTERPTVwiKSxiLmFzeW5jPVwiZmFsc2VcIixiLmxvYWRYTUwoYSk7cmV0dXJuIGJ9LHRoaXMueG1sMmpzb249ZnVuY3Rpb24oYSl7cmV0dXJuIGgoYSl9LHRoaXMueG1sX3N0cjJqc29uPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGFyc2VYbWxTdHJpbmcoYSk7cmV0dXJuIHRoaXMueG1sMmpzb24oYil9LHRoaXMuanNvbjJ4bWxfc3RyPWZ1bmN0aW9uKGEpe3JldHVybiByKGEpfSx0aGlzLmpzb24yeG1sPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanNvbjJ4bWxfc3RyKGEpO3JldHVybiB0aGlzLnBhcnNlWG1sU3RyaW5nKGIpfSx0aGlzLmdldFZlcnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gc30sdGhpcy5lc2NhcGVNb2RlPWZ1bmN0aW9uKGEpe3Q9YX19ZnVuY3Rpb24gT2JqZWN0SXJvbihhKXt2YXIgYjtmb3IoYj1bXSxpPTAsbGVuPWEubGVuZ3RoO2xlbj5pO2krPTEpYVtpXS5pc1Jvb3Q/Yi5wdXNoKFwicm9vdFwiKTpiLnB1c2goYVtpXS5uYW1lKTt2YXIgYz1mdW5jdGlvbihhLGIpe3ZhciBjO2lmKG51bGwhPT1hJiZudWxsIT09Yilmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJihiLmhhc093blByb3BlcnR5KGMpfHwoYltjXT1hW2NdKSl9LGQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGYsZyxoLGk7aWYobnVsbCE9PWEmJjAhPT1hLmxlbmd0aClmb3IoZT0wLGY9YS5sZW5ndGg7Zj5lO2UrPTEpZz1hW2VdLGIuaGFzT3duUHJvcGVydHkoZy5uYW1lKSYmKGQuaGFzT3duUHJvcGVydHkoZy5uYW1lKT9nLm1lcmdlJiYoaD1iW2cubmFtZV0saT1kW2cubmFtZV0sXCJvYmplY3RcIj09dHlwZW9mIGgmJlwib2JqZWN0XCI9PXR5cGVvZiBpP2MoaCxpKTpkW2cubmFtZV09bnVsbCE9Zy5tZXJnZUZ1bmN0aW9uP2cubWVyZ2VGdW5jdGlvbihoLGkpOmgraSk6ZFtnLm5hbWVdPWJbZy5uYW1lXSl9LGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxmLGcsaCxpLGosayxsPWE7aWYobnVsbCE9PWwuY2hpbGRyZW4mJjAhPT1sLmNoaWxkcmVuLmxlbmd0aClmb3IoYz0wLGY9bC5jaGlsZHJlbi5sZW5ndGg7Zj5jO2MrPTEpaWYoaj1sLmNoaWxkcmVuW2NdLGIuaGFzT3duUHJvcGVydHkoai5uYW1lKSlpZihqLmlzQXJyYXkpZm9yKGk9YltqLm5hbWUrXCJfYXNBcnJheVwiXSxnPTAsaD1pLmxlbmd0aDtoPmc7Zys9MSlrPWlbZ10sZChsLnByb3BlcnRpZXMsYixrKSxlKGosayk7ZWxzZSBrPWJbai5uYW1lXSxkKGwucHJvcGVydGllcyxiLGspLGUoaixrKX0sZj1mdW5jdGlvbihjKXt2YXIgZCxnLGgsaSxqLGssbDtpZihudWxsPT09YylyZXR1cm4gYztpZihcIm9iamVjdFwiIT10eXBlb2YgYylyZXR1cm4gYztmb3IoZD0wLGc9Yi5sZW5ndGg7Zz5kO2QrPTEpXCJyb290XCI9PT1iW2RdJiYoaj1hW2RdLGs9YyxlKGosaykpO2ZvcihpIGluIGMpaWYoYy5oYXNPd25Qcm9wZXJ0eShpKSl7aWYoaD1iLmluZGV4T2YoaSksLTEhPT1oKWlmKGo9YVtoXSxqLmlzQXJyYXkpZm9yKGw9Y1tpK1wiX2FzQXJyYXlcIl0sZD0wLGc9bC5sZW5ndGg7Zz5kO2QrPTEpaz1sW2RdLGUoaixrKTtlbHNlIGs9Y1tpXSxlKGosayk7ZihjW2ldKX1yZXR1cm4gY307cmV0dXJue3J1bjpmfX1pZihmdW5jdGlvbihhKXthKHZvaWQgMCxRPXt9KX0oZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5zdGFjayYmXCJvYmplY3RcIj09dHlwZW9mIGEmJm51bGwhPT1hJiZhLnN0YWNrJiYtMT09PWEuc3RhY2suaW5kZXhPZihOKSYmKGEuc3RhY2s9ZChhLnN0YWNrKStcIlxcblwiK04rXCJcXG5cIitkKGIuc3RhY2spKX1mdW5jdGlvbiBkKGEpe2Zvcih2YXIgYT1hLnNwbGl0KFwiXFxuXCIpLGI9W10sYz0wO2M8YS5sZW5ndGg7KytjKXt2YXIgZCxlPWFbY107aWYoZD0vYXQgLisgXFwoKC4qKTooXFxkKyk6XFxkK1xcKS8uZXhlYyhlKSl7dmFyIGY9ZFsyXTtkPWRbMV09PT13JiZmPj14JiZUPj1mfWVsc2UgZD0hMTshZCYmISgtMSE9PWUuaW5kZXhPZihcIihtb2R1bGUuanM6XCIpfHwtMSE9PWUuaW5kZXhPZihcIihub2RlLmpzOlwiKSkmJmIucHVzaChlKX1yZXR1cm4gYi5qb2luKFwiXFxuXCIpfWZ1bmN0aW9uIGUoKXtpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSl7dmFyIGEsYixjPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO3JldHVybiBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1mdW5jdGlvbihjLGQpe2E9ZFsxXS5nZXRGaWxlTmFtZSgpLGI9ZFsxXS5nZXRMaW5lTnVtYmVyKCl9LEVycm9yKCkuc3RhY2ssRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9Yyx3PWEsYn19ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNvbnNvbGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGIrXCIgaXMgZGVwcmVjYXRlZCwgdXNlIFwiK2MrXCIgaW5zdGVhZC5cIixFcnJvcihcIlwiKS5zdGFjayksYS5hcHBseShhLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGcoKXtmdW5jdGlvbiBhKGEpe2MmJihiPW4oYSksSChjLGZ1bmN0aW9uKGEsYyl7QShmdW5jdGlvbigpe2IucHJvbWlzZURpc3BhdGNoLmFwcGx5KGIsYyl9KX0sdm9pZCAwKSxkPWM9dm9pZCAwKX12YXIgYixjPVtdLGQ9W10sZT1LKGcucHJvdG90eXBlKSxmPUsoaC5wcm90b3R5cGUpO3JldHVybiBmLnByb21pc2VEaXNwYXRjaD1mdW5jdGlvbihhLGUsZil7dmFyIGc9Ryhhcmd1bWVudHMpO2M/KGMucHVzaChnKSxcIndoZW5cIj09PWUmJmZbMV0mJmQucHVzaChmWzFdKSk6QShmdW5jdGlvbigpe2IucHJvbWlzZURpc3BhdGNoLmFwcGx5KGIsZyl9KX0sZi52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIGM/ZjpiLnZhbHVlT2YoKX0sRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShmLGcpLGYuc3RhY2s9Zi5zdGFjay5zdWJzdHJpbmcoZi5zdGFjay5pbmRleE9mKFwiXFxuXCIpKzEpKSx6KGYpLGUucHJvbWlzZT1mLGUucmVzb2x2ZT1hLGUucmVqZWN0PWZ1bmN0aW9uKGIpe2EobShiKSl9LGUubm90aWZ5PWZ1bmN0aW9uKGEpe2MmJkgoZCxmdW5jdGlvbihiLGMpe0EoZnVuY3Rpb24oKXtjKGEpfSl9LHZvaWQgMCl9LGV9ZnVuY3Rpb24gaChhLGIsYyxkKXt2b2lkIDA9PT1iJiYoYj1mdW5jdGlvbihhKXtyZXR1cm4gbShFcnJvcihcIlByb21pc2UgZG9lcyBub3Qgc3VwcG9ydCBvcGVyYXRpb246IFwiK2EpKX0pO3ZhciBlPUsoaC5wcm90b3R5cGUpO3JldHVybiBlLnByb21pc2VEaXNwYXRjaD1mdW5jdGlvbihjLGQsZil7dmFyIGc7dHJ5e2c9YVtkXT9hW2RdLmFwcGx5KGUsZik6Yi5jYWxsKGUsZCxmKX1jYXRjaChoKXtnPW0oaCl9YyYmYyhnKX0sYyYmKGUudmFsdWVPZj1jKSxkJiYoZS5leGNlcHRpb249ZCkseihlKSxlfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGooYSk/YS52YWx1ZU9mKCk6YX1mdW5jdGlvbiBqKGEpe3JldHVybiBhJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLnByb21pc2VEaXNwYXRjaH1mdW5jdGlvbiBrKGEpe3JldHVybiFqKGkoYSkpfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGE9aShhKSxqKGEpJiZcImV4Y2VwdGlvblwiaW4gYX1mdW5jdGlvbiBtKGEpe3ZhciBhPWF8fEVycm9yKCksYj1oKHt3aGVuOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBjPUkoUCx0aGlzKTstMSE9PWMmJihRLnNwbGljZShjLDEpLFAuc3BsaWNlKGMsMSkpfXJldHVybiBiP2IoYSk6bShhKX19LGZ1bmN0aW9uKCl7cmV0dXJuIG0oYSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGEpO3JldHVybiFPJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYhd2luZG93LlRvdWNoJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2coXCJTaG91bGQgYmUgZW1wdHk6XCIsUSksTz0hMCxQLnB1c2goYiksUS5wdXNoKGEpLGJ9ZnVuY3Rpb24gbihhKXtpZihqKGEpKXJldHVybiBhO2lmKChhPWkoYSkpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLnRoZW4pe3ZhciBiPWcoKTtyZXR1cm4gYS50aGVuKGIucmVzb2x2ZSxiLnJlamVjdCxiLm5vdGlmeSksYi5wcm9taXNlfXJldHVybiBoKHt3aGVuOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGdldDpmdW5jdGlvbihiKXtyZXR1cm4gYVtiXX0scHV0OmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGFbYl09YyxhfSxkZWw6ZnVuY3Rpb24oYil7cmV0dXJuIGRlbGV0ZSBhW2JdLGF9LHBvc3Q6ZnVuY3Rpb24oYixjKXtyZXR1cm4gYVtiXS5hcHBseShhLGMpfSxhcHBseTpmdW5jdGlvbihiKXtyZXR1cm4gYS5hcHBseSh2b2lkIDAsYil9LGtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gTChhKX19LHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBhfSl9ZnVuY3Rpb24gbyhhLGIsZCxlKXtmdW5jdGlvbiBmKGEpe3RyeXtyZXR1cm4gYj9iKGEpOmF9Y2F0Y2goYyl7cmV0dXJuIG0oYyl9fWZ1bmN0aW9uIGgoYSl7aWYoZCl7YyhhLGspO3RyeXtyZXR1cm4gZChhKX1jYXRjaChiKXtyZXR1cm4gbShiKX19cmV0dXJuIG0oYSl9dmFyIGk9ZygpLGo9ITEsaz1uKGEpO3JldHVybiBBKGZ1bmN0aW9uKCl7ay5wcm9taXNlRGlzcGF0Y2goZnVuY3Rpb24oYSl7anx8KGo9ITAsaS5yZXNvbHZlKGYoYSkpKX0sXCJ3aGVuXCIsW2Z1bmN0aW9uKGEpe2p8fChqPSEwLGkucmVzb2x2ZShoKGEpKSl9XSl9KSxrLnByb21pc2VEaXNwYXRjaCh2b2lkIDAsXCJ3aGVuXCIsW3ZvaWQgMCxmdW5jdGlvbihhKXtpLm5vdGlmeShlP2UoYSk6YSl9XSksaS5wcm9taXNlfWZ1bmN0aW9uIHAoYSxiLGMpe3JldHVybiBvKGEsZnVuY3Rpb24oYSl7cmV0dXJuIHQoYSkudGhlbihmdW5jdGlvbihhKXtyZXR1cm4gYi5hcHBseSh2b2lkIDAsYSl9LGMpfSxjKX1mdW5jdGlvbiBxKGEsYixjKXt2YXIgZD1nKCk7cmV0dXJuIEEoZnVuY3Rpb24oKXtuKGEpLnByb21pc2VEaXNwYXRjaChkLnJlc29sdmUsYixjKX0pLGQucHJvbWlzZX1mdW5jdGlvbiByKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1HKGFyZ3VtZW50cywxKTtyZXR1cm4gcShiLGEsYyl9fWZ1bmN0aW9uIHMoYSl7dmFyIGI9Ryhhcmd1bWVudHMsMSk7cmV0dXJuIFMoYSxiKX1mdW5jdGlvbiB0KGEpe3JldHVybiBvKGEsZnVuY3Rpb24oYSl7dmFyIGI9YS5sZW5ndGg7aWYoMD09PWIpcmV0dXJuIG4oYSk7dmFyIGM9ZygpO3JldHVybiBIKGEsZnVuY3Rpb24oZCxlLGYpe2soZSk/KGFbZl09aShlKSwwPT09LS1iJiZjLnJlc29sdmUoYSkpOm8oZSxmdW5jdGlvbihkKXthW2ZdPWQsMD09PS0tYiYmYy5yZXNvbHZlKGEpfSkuZmFpbChjLnJlamVjdCl9LHZvaWQgMCksYy5wcm9taXNlfSl9ZnVuY3Rpb24gdShhLGIpe3JldHVybiBvKGEsdm9pZCAwLGIpfWZ1bmN0aW9uIHYoYSxiKXt2YXIgYz1HKGFyZ3VtZW50cywyKSxkPWcoKTtyZXR1cm4gYy5wdXNoKGQubWFrZU5vZGVSZXNvbHZlcigpKSxSKGEsYixjKS5mYWlsKGQucmVqZWN0KSxkLnByb21pc2V9dmFyIHcseD1lKCkseT1mdW5jdGlvbigpe30sej1PYmplY3QuZnJlZXplfHx5O1widW5kZWZpbmVkXCIhPXR5cGVvZiBjYWphVk0mJih6PWNhamFWTS5kZWYpO3ZhciBBO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBwcm9jZXNzKUE9cHJvY2Vzcy5uZXh0VGljaztlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHNldEltbWVkaWF0ZSlBPXNldEltbWVkaWF0ZTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCl7dmFyIEI9bmV3IE1lc3NhZ2VDaGFubmVsLEM9e30sRD1DO0IucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKCl7Qz1DLm5leHQ7dmFyIGE9Qy50YXNrO2RlbGV0ZSBDLnRhc2ssYSgpfSxBPWZ1bmN0aW9uKGEpe0Q9RC5uZXh0PXt0YXNrOmF9LEIucG9ydDIucG9zdE1lc3NhZ2UoMCl9fWVsc2UgQT1mdW5jdGlvbihhKXtzZXRUaW1lb3V0KGEsMCl9O3ZhciBFO0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kPyhFPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLEU9RS5iaW5kKEUuY2FsbCkpOkU9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuY2FsbC5hcHBseShhLGFyZ3VtZW50cyl9fTt2YXIgRixHPUUoQXJyYXkucHJvdG90eXBlLnNsaWNlKSxIPUUoQXJyYXkucHJvdG90eXBlLnJlZHVjZXx8ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDs7KXtpZihjIGluIHRoaXMpe2I9dGhpc1tjKytdO2JyZWFrfWlmKCsrYz49ZCl0aHJvdyBuZXcgVHlwZUVycm9yfWZvcig7ZD5jO2MrKyljIGluIHRoaXMmJihiPWEoYix0aGlzW2NdLGMpKTtyZXR1cm4gYn0pLEk9RShBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxlbmd0aDtiKyspaWYodGhpc1tiXT09PWEpcmV0dXJuIGI7cmV0dXJuLTF9KSxKPUUoQXJyYXkucHJvdG90eXBlLm1hcHx8ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9W107cmV0dXJuIEgoYyxmdW5jdGlvbihlLGYsZyl7ZC5wdXNoKGEuY2FsbChiLGYsZyxjKSl9LHZvaWQgMCksZH0pLEs9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe31yZXR1cm4gYi5wcm90b3R5cGU9YSxuZXcgYn0sTD1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYiBpbiBhKWMucHVzaChiKTtyZXR1cm4gY30sTT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO0Y9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFJldHVyblZhbHVlP1JldHVyblZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMudmFsdWU9YX07dmFyIE49XCJGcm9tIHByZXZpb3VzIGV2ZW50OlwiO2IubmV4dFRpY2s9QSxiLmRlZmVyPWcsZy5wcm90b3R5cGUubWFrZU5vZGVSZXNvbHZlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Yj9hLnJlamVjdChiKTphcmd1bWVudHMubGVuZ3RoPjI/YS5yZXNvbHZlKEcoYXJndW1lbnRzLDEpKTphLnJlc29sdmUoYyl9fSxiLnByb21pc2U9ZnVuY3Rpb24oYSl7dmFyIGI9ZygpO3JldHVybiBzKGEsYi5yZXNvbHZlLGIucmVqZWN0LGIubm90aWZ5KS5mYWlsKGIucmVqZWN0KSxiLnByb21pc2V9LGIubWFrZVByb21pc2U9aCxoLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbyh0aGlzLGEsYixjKX0saC5wcm90b3R5cGUudGhlblJlc29sdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIG8odGhpcyxmdW5jdGlvbigpe3JldHVybiBhfSl9LEgoXCJpc1Jlc29sdmVkIGlzRnVsZmlsbGVkIGlzUmVqZWN0ZWQgZGlzcGF0Y2ggd2hlbiBzcHJlYWQgZ2V0IHB1dCBkZWwgcG9zdCBzZW5kIGludm9rZSBrZXlzIGZhcHBseSBmY2FsbCBmYmluZCBhbGwgYWxsUmVzb2x2ZWQgdGltZW91dCBkZWxheSBjYXRjaCBmaW5hbGx5IGZhaWwgZmluIHByb2dyZXNzIGVuZCBkb25lIG5mY2FsbCBuZmFwcGx5IG5mYmluZCBuY2FsbCBuYXBwbHkgbmJpbmQgbnBvc3QgbnNlbmQgbmludm9rZSBuZW5kIG5vZGVpZnlcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oYSxjKXtoLnByb3RvdHlwZVtjXT1mdW5jdGlvbigpe3JldHVybiBiW2NdLmFwcGx5KGIsW3RoaXNdLmNvbmNhdChHKGFyZ3VtZW50cykpKX19LHZvaWQgMCksaC5wcm90b3R5cGUudG9Tb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpfSxoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiW29iamVjdCBQcm9taXNlXVwifSx6KGgucHJvdG90eXBlKSxiLm5lYXJlcj1pLGIuaXNQcm9taXNlPWosYi5pc1Jlc29sdmVkPWZ1bmN0aW9uKGEpe3JldHVybiBrKGEpfHxsKGEpfSxiLmlzRnVsZmlsbGVkPWssYi5pc1JlamVjdGVkPWw7dmFyIE8sUD1bXSxRPVtdO2IucmVqZWN0PW0sYi5yZXNvbHZlPW4sYi5tYXN0ZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIGgoe2lzRGVmOmZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24oYixjKXtyZXR1cm4gcShhLGIsYyl9LGZ1bmN0aW9uKCl7cmV0dXJuIGkoYSl9KX0sYi53aGVuPW8sYi5zcHJlYWQ9cCxiLmFzeW5jPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZjt0cnl7Zj1jW2FdKGIpfWNhdGNoKGcpe3JldHVyblwiW29iamVjdCBTdG9wSXRlcmF0aW9uXVwiPT09TShnKXx8ZyBpbnN0YW5jZW9mIEY/Zy52YWx1ZTptKGcpfXJldHVybiBvKGYsZCxlKX12YXIgYz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxkPWIuYmluZChiLFwic2VuZFwiKSxlPWIuYmluZChiLFwidGhyb3dcIik7cmV0dXJuIGQoKX19LGJbXCJyZXR1cm5cIl09ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEYoYSl9LGIucHJvbWlzZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHAoW3RoaXMsdChhcmd1bWVudHMpXSxmdW5jdGlvbihiLGMpe3JldHVybiBhLmFwcGx5KGIsYyl9KX19LGIuZGlzcGF0Y2g9cSxiLmRpc3BhdGNoZXI9cixiLmdldD1yKFwiZ2V0XCIpLGIucHV0PXIoXCJwdXRcIiksYltcImRlbGV0ZVwiXT1iLmRlbD1yKFwiZGVsXCIpO3ZhciBSPWIucG9zdD1yKFwicG9zdFwiKTtiLnNlbmQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1HKGFyZ3VtZW50cywyKTtyZXR1cm4gUihhLGIsYyl9LGIuaW52b2tlPWYoYi5zZW5kLFwiaW52b2tlXCIsXCJzZW5kXCIpO3ZhciBTPWIuZmFwcGx5PXIoXCJhcHBseVwiKTtiW1widHJ5XCJdPXMsYi5mY2FsbD1zLGIuZmJpbmQ9ZnVuY3Rpb24oYSl7dmFyIGI9Ryhhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9Yi5jb25jYXQoRyhhcmd1bWVudHMpKTtyZXR1cm4gUyhhLGMpfX0sYi5rZXlzPXIoXCJrZXlzXCIpLGIuYWxsPXQsYi5hbGxSZXNvbHZlZD1mdW5jdGlvbihhKXtyZXR1cm4gbyhhLGZ1bmN0aW9uKGEpe3JldHVybiBvKHQoSihhLGZ1bmN0aW9uKGEpe3JldHVybiBvKGEseSx5KX0pKSxmdW5jdGlvbigpe3JldHVybiBKKGEsbil9KX0pfSxiW1wiY2F0Y2hcIl09Yi5mYWlsPXUsYi5wcm9ncmVzcz1mdW5jdGlvbihhLGIpe3JldHVybiBvKGEsdm9pZCAwLHZvaWQgMCxiKX0sYltcImZpbmFsbHlcIl09Yi5maW49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbyhhLGZ1bmN0aW9uKGEpe3JldHVybiBvKGIoKSxmdW5jdGlvbigpe3JldHVybiBhfSl9LGZ1bmN0aW9uKGEpe3JldHVybiBvKGIoKSxmdW5jdGlvbigpe3JldHVybiBtKGEpfSl9KX0sYi5kb25lPWZ1bmN0aW9uKGEsZCxlLGYpe2Q9ZHx8ZXx8Zj9vKGEsZCxlLGYpOmEsdShkLGZ1bmN0aW9uKGQpe0EoZnVuY3Rpb24oKXtpZihjKGQsYSksIWIub25lcnJvcil0aHJvdyBkO2Iub25lcnJvcihkKX0pfSl9LGIudGltZW91dD1mdW5jdGlvbihhLGIpe3ZhciBjPWcoKSxkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjLnJlamVjdChFcnJvcihcIlRpbWVkIG91dCBhZnRlciBcIitiK1wiIG1zXCIpKX0sYik7cmV0dXJuIG8oYSxmdW5jdGlvbihhKXtjbGVhclRpbWVvdXQoZCksYy5yZXNvbHZlKGEpfSxmdW5jdGlvbihhKXtjbGVhclRpbWVvdXQoZCksYy5yZWplY3QoYSl9KSxjLnByb21pc2V9LGIuZGVsYXk9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj1hLGE9dm9pZCAwKTt2YXIgYz1nKCk7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjLnJlc29sdmUoYSl9LGIpLGMucHJvbWlzZX0sYi5uZmFwcGx5PWZ1bmN0aW9uKGEsYil7dmFyIGM9RyhiKSxkPWcoKTtyZXR1cm4gYy5wdXNoKGQubWFrZU5vZGVSZXNvbHZlcigpKSxTKGEsYykuZmFpbChkLnJlamVjdCksZC5wcm9taXNlfSxiLm5mY2FsbD1mdW5jdGlvbihhKXt2YXIgYj1HKGFyZ3VtZW50cywxKSxjPWcoKTtyZXR1cm4gYi5wdXNoKGMubWFrZU5vZGVSZXNvbHZlcigpKSxTKGEsYikuZmFpbChjLnJlamVjdCksYy5wcm9taXNlfSxiLm5mYmluZD1mdW5jdGlvbihhKXt2YXIgYj1HKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1iLmNvbmNhdChHKGFyZ3VtZW50cykpLGQ9ZygpO3JldHVybiBjLnB1c2goZC5tYWtlTm9kZVJlc29sdmVyKCkpLFMoYSxjKS5mYWlsKGQucmVqZWN0KSxkLnByb21pc2V9fSxiLm5wb3N0PWZ1bmN0aW9uKGEsYixjKXt2YXIgYz1HKGMpLGQ9ZygpO3JldHVybiBjLnB1c2goZC5tYWtlTm9kZVJlc29sdmVyKCkpLFIoYSxiLGMpLmZhaWwoZC5yZWplY3QpLGQucHJvbWlzZX0sYi5uc2VuZD12LGIubmludm9rZT1mKHYsXCJuaW52b2tlXCIsXCJuc2VuZFwiKSxiLm5vZGVpZnk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj8oYS50aGVuKGZ1bmN0aW9uKGEpe0EoZnVuY3Rpb24oKXtiKG51bGwsYSl9KX0sZnVuY3Rpb24oYSl7QShmdW5jdGlvbigpe2IoYSl9KX0pLHZvaWQgMCk6YX07dmFyIFQ9ZSgpfSksZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9e1ZFUlNJT046XCIwLjUuM1wifTtiLlN5c3RlbT1mdW5jdGlvbigpe3RoaXMuX21hcHBpbmdzPXt9LHRoaXMuX291dGxldHM9e30sdGhpcy5faGFuZGxlcnM9e30sdGhpcy5zdHJpY3RJbmplY3Rpb25zPSEwLHRoaXMuYXV0b01hcE91dGxldHM9ITEsdGhpcy5wb3N0SW5qZWN0aW9uSG9vaz1cInNldHVwXCJ9LGIuU3lzdGVtLnByb3RvdHlwZT17X2NyZWF0ZUFuZFNldHVwSW5zdGFuY2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgYjtyZXR1cm4gdGhpcy5pbmplY3RJbnRvKGMsYSksY30sX3JldHJpZXZlRnJvbUNhY2hlT3JDcmVhdGU6ZnVuY3Rpb24oYSxiKXtcInVuZGVmaW5lZFwiPT10eXBlb2YgYiYmKGI9ITEpO3ZhciBjO2lmKCF0aGlzLl9tYXBwaW5ncy5oYXNPd25Qcm9wZXJ0eShhKSl0aHJvdyBuZXcgRXJyb3IoMWUzKTt2YXIgZD10aGlzLl9tYXBwaW5nc1thXTtyZXR1cm4hYiYmZC5pc1NpbmdsZXRvbj8obnVsbD09ZC5vYmplY3QmJihkLm9iamVjdD10aGlzLl9jcmVhdGVBbmRTZXR1cEluc3RhbmNlKGEsZC5jbGF6eikpLGM9ZC5vYmplY3QpOmM9ZC5jbGF6ej90aGlzLl9jcmVhdGVBbmRTZXR1cEluc3RhbmNlKGEsZC5jbGF6eik6ZC5vYmplY3QsY30sbWFwT3V0bGV0OmZ1bmN0aW9uKGEsYixjKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTAxMCk7cmV0dXJuIGI9Ynx8XCJnbG9iYWxcIixjPWN8fGEsdGhpcy5fb3V0bGV0cy5oYXNPd25Qcm9wZXJ0eShiKXx8KHRoaXMuX291dGxldHNbYl09e30pLHRoaXMuX291dGxldHNbYl1bY109YSx0aGlzfSxnZXRPYmplY3Q6ZnVuY3Rpb24oYSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKDEwMjApO3JldHVybiB0aGlzLl9yZXRyaWV2ZUZyb21DYWNoZU9yQ3JlYXRlKGEpfSxtYXBWYWx1ZTpmdW5jdGlvbihhLGIpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigxMDMwKTtyZXR1cm4gdGhpcy5fbWFwcGluZ3NbYV09e2NsYXp6Om51bGwsb2JqZWN0OmIsaXNTaW5nbGV0b246ITB9LHRoaXMuYXV0b01hcE91dGxldHMmJnRoaXMubWFwT3V0bGV0KGEpLHRoaXMuaGFzTWFwcGluZyhhKSYmdGhpcy5pbmplY3RJbnRvKGIsYSksdGhpc30saGFzTWFwcGluZzpmdW5jdGlvbihhKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTA0MCk7cmV0dXJuIHRoaXMuX21hcHBpbmdzLmhhc093blByb3BlcnR5KGEpfSxtYXBDbGFzczpmdW5jdGlvbihhLGIpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigxMDUwKTtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYil0aHJvdyBuZXcgRXJyb3IoMTA1MSk7cmV0dXJuIHRoaXMuX21hcHBpbmdzW2FdPXtjbGF6ejpiLG9iamVjdDpudWxsLGlzU2luZ2xldG9uOiExfSx0aGlzLmF1dG9NYXBPdXRsZXRzJiZ0aGlzLm1hcE91dGxldChhKSx0aGlzfSxtYXBTaW5nbGV0b246ZnVuY3Rpb24oYSxiKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTA2MCk7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGIpdGhyb3cgbmV3IEVycm9yKDEwNjEpO3JldHVybiB0aGlzLl9tYXBwaW5nc1thXT17Y2xheno6YixvYmplY3Q6bnVsbCxpc1NpbmdsZXRvbjohMH0sdGhpcy5hdXRvTWFwT3V0bGV0cyYmdGhpcy5tYXBPdXRsZXQoYSksdGhpc30saW5zdGFudGlhdGU6ZnVuY3Rpb24oYSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKDEwNzApO3JldHVybiB0aGlzLl9yZXRyaWV2ZUZyb21DYWNoZU9yQ3JlYXRlKGEsITApfSxpbmplY3RJbnRvOmZ1bmN0aW9uKGEsYil7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKDEwODApO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBhKXt2YXIgYz1bXTt0aGlzLl9vdXRsZXRzLmhhc093blByb3BlcnR5KFwiZ2xvYmFsXCIpJiZjLnB1c2godGhpcy5fb3V0bGV0cy5nbG9iYWwpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBiJiZ0aGlzLl9vdXRsZXRzLmhhc093blByb3BlcnR5KGIpJiZjLnB1c2godGhpcy5fb3V0bGV0c1tiXSk7Zm9yKHZhciBkIGluIGMpe3ZhciBlPWNbZF07Zm9yKHZhciBmIGluIGUpe3ZhciBnPWVbZl07KCF0aGlzLnN0cmljdEluamVjdGlvbnN8fGYgaW4gYSkmJihhW2ZdPXRoaXMuZ2V0T2JqZWN0KGcpKX19XCJzZXR1cFwiaW4gYSYmYS5zZXR1cC5jYWxsKGEpfXJldHVybiB0aGlzfSx1bm1hcDpmdW5jdGlvbihhKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTA5MCk7cmV0dXJuIGRlbGV0ZSB0aGlzLl9tYXBwaW5nc1thXSx0aGlzfSx1bm1hcE91dGxldDpmdW5jdGlvbihhLGIpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigxMTAwKTtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYil0aHJvdyBuZXcgRXJyb3IoMTEwMSk7cmV0dXJuIGRlbGV0ZSB0aGlzLl9vdXRsZXRzW2FdW2JdLHRoaXN9LG1hcEhhbmRsZXI6ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoMTExMCk7cmV0dXJuIGI9Ynx8XCJnbG9iYWxcIixjPWN8fGEsXCJ1bmRlZmluZWRcIj09dHlwZW9mIGQmJihkPSExKSxcInVuZGVmaW5lZFwiPT10eXBlb2YgZSYmKGU9ITEpLHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGEpfHwodGhpcy5faGFuZGxlcnNbYV09e30pLHRoaXMuX2hhbmRsZXJzW2FdLmhhc093blByb3BlcnR5KGIpfHwodGhpcy5faGFuZGxlcnNbYV1bYl09W10pLHRoaXMuX2hhbmRsZXJzW2FdW2JdLnB1c2goe2hhbmRsZXI6YyxvbmVTaG90OmQscGFzc0V2ZW50OmV9KSx0aGlzfSx1bm1hcEhhbmRsZXI6ZnVuY3Rpb24oYSxiLGMpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcigxMTIwKTtpZihiPWJ8fFwiZ2xvYmFsXCIsYz1jfHxhLHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGEpJiZ0aGlzLl9oYW5kbGVyc1thXS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGQ9dGhpcy5faGFuZGxlcnNbYV1bYl07Zm9yKHZhciBlIGluIGQpe3ZhciBmPWRbZV07aWYoZi5oYW5kbGVyPT09Yyl7ZC5zcGxpY2UoZSwxKTticmVha319fXJldHVybiB0aGlzfSxub3RpZnk6ZnVuY3Rpb24oYSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKDExMzApO3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksYz1iLnNsaWNlKDEpO2lmKHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgZD10aGlzLl9oYW5kbGVyc1thXTtmb3IodmFyIGUgaW4gZCl7dmFyIGYsZz1kW2VdO1wiZ2xvYmFsXCIhPT1lJiYoZj10aGlzLmdldE9iamVjdChlKSk7dmFyIGgsaSxqPVtdO2ZvcihoPTAsaT1nLmxlbmd0aDtpPmg7aCsrKXt2YXIgayxsPWdbaF07az1mJiZcInN0cmluZ1wiPT10eXBlb2YgbC5oYW5kbGVyP2ZbbC5oYW5kbGVyXTpsLmhhbmRsZXIsbC5vbmVTaG90JiZqLnVuc2hpZnQoaCksbC5wYXNzRXZlbnQ/ay5hcHBseShmLGIpOmsuYXBwbHkoZixjKX1mb3IoaD0wLGk9ai5sZW5ndGg7aT5oO2grKylnLnNwbGljZShqW2hdLDEpfX1yZXR1cm4gdGhpc319LGEuZGlqb249Yn0odGhpcyksXCJ1bmRlZmluZWRcIj09dHlwZW9mIHV0aWxzKXZhciB1dGlscz17fTtcInVuZGVmaW5lZFwiPT10eXBlb2YgdXRpbHMuTWF0aCYmKHV0aWxzLk1hdGg9e30pLHV0aWxzLk1hdGgudG82NEJpdE51bWJlcj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZTtyZXR1cm4gYz1uZXcgZ29vZy5tYXRoLkxvbmcoMCxiKSxkPW5ldyBnb29nLm1hdGguTG9uZyhhLDApLGU9Yy5hZGQoZCksZS50b051bWJlcigpfSxnb29nPXt9LGdvb2cubWF0aD17fSxnb29nLm1hdGguTG9uZz1mdW5jdGlvbihhLGIpe3RoaXMubG93Xz0wfGEsdGhpcy5oaWdoXz0wfGJ9LGdvb2cubWF0aC5Mb25nLkludENhY2hlXz17fSxnb29nLm1hdGguTG9uZy5mcm9tSW50PWZ1bmN0aW9uKGEpe2lmKGE+PS0xMjgmJjEyOD5hKXt2YXIgYj1nb29nLm1hdGguTG9uZy5JbnRDYWNoZV9bYV07aWYoYilyZXR1cm4gYn12YXIgYz1uZXcgZ29vZy5tYXRoLkxvbmcoMHxhLDA+YT8tMTowKTtyZXR1cm4gYT49LTEyOCYmMTI4PmEmJihnb29nLm1hdGguTG9uZy5JbnRDYWNoZV9bYV09YyksY30sZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcj1mdW5jdGlvbihhKXtyZXR1cm4gaXNOYU4oYSl8fCFpc0Zpbml0ZShhKT9nb29nLm1hdGguTG9uZy5aRVJPOmE8PS1nb29nLm1hdGguTG9uZy5UV09fUFdSXzYzX0RCTF8/Z29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFOmErMT49Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl82M19EQkxfP2dvb2cubWF0aC5Mb25nLk1BWF9WQUxVRTowPmE/Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcigtYSkubmVnYXRlKCk6bmV3IGdvb2cubWF0aC5Mb25nKDB8YSVnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8sMHxhL2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXyl9LGdvb2cubWF0aC5Mb25nLmZyb21CaXRzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBnb29nLm1hdGguTG9uZyhhLGIpfSxnb29nLm1hdGguTG9uZy5mcm9tU3RyaW5nPWZ1bmN0aW9uKGEsYil7aWYoMD09YS5sZW5ndGgpdGhyb3cgRXJyb3IoXCJudW1iZXIgZm9ybWF0IGVycm9yOiBlbXB0eSBzdHJpbmdcIik7dmFyIGM9Ynx8MTA7aWYoMj5jfHxjPjM2KXRocm93IEVycm9yKFwicmFkaXggb3V0IG9mIHJhbmdlOiBcIitjKTtpZihcIi1cIj09YS5jaGFyQXQoMCkpcmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21TdHJpbmcoYS5zdWJzdHJpbmcoMSksYykubmVnYXRlKCk7aWYoYS5pbmRleE9mKFwiLVwiKT49MCl0aHJvdyBFcnJvcignbnVtYmVyIGZvcm1hdCBlcnJvcjogaW50ZXJpb3IgXCItXCIgY2hhcmFjdGVyOiAnK2EpO2Zvcih2YXIgZD1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKE1hdGgucG93KGMsOCkpLGU9Z29vZy5tYXRoLkxvbmcuWkVSTyxmPTA7ZjxhLmxlbmd0aDtmKz04KXt2YXIgZz1NYXRoLm1pbig4LGEubGVuZ3RoLWYpLGg9cGFyc2VJbnQoYS5zdWJzdHJpbmcoZixmK2cpLGMpO2lmKDg+Zyl7dmFyIGk9Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihNYXRoLnBvdyhjLGcpKTtlPWUubXVsdGlwbHkoaSkuYWRkKGdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoaCkpfWVsc2UgZT1lLm11bHRpcGx5KGQpLGU9ZS5hZGQoZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihoKSl9cmV0dXJuIGV9LGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMTZfREJMXz02NTUzNixnb29nLm1hdGguTG9uZy5UV09fUFdSXzI0X0RCTF89MTw8MjQsZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMl9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMTZfREJMXypnb29nLm1hdGguTG9uZy5UV09fUFdSXzE2X0RCTF8sZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMV9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXy8yLGdvb2cubWF0aC5Mb25nLlRXT19QV1JfNDhfREJMXz1nb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8qZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8xNl9EQkxfLGdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjRfREJMXz1nb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8qZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMl9EQkxfLGdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjNfREJMXz1nb29nLm1hdGguTG9uZy5UV09fUFdSXzY0X0RCTF8vMixnb29nLm1hdGguTG9uZy5aRVJPPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMCksZ29vZy5tYXRoLkxvbmcuT05FPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMSksZ29vZy5tYXRoLkxvbmcuTkVHX09ORT1nb29nLm1hdGguTG9uZy5mcm9tSW50KC0xKSxnb29nLm1hdGguTG9uZy5NQVhfVkFMVUU9Z29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoLTEsMjE0NzQ4MzY0NyksZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFPWdvb2cubWF0aC5Mb25nLmZyb21CaXRzKDAsLTIxNDc0ODM2NDgpLGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMTw8MjQpLGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS50b0ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvd199LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hfKmdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXyt0aGlzLmdldExvd0JpdHNVbnNpZ25lZCgpfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oYSl7dmFyIGI9YXx8MTA7aWYoMj5ifHxiPjM2KXRocm93IEVycm9yKFwicmFkaXggb3V0IG9mIHJhbmdlOiBcIitiKTtpZih0aGlzLmlzWmVybygpKXJldHVyblwiMFwiO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXtpZih0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXt2YXIgYz1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKGIpLGQ9dGhpcy5kaXYoYyksZT1kLm11bHRpcGx5KGMpLnN1YnRyYWN0KHRoaXMpO3JldHVybiBkLnRvU3RyaW5nKGIpK2UudG9JbnQoKS50b1N0cmluZyhiKX1yZXR1cm5cIi1cIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGIpfWZvcih2YXIgZj1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKE1hdGgucG93KGIsNikpLGU9dGhpcyxnPVwiXCI7Oyl7dmFyIGg9ZS5kaXYoZiksaT1lLnN1YnRyYWN0KGgubXVsdGlwbHkoZikpLnRvSW50KCksaj1pLnRvU3RyaW5nKGIpO2lmKGU9aCxlLmlzWmVybygpKXJldHVybiBqK2c7Zm9yKDtqLmxlbmd0aDw2OylqPVwiMFwiK2o7Zz1cIlwiK2orZ319LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5nZXRIaWdoQml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hffSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0TG93Qml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvd199LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5nZXRMb3dCaXRzVW5zaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dfPj0wP3RoaXMubG93Xzpnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8rdGhpcy5sb3dffSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0TnVtQml0c0Ficz1mdW5jdGlvbigpe2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpPzY0OnRoaXMubmVnYXRlKCkuZ2V0TnVtQml0c0FicygpO2Zvcih2YXIgYT0wIT10aGlzLmhpZ2hfP3RoaXMuaGlnaF86dGhpcy5sb3dfLGI9MzE7Yj4wJiYwPT0oYSYxPDxiKTtiLS0pO3JldHVybiAwIT10aGlzLmhpZ2hfP2IrMzM6YisxfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PXRoaXMuaGlnaF8mJjA9PXRoaXMubG93X30sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmlzTmVnYXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoXzwwfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNPZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09KDEmdGhpcy5sb3dfKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oaWdoXz09YS5oaWdoXyYmdGhpcy5sb3dfPT1hLmxvd199LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ub3RFcXVhbHM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGlnaF8hPWEuaGlnaF98fHRoaXMubG93XyE9YS5sb3dffSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubGVzc1RoYW49ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcGFyZShhKTwwfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubGVzc1RoYW5PckVxdWFsPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbXBhcmUoYSk8PTB9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ncmVhdGVyVGhhbj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb21wYXJlKGEpPjB9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcGFyZShhKT49MH0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oYSl7aWYodGhpcy5lcXVhbHMoYSkpcmV0dXJuIDA7dmFyIGI9dGhpcy5pc05lZ2F0aXZlKCksYz1hLmlzTmVnYXRpdmUoKTtyZXR1cm4gYiYmIWM/LTE6IWImJmM/MTp0aGlzLnN1YnRyYWN0KGEpLmlzTmVnYXRpdmUoKT8tMToxfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubmVnYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSk/Z29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFOnRoaXMubm90KCkuYWRkKGdvb2cubWF0aC5Mb25nLk9ORSl9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oaWdoXz4+PjE2LGM9NjU1MzUmdGhpcy5oaWdoXyxkPXRoaXMubG93Xz4+PjE2LGU9NjU1MzUmdGhpcy5sb3dfLGY9YS5oaWdoXz4+PjE2LGc9NjU1MzUmYS5oaWdoXyxoPWEubG93Xz4+PjE2LGk9NjU1MzUmYS5sb3dfLGo9MCxrPTAsbD0wLG09MDtyZXR1cm4gbSs9ZStpLGwrPW0+Pj4xNixtJj02NTUzNSxsKz1kK2gsays9bD4+PjE2LGwmPTY1NTM1LGsrPWMrZyxqKz1rPj4+MTYsayY9NjU1MzUsais9YitmLGomPTY1NTM1LGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGw8PDE2fG0sajw8MTZ8ayl9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5zdWJ0cmFjdD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQoYS5uZWdhdGUoKSl9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbihhKXtpZih0aGlzLmlzWmVybygpKXJldHVybiBnb29nLm1hdGguTG9uZy5aRVJPO2lmKGEuaXNaZXJvKCkpcmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk87aWYodGhpcy5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSlyZXR1cm4gYS5pc09kZCgpP2dvb2cubWF0aC5Mb25nLk1JTl9WQUxVRTpnb29nLm1hdGguTG9uZy5aRVJPO2lmKGEuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMuaXNPZGQoKT9nb29nLm1hdGguTG9uZy5NSU5fVkFMVUU6Z29vZy5tYXRoLkxvbmcuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gYS5pc05lZ2F0aXZlKCk/dGhpcy5uZWdhdGUoKS5tdWx0aXBseShhLm5lZ2F0ZSgpKTp0aGlzLm5lZ2F0ZSgpLm11bHRpcGx5KGEpLm5lZ2F0ZSgpO2lmKGEuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bHRpcGx5KGEubmVnYXRlKCkpLm5lZ2F0ZSgpO2lmKHRoaXMubGVzc1RoYW4oZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8yNF8pJiZhLmxlc3NUaGFuKGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfKSlyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkqYS50b051bWJlcigpKTt2YXIgYj10aGlzLmhpZ2hfPj4+MTYsYz02NTUzNSZ0aGlzLmhpZ2hfLGQ9dGhpcy5sb3dfPj4+MTYsZT02NTUzNSZ0aGlzLmxvd18sZj1hLmhpZ2hfPj4+MTYsZz02NTUzNSZhLmhpZ2hfLGg9YS5sb3dfPj4+MTYsaT02NTUzNSZhLmxvd18saj0wLGs9MCxsPTAsbT0wO3JldHVybiBtKz1lKmksbCs9bT4+PjE2LG0mPTY1NTM1LGwrPWQqaSxrKz1sPj4+MTYsbCY9NjU1MzUsbCs9ZSpoLGsrPWw+Pj4xNixsJj02NTUzNSxrKz1jKmksais9az4+PjE2LGsmPTY1NTM1LGsrPWQqaCxqKz1rPj4+MTYsayY9NjU1MzUsays9ZSpnLGorPWs+Pj4xNixrJj02NTUzNSxqKz1iKmkrYypoK2QqZytlKmYsaiY9NjU1MzUsZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHMobDw8MTZ8bSxqPDwxNnxrKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmRpdj1mdW5jdGlvbihhKXtpZihhLmlzWmVybygpKXRocm93IEVycm9yKFwiZGl2aXNpb24gYnkgemVyb1wiKTtpZih0aGlzLmlzWmVybygpKXJldHVybiBnb29nLm1hdGguTG9uZy5aRVJPO2lmKHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpe2lmKGEuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk9ORSl8fGEuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk5FR19PTkUpKXJldHVybiBnb29nLm1hdGguTG9uZy5NSU5fVkFMVUU7aWYoYS5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSlyZXR1cm4gZ29vZy5tYXRoLkxvbmcuT05FO3ZhciBiPXRoaXMuc2hpZnRSaWdodCgxKSxjPWIuZGl2KGEpLnNoaWZ0TGVmdCgxKTtpZihjLmVxdWFscyhnb29nLm1hdGguTG9uZy5aRVJPKSlyZXR1cm4gYS5pc05lZ2F0aXZlKCk/Z29vZy5tYXRoLkxvbmcuT05FOmdvb2cubWF0aC5Mb25nLk5FR19PTkU7dmFyIGQ9dGhpcy5zdWJ0cmFjdChhLm11bHRpcGx5KGMpKSxlPWMuYWRkKGQuZGl2KGEpKTtyZXR1cm4gZX1pZihhLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXJldHVybiBnb29nLm1hdGguTG9uZy5aRVJPO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBhLmlzTmVnYXRpdmUoKT90aGlzLm5lZ2F0ZSgpLmRpdihhLm5lZ2F0ZSgpKTp0aGlzLm5lZ2F0ZSgpLmRpdihhKS5uZWdhdGUoKTtpZihhLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5kaXYoYS5uZWdhdGUoKSkubmVnYXRlKCk7Zm9yKHZhciBmPWdvb2cubWF0aC5Mb25nLlpFUk8sZD10aGlzO2QuZ3JlYXRlclRoYW5PckVxdWFsKGEpOyl7Zm9yKHZhciBjPU1hdGgubWF4KDEsTWF0aC5mbG9vcihkLnRvTnVtYmVyKCkvYS50b051bWJlcigpKSksZz1NYXRoLmNlaWwoTWF0aC5sb2coYykvTWF0aC5MTjIpLGg9NDg+PWc/MTpNYXRoLnBvdygyLGctNDgpLGk9Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihjKSxqPWkubXVsdGlwbHkoYSk7ai5pc05lZ2F0aXZlKCl8fGouZ3JlYXRlclRoYW4oZCk7KWMtPWgsaT1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKGMpLGo9aS5tdWx0aXBseShhKTtpLmlzWmVybygpJiYoaT1nb29nLm1hdGguTG9uZy5PTkUpLGY9Zi5hZGQoaSksZD1kLnN1YnRyYWN0KGopfXJldHVybiBmfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubW9kdWxvPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN1YnRyYWN0KHRoaXMuZGl2KGEpLm11bHRpcGx5KGEpKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyh+dGhpcy5sb3dfLH50aGlzLmhpZ2hfKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmFuZD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHModGhpcy5sb3dfJmEubG93Xyx0aGlzLmhpZ2hfJmEuaGlnaF8pfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUub3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKHRoaXMubG93X3xhLmxvd18sdGhpcy5oaWdoX3xhLmhpZ2hfKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnhvcj1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHModGhpcy5sb3dfXmEubG93Xyx0aGlzLmhpZ2hfXmEuaGlnaF8pfSxnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuc2hpZnRMZWZ0PWZ1bmN0aW9uKGEpe2lmKGEmPTYzLDA9PWEpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5sb3dfO2lmKDMyPmEpe3ZhciBjPXRoaXMuaGlnaF87cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGI8PGEsYzw8YXxiPj4+MzItYSl9cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKDAsYjw8YS0zMil9LGdvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5zaGlmdFJpZ2h0PWZ1bmN0aW9uKGEpe2lmKGEmPTYzLDA9PWEpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5oaWdoXztpZigzMj5hKXt2YXIgYz10aGlzLmxvd187cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGM+Pj5hfGI8PDMyLWEsYj4+YSl9cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGI+PmEtMzIsYj49MD8wOi0xKX0sZ29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZD1mdW5jdGlvbihhKXtpZihhJj02MywwPT1hKXJldHVybiB0aGlzO3ZhciBiPXRoaXMuaGlnaF87aWYoMzI+YSl7dmFyIGM9dGhpcy5sb3dfO3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyhjPj4+YXxiPDwzMi1hLGI+Pj5hKX1yZXR1cm4gMzI9PWE/Z29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoYiwwKTpnb29nLm1hdGguTG9uZy5mcm9tQml0cyhiPj4+YS0zMiwwKX07dmFyIFVURjg9e307VVRGOC5lbmNvZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoOysrYyl7dmFyIGQ9YS5jaGFyQ29kZUF0KGMpOzEyOD5kP2IucHVzaChkKToyMDQ4PmQ/KGIucHVzaCgxOTJ8ZD4+NiksYi5wdXNoKDEyOHw2MyZkKSk6NjU1MzY+ZD8oYi5wdXNoKDIyNHxkPj4xMiksYi5wdXNoKDEyOHw2MyZkPj42KSxiLnB1c2goMTI4fDYzJmQpKTooYi5wdXNoKDI0MHxkPj4xOCksYi5wdXNoKDEyOHw2MyZkPj4xMiksYi5wdXNoKDEyOHw2MyZkPj42KSxiLnB1c2goMTI4fDYzJmQpKX1yZXR1cm4gYn0sVVRGOC5kZWNvZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoOyl7dmFyIGQ9YVtjKytdOzEyOD5kfHwoMjI0PmQ/KGQ9KDMxJmQpPDw2LGR8PTYzJmFbYysrXSk6MjQwPmQ/KGQ9KDE1JmQpPDwxMixkfD0oNjMmYVtjKytdKTw8NixkfD02MyZhW2MrK10pOihkPSg3JmQpPDwxOCxkfD0oNjMmYVtjKytdKTw8MTIsZHw9KDYzJmFbYysrXSk8PDYsZHw9NjMmYVtjKytdKSksYi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZCkpfXJldHVybiBiLmpvaW4oXCJcIil9O3ZhciBCQVNFNjQ9e307aWYoZnVuY3Rpb24oYil7dmFyIGM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZD1bXSxlPTB8YS5sZW5ndGgvMzswPGUtLTspe3ZhciBmPShhW2NdPDwxNikrKGFbYysxXTw8OCkrYVtjKzJdO2MrPTMsZC5wdXNoKGIuY2hhckF0KDYzJmY+PjE4KSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjEyKSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjYpKSxkLnB1c2goYi5jaGFyQXQoNjMmZikpfWlmKDI9PWEubGVuZ3RoLWMpe3ZhciBmPShhW2NdPDwxNikrKGFbYysxXTw8OCk7ZC5wdXNoKGIuY2hhckF0KDYzJmY+PjE4KSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjEyKSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjYpKSxkLnB1c2goXCI9XCIpfWVsc2UgaWYoMT09YS5sZW5ndGgtYyl7dmFyIGY9YVtjXTw8MTY7ZC5wdXNoKGIuY2hhckF0KDYzJmY+PjE4KSksZC5wdXNoKGIuY2hhckF0KDYzJmY+PjEyKSksZC5wdXNoKFwiPT1cIil9cmV0dXJuIGQuam9pbihcIlwiKX0sZD1mdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7YzxiLmxlbmd0aDsrK2MpYVtiLmNoYXJDb2RlQXQoYyldPWM7cmV0dXJuIGFbXCI9XCIuY2hhckNvZGVBdCgwKV09MCxhfSgpLGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1bXSxlPTB8YS5sZW5ndGgvNDswPGUtLTspe3ZhciBmPShkW2EuY2hhckNvZGVBdChiKV08PDE4KSsoZFthLmNoYXJDb2RlQXQoYisxKV08PDEyKSsoZFthLmNoYXJDb2RlQXQoYisyKV08PDYpK2RbYS5jaGFyQ29kZUF0KGIrMyldO2MucHVzaCgyNTUmZj4+MTYpLGMucHVzaCgyNTUmZj4+OCksYy5wdXNoKDI1NSZmKSxiKz00fXJldHVybiBjJiYoXCI9XCI9PWEuY2hhckF0KGItMik/KGMucG9wKCksYy5wb3AoKSk6XCI9XCI9PWEuY2hhckF0KGItMSkmJmMucG9wKCkpLGN9LGY9e307Zi5lbmNvZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoOysrYyliLnB1c2goYS5jaGFyQ29kZUF0KGMpKTtyZXR1cm4gYn0sZi5kZWNvZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPHMubGVuZ3RoOysrYilhW2JdPVN0cmluZy5mcm9tQ2hhckNvZGUoYVtiXSk7cmV0dXJuIGEuam9pbihcIlwiKX0sQkFTRTY0LmRlY29kZUFycmF5PWZ1bmN0aW9uKGEpe3ZhciBiPWUoYSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KGIpfSxCQVNFNjQuZW5jb2RlQVNDSUk9ZnVuY3Rpb24oYSl7dmFyIGI9Zi5lbmNvZGUoYSk7cmV0dXJuIGMoYil9LEJBU0U2NC5kZWNvZGVBU0NJST1mdW5jdGlvbihhKXt2YXIgYj1lKGEpO3JldHVybiBmLmRlY29kZShiKX0sQkFTRTY0LmVuY29kZT1mdW5jdGlvbihhKXt2YXIgYj1VVEY4LmVuY29kZShhKTtyZXR1cm4gYyhiKX0sQkFTRTY0LmRlY29kZT1mdW5jdGlvbihhKXt2YXIgYj1lKGEpO3JldHVybiBVVEY4LmRlY29kZShiKX19KFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiKSx2b2lkIDA9PT1idG9hKXZhciBidG9hPUJBU0U2NC5lbmNvZGU7aWYodm9pZCAwPT09YXRvYil2YXIgYXRvYj1CQVNFNjQuZGVjb2RlO01lZGlhUGxheWVyPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiLGMsZCxlLGYsZz1cIjEuMC4wXCIsaD1hLGk9ITEsaj0hMSxrPSEwLGw9ITEsbT1NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfU0laRV9SRVFVSVJFRCxuPWZ1bmN0aW9uKCl7cmV0dXJuISFjJiYhIWR9LG89ZnVuY3Rpb24oKXtpZighaSl0aHJvd1wiTWVkaWFQbGF5ZXIgbm90IGluaXRpYWxpemVkIVwiO2lmKCF0aGlzLmNhcGFiaWxpdGllcy5zdXBwb3J0c01lZGlhU291cmNlKCkpcmV0dXJuIHRoaXMuZXJySGFuZGxlci5jYXBhYmlsaXR5RXJyb3IoXCJtZWRpYXNvdXJjZVwiKSx2b2lkIDA7aWYoIWN8fCFkKXRocm93XCJNaXNzaW5nIHZpZXcgb3Igc291cmNlLlwiO2o9ITAsdGhpcy5kZWJ1Zy5sb2coXCJQbGF5YmFjayBpbml0aWF0ZWQhXCIpLGU9Yi5nZXRPYmplY3QoXCJzdHJlYW1Db250cm9sbGVyXCIpLGUuc2V0VmlkZW9Nb2RlbChmKSxlLnNldEF1dG9QbGF5KGspLGUubG9hZChkKSxiLm1hcFZhbHVlKFwic2NoZWR1bGVXaGlsZVBhdXNlZFwiLGwpLGIubWFwT3V0bGV0KFwic2NoZWR1bGVXaGlsZVBhdXNlZFwiLFwic3RyZWFtXCIpLGIubWFwVmFsdWUoXCJidWZmZXJNYXhcIixtKSxiLmluamVjdEludG8odGhpcy5idWZmZXJFeHQsXCJidWZmZXJNYXhcIil9LHA9ZnVuY3Rpb24oKXtuKCkmJm8uY2FsbCh0aGlzKX07cmV0dXJuIGI9bmV3IGRpam9uLlN5c3RlbSxiLm1hcFZhbHVlKFwic3lzdGVtXCIsYiksYi5tYXBPdXRsZXQoXCJzeXN0ZW1cIiksYi5pbmplY3RJbnRvKGgpLHtkZWJ1Zzp2b2lkIDAsZXZlbnRCdXM6dm9pZCAwLGNhcGFiaWxpdGllczp2b2lkIDAsYWJyQ29udHJvbGxlcjp2b2lkIDAsbWV0cmljc01vZGVsOnZvaWQgMCxtZXRyaWNzRXh0OnZvaWQgMCxidWZmZXJFeHQ6dm9pZCAwLGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMuYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyl9LGdldFZlcnNpb246ZnVuY3Rpb24oKXtyZXR1cm4gZ30sc3RhcnR1cDpmdW5jdGlvbigpe2l8fChiLmluamVjdEludG8odGhpcyksaT0hMCl9LGdldERlYnVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVidWd9LGdldFZpZGVvTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gZn0sc2V0QXV0b1BsYXk6ZnVuY3Rpb24oYSl7az1hfSxnZXRBdXRvUGxheTpmdW5jdGlvbigpe3JldHVybiBrfSxzZXRTY2hlZHVsZVdoaWxlUGF1c2VkOmZ1bmN0aW9uKGEpe2w9YX0sZ2V0U2NoZWR1bGVXaGlsZVBhdXNlZDpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRCdWZmZXJNYXg6ZnVuY3Rpb24oYSl7bT1hfSxnZXRCdWZmZXJNYXg6ZnVuY3Rpb24oKXtyZXR1cm4gbX0sZ2V0TWV0cmljc0V4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1ldHJpY3NFeHR9LGdldE1ldHJpY3NGb3I6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZXRyaWNzTW9kZWwuZ2V0UmVhZE9ubHlNZXRyaWNzRm9yKGEpO3JldHVybiBifSxnZXRRdWFsaXR5Rm9yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFickNvbnRyb2xsZXIuZ2V0UXVhbGl0eUZvcihhKX0sc2V0UXVhbGl0eUZvcjpmdW5jdGlvbihhLGIpe3RoaXMuYWJyQ29udHJvbGxlci5zZXRQbGF5YmFja1F1YWxpdHkoYSxiKX0sZ2V0QXV0b1N3aXRjaFF1YWxpdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hYnJDb250cm9sbGVyLmdldEF1dG9Td2l0Y2hCaXRyYXRlKCl9LHNldEF1dG9Td2l0Y2hRdWFsaXR5OmZ1bmN0aW9uKGEpe3RoaXMuYWJyQ29udHJvbGxlci5zZXRBdXRvU3dpdGNoQml0cmF0ZShhKX0sYXR0YWNoVmlldzpmdW5jdGlvbihhKXtpZighaSl0aHJvd1wiTWVkaWFQbGF5ZXIgbm90IGluaXRpYWxpemVkIVwiO2M9YSxmPW51bGwsYyYmKGY9Yi5nZXRPYmplY3QoXCJ2aWRlb01vZGVsXCIpLGYuc2V0RWxlbWVudChjKSksaiYmZSYmKGUucmVzZXQoKSxlPW51bGwsaj0hMSksbi5jYWxsKHRoaXMpJiZwLmNhbGwodGhpcyl9LGF0dGFjaFNvdXJjZTpmdW5jdGlvbihhKXtpZighaSl0aHJvd1wiTWVkaWFQbGF5ZXIgbm90IGluaXRpYWxpemVkIVwiO2Q9YSx0aGlzLnNldFF1YWxpdHlGb3IoXCJ2aWRlb1wiLDApLHRoaXMuc2V0UXVhbGl0eUZvcihcImF1ZGlvXCIsMCksaiYmZSYmKGUucmVzZXQoKSxlPW51bGwsaj0hMSksbi5jYWxsKHRoaXMpJiZwLmNhbGwodGhpcyl9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5hdHRhY2hTb3VyY2UobnVsbCksdGhpcy5hdHRhY2hWaWV3KG51bGwpfSxwbGF5Om8saXNSZWFkeTpufX0sTWVkaWFQbGF5ZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllcn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzPXt9LE1lZGlhUGxheWVyLnV0aWxzPXt9LE1lZGlhUGxheWVyLm1vZGVscz17fSxNZWRpYVBsYXllci52bz17fSxNZWRpYVBsYXllci52by5tZXRyaWNzPXt9LE1lZGlhUGxheWVyLnJ1bGVzPXt9LE1lZGlhUGxheWVyLmRpPXt9LE1lZGlhUGxheWVyLmRpLkNvbnRleHQ9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm57c3lzdGVtOnZvaWQgMCxzZXR1cDpmdW5jdGlvbigpe3RoaXMuc3lzdGVtLmF1dG9NYXBPdXRsZXRzPSEwLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImRlYnVnXCIsTWVkaWFQbGF5ZXIudXRpbHMuRGVidWcpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImV2ZW50QnVzXCIsTWVkaWFQbGF5ZXIudXRpbHMuRXZlbnRCdXMpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImNhcGFiaWxpdGllc1wiLE1lZGlhUGxheWVyLnV0aWxzLkNhcGFiaWxpdGllcyksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwidGV4dFRyYWNrRXh0ZW5zaW9uc1wiLE1lZGlhUGxheWVyLnV0aWxzLlRleHRUcmFja0V4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcInZ0dFBhcnNlclwiLE1lZGlhUGxheWVyLnV0aWxzLlZUVFBhcnNlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJ2aWRlb01vZGVsXCIsTWVkaWFQbGF5ZXIubW9kZWxzLlZpZGVvTW9kZWwpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcIm1hbmlmZXN0TW9kZWxcIixNZWRpYVBsYXllci5tb2RlbHMuTWFuaWZlc3RNb2RlbCksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwibWV0cmljc01vZGVsXCIsTWVkaWFQbGF5ZXIubW9kZWxzLk1ldHJpY3NNb2RlbCksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJwcm90ZWN0aW9uTW9kZWxcIixNZWRpYVBsYXllci5tb2RlbHMuUHJvdGVjdGlvbk1vZGVsKSx0aGlzLnN5c3RlbS5tYXBTaW5nbGV0b24oXCJ0ZXh0VlRUU291cmNlQnVmZmVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlRleHRWVFRTb3VyY2VCdWZmZXIpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcIm1lZGlhU291cmNlRXh0XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1lZGlhU291cmNlRXh0ZW5zaW9ucyksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwic291cmNlQnVmZmVyRXh0XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNvdXJjZUJ1ZmZlckV4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImJ1ZmZlckV4dFwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zKSx0aGlzLnN5c3RlbS5tYXBTaW5nbGV0b24oXCJhYnJDb250cm9sbGVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkFickNvbnRyb2xsZXIpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcImVyckhhbmRsZXJcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRXJyb3JIYW5kbGVyKSx0aGlzLnN5c3RlbS5tYXBTaW5nbGV0b24oXCJwcm90ZWN0aW9uRXh0XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25FeHRlbnNpb25zKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcInByb3RlY3Rpb25Db250cm9sbGVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25Db250cm9sbGVyKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcIm1ldHJpY3NcIixNZWRpYVBsYXllci5tb2RlbHMuTWV0cmljc0xpc3QpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiZG93bmxvYWRSYXRpb1J1bGVcIixNZWRpYVBsYXllci5ydWxlcy5Eb3dubG9hZFJhdGlvUnVsZSksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJpbnN1ZmZpY2llbnRCdWZmZXJSdWxlXCIsTWVkaWFQbGF5ZXIucnVsZXMuSW5zdWZmaWNpZW50QnVmZmVyUnVsZSksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJsaW1pdFN3aXRjaGVzUnVsZVwiLE1lZGlhUGxheWVyLnJ1bGVzLkxpbWl0U3dpdGNoZXNSdWxlKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcImFiclJ1bGVzQ29sbGVjdGlvblwiLE1lZGlhUGxheWVyLnJ1bGVzLkJhc2VSdWxlc0NvbGxlY3Rpb24pLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwidGV4dENvbnRyb2xsZXJcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dENvbnRyb2xsZXIpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiYnVmZmVyQ29udHJvbGxlclwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJDb250cm9sbGVyKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcIm1hbmlmZXN0TG9hZGVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1hbmlmZXN0TG9hZGVyKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcIm1hbmlmZXN0VXBkYXRlclwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5NYW5pZmVzdFVwZGF0ZXIpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiZnJhZ21lbnRDb250cm9sbGVyXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkZyYWdtZW50Q29udHJvbGxlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJmcmFnbWVudExvYWRlclwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudExvYWRlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJmcmFnbWVudE1vZGVsXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkZyYWdtZW50TW9kZWwpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcInN0cmVhbUNvbnRyb2xsZXJcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtQ29udHJvbGxlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJzdHJlYW1cIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtKSx0aGlzLnN5c3RlbS5tYXBDbGFzcyhcInJlcXVlc3RTY2hlZHVsZXJcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUmVxdWVzdFNjaGVkdWxlciksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwic2NoZWR1bGVyRXh0XCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNjaGVkdWxlckV4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwic2NoZWR1bGVyTW9kZWxcIixNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU2NoZWR1bGVyTW9kZWwpXHJcbn19fSxEYXNoPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJue21vZHVsZXM6e30sZGVwZW5kZW5jaWVzOnt9LHZvOnt9LGRpOnt9fX0oKSxEYXNoLmRpLkRhc2hDb250ZXh0PWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJue3N5c3RlbTp2b2lkIDAsc2V0dXA6ZnVuY3Rpb24oKXtEYXNoLmRpLkRhc2hDb250ZXh0LnByb3RvdHlwZS5zZXR1cC5jYWxsKHRoaXMpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwicGFyc2VyXCIsRGFzaC5kZXBlbmRlbmNpZXMuRGFzaFBhcnNlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJpbmRleEhhbmRsZXJcIixEYXNoLmRlcGVuZGVuY2llcy5EYXNoSGFuZGxlciksdGhpcy5zeXN0ZW0ubWFwQ2xhc3MoXCJiYXNlVVJMRXh0XCIsRGFzaC5kZXBlbmRlbmNpZXMuQmFzZVVSTEV4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcENsYXNzKFwiZnJhZ21lbnRFeHRcIixEYXNoLmRlcGVuZGVuY2llcy5GcmFnbWVudEV4dGVuc2lvbnMpLHRoaXMuc3lzdGVtLm1hcFNpbmdsZXRvbihcIm1hbmlmZXN0RXh0XCIsRGFzaC5kZXBlbmRlbmNpZXMuRGFzaE1hbmlmZXN0RXh0ZW5zaW9ucyksdGhpcy5zeXN0ZW0ubWFwU2luZ2xldG9uKFwibWV0cmljc0V4dFwiLERhc2guZGVwZW5kZW5jaWVzLkRhc2hNZXRyaWNzRXh0ZW5zaW9ucyl9fX0sRGFzaC5kaS5EYXNoQ29udGV4dC5wcm90b3R5cGU9bmV3IE1lZGlhUGxheWVyLmRpLkNvbnRleHQsRGFzaC5kaS5EYXNoQ29udGV4dC5wcm90b3R5cGUuY29uc3RydWN0b3I9RGFzaC5kaS5EYXNoQ29udGV4dCxEYXNoLmRlcGVuZGVuY2llcy5CYXNlVVJMRXh0ZW5zaW9ucz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZSxmLGcsaCxpLGosayxsLG09bmV3IERhdGFWaWV3KGEpLG49e30sbz0wO1wic2lkeFwiIT09aiYmbzxtLmJ5dGVMZW5ndGg7KXtmb3Ioaz1tLmdldFVpbnQzMihvKSxvKz00LGo9XCJcIixmPTA7ND5mO2YrPTEpbD1tLmdldEludDgobyksais9U3RyaW5nLmZyb21DaGFyQ29kZShsKSxvKz0xO1wibW9vZlwiIT09aiYmXCJ0cmFmXCIhPT1qJiZcInNpZHhcIiE9PWo/bys9ay04Olwic2lkeFwiPT09aiYmKG8tPTgpfWlmKGU9bS5nZXRVaW50MzIobywhMSkrbyxlPmEuYnl0ZUxlbmd0aCl0aHJvd1wic2lkeCB0ZXJtaW5hdGVzIGFmdGVyIGFycmF5IGJ1ZmZlclwiO2ZvcihuLnZlcnNpb249bS5nZXRVaW50OChvKzgpLG8rPTEyLG4udGltZXNjYWxlPW0uZ2V0VWludDMyKG8rNCwhMSksbys9OCwwPT09bi52ZXJzaW9uPyhuLmVhcmxpZXN0X3ByZXNlbnRhdGlvbl90aW1lPW0uZ2V0VWludDMyKG8sITEpLG4uZmlyc3Rfb2Zmc2V0PW0uZ2V0VWludDMyKG8rNCwhMSksbys9OCk6KG4uZWFybGllc3RfcHJlc2VudGF0aW9uX3RpbWU9dXRpbHMuTWF0aC50bzY0Qml0TnVtYmVyKG0uZ2V0VWludDMyKG8rNCwhMSksbS5nZXRVaW50MzIobywhMSkpLG4uZmlyc3Rfb2Zmc2V0PShtLmdldFVpbnQzMihvKzgsITEpPDwzMikrbS5nZXRVaW50MzIobysxMiwhMSksbys9MTYpLG4uZmlyc3Rfb2Zmc2V0Kz1lKyhifHwwKSxuLnJlZmVyZW5jZV9jb3VudD1tLmdldFVpbnQxNihvKzIsITEpLG8rPTQsbi5yZWZlcmVuY2VzPVtdLGM9bi5maXJzdF9vZmZzZXQsZD1uLmVhcmxpZXN0X3ByZXNlbnRhdGlvbl90aW1lLGY9MDtmPG4ucmVmZXJlbmNlX2NvdW50O2YrPTEpaD1tLmdldFVpbnQzMihvLCExKSxnPWg+Pj4zMSxoPTIxNDc0ODM2NDcmaCxpPW0uZ2V0VWludDMyKG8rNCwhMSksbys9MTIsbi5yZWZlcmVuY2VzLnB1c2goe3NpemU6aCx0eXBlOmcsb2Zmc2V0OmMsZHVyYXRpb246aSx0aW1lOmQsdGltZXNjYWxlOm4udGltZXNjYWxlfSksYys9aCxkKz1pO2lmKG8hPT1lKXRocm93XCJFcnJvcjogZmluYWwgcG9zIFwiK28rXCIgZGlmZmVycyBmcm9tIFNJRFggZW5kIFwiK2U7cmV0dXJuIG59LGI9ZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoLGksaixrLGw7Zm9yKGU9YS5jYWxsKHRoaXMsYixkKSxmPWUucmVmZXJlbmNlcyxnPVtdLGk9MCxqPWYubGVuZ3RoO2o+aTtpKz0xKWg9bmV3IERhc2gudm8uU2VnbWVudCxoLmR1cmF0aW9uPWZbaV0uZHVyYXRpb24saC5tZWRpYT1jLGguc3RhcnRUaW1lPWZbaV0udGltZSxoLnRpbWVzY2FsZT1mW2ldLnRpbWVzY2FsZSxrPWZbaV0ub2Zmc2V0LGw9ZltpXS5vZmZzZXQrZltpXS5zaXplLTEsaC5tZWRpYVJhbmdlPWsrXCItXCIrbCxnLnB1c2goaCk7cmV0dXJuIHRoaXMuZGVidWcubG9nKFwiUGFyc2VkIFNJRFggYm94OiBcIitnLmxlbmd0aCtcIiBzZWdtZW50cy5cIiksUS53aGVuKGcpfSxjPWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmLGcsaCxpLGosaz1RLmRlZmVyKCksbD1uZXcgRGF0YVZpZXcoYSksbT0wLG49XCJcIixvPTAscD0hMSxxPXRoaXM7Zm9yKHEuZGVidWcubG9nKFwiU2VhcmNoaW5nIGZvciBpbml0aWFsaXphdGlvbi5cIik7XCJtb292XCIhPT1uJiZtPGwuYnl0ZUxlbmd0aDspe2ZvcihvPWwuZ2V0VWludDMyKG0pLG0rPTQsbj1cIlwiLGc9MDs0Pmc7Zys9MSloPWwuZ2V0SW50OChtKSxuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGgpLG0rPTE7XCJtb292XCIhPT1uJiYobSs9by04KX1yZXR1cm4gZj1sLmJ5dGVMZW5ndGgtbSxcIm1vb3ZcIiE9PW4/KHEuZGVidWcubG9nKFwiTG9hZGluZyBtb3JlIGJ5dGVzIHRvIGZpbmQgaW5pdGlhbGl6YXRpb24uXCIpLGIucmFuZ2Uuc3RhcnQ9MCxiLnJhbmdlLmVuZD1iLmJ5dGVzTG9hZGVkK2IuYnl0ZXNUb0xvYWQsaT1uZXcgWE1MSHR0cFJlcXVlc3QsaS5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXtwfHxrLnJlamVjdChcIkVycm9yIGxvYWRpbmcgaW5pdGlhbGl6YXRpb24uXCIpfSxpLm9ubG9hZD1mdW5jdGlvbigpe3A9ITAsYi5ieXRlc0xvYWRlZD1iLnJhbmdlLmVuZCxjLmNhbGwocSxpLnJlc3BvbnNlKS50aGVuKGZ1bmN0aW9uKGEpe2sucmVzb2x2ZShhKX0pfSxpLm9uZXJyb3I9ZnVuY3Rpb24oKXtrLnJlamVjdChcIkVycm9yIGxvYWRpbmcgaW5pdGlhbGl6YXRpb24uXCIpfSxpLm9wZW4oXCJHRVRcIixiLnVybCksaS5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiLGkuc2V0UmVxdWVzdEhlYWRlcihcIlJhbmdlXCIsXCJieXRlcz1cIitiLnJhbmdlLnN0YXJ0K1wiLVwiK2IucmFuZ2UuZW5kKSxpLnNlbmQobnVsbCkpOihkPW0tOCxlPWQrby0xLGo9ZCtcIi1cIitlLHEuZGVidWcubG9nKFwiRm91bmQgdGhlIGluaXRpYWxpemF0aW9uLiAgUmFuZ2U6IFwiK2opLGsucmVzb2x2ZShqKSksay5wcm9taXNlfSxkPWZ1bmN0aW9uKGEpe3ZhciBiPVEuZGVmZXIoKSxkPW5ldyBYTUxIdHRwUmVxdWVzdCxlPSEwLGY9dGhpcyxnPXt1cmw6YSxyYW5nZTp7fSxzZWFyY2hpbmc6ITEsYnl0ZXNMb2FkZWQ6MCxieXRlc1RvTG9hZDoxNTAwLHJlcXVlc3Q6ZH07cmV0dXJuIGYuZGVidWcubG9nKFwiU3RhcnQgc2VhcmNoaW5nIGZvciBpbml0aWFsaXphdGlvbi5cIiksZy5yYW5nZS5zdGFydD0wLGcucmFuZ2UuZW5kPWcuYnl0ZXNUb0xvYWQsZC5vbmxvYWQ9ZnVuY3Rpb24oKXtkLnN0YXR1czwyMDB8fGQuc3RhdHVzPjI5OXx8KGU9ITEsZy5ieXRlc0xvYWRlZD1nLnJhbmdlLmVuZCxjLmNhbGwoZixkLnJlc3BvbnNlLGcpLnRoZW4oZnVuY3Rpb24oYSl7Yi5yZXNvbHZlKGEpfSkpfSxkLm9ubG9hZGVuZD1kLm9uZXJyb3I9ZnVuY3Rpb24oKXtlJiYoZT0hMSxmLmVyckhhbmRsZXIuZG93bmxvYWRFcnJvcihcImluaXRpYWxpemF0aW9uXCIsZy51cmwsZCksYi5yZWplY3QoZCkpfSxkLm9wZW4oXCJHRVRcIixnLnVybCksZC5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiLGQuc2V0UmVxdWVzdEhlYWRlcihcIlJhbmdlXCIsXCJieXRlcz1cIitnLnJhbmdlLnN0YXJ0K1wiLVwiK2cucmFuZ2UuZW5kKSxkLnNlbmQobnVsbCksZi5kZWJ1Zy5sb2coXCJQZXJmb3JtIGluaXQgc2VhcmNoOiBcIitnLnVybCksYi5wcm9taXNlfSxlPWZ1bmN0aW9uKGEsYyl7dmFyIGQsZixnLGgsaSxqLGssbCxtPVEuZGVmZXIoKSxuPW5ldyBEYXRhVmlldyhhKSxvPW5ldyBYTUxIdHRwUmVxdWVzdCxwPTAscT1cIlwiLHI9MCxzPSEwLHQ9ITEsdT10aGlzO2Zvcih1LmRlYnVnLmxvZyhcIlNlYXJjaGluZyBmb3IgU0lEWCBib3guXCIpLHUuZGVidWcubG9nKGMuYnl0ZXNMb2FkZWQrXCIgYnl0ZXMgbG9hZGVkLlwiKTtcInNpZHhcIiE9PXEmJnA8bi5ieXRlTGVuZ3RoOyl7Zm9yKHI9bi5nZXRVaW50MzIocCkscCs9NCxxPVwiXCIsaT0wOzQ+aTtpKz0xKWo9bi5nZXRJbnQ4KHApLHErPVN0cmluZy5mcm9tQ2hhckNvZGUoaikscCs9MTtcInNpZHhcIiE9PXEmJihwKz1yLTgpfWlmKGQ9bi5ieXRlTGVuZ3RoLXAsXCJzaWR4XCIhPT1xKW0ucmVqZWN0KCk7ZWxzZSBpZihyLTg+ZCl1LmRlYnVnLmxvZyhcIkZvdW5kIFNJRFggYnV0IHdlIGRvbid0IGhhdmUgYWxsIG9mIGl0LlwiKSxjLnJhbmdlLnN0YXJ0PTAsYy5yYW5nZS5lbmQ9Yy5ieXRlc0xvYWRlZCsoci1kKSxvLm9ubG9hZD1mdW5jdGlvbigpe28uc3RhdHVzPDIwMHx8by5zdGF0dXM+Mjk5fHwocz0hMSxjLmJ5dGVzTG9hZGVkPWMucmFuZ2UuZW5kLGUuY2FsbCh1LG8ucmVzcG9uc2UsYykudGhlbihmdW5jdGlvbihhKXttLnJlc29sdmUoYSl9KSl9LG8ub25sb2FkZW5kPW8ub25lcnJvcj1mdW5jdGlvbigpe3MmJihzPSExLHUuZXJySGFuZGxlci5kb3dubG9hZEVycm9yKFwiU0lEWFwiLGMudXJsLG8pLG0ucmVqZWN0KG8pKX0sby5vcGVuKFwiR0VUXCIsYy51cmwpLG8ucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixvLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLFwiYnl0ZXM9XCIrYy5yYW5nZS5zdGFydCtcIi1cIitjLnJhbmdlLmVuZCksby5zZW5kKG51bGwpO2Vsc2UgaWYoYy5yYW5nZS5zdGFydD1wLTgsYy5yYW5nZS5lbmQ9Yy5yYW5nZS5zdGFydCtyLHUuZGVidWcubG9nKFwiRm91bmQgdGhlIFNJRFggYm94LiAgU3RhcnQ6IFwiK2MucmFuZ2Uuc3RhcnQrXCIgfCBFbmQ6IFwiK2MucmFuZ2UuZW5kKSxmPW5ldyBBcnJheUJ1ZmZlcihjLnJhbmdlLmVuZC1jLnJhbmdlLnN0YXJ0KSxoPW5ldyBVaW50OEFycmF5KGYpLGc9bmV3IFVpbnQ4QXJyYXkoYSxjLnJhbmdlLnN0YXJ0LGMucmFuZ2UuZW5kLWMucmFuZ2Uuc3RhcnQpLGguc2V0KGcpLGs9dGhpcy5wYXJzZVNJRFguY2FsbCh0aGlzLGYsYy5yYW5nZS5zdGFydCksbD1rLnJlZmVyZW5jZXMsbnVsbCE9PWwmJnZvaWQgMCE9PWwmJmwubGVuZ3RoPjAmJih0PTE9PT1sWzBdLnR5cGUpLHQpe3UuZGVidWcubG9nKFwiSW5pdGlhdGUgbXVsdGlwbGUgU0lEWCBsb2FkLlwiKTt2YXIgdix3LHgseSx6LEEsQj1bXTtmb3Iodj0wLHc9bC5sZW5ndGg7dz52O3YrPTEpeD1sW3ZdLm9mZnNldCx5PWxbdl0ub2Zmc2V0K2xbdl0uc2l6ZS0xLHo9eCtcIi1cIit5LEIucHVzaCh0aGlzLmxvYWRTZWdtZW50cy5jYWxsKHUsYy51cmwseikpO1EuYWxsKEIpLnRoZW4oZnVuY3Rpb24oYSl7Zm9yKEE9W10sdj0wLHc9YS5sZW5ndGg7dz52O3YrPTEpQT1BLmNvbmNhdChhW3ZdKTttLnJlc29sdmUoQSl9LGZ1bmN0aW9uKGEpe20ucmVqZWN0KGEpfSl9ZWxzZSB1LmRlYnVnLmxvZyhcIlBhcnNpbmcgc2VnbWVudHMgZnJvbSBTSURYLlwiKSxiLmNhbGwodSxmLGMudXJsLGMucmFuZ2Uuc3RhcnQpLnRoZW4oZnVuY3Rpb24oYSl7bS5yZXNvbHZlKGEpfSk7cmV0dXJuIG0ucHJvbWlzZX0sZj1mdW5jdGlvbihhLGMpe3ZhciBkLGY9US5kZWZlcigpLGc9bmV3IFhNTEh0dHBSZXF1ZXN0LGg9ITAsaT10aGlzLGo9e3VybDphLHJhbmdlOnt9LHNlYXJjaGluZzohMSxieXRlc0xvYWRlZDowLGJ5dGVzVG9Mb2FkOjE1MDAscmVxdWVzdDpnfTtyZXR1cm4gbnVsbD09PWM/KGkuZGVidWcubG9nKFwiTm8ga25vd24gcmFuZ2UgZm9yIFNJRFggcmVxdWVzdC5cIiksai5zZWFyY2hpbmc9ITAsai5yYW5nZS5zdGFydD0wLGoucmFuZ2UuZW5kPWouYnl0ZXNUb0xvYWQpOihkPWMuc3BsaXQoXCItXCIpLGoucmFuZ2Uuc3RhcnQ9cGFyc2VGbG9hdChkWzBdKSxqLnJhbmdlLmVuZD1wYXJzZUZsb2F0KGRbMV0pKSxnLm9ubG9hZD1mdW5jdGlvbigpe2cuc3RhdHVzPDIwMHx8Zy5zdGF0dXM+Mjk5fHwoaD0hMSxqLnNlYXJjaGluZz8oai5ieXRlc0xvYWRlZD1qLnJhbmdlLmVuZCxlLmNhbGwoaSxnLnJlc3BvbnNlLGopLnRoZW4oZnVuY3Rpb24oYSl7Zi5yZXNvbHZlKGEpfSkpOmIuY2FsbChpLGcucmVzcG9uc2Usai51cmwsai5yYW5nZS5zdGFydCkudGhlbihmdW5jdGlvbihhKXtmLnJlc29sdmUoYSl9KSl9LGcub25sb2FkZW5kPWcub25lcnJvcj1mdW5jdGlvbigpe2gmJihoPSExLGkuZXJySGFuZGxlci5kb3dubG9hZEVycm9yKFwiU0lEWFwiLGoudXJsLGcpLGYucmVqZWN0KGcpKX0sZy5vcGVuKFwiR0VUXCIsai51cmwpLGcucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixnLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLFwiYnl0ZXM9XCIrai5yYW5nZS5zdGFydCtcIi1cIitqLnJhbmdlLmVuZCksZy5zZW5kKG51bGwpLGkuZGVidWcubG9nKFwiUGVyZm9ybSBTSURYIGxvYWQ6IFwiK2oudXJsKSxmLnByb21pc2V9O3JldHVybntkZWJ1Zzp2b2lkIDAsZXJySGFuZGxlcjp2b2lkIDAsbG9hZFNlZ21lbnRzOmYsbG9hZEluaXRpYWxpemF0aW9uOmQscGFyc2VTZWdtZW50czpiLHBhcnNlU0lEWDphLGZpbmRTSURYOmV9fSxEYXNoLmRlcGVuZGVuY2llcy5CYXNlVVJMRXh0ZW5zaW9ucy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkRhc2guZGVwZW5kZW5jaWVzLkJhc2VVUkxFeHRlbnNpb25zfSxEYXNoLmRlcGVuZGVuY2llcy5EYXNoSGFuZGxlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhLGIsYyxkPS0xLGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1udWxsO3JldHVybiBiJiZiLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkmJmIuUmVwcmVzZW50YXRpb25fYXNBcnJheS5sZW5ndGg+MCYmKGM9Yi5SZXByZXNlbnRhdGlvbl9hc0FycmF5W2FdKSxjfSxmPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi50b1N0cmluZygpO3JldHVybiBhLnNwbGl0KFwiJE51bWJlciRcIikuam9pbihjKX0sZz1mdW5jdGlvbihhLGIpe3ZhciBjPWIudG9TdHJpbmcoKTtyZXR1cm4gYS5zcGxpdChcIiRUaW1lJFwiKS5qb2luKGMpfSxoPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi50b1N0cmluZygpO3JldHVybiBhLnNwbGl0KFwiJEJhbmR3aWR0aCRcIikuam9pbihjKX0saT1mdW5jdGlvbihhLGIpe2lmKG51bGw9PT1ifHwtMT09PWEuaW5kZXhPZihcIiRSZXByZXNlbnRhdGlvbklEJFwiKSlyZXR1cm4gYTt2YXIgYz1iLnRvU3RyaW5nKCk7cmV0dXJuIGEuc3BsaXQoXCIkUmVwcmVzZW50YXRpb25JRCRcIikuam9pbihjKX0saj1mdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBjPWE9PT1iP2E6LTEhPT1hLmluZGV4T2YoXCJodHRwOi8vXCIpP2E6YithfSxrPWZ1bmN0aW9uKGEsYil7dmFyIGQ9US5kZWZlcigpLGY9ZShhLGIpLGc9bnVsbCxrPW51bGwsbD1udWxsLG09bnVsbCxuPXRoaXM7cmV0dXJuIGY/KG4uZGVidWcubG9nKFwiR2V0dGluZyB0aGUgaW5pdGlhbGl6YXRpb24gcmVxdWVzdC5cIiksZi5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUZW1wbGF0ZVwiKT9mLlNlZ21lbnRUZW1wbGF0ZS5oYXNPd25Qcm9wZXJ0eShcImluaXRpYWxpemF0aW9uXCIpJiYoaz1mLlNlZ21lbnRUZW1wbGF0ZS5pbml0aWFsaXphdGlvbixrPWgoayxmLmJhbmR3aWR0aCksaz1pKGssZi5pZCkpOmYuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50TGlzdFwiKSYmZi5TZWdtZW50TGlzdC5oYXNPd25Qcm9wZXJ0eShcIkluaXRpYWxpemF0aW9uXCIpJiZmLlNlZ21lbnRMaXN0LkluaXRpYWxpemF0aW9uLmhhc093blByb3BlcnR5KFwicmFuZ2VcIik/KGs9Zi5TZWdtZW50TGlzdC5Jbml0aWFsaXphdGlvbi5oYXNPd25Qcm9wZXJ0eShcInNvdXJjZVVSTFwiKT9mLlNlZ21lbnRMaXN0LkluaXRpYWxpemF0aW9uLnNvdXJjZVVSTDpmLkJhc2VVUkwsbT1mLlNlZ21lbnRMaXN0LkluaXRpYWxpemF0aW9uLnJhbmdlKTpmLmhhc093blByb3BlcnR5KFwiU2VnbWVudExpc3RcIikmJmYuU2VnbWVudExpc3QuaGFzT3duUHJvcGVydHkoXCJJbml0aWFsaXphdGlvblwiKSYmZi5TZWdtZW50TGlzdC5Jbml0aWFsaXphdGlvbi5oYXNPd25Qcm9wZXJ0eShcInNvdXJjZVVSTFwiKT9rPWYuU2VnbWVudExpc3QuSW5pdGlhbGl6YXRpb24uc291cmNlVVJMOmYuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50QmFzZVwiKSYmZi5TZWdtZW50QmFzZS5oYXNPd25Qcm9wZXJ0eShcIkluaXRpYWxpemF0aW9uXCIpJiZmLlNlZ21lbnRCYXNlLkluaXRpYWxpemF0aW9uLmhhc093blByb3BlcnR5KFwicmFuZ2VcIik/KGs9Zi5CYXNlVVJMLG09Zi5TZWdtZW50QmFzZS5Jbml0aWFsaXphdGlvbi5yYW5nZSk6Zi5oYXNPd25Qcm9wZXJ0eShcIm1pbWVUeXBlXCIpJiZuLm1hbmlmZXN0RXh0LmdldElzVGV4dFRyYWNrKGYubWltZVR5cGUpPyhrPWYuQmFzZVVSTCxtPTApOihsPWYuQmFzZVVSTCxuLmJhc2VVUkxFeHQubG9hZEluaXRpYWxpemF0aW9uKGwpLnRoZW4oZnVuY3Rpb24oYil7bi5kZWJ1Zy5sb2coXCJHb3QgYW4gaW5pdGlhbGl6YXRpb24uXCIpLGc9bmV3IE1lZGlhUGxheWVyLnZvLlNlZ21lbnRSZXF1ZXN0LGcuc3RyZWFtVHlwZT1jLGcudHlwZT1cIkluaXRpYWxpemF0aW9uIFNlZ21lbnRcIixnLnVybD1qKGwsZi5CYXNlVVJMKSxnLnJhbmdlPWIsZy5xdWFsaXR5PWEsZC5yZXNvbHZlKGcpfSxmdW5jdGlvbihhKXtkLnJlamVjdChhKX0pKSxrJiZrLmxlbmd0aD4wJiYobi5kZWJ1Zy5sb2coXCJHb3QgYW4gaW5pdGlhbGl6YXRpb24uXCIpLGc9bmV3IE1lZGlhUGxheWVyLnZvLlNlZ21lbnRSZXF1ZXN0LGcuc3RyZWFtVHlwZT1jLGcudHlwZT1cIkluaXRpYWxpemF0aW9uIFNlZ21lbnRcIixnLnVybD1qKGssZi5CYXNlVVJMKSxnLnJhbmdlPW0sZy5xdWFsaXR5PWEsZC5yZXNvbHZlKGcpKSxkLnByb21pc2UpOlEucmVqZWN0KFwibm8gcmVwcmVzZW5hdGlvblwiKX0sbD1mdW5jdGlvbihjKXt2YXIgZSxmLGcsaCxpLGosaz0hMTtyZXR1cm4gdGhpcy5kZWJ1Zy5sb2coXCJDaGVja2luZyBmb3Igc3RyZWFtIGVuZC4uLlwiKSxhPyh0aGlzLmRlYnVnLmxvZyhcIkxpdmUgbmV2ZXIgZW5kcyEgKFRPRE8pXCIpLGs9ITEpOmMuaGFzT3duUHJvcGVydHkoXCJzZWdtZW50c1wiKSYmbnVsbCE9PWMuc2VnbWVudHM/KHRoaXMuZGVidWcubG9nKFwiU2VnbWVudHM6IFwiK2QrXCIgLyBcIitjLnNlZ21lbnRzLmxlbmd0aCksaz1kPj1jLnNlZ21lbnRzLmxlbmd0aCk6Yy5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUZW1wbGF0ZVwiKSYmIWMuU2VnbWVudFRlbXBsYXRlLmhhc093blByb3BlcnR5KFwiU2VnbWVudFRpbWVsaW5lXCIpJiYoZj0xLGk9MSxoPWIsYy5TZWdtZW50VGVtcGxhdGUuaGFzT3duUHJvcGVydHkoXCJkdXJhdGlvblwiKSYmKGU9Yy5TZWdtZW50VGVtcGxhdGUuZHVyYXRpb24sYy5TZWdtZW50VGVtcGxhdGUuaGFzT3duUHJvcGVydHkoXCJ0aW1lc2NhbGVcIikmJihmPWMuU2VnbWVudFRlbXBsYXRlLnRpbWVzY2FsZSksYy5TZWdtZW50VGVtcGxhdGUuaGFzT3duUHJvcGVydHkoXCJzdGFydE51bWJlclwiKSYmKGk9Yy5TZWdtZW50VGVtcGxhdGUuc3RhcnROdW1iZXIpLGc9ZS9mLGo9ZC1pLHRoaXMuZGVidWcubG9nKFwiU2VnbWVudFRlbXBsYXRlOiBcIitnK1wiICogXCIraitcIiA9IFwiK2cqaitcIiAvIFwiK2gpLGs9ZypqPj1oKSksUS53aGVuKGspfSxtPWZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxoLGksaixrLGwsbSxuPVtdLG89MCxwPTEscT0xO2ZvcihhLmhhc093blByb3BlcnR5KFwic3RhcnROdW1iZXJcIikmJihwPWEuc3RhcnROdW1iZXIpLGEuaGFzT3duUHJvcGVydHkoXCJ0aW1lc2NhbGVcIikmJihxPWEudGltZXNjYWxlKSxkPWMuU19hc0FycmF5LGg9MCxpPWQubGVuZ3RoO2k+aDtoKz0xKWZvcihlPWRbaF0saz0wLGUuaGFzT3duUHJvcGVydHkoXCJyXCIpJiYoaz1lLnIpLDA+ayYmKGs9KGItby9xKS8oZS5kL3EpLTEpLGo9MDtrPj1qO2orPTEpbD1uZXcgRGFzaC52by5TZWdtZW50LGwudGltZXNjYWxlPXEsMD09PWomJmUuaGFzT3duUHJvcGVydHkoXCJ0XCIpPyhsLnN0YXJ0VGltZT1lLnQsbz1lLnQpOmwuc3RhcnRUaW1lPW8sbC5kdXJhdGlvbj1lLmQsbT1hLm1lZGlhLG09ZihtLHApLG09ZyhtLGwuc3RhcnRUaW1lKSxsLm1lZGlhPW0sbi5wdXNoKGwpLG8rPWwuZHVyYXRpb24scCs9MTtyZXR1cm4gUS53aGVuKG4pfSxuPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZz1bXSxoPTE7Zm9yKGEuaGFzT3duUHJvcGVydHkoXCJzdGFydE51bWJlclwiKSYmKGg9TWF0aC5tYXgoYS5zdGFydE51bWJlciwxKSksZj0oaC0xKSphLmR1cmF0aW9uLGI9MCxjPWEuU2VnbWVudFVSTF9hc0FycmF5Lmxlbmd0aDtjPmI7Yis9MSllPWEuU2VnbWVudFVSTF9hc0FycmF5W2JdLGQ9bmV3IERhc2gudm8uU2VnbWVudCxkLm1lZGlhPWUubWVkaWEsZC5tZWRpYVJhbmdlPWUubWVkaWFSYW5nZSxkLmluZGV4PWUuaW5kZXgsZC5pbmRleFJhbmdlPWUuaW5kZXhSYW5nZSxkLnRpbWVzY2FsZT1hLnRpbWVzY2FsZSxkLmR1cmF0aW9uPWEuZHVyYXRpb24sZC5zdGFydFRpbWU9ZitiKmEuZHVyYXRpb24sZy5wdXNoKGQpO3JldHVybiBRLndoZW4oZyl9LG89ZnVuY3Rpb24oYSl7dmFyIGI9YS5CYXNlVVJMLGM9bnVsbDtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRCYXNlXCIpJiZhLlNlZ21lbnRCYXNlLmhhc093blByb3BlcnR5KFwiaW5kZXhSYW5nZVwiKSYmKGM9YS5TZWdtZW50QmFzZS5pbmRleFJhbmdlKSx0aGlzLmJhc2VVUkxFeHQubG9hZFNlZ21lbnRzKGIsYyl9LHA9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGI9YS5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUZW1wbGF0ZVwiKSYmIWEuU2VnbWVudFRlbXBsYXRlLmhhc093blByb3BlcnR5KFwiU2VnbWVudFRpbWVsaW5lXCIpP1Eud2hlbihudWxsKTphLmhhc093blByb3BlcnR5KFwic2VnbWVudHNcIikmJm51bGwhPT1hLnNlZ21lbnRzP1Eud2hlbihhLnNlZ21lbnRzKTphLmhhc093blByb3BlcnR5KFwiU2VnbWVudFRlbXBsYXRlXCIpJiZhLlNlZ21lbnRUZW1wbGF0ZS5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUaW1lbGluZVwiKT9tLmNhbGwodGhpcyxhLlNlZ21lbnRUZW1wbGF0ZSxhLlNlZ21lbnRUZW1wbGF0ZS5TZWdtZW50VGltZWxpbmUpOmEuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50TGlzdFwiKT9uLmNhbGwodGhpcyxhLlNlZ21lbnRMaXN0KTpvLmNhbGwodGhpcyxhKX0scT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9LTE7aWYoYiYmYi5sZW5ndGg+MClmb3IoZj1iLmxlbmd0aC0xO2Y+PTA7Zi0tKXtpZihjPWJbZl0sZD1jLnN0YXJ0VGltZS9jLnRpbWVzY2FsZSxlPWMuZHVyYXRpb24vYy50aW1lc2NhbGUsYStEYXNoLmRlcGVuZGVuY2llcy5EYXNoSGFuZGxlci5FUFNJTE9OPj1kJiZhLURhc2guZGVwZW5kZW5jaWVzLkRhc2hIYW5kbGVyLkVQU0lMT048PWQrZSl7Zz1mO2JyZWFrfS0xPT09ZyYmYS1EYXNoLmRlcGVuZGVuY2llcy5EYXNoSGFuZGxlci5FUFNJTE9OPmQrZSYmKGc9ZisxKX1yZXR1cm4tMT09PWcmJihjb25zb2xlLmxvZyhcIkNvdWxkbid0IGZpZ3VyZSBvdXQgYSB0aW1lIVwiKSxjb25zb2xlLmxvZyhcIlRpbWU6IFwiK2EpLGNvbnNvbGUubG9nKGIpKSxRLndoZW4oZyl9LHI9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9LTEsZj0xLGc9MTtpZighYi5oYXNPd25Qcm9wZXJ0eShcImR1cmF0aW9uXCIpKXRocm93XCJFeHBlY3RlZCAnZHVyYXRpb24nIGF0dHJpYnV0ZSBvbiBTZWdtZW50VGVtcGxhdGUhXCI7cmV0dXJuIGM9Yi5kdXJhdGlvbixiLmhhc093blByb3BlcnR5KFwidGltZXNjYWxlXCIpJiYoZj1iLnRpbWVzY2FsZSksYi5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0TnVtYmVyXCIpJiYoZz1iLnN0YXJ0TnVtYmVyKSxkPWMvZixlPU1hdGguZmxvb3IoYS9kKSxlKz1nLFEud2hlbihlKX0scz1mdW5jdGlvbihhLGIsZCxlKXt2YXIgayxsLG09bmV3IE1lZGlhUGxheWVyLnZvLlNlZ21lbnRSZXF1ZXN0LG49MSxvPTE7cmV0dXJuIGIuaGFzT3duUHJvcGVydHkoXCJ0aW1lc2NhbGVcIikmJihuPWIudGltZXNjYWxlKSxiLmhhc093blByb3BlcnR5KFwic3RhcnROdW1iZXJcIikmJihvPWIuc3RhcnROdW1iZXIpLGw9Yi5kdXJhdGlvbiphL24sbD1NYXRoLmZsb29yKGwpLGs9Yi5tZWRpYSxrPWYoayxhKSxrPWcoayxsKSxrPWgoayxkLmJhbmR3aWR0aCksaz1pKGssZC5pZCksbS5zdHJlYW1UeXBlPWMsbS50eXBlPVwiTWVkaWEgU2VnbWVudFwiLG0udXJsPWooayxkLkJhc2VVUkwpLG0uZHVyYXRpb249Yi5kdXJhdGlvbi9uLG0udGltZXNjYWxlPW4sbS5zdGFydFRpbWU9KGEtbykqYi5kdXJhdGlvbi9uLG0ucXVhbGl0eT1lLG0uaW5kZXg9YSxRLndoZW4obSl9LHQ9ZnVuY3Rpb24oYSxiLGQsZSl7aWYobnVsbD09PWJ8fHZvaWQgMD09PWIpcmV0dXJuIFEud2hlbihudWxsKTt2YXIgayxsPW5ldyBNZWRpYVBsYXllci52by5TZWdtZW50UmVxdWVzdDtyZXR1cm4gaz1qKGIubWVkaWEsZC5CYXNlVVJMKSxrPWYoayxhKSxrPWcoayxiLnN0YXJ0VGltZSksaz1oKGssZC5iYW5kd2lkdGgpLGs9aShrLGQuaWQpLGwuc3RyZWFtVHlwZT1jLGwudHlwZT1cIk1lZGlhIFNlZ21lbnRcIixsLnVybD1rLGwucmFuZ2U9Yi5tZWRpYVJhbmdlLGwuc3RhcnRUaW1lPWIuc3RhcnRUaW1lL2IudGltZXNjYWxlLGwuZHVyYXRpb249Yi5kdXJhdGlvbi9iLnRpbWVzY2FsZSxsLnRpbWVzY2FsZT1iLnRpbWVzY2FsZSxsLnF1YWxpdHk9ZSxsLmluZGV4PWEsUS53aGVuKGwpfSx1PWZ1bmN0aW9uKGEsYixjKXt2YXIgZixnLGgsaT1lKGIsYyksaj0hMSxrPXRoaXM7cmV0dXJuIGk/KGsuZGVidWcubG9nKFwiR2V0dGluZyB0aGUgcmVxdWVzdCBmb3IgdGltZTogXCIrYSksZj1RLmRlZmVyKCkscC5jYWxsKGssaSkudGhlbihmdW5jdGlvbihiKXt2YXIgYztpZihrLmRlYnVnLmxvZyhcIkdvdCBzZWdtZW50cy5cIiksay5kZWJ1Zy5sb2coYiksbnVsbD09PWIpe2lmKCFpLmhhc093blByb3BlcnR5KFwiU2VnbWVudFRlbXBsYXRlXCIpKXRocm93XCJFeHBlY3RlZCBTZWdtZW50VGVtcGxhdGUhXCI7aj0hMCxrLmRlYnVnLmxvZyhcIk5vIHNlZ21lbnRzIGZvdW5kLCBzbyB3ZSBtdXN0IGJlIHVzaW5nIGEgU2VnbWVudFRlbXBsYXRlLlwiKSxjPXIuY2FsbChrLGEsaS5TZWdtZW50VGVtcGxhdGUpfWVsc2Ugay5kZWJ1Zy5sb2coXCJHb3QgYSBsaXN0IG9mIHNlZ21lbnRzLCBzbyBkaWcgZGVlcGVyLlwiKSxpLnNlZ21lbnRzPWIsaj0hMSxjPXEuY2FsbChrLGEsYik7cmV0dXJuIGN9LGZ1bmN0aW9uKCl7Zi5yZWplY3QoKX0pLnRoZW4oZnVuY3Rpb24oYil7cmV0dXJuIGsuZGVidWcubG9nKFwiSW5kZXggZm9yIHRpbWUgXCIrYStcIiBpcyBcIitiKSxkPWIsbC5jYWxsKGssaSl9KS50aGVuKGZ1bmN0aW9uKGEpe3ZhciBjPW51bGw7cmV0dXJuIGsuZGVidWcubG9nKFwiU3RyZWFtIGZpbmlzaGVkPyBcIithKSxhPyhnPW5ldyBNZWRpYVBsYXllci52by5TZWdtZW50UmVxdWVzdCxnLmFjdGlvbj1nLkFDVElPTl9DT01QTEVURSxnLmluZGV4PWQsay5kZWJ1Zy5sb2coXCJTaWduYWwgY29tcGxldGUuXCIpLGsuZGVidWcubG9nKGcpLGYucmVzb2x2ZShnKSk6aj9jPXMuY2FsbChrLGQsaS5TZWdtZW50VGVtcGxhdGUsaSxiKTooaD1pLnNlZ21lbnRzW2RdLGM9dC5jYWxsKGssZCxoLGksYikpLGN9KS50aGVuKGZ1bmN0aW9uKGEpe2suZGVidWcubG9nKFwiR290IGEgcmVxdWVzdC5cIiksay5kZWJ1Zy5sb2coYSksZi5yZXNvbHZlKGEpfSksZi5wcm9taXNlKTpRLnJlamVjdChcIm5vIHJlcHJlc2VuYXRpb25cIil9LHY9ZnVuY3Rpb24oYSxiKXt2YXIgYyxmLGcsaD1lKGEsYiksaT10aGlzO2lmKCFoKXJldHVybiBRLnJlamVjdChcIm5vIHJlcHJlc2VuYXRpb25cIik7aWYoaS5kZWJ1Zy5sb2coXCJHZXR0aW5nIHRoZSBuZXh0IHJlcXVlc3QuXCIpLC0xPT09ZCl0aHJvd1wiWW91IG11c3QgY2FsbCBnZXRTZWdtZW50UmVxdWVzdEZvclRpbWUgZmlyc3QuXCI7cmV0dXJuIGQrPTEsaS5kZWJ1Zy5sb2coXCJOZXcgaW5kZXg6IFwiK2QpLGM9US5kZWZlcigpLGwuY2FsbChpLGgpLnRoZW4oZnVuY3Rpb24oYil7aS5kZWJ1Zy5sb2coXCJTdHJlYW0gZmluaXNoZWQ/IFwiK2IpLGI/KGY9bmV3IE1lZGlhUGxheWVyLnZvLlNlZ21lbnRSZXF1ZXN0LGYuYWN0aW9uPWYuQUNUSU9OX0NPTVBMRVRFLGYuaW5kZXg9ZCxpLmRlYnVnLmxvZyhcIlNpZ25hbCBjb21wbGV0ZS5cIiksaS5kZWJ1Zy5sb2coZiksYy5yZXNvbHZlKGYpKTpwLmNhbGwoaSxoKS50aGVuKGZ1bmN0aW9uKGIpe3ZhciBjO2lmKGkuZGVidWcubG9nKFwiR290IHNlZ21lbnRzLlwiKSxpLmRlYnVnLmxvZyhiKSxudWxsPT09Yil7aWYoIWguaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGVtcGxhdGVcIikpdGhyb3dcIkV4cGVjdGVkIFNlZ21lbnRUZW1wbGF0ZSFcIjtpLmRlYnVnLmxvZyhcIk5vIHNlZ21lbnRzIGZvdW5kLCBzbyB3ZSBtdXN0IGJlIHVzaW5nIGEgU2VnbWVudFRlbXBsYXRlLlwiKSxjPXMuY2FsbChpLGQsaC5TZWdtZW50VGVtcGxhdGUsaCxhKX1lbHNlIGguc2VnbWVudHM9YixnPWguc2VnbWVudHNbZF0sYz10LmNhbGwoaSxkLGcsaCxhKTtyZXR1cm4gY30sZnVuY3Rpb24oKXtjLnJlamVjdCgpfSkudGhlbihmdW5jdGlvbihhKXtpLmRlYnVnLmxvZyhcIkdvdCBhIHJlcXVlc3QuXCIpLGkuZGVidWcubG9nKGEpLGMucmVzb2x2ZShhKX0pfSksYy5wcm9taXNlfSx3PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBmLGcsaCxpPXRoaXMsaj1lKGEsYiksaz1NYXRoLm1heChjLWQsMCksbD1RLmRlZmVyKCksbT0wLG49MTtyZXR1cm4gaj8ocC5jYWxsKGksaikudGhlbihmdW5jdGlvbihhKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl7aWYoIWouaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGVtcGxhdGVcIikpdGhyb3dcIkV4cGVjdGVkIFNlZ21lbnRUZW1wbGF0ZSFcIjtqLlNlZ21lbnRUZW1wbGF0ZS5oYXNPd25Qcm9wZXJ0eShcInRpbWVzY2FsZVwiKSYmKG49ai5TZWdtZW50VGVtcGxhdGUudGltZXNjYWxlKSxoPWouU2VnbWVudFRlbXBsYXRlLmR1cmF0aW9uLGY9aC9ufWVsc2UgZz1hWzBdLGcuaGFzT3duUHJvcGVydHkoXCJ0aW1lc2NhbGVcIikmJihuPWcudGltZXNjYWxlKSxoPWcuZHVyYXRpb24sZj1oL247bT1NYXRoLmNlaWwoay9mKSxsLnJlc29sdmUobSl9LGZ1bmN0aW9uKCl7bC5yZXNvbHZlKDApfSksbC5wcm9taXNlKTpRLnJlamVjdChcIm5vIHJlcHJlc2VuYXRpb25cIil9LHg9ZnVuY3Rpb24oYixjKXt2YXIgZixnLGgsaSxqPXRoaXMsaz1lKGIsYyksbD0hMSxtPTEsbj0xLG89US5kZWZlcigpO3JldHVybiBrPyhnPWQsMD5nJiYobD1hLGc9MCkscC5jYWxsKGosaykudGhlbihmdW5jdGlvbihhKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl7aWYoIWsuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGVtcGxhdGVcIikpdGhyb3dcIkV4cGVjdGVkIFNlZ21lbnRUZW1wbGF0ZSFcIjtpPWsuU2VnbWVudFRlbXBsYXRlLmR1cmF0aW9uLGsuU2VnbWVudFRlbXBsYXRlLmhhc093blByb3BlcnR5KFwidGltZXNjYWxlXCIpJiYobT1rLlNlZ21lbnRUZW1wbGF0ZS50aW1lc2NhbGUpLGsuU2VnbWVudFRlbXBsYXRlLmhhc093blByb3BlcnR5KFwic3RhcnROdW1iZXJcIikmJihuPWsuU2VnbWVudFRlbXBsYXRlLnN0YXJ0TnVtYmVyKSxmPWkvbSpNYXRoLm1heChnLW4sMCl9ZWxzZShsfHxnPj1hLmxlbmd0aCkmJihnPWEubGVuZ3RoLTEpLGg9YVtnXS5zdGFydFRpbWUsaT1hW2ddLmR1cmF0aW9uLGFbZ10uaGFzT3duUHJvcGVydHkoXCJ0aW1lc2NhbGVcIikmJihtPWFbZ10udGltZXNjYWxlKSxmPWgvbTtvLnJlc29sdmUoZil9LGZ1bmN0aW9uKCl7by5yZWplY3QoKX0pLG8ucHJvbWlzZSk6US5yZWplY3QoXCJubyByZXByZXNlbmF0aW9uXCIpfTtyZXR1cm57ZGVidWc6dm9pZCAwLGJhc2VVUkxFeHQ6dm9pZCAwLG1hbmlmZXN0TW9kZWw6dm9pZCAwLG1hbmlmZXN0RXh0OnZvaWQgMCxlcnJIYW5kbGVyOnZvaWQgMCxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIGN9LHNldFR5cGU6ZnVuY3Rpb24oYSl7Yz1hfSxnZXRJc0xpdmU6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2V0SXNMaXZlOmZ1bmN0aW9uKGIpe2E9Yn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYn0sc2V0RHVyYXRpb246ZnVuY3Rpb24oYSl7Yj1hfSxnZXRJbml0UmVxdWVzdDprLGdldFNlZ21lbnRSZXF1ZXN0Rm9yVGltZTp1LGdldE5leHRTZWdtZW50UmVxdWVzdDp2LGdldEN1cnJlbnRUaW1lOngsZ2V0U2VnbWVudENvdW50Rm9yRHVyYXRpb246d319LERhc2guZGVwZW5kZW5jaWVzLkRhc2hIYW5kbGVyLkVQU0lMT049LjAwMyxEYXNoLmRlcGVuZGVuY2llcy5EYXNoSGFuZGxlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkRhc2guZGVwZW5kZW5jaWVzLkRhc2hIYW5kbGVyfSxEYXNoLmRlcGVuZGVuY2llcy5EYXNoTWFuaWZlc3RFeHRlbnNpb25zPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCJ9LERhc2guZGVwZW5kZW5jaWVzLkRhc2hNYW5pZmVzdEV4dGVuc2lvbnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpEYXNoLmRlcGVuZGVuY2llcy5EYXNoTWFuaWZlc3RFeHRlbnNpb25zLGdldElzQXVkaW86ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGIsYyxkLGU9YS5Db250ZW50Q29tcG9uZW50X2FzQXJyYXksZj0hMSxnPSExO2lmKGUpZm9yKGI9MCxjPWUubGVuZ3RoO2M+YjtiKz0xKVwiYXVkaW9cIj09PWVbYl0uY29udGVudFR5cGUmJihmPSEwLGc9ITApO2lmKGEuaGFzT3duUHJvcGVydHkoXCJtaW1lVHlwZVwiKSYmKGY9LTEhPT1hLm1pbWVUeXBlLmluZGV4T2YoXCJhdWRpb1wiKSxnPSEwKSwhZylmb3IoYj0wLGM9YS5SZXByZXNlbnRhdGlvbl9hc0FycmF5Lmxlbmd0aDshZyYmYz5iOylkPWEuUmVwcmVzZW50YXRpb25fYXNBcnJheVtiXSxkLmhhc093blByb3BlcnR5KFwibWltZVR5cGVcIikmJihmPS0xIT09ZC5taW1lVHlwZS5pbmRleE9mKFwiYXVkaW9cIiksZz0hMCksYis9MTtyZXR1cm4gZiYmKGEudHlwZT1cImF1ZGlvXCIpLFEud2hlbihmKX0sZ2V0SXNWaWRlbzpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYixjLGQsZT1hLkNvbnRlbnRDb21wb25lbnRfYXNBcnJheSxmPSExLGc9ITE7aWYoZSlmb3IoYj0wLGM9ZS5sZW5ndGg7Yz5iO2IrPTEpXCJ2aWRlb1wiPT09ZVtiXS5jb250ZW50VHlwZSYmKGY9ITAsZz0hMCk7aWYoYS5oYXNPd25Qcm9wZXJ0eShcIm1pbWVUeXBlXCIpJiYoZj0tMSE9PWEubWltZVR5cGUuaW5kZXhPZihcInZpZGVvXCIpLGc9ITApLCFnKWZvcihiPTAsYz1hLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkubGVuZ3RoOyFnJiZjPmI7KWQ9YS5SZXByZXNlbnRhdGlvbl9hc0FycmF5W2JdLGQuaGFzT3duUHJvcGVydHkoXCJtaW1lVHlwZVwiKSYmKGY9LTEhPT1kLm1pbWVUeXBlLmluZGV4T2YoXCJ2aWRlb1wiKSxnPSEwKSxiKz0xO3JldHVybiBmJiYoYS50eXBlPVwidmlkZW9cIiksUS53aGVuKGYpfSxnZXRJc1RleHQ6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGIsYyxkLGU9YS5Db250ZW50Q29tcG9uZW50X2FzQXJyYXksZj0hMSxnPSExO2lmKGUpZm9yKGI9MCxjPWUubGVuZ3RoO2M+YjtiKz0xKVwidGV4dFwiPT09ZVtiXS5jb250ZW50VHlwZSYmKGY9ITAsZz0hMCk7aWYoYS5oYXNPd25Qcm9wZXJ0eShcIm1pbWVUeXBlXCIpJiYoZj0tMSE9PWEubWltZVR5cGUuaW5kZXhPZihcInRleHRcIiksZz0hMCksIWcpZm9yKGI9MCxjPWEuUmVwcmVzZW50YXRpb25fYXNBcnJheS5sZW5ndGg7IWcmJmM+YjspZD1hLlJlcHJlc2VudGF0aW9uX2FzQXJyYXlbYl0sZC5oYXNPd25Qcm9wZXJ0eShcIm1pbWVUeXBlXCIpJiYoZj0tMSE9PWQubWltZVR5cGUuaW5kZXhPZihcInRleHRcIiksZz0hMCksYis9MTtyZXR1cm4gUS53aGVuKGYpfSxnZXRJc1RleHRUcmFjazpmdW5jdGlvbihhKXtyZXR1cm5cInRleHQvdnR0XCI9PT1hfHxcImFwcGxpY2F0aW9uL3R0bWwreG1sXCI9PT1hfSxnZXRJc01haW46ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gUS53aGVuKCExKX0scHJvY2Vzc0FkYXB0YXRpb246ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHZvaWQgMCE9PWEuUmVwcmVzZW50YXRpb25fYXNBcnJheSYmbnVsbCE9PWEuUmVwcmVzZW50YXRpb25fYXNBcnJheSYmYS5SZXByZXNlbnRhdGlvbl9hc0FycmF5LnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5iYW5kd2lkdGgtYi5iYW5kd2lkdGh9KSxhfSxnZXREYXRhRm9ySWQ6ZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkLGUsZj1iLlBlcmlvZF9hc0FycmF5W2NdLkFkYXB0YXRpb25TZXRfYXNBcnJheTtmb3IoZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrPTEpaWYoZltkXS5oYXNPd25Qcm9wZXJ0eShcImlkXCIpJiZmW2RdLmlkPT09YSlyZXR1cm4gUS53aGVuKGZbZF0pO3JldHVybiBRLndoZW4obnVsbCl9LGdldERhdGFGb3JJbmRleDpmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGQ9Yi5QZXJpb2RfYXNBcnJheVtjXS5BZGFwdGF0aW9uU2V0X2FzQXJyYXk7cmV0dXJuIFEud2hlbihkW2FdKX0sZ2V0RGF0YUluZGV4OmZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjt2YXIgZCxlLGY9Yi5QZXJpb2RfYXNBcnJheVtjXS5BZGFwdGF0aW9uU2V0X2FzQXJyYXk7Zm9yKGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKz0xKWlmKGZbZF09PT1hKXJldHVybiBRLndoZW4oZCk7cmV0dXJuIFEud2hlbigtMSl9LGdldFZpZGVvRGF0YTpmdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjLGQsZT10aGlzLGY9YS5QZXJpb2RfYXNBcnJheVtiXS5BZGFwdGF0aW9uU2V0X2FzQXJyYXksZz1RLmRlZmVyKCksaD1bXTtmb3IoYz0wLGQ9Zi5sZW5ndGg7ZD5jO2MrPTEpaC5wdXNoKHRoaXMuZ2V0SXNWaWRlbyhmW2NdKSk7cmV0dXJuIFEuYWxsKGgpLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGI9ITE7Zm9yKGM9MCxkPWEubGVuZ3RoO2Q+YztjKz0xKWFbY109PT0hMCYmKGI9ITAsZy5yZXNvbHZlKGUucHJvY2Vzc0FkYXB0YXRpb24oZltjXSkpKTtifHxnLnJlc29sdmUobnVsbCl9KSxnLnByb21pc2V9LGdldFRleHREYXRhOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGMsZCxlPXRoaXMsZj1hLlBlcmlvZF9hc0FycmF5W2JdLkFkYXB0YXRpb25TZXRfYXNBcnJheSxnPVEuZGVmZXIoKSxoPVtdO2ZvcihjPTAsZD1mLmxlbmd0aDtkPmM7Yys9MSloLnB1c2godGhpcy5nZXRJc1RleHQoZltjXSkpO3JldHVybiBRLmFsbChoKS50aGVuKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2ZvcihjPTAsZD1hLmxlbmd0aDtkPmM7Yys9MSlhW2NdPT09ITAmJihiPSEwLGcucmVzb2x2ZShlLnByb2Nlc3NBZGFwdGF0aW9uKGZbY10pKSk7Ynx8Zy5yZXNvbHZlKG51bGwpfSksZy5wcm9taXNlfSxnZXRBdWRpb0RhdGFzOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGMsZCxlPXRoaXMsZj1hLlBlcmlvZF9hc0FycmF5W2JdLkFkYXB0YXRpb25TZXRfYXNBcnJheSxnPVEuZGVmZXIoKSxoPVtdO2ZvcihjPTAsZD1mLmxlbmd0aDtkPmM7Yys9MSloLnB1c2godGhpcy5nZXRJc0F1ZGlvKGZbY10pKTtyZXR1cm4gUS5hbGwoaCkudGhlbihmdW5jdGlvbihhKXt2YXIgYj1bXTtmb3IoYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrPTEpYVtjXT09PSEwJiZiLnB1c2goZS5wcm9jZXNzQWRhcHRhdGlvbihmW2NdKSk7Zy5yZXNvbHZlKGIpfSksZy5wcm9taXNlfSxnZXRQcmltYXJ5QXVkaW9EYXRhOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGMsZCxlPVEuZGVmZXIoKSxmPVtdLGc9dGhpcztyZXR1cm4gdGhpcy5nZXRBdWRpb0RhdGFzKGEsYikudGhlbihmdW5jdGlvbihhKXtmb3IoYSYmMCE9PWEubGVuZ3RofHxlLnJlc29sdmUobnVsbCksYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrPTEpZi5wdXNoKGcuZ2V0SXNNYWluKGFbY10pKTtRLmFsbChmKS50aGVuKGZ1bmN0aW9uKGIpe3ZhciBmPSExO2ZvcihjPTAsZD1iLmxlbmd0aDtkPmM7Yys9MSliW2NdPT09ITAmJihmPSEwLGUucmVzb2x2ZShnLnByb2Nlc3NBZGFwdGF0aW9uKGFbY10pKSk7Znx8ZS5yZXNvbHZlKGFbMF0pfSl9KSxlLnByb21pc2V9LGdldENvZGVjOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPWEuUmVwcmVzZW50YXRpb25fYXNBcnJheVswXSxjPWIubWltZVR5cGUrJztjb2RlY3M9XCInK2IuY29kZWNzKydcIic7cmV0dXJuIFEud2hlbihjKX0sZ2V0TWltZVR5cGU6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIFEud2hlbihhLlJlcHJlc2VudGF0aW9uX2FzQXJyYXlbMF0ubWltZVR5cGUpfSxnZXRLSUQ6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGEmJmEuaGFzT3duUHJvcGVydHkoXCJjZW5jOmRlZmF1bHRfS0lEXCIpP2FbXCJjZW5jOmRlZmF1bHRfS0lEXCJdOm51bGx9LGdldENvbnRlbnRQcm90ZWN0aW9uRGF0YTpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gYSYmYS5oYXNPd25Qcm9wZXJ0eShcIkNvbnRlbnRQcm90ZWN0aW9uX2FzQXJyYXlcIikmJjAhPT1hLkNvbnRlbnRQcm90ZWN0aW9uX2FzQXJyYXkubGVuZ3RoP1Eud2hlbihhLkNvbnRlbnRQcm90ZWN0aW9uX2FzQXJyYXkpOlEud2hlbihudWxsKX0sZ2V0U2VnbWVudEluZm9Gb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50QmFzZVwiKT9hLlNlZ21lbnRCYXNlOmEuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50TGlzdFwiKT9hLlNlZ21lbnRMaXN0OmEuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50VGVtcGxhdGVcIik/YS5TZWdtZW50VGVtcGxhdGU6bnVsbH0sZ2V0TGl2ZU9mZnNldDpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj0xNTtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShcInN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5XCIpJiYoYj1hLnN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5KSxRLndoZW4oYil9LGdldExpdmVTdGFydDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT0wLGY9MSxnPTEsaD1udWxsLGk9bnVsbDtyZXR1cm4gZD1hLlBlcmlvZF9hc0FycmF5W2JdLkFkYXB0YXRpb25TZXRfYXNBcnJheVsxXS5SZXByZXNlbnRhdGlvbl9hc0FycmF5WzBdLGQuaGFzT3duUHJvcGVydHkoXCJTZWdtZW50TGlzdFwiKT8oaD1kLlNlZ21lbnRMaXN0LGguaGFzT3duUHJvcGVydHkoXCJzdGFydE51bWJlclwiKSYmKGY9TWF0aC5tYXgoaC5zdGFydE51bWJlciwxKSksaC5oYXNPd25Qcm9wZXJ0eShcInRpbWVzY2FsZVwiKSYmKGc9aC50aW1lc2NhbGUpLGM9aC5kdXJhdGlvbixlPShmLTEpKmMvZyk6ZC5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUZW1wbGF0ZVwiKSYmKGk9ZC5TZWdtZW50VGVtcGxhdGUsaS5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0TnVtYmVyXCIpJiYoZj1NYXRoLm1heChpLnN0YXJ0TnVtYmVyLDEpKSxpLmhhc093blByb3BlcnR5KFwidGltZXNjYWxlXCIpJiYoZz1pLnRpbWVzY2FsZSksYz1pLmR1cmF0aW9uLGU9aS5oYXNPd25Qcm9wZXJ0eShcIlNlZ21lbnRUaW1lbGluZVwiKT9pLlNlZ21lbnRUaW1lbGluZS5TX2FzQXJyYXlbMF0udC9nOihmLTEpKmMvZyksUS53aGVuKGUpfSxnZXRMaXZlRWRnZTpmdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjLGQ9dGhpcyxlPVEuZGVmZXIoKSxmPTAsZz1uZXcgRGF0ZSxoPWEuYXZhaWxhYmlsaXR5U3RhcnRUaW1lO3JldHVybiBkLmdldExpdmVPZmZzZXQoYSkudGhlbihmdW5jdGlvbihpKXthLmhhc093blByb3BlcnR5KFwiYXZhaWxhYmlsaXR5RW5kVGltZVwiKT8oYz1hLmF2YWlsYWJpbGl0eUVuZFRpbWUsZj0oYy5nZXRUaW1lKCktaC5nZXRUaW1lKCkpLzFlMyk6Zj0oZy5nZXRUaW1lKCktaC5nZXRUaW1lKCkpLzFlMyxkLmdldExpdmVTdGFydChhLGIpLnRoZW4oZnVuY3Rpb24oYSl7Zis9YSxmLT1pLGUucmVzb2x2ZShmKX0pfSksZS5wcm9taXNlfSxnZXRQcmVzZW50YXRpb25PZmZzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9dGhpcyxmPVEuZGVmZXIoKSxnPTAsaD0xO3JldHVybiBlLmdldFJlcHJlc2VudGF0aW9uRm9yKGEsYikudGhlbihmdW5jdGlvbihhKXtkPWUuZ2V0U2VnbWVudEluZm9Gb3IoYSksbnVsbCE9PWQmJnZvaWQgMCE9PWQmJmQuaGFzT3duUHJvcGVydHkoXCJwcmVzZW50YXRpb25UaW1lT2Zmc2V0XCIpJiYoYz1kLnByZXNlbnRhdGlvblRpbWVPZmZzZXQsZC5oYXNPd25Qcm9wZXJ0eShcInRpbWVzY2FsZVwiKSYmKGg9ZC50aW1lc2NhbGUpLGc9Yy9oKSxmLnJlc29sdmUoZyl9KSxmLnByb21pc2V9LGdldElzTGl2ZTpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj0hMSxjPVwiZHluYW1pY1wiO3JldHVybiBhLmhhc093blByb3BlcnR5KFwidHlwZVwiKSYmKGI9YS50eXBlPT09YyksYn0sZ2V0SXNEVlI6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYyxkO3JldHVybiBjPSFpc05hTihhLnRpbWVTaGlmdEJ1ZmZlckRlcHRoKSxkPWImJmMsUS53aGVuKGQpfSxnZXRJc09uRGVtYW5kOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPSExO3JldHVybiBhLnByb2ZpbGVzJiZhLnByb2ZpbGVzLmxlbmd0aD4wJiYoYj0tMSE9PWEucHJvZmlsZXMuaW5kZXhPZihcInVybjptcGVnOmRhc2g6cHJvZmlsZTppc29mZi1vbi1kZW1hbmQ6MjAxMVwiKSksUS53aGVuKGIpfSxnZXREdXJhdGlvbjpmdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjPTAvMDtyZXR1cm4gYj9jPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTphLm1lZGlhUHJlc2VudGF0aW9uRHVyYXRpb24/Yz1hLm1lZGlhUHJlc2VudGF0aW9uRHVyYXRpb246YS5hdmFpbGFiaWxpdHlFbmRUaW1lJiZhLmF2YWlsYWJpbGl0eVN0YXJ0VGltZSYmKGM9YS5hdmFpbGFiaWxpdHlFbmRUaW1lLmdldFRpbWUoKS1hLmF2YWlsYWJpbGl0eVN0YXJ0VGltZS5nZXRUaW1lKCkpLFEud2hlbihjKX0sZ2V0RHVyYXRpb25Gb3JQZXJpb2Q6ZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkPTAvMDtyZXR1cm4gYz9kPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTpiLlBlcmlvZF9hc0FycmF5Lmxlbmd0aD4xJiZ2b2lkIDAhPT1iLlBlcmlvZF9hc0FycmF5W2FdLmR1cmF0aW9uP2Q9Yi5QZXJpb2RfYXNBcnJheVthXS5kdXJhdGlvbjpiLm1lZGlhUHJlc2VudGF0aW9uRHVyYXRpb24/ZD1iLm1lZGlhUHJlc2VudGF0aW9uRHVyYXRpb246Yi5hdmFpbGFiaWxpdHlFbmRUaW1lJiZiLmF2YWlsYWJpbGl0eVN0YXJ0VGltZSYmKGQ9Yi5hdmFpbGFiaWxpdHlFbmRUaW1lLmdldFRpbWUoKS1iLmF2YWlsYWJpbGl0eVN0YXJ0VGltZS5nZXRUaW1lKCkpLFEud2hlbihkKX0sZ2V0QmFuZHdpZHRoOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBRLndoZW4oYS5iYW5kd2lkdGgpfSxnZXRSZWZyZXNoRGVsYXk6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9MC8wO3JldHVybiBhLmhhc093blByb3BlcnR5KFwibWluaW11bVVwZGF0ZVBlcmlvZFwiKSYmKGI9cGFyc2VGbG9hdChhLm1pbmltdW1VcGRhdGVQZXJpb2QpKSxRLndoZW4oYil9LGdldFJlcHJlc2VudGF0aW9uQ291bnQ6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIFEud2hlbihhLlJlcHJlc2VudGF0aW9uX2FzQXJyYXkubGVuZ3RoKX0sZ2V0UmVwcmVzZW50YXRpb25Gb3I6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gUS53aGVuKGIuUmVwcmVzZW50YXRpb25fYXNBcnJheVthXSl9LGdldFBlcmlvZENvdW50OmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBRLndoZW4oYS5QZXJpb2RfYXNBcnJheS5sZW5ndGgpfSxnZXRUaW1lc3RhbXBPZmZzZXRGb3JQZXJpb2Q6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZj10aGlzLGc9US5kZWZlcigpO3JldHVybiBmLmdldFByZXNlbnRhdGlvbk9mZnNldChjLGQpLnRoZW4oZnVuY3Rpb24oYyl7Zi5nZXRQZXJpb2RTdGFydChiLGEpLnRoZW4oZnVuY3Rpb24oYSl7ZT1hLWMsZy5yZXNvbHZlKGUpfSl9KSxnLnByb21pc2V9LGdldFBlcmlvZFN0YXJ0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPXRoaXMsZj1lLmdldElzTGl2ZShhKSxnPW51bGwsaD1udWxsLGk9bnVsbDtmb3IoYz0wO2I+PWM7Yys9MSlnPWEuUGVyaW9kX2FzQXJyYXlbY10sZy5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0XCIpP2Q9Zy5zdGFydDpudWxsIT09aCYmbnVsbCE9PWk/ZD1oK2k6MCE9PWN8fGZ8fChkPTApLGcuaGFzT3duUHJvcGVydHkoXCJkdXJhdGlvblwiKSYmKGk9Zy5kdXJhdGlvbiksaD1kO3JldHVybiBRLndoZW4oZCl9fSxEYXNoLmRlcGVuZGVuY2llcy5EYXNoTWV0cmljc0V4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaCxpLGo7Zm9yKGg9MDtoPGEubGVuZ3RoO2grPTEpZm9yKGM9YVtoXSxlPWMuQWRhcHRhdGlvblNldF9hc0FycmF5LGk9MDtpPGUubGVuZ3RoO2krPTEpZm9yKGQ9ZVtpXSxnPWQuUmVwcmVzZW50YXRpb25fYXNBcnJheSxqPTA7ajxnLmxlbmd0aDtqKz0xKWlmKGY9Z1tqXSxiPT09Zi5pZClyZXR1cm4gajtyZXR1cm4tMX0sYj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaCxpLGo7Zm9yKGg9MDtoPGEubGVuZ3RoO2grPTEpZm9yKGM9YVtoXSxlPWMuQWRhcHRhdGlvblNldF9hc0FycmF5LGk9MDtpPGUubGVuZ3RoO2krPTEpZm9yKGQ9ZVtpXSxnPWQuUmVwcmVzZW50YXRpb25fYXNBcnJheSxqPTA7ajxnLmxlbmd0aDtqKz0xKWlmKGY9Z1tqXSxiPT09Zi5pZClyZXR1cm4gZjtyZXR1cm4gbnVsbH0sYz1mdW5jdGlvbihhLGIpe3ZhciBjPSExO3JldHVyblwidmlkZW9cIj09PWI/KHRoaXMubWFuaWZlc3RFeHQuZ2V0SXNWaWRlbyhhKSxcInZpZGVvXCI9PT1hLnR5cGUmJihjPSEwKSk6XCJhdWRpb1wiPT09Yj8odGhpcy5tYW5pZmVzdEV4dC5nZXRJc0F1ZGlvKGEpLFwiYXVkaW9cIj09PWEudHlwZSYmKGM9ITApKTpjPSExLGN9LGQ9ZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoLGk7Zm9yKGg9MDtoPGEubGVuZ3RoO2grPTEpZm9yKGQ9YVtoXSxmPWQuQWRhcHRhdGlvblNldF9hc0FycmF5LGk9MDtpPGYubGVuZ3RoO2krPTEpaWYoZT1mW2ldLGc9ZS5SZXByZXNlbnRhdGlvbl9hc0FycmF5LGMuY2FsbCh0aGlzLGUsYikpcmV0dXJuIGcubGVuZ3RoO3JldHVybi0xfSxlPWZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWQubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGY9ZS5QZXJpb2RfYXNBcnJheTtyZXR1cm4gYz1iLmNhbGwoZCxmLGEpLG51bGw9PT1jP251bGw6Yy5iYW5kd2lkdGh9LGY9ZnVuY3Rpb24oYil7dmFyIGMsZD10aGlzLGU9ZC5tYW5pZmVzdE1vZGVsLmdldFZhbHVlKCksZj1lLlBlcmlvZF9hc0FycmF5O3JldHVybiBjPWEuY2FsbChkLGYsYil9LGc9ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLGU9Yy5tYW5pZmVzdE1vZGVsLmdldFZhbHVlKCksZj1lLlBlcmlvZF9hc0FycmF5O3JldHVybiBiPWQuY2FsbCh0aGlzLGYsYSl9LGg9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7dmFyIGIsYyxkLGU9YS5SZXBTd2l0Y2hMaXN0O3JldHVybiBudWxsPT09ZXx8ZS5sZW5ndGg8PTA/bnVsbDooYj1lLmxlbmd0aCxjPWItMSxkPWVbY10pfSxpPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiBudWxsO3ZhciBiLGMsZCxlPWEuQnVmZmVyTGV2ZWw7cmV0dXJuIG51bGw9PT1lfHxlLmxlbmd0aDw9MD9udWxsOihiPWUubGVuZ3RoLGM9Yi0xLGQ9ZVtjXSl9LGo9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7dmFyIGIsYyxkLGU9YS5IdHRwTGlzdDtyZXR1cm4gbnVsbD09PWV8fGUubGVuZ3RoPD0wP251bGw6KGI9ZS5sZW5ndGgsYz1iLTEsZD1lW2NdKX0saz1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDt2YXIgYixjLGQsZT1hLkRyb3BwZWRGcmFtZXM7cmV0dXJuIG51bGw9PT1lfHxlLmxlbmd0aDw9MD9udWxsOihiPWUubGVuZ3RoLGM9Yi0xLGQ9ZVtjXSl9O3JldHVybnttYW5pZmVzdE1vZGVsOnZvaWQgMCxtYW5pZmVzdEV4dDp2b2lkIDAsZ2V0QmFuZHdpZHRoRm9yUmVwcmVzZW50YXRpb246ZSxnZXRJbmRleEZvclJlcHJlc2VudGF0aW9uOmYsZ2V0TWF4SW5kZXhGb3JCdWZmZXJUeXBlOmcsZ2V0Q3VycmVudFJlcHJlc2VudGF0aW9uU3dpdGNoOmgsZ2V0Q3VycmVudEJ1ZmZlckxldmVsOmksZ2V0Q3VycmVudEh0dHBSZXF1ZXN0OmosZ2V0Q3VycmVudERyb3BwZWRGcmFtZXM6a319LERhc2guZGVwZW5kZW5jaWVzLkRhc2hNZXRyaWNzRXh0ZW5zaW9ucy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkRhc2guZGVwZW5kZW5jaWVzLkRhc2hNZXRyaWNzRXh0ZW5zaW9uc30sRGFzaC5kZXBlbmRlbmNpZXMuRGFzaFBhcnNlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPTMxNTM2ZTMsYj0yNTkyZTMsYz04NjQwMCxkPTM2MDAsZT02MCxmPS9eUCgoW1xcZC5dKilZKT8oKFtcXGQuXSopTSk/KChbXFxkLl0qKUQpP1QoKFtcXGQuXSopSCk/KChbXFxkLl0qKU0pPygoW1xcZC5dKilTKT8vLGc9L14oXFxkezR9XFwtXFxkXFxkXFwtXFxkXFxkKFt0VF1bXFxkOlxcLl0qKT8pKFt6Wl18KFsrXFwtXSkoXFxkXFxkKTooXFxkXFxkKSk/JC8saD0vXlstK10/WzAtOV0rWy5dP1swLTldKihbZUVdWy0rXT9bMC05XSspPyQvLGk9W3t0eXBlOlwiZHVyYXRpb25cIix0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiBmLnRlc3QoYSl9LGNvbnZlcnRlcjpmdW5jdGlvbihnKXt2YXIgaD1mLmV4ZWMoZyk7cmV0dXJuIHBhcnNlRmxvYXQoaFsyXXx8MCkqYStwYXJzZUZsb2F0KGhbNF18fDApKmIrcGFyc2VGbG9hdChoWzZdfHwwKSpjK3BhcnNlRmxvYXQoaFs4XXx8MCkqZCtwYXJzZUZsb2F0KGhbMTBdfHwwKSplK3BhcnNlRmxvYXQoaFsxMl18fDApfX0se3R5cGU6XCJkYXRldGltZVwiLHRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGcudGVzdChhKX0sY29udmVydGVyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgRGF0ZShhKX19LHt0eXBlOlwibnVtZXJpY1wiLHRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGgudGVzdChhKX0sY29udmVydGVyOmZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUZsb2F0KGEpfX1dLGo9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZDtyZXR1cm4gZD1be25hbWU6XCJwcm9maWxlc1wiLG1lcmdlOiExfSx7bmFtZTpcIndpZHRoXCIsbWVyZ2U6ITF9LHtuYW1lOlwiaGVpZ2h0XCIsbWVyZ2U6ITF9LHtuYW1lOlwic2FyXCIsbWVyZ2U6ITF9LHtuYW1lOlwiZnJhbWVSYXRlXCIsbWVyZ2U6ITF9LHtuYW1lOlwiYXVkaW9TYW1wbGluZ1JhdGVcIixtZXJnZTohMX0se25hbWU6XCJtaW1lVHlwZVwiLG1lcmdlOiExfSx7bmFtZTpcInNlZ21lbnRQcm9maWxlc1wiLG1lcmdlOiExfSx7bmFtZTpcImNvZGVjc1wiLG1lcmdlOiExfSx7bmFtZTpcIm1heGltdW1TQVBQZXJpb2RcIixtZXJnZTohMX0se25hbWU6XCJzdGFydHNXaXRoU2FwXCIsbWVyZ2U6ITF9LHtuYW1lOlwibWF4UGxheW91dFJhdGVcIixtZXJnZTohMX0se25hbWU6XCJjb2RpbmdEZXBlbmRlbmN5XCIsbWVyZ2U6ITF9LHtuYW1lOlwic2NhblR5cGVcIixtZXJnZTohMX0se25hbWU6XCJGcmFtZVBhY2tpbmdcIixtZXJnZTohMH0se25hbWU6XCJBdWRpb0NoYW5uZWxDb25maWd1cmF0aW9uXCIsbWVyZ2U6ITB9LHtuYW1lOlwiQ29udGVudFByb3RlY3Rpb25cIixtZXJnZTohMH1dLGE9e30sYS5uYW1lPVwiQWRhcHRhdGlvblNldFwiLGEuaXNSb290PSExLGEuaXNBcnJheT0hMCxhLnBhcmVudD1udWxsLGEuY2hpbGRyZW49W10sYS5wcm9wZXJ0aWVzPWQsYj17fSxiLm5hbWU9XCJSZXByZXNlbnRhdGlvblwiLGIuaXNSb290PSExLGIuaXNBcnJheT0hMCxiLnBhcmVudD1hLGIuY2hpbGRyZW49W10sYi5wcm9wZXJ0aWVzPWQsYS5jaGlsZHJlbi5wdXNoKGIpLGM9e30sYy5uYW1lPVwiU3ViUmVwcmVzZW50YXRpb25cIixjLmlzUm9vdD0hMSxjLmlzQXJyYXk9ITAsYy5wYXJlbnQ9YixjLmNoaWxkcmVuPVtdLGMucHJvcGVydGllcz1kLGIuY2hpbGRyZW4ucHVzaChjKSxhfSxrPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7cmV0dXJuIGQ9W3tuYW1lOlwiU2VnbWVudEJhc2VcIixtZXJnZTohMH0se25hbWU6XCJTZWdtZW50VGVtcGxhdGVcIixtZXJnZTohMH0se25hbWU6XCJTZWdtZW50TGlzdFwiLG1lcmdlOiEwfV0sYT17fSxhLm5hbWU9XCJQZXJpb2RcIixhLmlzUm9vdD0hMSxhLmlzQXJyYXk9ITAsYS5wYXJlbnQ9bnVsbCxhLmNoaWxkcmVuPVtdLGEucHJvcGVydGllcz1kLGI9e30sYi5uYW1lPVwiQWRhcHRhdGlvblNldFwiLGIuaXNSb290PSExLGIuaXNBcnJheT0hMCxiLnBhcmVudD1hLGIuY2hpbGRyZW49W10sYi5wcm9wZXJ0aWVzPWQsYS5jaGlsZHJlbi5wdXNoKGIpLGM9e30sYy5uYW1lPVwiUmVwcmVzZW50YXRpb25cIixjLmlzUm9vdD0hMSxjLmlzQXJyYXk9ITAsYy5wYXJlbnQ9YixjLmNoaWxkcmVuPVtdLGMucHJvcGVydGllcz1kLGIuY2hpbGRyZW4ucHVzaChjKSxhfSxsPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtyZXR1cm4gZT1be25hbWU6XCJCYXNlVVJMXCIsbWVyZ2U6ITAsbWVyZ2VGdW5jdGlvbjpmdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBjPTA9PT1iLmluZGV4T2YoXCJodHRwOi8vXCIpP2I6YStifX1dLGE9e30sYS5uYW1lPVwibXBkXCIsYS5pc1Jvb3Q9ITAsYS5pc0FycmF5PSEwLGEucGFyZW50PW51bGwsYS5jaGlsZHJlbj1bXSxhLnByb3BlcnRpZXM9ZSxiPXt9LGIubmFtZT1cIlBlcmlvZFwiLGIuaXNSb290PSExLGIuaXNBcnJheT0hMCxiLnBhcmVudD1udWxsLGIuY2hpbGRyZW49W10sYi5wcm9wZXJ0aWVzPWUsYS5jaGlsZHJlbi5wdXNoKGIpLGM9e30sYy5uYW1lPVwiQWRhcHRhdGlvblNldFwiLGMuaXNSb290PSExLGMuaXNBcnJheT0hMCxjLnBhcmVudD1iLGMuY2hpbGRyZW49W10sYy5wcm9wZXJ0aWVzPWUsYi5jaGlsZHJlbi5wdXNoKGMpLGQ9e30sZC5uYW1lPVwiUmVwcmVzZW50YXRpb25cIixkLmlzUm9vdD0hMSxkLmlzQXJyYXk9ITAsZC5wYXJlbnQ9YyxkLmNoaWxkcmVuPVtdLGQucHJvcGVydGllcz1lLGMuY2hpbGRyZW4ucHVzaChkKSxhfSxtPWZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIGEucHVzaChqKCkpLGEucHVzaChrKCkpLGEucHVzaChsKCkpLGF9LG49ZnVuY3Rpb24oYSxiKXt0aGlzLmRlYnVnLmxvZyhcIkRvaW5nIHBhcnNlLlwiKTt2YXIgYyxkPW5ldyBYMkpTKGksXCJcIiwhMCksZT1uZXcgT2JqZWN0SXJvbihtKCkpO3RyeXt0aGlzLmRlYnVnLmxvZyhcIkNvbnZlcnRpbmcgZnJvbSBYTUwuXCIpLGM9ZC54bWxfc3RyMmpzb24oYSksYy5oYXNPd25Qcm9wZXJ0eShcIkJhc2VVUkxcIik/KGMuQmFzZVVSTD1jLkJhc2VVUkxfYXNBcnJheVswXSwwIT09Yy5CYXNlVVJMLnRvU3RyaW5nKCkuaW5kZXhPZihcImh0dHBcIikmJihjLkJhc2VVUkw9YitjLkJhc2VVUkwpKToodGhpcy5kZWJ1Zy5sb2coXCJTZXR0aW5nIGJhc2VVUkw6IFwiK2IpLGMuQmFzZVVSTD1iKSx0aGlzLmRlYnVnLmxvZyhcIkZsYXR0ZW4gbWFuaWZlc3QgcHJvcGVydGllcy5cIiksZS5ydW4oYyksdGhpcy5kZWJ1Zy5sb2coXCJQYXJzaW5nIGNvbXBsZXRlLlwiKX1jYXRjaChmKXtyZXR1cm4gdGhpcy5lcnJIYW5kbGVyLm1hbmlmZXN0RXJyb3IoXCJwYXJzaW5nIHRoZSBtYW5pZmVzdCBmYWlsZWRcIixcInBhcnNlXCIsYSksUS5yZWplY3QoZil9cmV0dXJuIFEud2hlbihjKX07cmV0dXJue2RlYnVnOnZvaWQgMCxlcnJIYW5kbGVyOnZvaWQgMCxwYXJzZTpufX0sRGFzaC5kZXBlbmRlbmNpZXMuRGFzaFBhcnNlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkRhc2guZGVwZW5kZW5jaWVzLkRhc2hQYXJzZXJ9LERhc2guZGVwZW5kZW5jaWVzLkZyYWdtZW50RXh0ZW5zaW9ucz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZSxmLGcsaD1RLmRlZmVyKCksaT1uZXcgRGF0YVZpZXcoYSksaj0wO1widGZkdFwiIT09ZSYmajxpLmJ5dGVMZW5ndGg7KXtmb3IoZD1pLmdldFVpbnQzMihqKSxqKz00LGU9XCJcIixmPTA7ND5mO2YrPTEpZz1pLmdldEludDgoaiksZSs9U3RyaW5nLmZyb21DaGFyQ29kZShnKSxqKz0xO1wibW9vZlwiIT09ZSYmXCJ0cmFmXCIhPT1lJiZcInRmZHRcIiE9PWUmJihqKz1kLTgpfWlmKGo9PT1pLmJ5dGVMZW5ndGgpdGhyb3dcIkVycm9yIGZpbmRpbmcgbGl2ZSBvZmZzZXQuXCI7cmV0dXJuIGM9aS5nZXRVaW50OChqKSx0aGlzLmRlYnVnLmxvZyhcInBvc2l0aW9uOiBcIitqKSwwPT09Yz8oais9NCxiPWkuZ2V0VWludDMyKGosITEpKTooais9ZC0xNixiPXV0aWxzLk1hdGgudG82NEJpdE51bWJlcihpLmdldFVpbnQzMihqKzQsITEpLGkuZ2V0VWludDMyKGosITEpKSksaC5yZXNvbHZlKHt2ZXJzaW9uOmMsYmFzZV9tZWRpYV9kZWNvZGVfdGltZTpifSksaC5wcm9taXNlfSxiPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZSxmLGcsaCxpPW5ldyBEYXRhVmlldyhhKSxqPTA7XCJzaWR4XCIhPT1mJiZqPGkuYnl0ZUxlbmd0aDspe2ZvcihnPWkuZ2V0VWludDMyKGopLGorPTQsZj1cIlwiLGU9MDs0PmU7ZSs9MSloPWkuZ2V0SW50OChqKSxmKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGgpLGorPTE7XCJtb29mXCIhPT1mJiZcInRyYWZcIiE9PWYmJlwic2lkeFwiIT09Zj9qKz1nLTg6XCJzaWR4XCI9PT1mJiYoai09OCl9cmV0dXJuIGI9aS5nZXRVaW50OChqKzgpLGorPTEyLGM9aS5nZXRVaW50MzIoais0LCExKSxqKz04LGQ9MD09PWI/aS5nZXRVaW50MzIoaiwhMSk6dXRpbHMuTWF0aC50bzY0Qml0TnVtYmVyKGkuZ2V0VWludDMyKGorNCwhMSksaS5nZXRVaW50MzIoaiwhMSkpLFEud2hlbih7ZWFybGllc3RQcmVzZW50YXRpb25UaW1lOmQsdGltZXNjYWxlOmN9KX0sYz1mdW5jdGlvbihiKXt2YXIgYyxkLGUsZj1RLmRlZmVyKCksZz1uZXcgWE1MSHR0cFJlcXVlc3QsaD0hMTtyZXR1cm4gYz1iLGcub25sb2FkZW5kPWZ1bmN0aW9uKCl7aHx8KGQ9XCJFcnJvciBsb2FkaW5nIGZyYWdtZW50OiBcIitjLGYucmVqZWN0KGQpKX0sZy5vbmxvYWQ9ZnVuY3Rpb24oKXtoPSEwLGU9YShnLnJlc3BvbnNlKSxmLnJlc29sdmUoZSl9LGcub25lcnJvcj1mdW5jdGlvbigpe2Q9XCJFcnJvciBsb2FkaW5nIGZyYWdtZW50OiBcIitjLGYucmVqZWN0KGQpfSxnLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCIsZy5vcGVuKFwiR0VUXCIsYyksZy5zZW5kKG51bGwpLGYucHJvbWlzZX07cmV0dXJue2RlYnVnOnZvaWQgMCxsb2FkRnJhZ21lbnQ6YyxwYXJzZVRGRFQ6YSxwYXJzZVNJRFg6Yn19LERhc2guZGVwZW5kZW5jaWVzLkZyYWdtZW50RXh0ZW5zaW9ucy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkRhc2guZGVwZW5kZW5jaWVzLkZyYWdtZW50RXh0ZW5zaW9uc30sRGFzaC52by5TZWdtZW50PWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy5pbmRleFJhbmdlPW51bGwsdGhpcy5pbmRleD1udWxsLHRoaXMubWVkaWFSYW5nZT1udWxsLHRoaXMubWVkaWE9bnVsbCx0aGlzLmR1cmF0aW9uPTAvMCx0aGlzLnN0YXJ0VGltZT0wLzAsdGhpcy50aW1lc2NhbGU9MC8wfSxEYXNoLnZvLlNlZ21lbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpEYXNoLnZvLlNlZ21lbnR9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5BYnJDb250cm9sbGVyPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9ITAsYj17fSxjPXt9LGQ9ZnVuY3Rpb24oYSl7dmFyIGM7cmV0dXJuIGIuaGFzT3duUHJvcGVydHkoYSl8fChiW2FdPTApLGM9YlthXX0sZT1mdW5jdGlvbihhLGMpe2JbYV09Y30sZj1mdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYy5oYXNPd25Qcm9wZXJ0eShhKXx8KGNbYV09MCksYj1jW2FdfSxnPWZ1bmN0aW9uKGEsYil7Y1thXT1ifTtyZXR1cm57ZGVidWc6dm9pZCAwLGFiclJ1bGVzQ29sbGVjdGlvbjp2b2lkIDAsbWFuaWZlc3RFeHQ6dm9pZCAwLG1ldHJpY3NNb2RlbDp2b2lkIDAsZ2V0QXV0b1N3aXRjaEJpdHJhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2V0QXV0b1N3aXRjaEJpdHJhdGU6ZnVuY3Rpb24oYil7YT1ifSxnZXRNZXRyaWNzRm9yOmZ1bmN0aW9uKGEpe3ZhciBiPVEuZGVmZXIoKSxjPXRoaXM7cmV0dXJuIGMubWFuaWZlc3RFeHQuZ2V0SXNWaWRlbyhhKS50aGVuKGZ1bmN0aW9uKGQpe2Q/Yi5yZXNvbHZlKGMubWV0cmljc01vZGVsLmdldE1ldHJpY3NGb3IoXCJ2aWRlb1wiKSk6Yy5tYW5pZmVzdEV4dC5nZXRJc0F1ZGlvKGEpLnRoZW4oZnVuY3Rpb24oYSl7YT9iLnJlc29sdmUoYy5tZXRyaWNzTW9kZWwuZ2V0TWV0cmljc0ZvcihcImF1ZGlvXCIpKTpiLnJlc29sdmUoYy5tZXRyaWNzTW9kZWwuZ2V0TWV0cmljc0ZvcihcInN0cmVhbVwiKSl9KX0pLGIucHJvbWlzZX0sZ2V0UGxheWJhY2tRdWFsaXR5OmZ1bmN0aW9uKGIsYyl7dmFyIGgsaSxqLGssbCxtLG49dGhpcyxvPVEuZGVmZXIoKSxwPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSxxPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSxyPVtdO3JldHVybiBsPWQoYiksbT1mKGIpLG4uZGVidWcubG9nKFwiQUJSIGVuYWJsZWQ/IChcIithK1wiKVwiKSxhPyhuLmRlYnVnLmxvZyhcIkNoZWNrIEFCUiBydWxlcy5cIiksbi5nZXRNZXRyaWNzRm9yKGMpLnRoZW4oZnVuY3Rpb24oYSl7bi5hYnJSdWxlc0NvbGxlY3Rpb24uZ2V0UnVsZXMoKS50aGVuKGZ1bmN0aW9uKGQpe2ZvcihoPTAsaT1kLmxlbmd0aDtpPmg7aCs9MSlyLnB1c2goZFtoXS5jaGVja0luZGV4KGwsYSxjKSk7XHJcblEuYWxsKHIpLnRoZW4oZnVuY3Rpb24oYSl7Zm9yKG4uZGVidWcubG9nKGEpLGs9e30sa1tNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5TVFJPTkddPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSxrW01lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLldFQUtdPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSxrW01lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLkRFRkFVTFRdPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLk5PX0NIQU5HRSxoPTAsaT1hLmxlbmd0aDtpPmg7aCs9MSlqPWFbaF0sai5xdWFsaXR5IT09TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuTk9fQ0hBTkdFJiYoa1tqLnByaW9yaXR5XT1NYXRoLm1pbihrW2oucHJpb3JpdHldLGoucXVhbGl0eSkpO2tbTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuV0VBS10hPT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0UmJihxPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLldFQUsscD1rW01lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLldFQUtdKSxrW01lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLkRFRkFVTFRdIT09TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuTk9fQ0hBTkdFJiYocT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5ERUZBVUxULHA9a1tNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5ERUZBVUxUXSksa1tNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5TVFJPTkddIT09TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuTk9fQ0hBTkdFJiYocT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5TVFJPTkcscD1rW01lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9OR10pLHAhPT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0UmJnZvaWQgMCE9PXAmJihsPXApLHEhPT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0UmJnZvaWQgMCE9PXEmJihtPXEpLG4ubWFuaWZlc3RFeHQuZ2V0UmVwcmVzZW50YXRpb25Db3VudChjKS50aGVuKGZ1bmN0aW9uKGEpezA+bCYmKGw9MCksbD49YSYmKGw9YS0xKSxtIT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5TVFJPTkcmJm0hPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLldFQUsmJihtPU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLkRFRkFVTFQpLGUoYixsKSxuLmRlYnVnLmxvZyhcIk5ldyBxdWFsaXR5IG9mIFwiK2wpLGcoYixtKSxuLmRlYnVnLmxvZyhcIk5ldyBjb25maWRlbmNlIG9mIFwiK20pLG8ucmVzb2x2ZSh7cXVhbGl0eTpsLGNvbmZpZGVuY2U6bX0pfSl9KX0pfSkpOihuLmRlYnVnLmxvZyhcIlVuY2hhbmdlZCBxdWFsaXR5IG9mIFwiK2wpLG8ucmVzb2x2ZSh7cXVhbGl0eTpsLGNvbmZpZGVuY2U6bX0pKSxvLnByb21pc2V9LHNldFBsYXliYWNrUXVhbGl0eTpmdW5jdGlvbihhLGIpe3ZhciBjPWQoYSk7YiE9PWMmJmUoYSxiKX0sZ2V0UXVhbGl0eUZvcjpmdW5jdGlvbihhKXtyZXR1cm4gZChhKX19fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQWJyQ29udHJvbGxlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5BYnJDb250cm9sbGVyfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyQ29udHJvbGxlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhLGIsYyxkLGU9LjUsZj0yMixnPVwiV0FJVElOR1wiLGg9XCJSRUFEWVwiLGk9XCJWQUxJREFUSU5HXCIsaj1cIkxPQURJTkdcIixrPWcsbD0hMSxtPSExLG49ITEsbz0hMCxwPVtdLHE9ITEscj0tMSxzPSEwLHQ9LTEsdT0hMSx2PSExLHc9ITEseD0hMSx5PVtdLHo9bnVsbCxBPVEuZGVmZXIoKSxCPW51bGwsQz1udWxsLEQ9LTEsRT0wLEY9MCxHPW51bGwsSD0wLEk9ITEsSj1udWxsLEs9MCxMPSExLE09bnVsbCxOPW51bGwsTz1udWxsLFA9bnVsbCxSPSEwLFM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLmRlYnVnLmxvZyhcIkJ1ZmZlckNvbnRyb2xsZXIgXCIrYytcIiBzZXRTdGF0ZSB0bzpcIithKSxrPWEsbnVsbCE9PUcmJmIuZnJhZ21lbnRDb250cm9sbGVyLm9uQnVmZmVyQ29udHJvbGxlclN0YXRlQ2hhbmdlKCl9LFQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9bnVsbDtSPT09ITEmJihkPVAuc3RhcnQsYz1hLmdldFRpbWUoKS1kLmdldFRpbWUoKSxQLmR1cmF0aW9uPWMsUC5zdG9wcmVhc29uPWIsUj0hMCl9LFU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxiPXRoaXMubWFuaWZlc3RFeHQuZ2V0SXNMaXZlKGEpO3JldHVybiB3PSEwLFEud2hlbihiKX0sVj1mdW5jdGlvbigpe2lmKGwmJm0pe3ZhciBhPXRoaXM7VS5jYWxsKHRoaXMpLnRoZW4oZnVuY3Rpb24oYil7dj1iLGEuZGVidWcubG9nKFwiQnVmZmVyQ29udHJvbGxlciBiZWdpbiBcIitjK1wiIHZhbGlkYXRpb25cIiksUy5jYWxsKGEsaCksYS5yZXF1ZXN0U2NoZWR1bGVyLnN0YXJ0U2NoZWR1bGluZyhhLHJiKSxHPWEuZnJhZ21lbnRDb250cm9sbGVyLmF0dGFjaEJ1ZmZlckNvbnRyb2xsZXIoYSl9KX19LFc9ZnVuY3Rpb24oKXt2YXIgYTt0aGlzLnJlcXVlc3RTY2hlZHVsZXIuaXNTY2hlZHVsZWQodGhpcyl8fChxPT09ITEmJihhPW5ldyBEYXRlLFQoYSxNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlLlVTRVJfUkVRVUVTVF9TVE9QX1JFQVNPTiksTz10aGlzLm1ldHJpY3NNb2RlbC5hZGRQbGF5TGlzdChjLGEsMCxNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LklOSVRJQUxfUExBWV9TVEFSVF9SRUFTT04pKSx0aGlzLmRlYnVnLmxvZyhcIkJ1ZmZlckNvbnRyb2xsZXIgXCIrYytcIiBzdGFydC5cIiksbT0hMCxuPSEwLFYuY2FsbCh0aGlzKSl9LFg9ZnVuY3Rpb24oYSl7dmFyIGI7dGhpcy5kZWJ1Zy5sb2coXCJCdWZmZXJDb250cm9sbGVyIFwiK2MrXCIgc2VlazogXCIrYSkscT0hMCxyPWEsYj1uZXcgRGF0ZSxUKGIsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5VU0VSX1JFUVVFU1RfU1RPUF9SRUFTT04pLE89dGhpcy5tZXRyaWNzTW9kZWwuYWRkUGxheUxpc3QoYyxiLHIsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5TRUVLX1NUQVJUX1JFQVNPTiksVy5jYWxsKHRoaXMpfSxZPWZ1bmN0aW9uKCl7ayE9PWcmJih0aGlzLmRlYnVnLmxvZyhcIkJ1ZmZlckNvbnRyb2xsZXIgXCIrYytcIiBzdG9wLlwiKSxTLmNhbGwodGhpcyxnKSx0aGlzLnJlcXVlc3RTY2hlZHVsZXIuc3RvcFNjaGVkdWxpbmcodGhpcyksdGhpcy5mcmFnbWVudENvbnRyb2xsZXIuY2FuY2VsUGVuZGluZ1JlcXVlc3RzRm9yTW9kZWwoRyksbT0hMSxuPSExLFQobmV3IERhdGUsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5VU0VSX1JFUVVFU1RfU1RPUF9SRUFTT04pKX0sWj1mdW5jdGlvbihhLGIpe3ZhciBjPW51bGw7cmV0dXJuIGImJmIuUmVwcmVzZW50YXRpb25fYXNBcnJheSYmYi5SZXByZXNlbnRhdGlvbl9hc0FycmF5Lmxlbmd0aD4wJiYoYz1iLlJlcHJlc2VudGF0aW9uX2FzQXJyYXlbYV0pLGN9LCQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2s9PT1qJiYodSYmKHU9ITEsdGhpcy52aWRlb01vZGVsLnN0YWxsU3RyZWFtKGMsdSkpLFMuY2FsbChhLGgpKX0sXz1mdW5jdGlvbihhKXtpZih0aGlzLmZyYWdtZW50Q29udHJvbGxlci5pc0luaXRpYWxpemF0aW9uUmVxdWVzdChhKSlTLmNhbGwodGhpcyxoKTtlbHNle1MuY2FsbCh0aGlzLGopO3ZhciBiPXRoaXMsYz1iLmZyYWdtZW50Q29udHJvbGxlci5nZXRMb2FkaW5nVGltZShiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7KE18fE4pJiYoUy5jYWxsKGIsaCkscWIuY2FsbChiKSl9LGMpfX0sYWI9ZnVuY3Rpb24oYSxiKXt0aGlzLmZyYWdtZW50Q29udHJvbGxlci5pc0luaXRpYWxpemF0aW9uUmVxdWVzdChhKT9oYi5jYWxsKHRoaXMsYSxiKTpiYi5jYWxsKHRoaXMsYSxiKX0sYmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzO2QuZGVidWcubG9nKGMrXCIgQnl0ZXMgZmluaXNoZWQgbG9hZGluZzogXCIrYS51cmwpLEt8fGlzTmFOKGEuZHVyYXRpb24pfHwoSz1hLmR1cmF0aW9uKSxkLmZyYWdtZW50Q29udHJvbGxlci5wcm9jZXNzKGIuZGF0YSkudGhlbihmdW5jdGlvbihiKXtudWxsIT09YiYmbnVsbCE9PXo/US53aGVuKHoucHJvbWlzZSkudGhlbihmdW5jdGlvbigpe2NiLmNhbGwoZCxiLGEucXVhbGl0eSkudGhlbihmdW5jdGlvbigpe0EucHJvbWlzZS50aGVuKGZ1bmN0aW9uKGIpe2IuaW5kZXgtMSE9PWEuaW5kZXh8fHh8fCh4PSEwLHUmJih1PSExLGQudmlkZW9Nb2RlbC5zdGFsbFN0cmVhbShjLHUpKSxTLmNhbGwoZCxoKSxkLnN5c3RlbS5ub3RpZnkoXCJidWZmZXJpbmdDb21wbGV0ZWRcIikpfSl9KX0pOmQuZGVidWcubG9nKFwiTm8gXCIrYytcIiBieXRlcyB0byBwdXNoLlwiKX0pfSxjYj1mdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMsZT1hPT1KLGg9ZT9COlEuZGVmZXIoKSxpPWU/eS5sZW5ndGg6eS5wdXNoKGgpLGo9Wih0LGQuZ2V0RGF0YSgpKSxsPWQudmlkZW9Nb2RlbC5nZXRDdXJyZW50VGltZSgpLG09bmV3IERhdGU7cmV0dXJuIGQuZGVidWcubG9nKFwiUHVzaCAoXCIrYytcIikgYnl0ZXM6IFwiK2EuYnl0ZUxlbmd0aCksUj09PSEwJiZrIT09ZyYmLTEhPT10JiYoUj0hMSxQPWQubWV0cmljc01vZGVsLmFwcGVuZFBsYXlMaXN0VHJhY2UoTyxqLmlkLG51bGwsbSxsLG51bGwsMSxudWxsKSksUS53aGVuKGV8fDI+aXx8eVtpLTJdLnByb21pc2UpLnRoZW4oZnVuY3Rpb24oKXtOJiZmYi5jYWxsKGQpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gYiE9PXQ/KGgucmVzb2x2ZSgpLGUmJihCPW51bGwsSj1udWxsKSx2b2lkIDApOihRLndoZW4oQz9DLnByb21pc2U6ITApLnRoZW4oZnVuY3Rpb24oKXtkLnNvdXJjZUJ1ZmZlckV4dC5hcHBlbmQoTixhLGQudmlkZW9Nb2RlbCkudGhlbihmdW5jdGlvbigpe2UmJihCPW51bGwsSj1udWxsKSxkLnJlcXVlc3RTY2hlZHVsZXIuaXNTY2hlZHVsZWQoZCl8fFcuY2FsbChkKSxJPSExLGRiLmNhbGwoZCkudGhlbihmdW5jdGlvbigpe2gucmVzb2x2ZSgpfSksTiYmZC5zb3VyY2VCdWZmZXJFeHQuZ2V0QWxsUmFuZ2VzKE4pLnRoZW4oZnVuY3Rpb24oYSl7aWYoYSYmKGQuZGVidWcubG9nKFwiQXBwZW5kIFwiK2MrXCIgY29tcGxldGU6IFwiK2EubGVuZ3RoKSxhLmxlbmd0aD4wKSl7dmFyIGIsZTtmb3IoZC5kZWJ1Zy5sb2coXCJOdW1iZXIgb2YgYnVmZmVyZWQgXCIrYytcIiByYW5nZXM6IFwiK2EubGVuZ3RoKSxiPTAsZT1hLmxlbmd0aDtlPmI7Yis9MSlkLmRlYnVnLmxvZyhcIkJ1ZmZlcmVkIFwiK2MrXCIgUmFuZ2U6IFwiK2Euc3RhcnQoYikrXCIgLSBcIithLmVuZChiKSl9fSl9LGZ1bmN0aW9uKGIpe2IuZXJyLmNvZGU9PT1mJiYoSj1hLEI9aCxJPSEwLEY9MCxZLmNhbGwoZCkpfSl9KSx2b2lkIDApfSl9KSxoLnByb21pc2V9LGRiPWZ1bmN0aW9uKCl7aWYoIU0mJiFOKXJldHVybiBRLndoZW4oITEpO3ZhciBhPXRoaXMsYj1RLmRlZmVyKCksZD1vYi5jYWxsKGEpO3JldHVybiBhLnNvdXJjZUJ1ZmZlckV4dC5nZXRCdWZmZXJMZW5ndGgoTixkKS50aGVuKGZ1bmN0aW9uKGQpe0g9ZCxhLm1ldHJpY3NNb2RlbC5hZGRCdWZmZXJMZXZlbChjLG5ldyBEYXRlLEgpLGViLmNhbGwoYSksYi5yZXNvbHZlKCl9KSxiLnByb21pc2V9LGViPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXJFeHQuZ2V0TGVhc3RCdWZmZXJMZXZlbCgpLGI9MipLLGM9SC1hO2M+YiYmIUM/KEY9MCxDPVEuZGVmZXIoKSk6Yj5jJiZDJiYoQy5yZXNvbHZlKCksQz1udWxsKX0sZmI9ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMsYz1RLmRlZmVyKCksZD0wO3JldHVybiBJPyhhPWZ1bmN0aW9uKCl7Z2IuY2FsbChiKS50aGVuKGZ1bmN0aW9uKGIpe2QrPWIsZD49Sz9jLnJlc29sdmUoKTpzZXRUaW1lb3V0KGEsMWUzKkspfSl9LGEuY2FsbChiKSxjLnByb21pc2UpOlEud2hlbighMCl9LGdiPWZ1bmN0aW9uKCl7dmFyIGEsYyxkPXRoaXMsZT1RLmRlZmVyKCksZj1kLnZpZGVvTW9kZWwuZ2V0Q3VycmVudFRpbWUoKSxnPTA7cmV0dXJuIGM9ZC5mcmFnbWVudENvbnRyb2xsZXIuZ2V0RXhlY3V0ZWRSZXF1ZXN0Rm9yVGltZShHLGYpLGE9YyYmIWlzTmFOKGMuc3RhcnRUaW1lKT9jLnN0YXJ0VGltZTpNYXRoLmZsb29yKGYpLEs9YyYmIWlzTmFOKGMuZHVyYXRpb24pP2MuZHVyYXRpb246MSxkLnNvdXJjZUJ1ZmZlckV4dC5nZXRCdWZmZXJSYW5nZShOLGYpLnRoZW4oZnVuY3Rpb24oYyl7bnVsbD09PWMmJnI9PT1mJiZOLmJ1ZmZlcmVkLmxlbmd0aD4wJiYoYT1OLmJ1ZmZlcmVkLmVuZChOLmJ1ZmZlcmVkLmxlbmd0aC0xKSksZz1OLmJ1ZmZlcmVkLnN0YXJ0KDApLGQuc291cmNlQnVmZmVyRXh0LnJlbW92ZShOLGcsYSxFLGIpLnRoZW4oZnVuY3Rpb24oKXtkLmZyYWdtZW50Q29udHJvbGxlci5yZW1vdmVFeGVjdXRlZFJlcXVlc3RzQmVmb3JlVGltZShHLGEpLGUucmVzb2x2ZShhLWcpfSl9KSxlLnByb21pc2V9LGhiPWZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcyxlPWIuZGF0YSxmPWEucXVhbGl0eTtkLmRlYnVnLmxvZyhjK1wiIEluaXRpYWxpemF0aW9uIGZpbmlzaGVkIGxvYWRpbmc6IFwiK2EudXJsKSxkLmZyYWdtZW50Q29udHJvbGxlci5wcm9jZXNzKGUpLnRoZW4oZnVuY3Rpb24oYil7bnVsbCE9PWI/KHBbZl09YixmPT09dCYmY2IuY2FsbChkLGIsYS5xdWFsaXR5KS50aGVuKGZ1bmN0aW9uKCl7ei5yZXNvbHZlKCl9KSk6ZC5kZWJ1Zy5sb2coXCJObyBcIitjK1wiIGJ5dGVzIHRvIHB1c2guXCIpfSl9LGliPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGM9YS5tYW5pZmVzdEV4dC5nZXRJc0xpdmUoYik7az09PWomJlMuY2FsbChhLGgpLGN8fGEuc3lzdGVtLm5vdGlmeShcInNlZ21lbnRMb2FkaW5nRmFpbGVkXCIpfSxqYj1mdW5jdGlvbihhKXt0aGlzLmRlYnVnLmxvZyhjK1wiIFN0cmVhbSBpcyBjb21wbGV0ZS5cIiksVChuZXcgRGF0ZSxNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlLkVORF9PRl9DT05URU5UX1NUT1BfUkVBU09OKSxZLmNhbGwodGhpcyksQS5yZXNvbHZlKGEpfSxrYj1mdW5jdGlvbihhLGIpe3ZhciBkLGU9bnVsbCxmPXRoaXMuYnVmZmVyRXh0LmdldFRvcFF1YWxpdHlJbmRleChjKSxnPVtdO2lmKG8mJih0aGlzLmRlYnVnLmxvZyhcIk1hcmtpbmcgYSBzcGVjaWFsIHNlZWsgZm9yIGluaXRpYWwgXCIrYytcIiBwbGF5YmFjay5cIikscXx8KHE9ITAscj0wKSxvPSExKSxzKXtmb3Ioej1RLmRlZmVyKCkscD1bXSxkPTA7Zj49ZDtkKz0xKWcucHVzaCh0aGlzLmluZGV4SGFuZGxlci5nZXRJbml0UmVxdWVzdChkLE0pKTt0PWIsZT1RLmFsbChnKX1lbHNlIGU9US53aGVuKG51bGwpLGEmJih6PVEuZGVmZXIoKSx0PWIscFtiXSYmY2IuY2FsbCh0aGlzLHBbYl0sYikudGhlbihmdW5jdGlvbigpe3oucmVzb2x2ZSgpfSkpO3JldHVybiBlfSxsYj1mdW5jdGlvbihiKXt2YXIgZCxlPXRoaXM7aWYocyYmIXEpZS5kZWJ1Zy5sb2coXCJEYXRhIGNoYW5nZWQgLSBsb2FkaW5nIHRoZSBcIitjK1wiIGZyYWdtZW50IGZvciB0aW1lOiBcIithKSxkPWUuaW5kZXhIYW5kbGVyLmdldFNlZ21lbnRSZXF1ZXN0Rm9yVGltZShhLGIsTSk7ZWxzZXt2YXIgZj1RLmRlZmVyKCksZz1lLnZpZGVvTW9kZWwuZ2V0Q3VycmVudFRpbWUoKTtkPWYucHJvbWlzZSxlLnNvdXJjZUJ1ZmZlckV4dC5nZXRCdWZmZXJSYW5nZShOLGcpLnRoZW4oZnVuY3Rpb24oYSl7cT0hMSxudWxsIT09YSYmKGc9YS5lbmQpLGUuZGVidWcubG9nKFwiTG9hZGluZyB0aGUgXCIrYytcIiBmcmFnbWVudCBmb3IgdGltZTogXCIrZyksZS5pbmRleEhhbmRsZXIuZ2V0U2VnbWVudFJlcXVlc3RGb3JUaW1lKGcsYixNKS50aGVuKGZ1bmN0aW9uKGEpe2YucmVzb2x2ZShhKX0sZnVuY3Rpb24oKXtmLnJlamVjdCgpfSl9LGZ1bmN0aW9uKCl7Zi5yZWplY3QoKX0pfXJldHVybiBzPSExLGR9LG1iPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7bnVsbCE9PWE/Yi5mcmFnbWVudENvbnRyb2xsZXIuaXNGcmFnbWVudExvYWRlZE9yUGVuZGluZyhiLGEpP1wiY29tcGxldGVcIiE9PWEuYWN0aW9uP2IuaW5kZXhIYW5kbGVyLmdldE5leHRTZWdtZW50UmVxdWVzdCh0LE0pLnRoZW4obWIuYmluZChiKSk6KFkuY2FsbChiKSxTLmNhbGwoYixoKSk6KGIuZGVidWcubG9nKFwiTG9hZGluZyBhbiBcIitjK1wiIGZyYWdtZW50OiBcIithLnVybCksUS53aGVuKEM/Qy5wcm9taXNlOiEwKS50aGVuKGZ1bmN0aW9uKCl7Yi5mcmFnbWVudENvbnRyb2xsZXIucHJlcGFyZUZyYWdtZW50Rm9yTG9hZGluZyhiLGEsXyxhYixpYixqYikudGhlbihmdW5jdGlvbigpe1MuY2FsbChiLGgpfSl9KSk6Uy5jYWxsKGIsaCl9LG5iPWZ1bmN0aW9uKCl7biYmKGQ+SCYmZDxFLXRoaXMudmlkZW9Nb2RlbC5nZXRDdXJyZW50VGltZSgpP3V8fCh0aGlzLmRlYnVnLmxvZyhcIldhaXRpbmcgZm9yIG1vcmUgXCIrYytcIiBidWZmZXIgYmVmb3JlIHN0YXJ0aW5nIHBsYXliYWNrLlwiKSx1PSEwLHRoaXMudmlkZW9Nb2RlbC5zdGFsbFN0cmVhbShjLHUpKToodGhpcy5kZWJ1Zy5sb2coXCJHb3QgZW5vdWdoIFwiK2MrXCIgYnVmZmVyIHRvIHN0YXJ0LlwiKSxuPSExLHU9ITEsdGhpcy52aWRlb01vZGVsLnN0YWxsU3RyZWFtKGMsdSkpKX0sb2I9ZnVuY3Rpb24oKXt2YXIgYT0tMTtyZXR1cm4gYT10aGlzLnZpZGVvTW9kZWwuZ2V0Q3VycmVudFRpbWUoKX0scGI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWIudmlkZW9Nb2RlbC5nZXRQbGF5YmFja1JhdGUoKSxkPUgvTWF0aC5tYXgoYywxKSxlPVEuZGVmZXIoKTtyZXR1cm4gYi5idWZmZXJFeHQuZ2V0UmVxdWlyZWRCdWZmZXJMZW5ndGgobixiLnJlcXVlc3RTY2hlZHVsZXIuZ2V0RXhlY3V0ZUludGVydmFsKGIpLzFlMyx2LEUpLnRoZW4oZnVuY3Rpb24oYyl7Yi5pbmRleEhhbmRsZXIuZ2V0U2VnbWVudENvdW50Rm9yRHVyYXRpb24oYSxNLGMsZCkudGhlbihmdW5jdGlvbihhKXtlLnJlc29sdmUoYSl9KX0pLGUucHJvbWlzZX0scWI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5mcmFnbWVudENvbnRyb2xsZXIuZ2V0UGVuZGluZ1JlcXVlc3RzKGEpLGM9YS5mcmFnbWVudENvbnRyb2xsZXIuZ2V0TG9hZGluZ1JlcXVlc3RzKGEpLGQ9KGI/Yi5sZW5ndGg6MCkrKGM/Yy5sZW5ndGg6MCk7Ri1kPjA/KEYtLSxsYi5jYWxsKGEsdCkudGhlbihtYi5iaW5kKGEpKSk6KGs9PT1pJiZTLmNhbGwoYSxoKSwkLmNhbGwoYSkpfSxyYj1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcyxkPSExLGY9bnVsbCxnPW5ldyBEYXRlLGw9Yi52aWRlb01vZGVsLmdldEN1cnJlbnRUaW1lKCksbT1vYi5jYWxsKGIpO2lmKGIuZGVidWcubG9nKFwiQnVmZmVyQ29udHJvbGxlci52YWxpZGF0ZSgpIFwiK2MrXCIgfCBzdGF0ZTogXCIrayksYi5kZWJ1Zy5sb2coYytcIiBQbGF5YmFjayByYXRlOiBcIitiLnZpZGVvTW9kZWwuZ2V0RWxlbWVudCgpLnBsYXliYWNrUmF0ZSksYi5kZWJ1Zy5sb2coYytcIiBXb3JraW5nIHRpbWU6IFwiK20pLGIuZGVidWcubG9nKGMrXCIgVmlkZW8gdGltZTogXCIrbCksYi5kZWJ1Zy5sb2coXCJDdXJyZW50IFwiK2MrXCIgYnVmZmVyIGxlbmd0aDogXCIrSCksbmIuY2FsbChiKSxrPT09aiYmZT5IKXV8fChiLmRlYnVnLmxvZyhcIlN0YWxsaW5nIFwiK2MrXCIgQnVmZmVyOiBcIitjKSxUKG5ldyBEYXRlLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2UuUkVCVUZGRVJJTkdfUkVBU09OKSx1PSEwLG49ITAsYi52aWRlb01vZGVsLnN0YWxsU3RyZWFtKGMsdSkpO2Vsc2UgaWYoaz09PWgpe1MuY2FsbChiLGkpO3ZhciBvPWIubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLm1pbkJ1ZmZlclRpbWU7Yi5idWZmZXJFeHQuZGVjaWRlQnVmZmVyTGVuZ3RoKG8sRSxuKS50aGVuKGZ1bmN0aW9uKGEpe2IuZGVidWcubG9nKFwiQnVmZmVyIHRpbWU6IFwiK2EpLGIuc2V0TWluQnVmZmVyVGltZShhKSxiLnJlcXVlc3RTY2hlZHVsZXIuYWRqdXN0RXhlY3V0ZUludGVydmFsKCl9KSxiLmFickNvbnRyb2xsZXIuZ2V0UGxheWJhY2tRdWFsaXR5KGMsTSkudGhlbihmdW5jdGlvbihlKXt2YXIgaD1lLnF1YWxpdHk7aWYoYi5kZWJ1Zy5sb2coYytcIiBQbGF5YmFjayBxdWFsaXR5OiBcIitoKSxiLmRlYnVnLmxvZyhcIlBvcHVsYXRlIFwiK2MrXCIgYnVmZmVycy5cIiksdm9pZCAwIT09aCYmKGE9aCksZD1oIT09dCxkPT09ITApe2lmKGIuZnJhZ21lbnRDb250cm9sbGVyLmFib3J0UmVxdWVzdHNGb3JNb2RlbChHKSxmPVooYSxiLmdldERhdGEoKSksbnVsbD09PWZ8fHZvaWQgMD09PWYpdGhyb3dcIlVuZXhwZWN0ZWQgZXJyb3IhXCI7Yi5tYW5pZmVzdEV4dC5nZXRUaW1lc3RhbXBPZmZzZXRGb3JQZXJpb2QoRCxiLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxoLE0pLnRoZW4oZnVuY3Rpb24oYSl7Ti50aW1lc3RhbXBPZmZzZXQhPT1hJiYoTi50aW1lc3RhbXBPZmZzZXQ9YSl9KSxUKG5ldyBEYXRlLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2UuUkVQUkVTRU5UQVRJT05fU1dJVENIX1NUT1BfUkVBU09OKSxiLm1ldHJpY3NNb2RlbC5hZGRSZXByZXNlbnRhdGlvblN3aXRjaChjLGcsbCxmLmlkKX1yZXR1cm4gYi5kZWJ1Zy5sb2coZD9jK1wiIFF1YWxpdHkgY2hhbmdlZCB0bzogXCIraDpcIlF1YWxpdHkgZGlkbid0IGNoYW5nZS5cIikscGIuY2FsbChiLGgpfSkudGhlbihmdW5jdGlvbihlKXtGPWUsa2IuY2FsbChiLGQsYSkudGhlbihmdW5jdGlvbihhKXtpZihudWxsIT09YSl7dmFyIGQsZSxmPWEubGVuZ3RoO2ZvcihlPTA7Zj5lO2UrPTEpZD1hW2VdLGIuZGVidWcubG9nKFwiTG9hZGluZyBcIitjK1wiIGluaXRpYWxpemF0aW9uOiBcIitkLnVybCksYi5kZWJ1Zy5sb2coZCksYi5mcmFnbWVudENvbnRyb2xsZXIucHJlcGFyZUZyYWdtZW50Rm9yTG9hZGluZyhiLGQsXyxhYixpYixqYikudGhlbihmdW5jdGlvbigpe1MuY2FsbChiLGgpfSl9fSkscWIuY2FsbChiKX0pfWVsc2Ugaz09PWkmJlMuY2FsbChiLGgpfTtyZXR1cm57dmlkZW9Nb2RlbDp2b2lkIDAsbWV0cmljc01vZGVsOnZvaWQgMCxtYW5pZmVzdEV4dDp2b2lkIDAsbWFuaWZlc3RNb2RlbDp2b2lkIDAsYnVmZmVyRXh0OnZvaWQgMCxzb3VyY2VCdWZmZXJFeHQ6dm9pZCAwLGFickNvbnRyb2xsZXI6dm9pZCAwLGZyYWdtZW50RXh0OnZvaWQgMCxpbmRleEhhbmRsZXI6dm9pZCAwLGRlYnVnOnZvaWQgMCxzeXN0ZW06dm9pZCAwLGVyckhhbmRsZXI6dm9pZCAwLGluaXRpYWxpemU6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt2YXIgaT10aGlzLGo9aS5tYW5pZmVzdE1vZGVsLmdldFZhbHVlKCksaz1pLm1hbmlmZXN0RXh0LmdldElzTGl2ZShqKTtpLnNldE1lZGlhU291cmNlKGgpLGkuc2V0VmlkZW9Nb2RlbChlKSxpLnNldFR5cGUoYSksaS5zZXRQZXJpb2RJbmRleChiKSxpLnNldERhdGEoYykudGhlbihmdW5jdGlvbigpe2w9ITAsVi5jYWxsKGkpfSksaS5zZXRCdWZmZXIoZCksaS5zZXRTY2hlZHVsZXIoZiksaS5zZXRGcmFnbWVudENvbnRyb2xsZXIoZyksaS5pbmRleEhhbmRsZXIuc2V0SXNMaXZlKGspLGkubWFuaWZlc3RFeHQuZ2V0RHVyYXRpb25Gb3JQZXJpb2QoYixpLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSkudGhlbihmdW5jdGlvbihhKXtFPWEsaS5pbmRleEhhbmRsZXIuc2V0RHVyYXRpb24oYSksaS5idWZmZXJFeHQuZGVjaWRlQnVmZmVyTGVuZ3RoKGoubWluQnVmZmVyVGltZSxFLG4pLnRoZW4oZnVuY3Rpb24oYSl7aS5zZXRNaW5CdWZmZXJUaW1lKGEpfSl9KX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiBjfSxzZXRUeXBlOmZ1bmN0aW9uKGEpe2M9YSx2b2lkIDAhPT10aGlzLmluZGV4SGFuZGxlciYmdGhpcy5pbmRleEhhbmRsZXIuc2V0VHlwZShhKX0sZ2V0UGVyaW9kSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gRH0sc2V0UGVyaW9kSW5kZXg6ZnVuY3Rpb24oYSl7RD1hfSxnZXRWaWRlb01vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9Nb2RlbH0sc2V0VmlkZW9Nb2RlbDpmdW5jdGlvbihhKXt0aGlzLnZpZGVvTW9kZWw9YX0sZ2V0U2NoZWR1bGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVxdWVzdFNjaGVkdWxlcn0sc2V0U2NoZWR1bGVyOmZ1bmN0aW9uKGEpe3RoaXMucmVxdWVzdFNjaGVkdWxlcj1hfSxnZXRGcmFnbWVudENvbnRyb2xsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mcmFnbWVudENvbnRyb2xsZXJ9LHNldEZyYWdtZW50Q29udHJvbGxlcjpmdW5jdGlvbihhKXt0aGlzLmZyYWdtZW50Q29udHJvbGxlcj1hfSxnZXRBdXRvU3dpdGNoQml0cmF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIGEuYWJyQ29udHJvbGxlci5nZXRBdXRvU3dpdGNoQml0cmF0ZSgpfSxzZXRBdXRvU3dpdGNoQml0cmF0ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzO2IuYWJyQ29udHJvbGxlci5zZXRBdXRvU3dpdGNoQml0cmF0ZShhKX0sZ2V0RGF0YTpmdW5jdGlvbigpe3JldHVybiBNfSxzZXREYXRhOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMsZT1RLmRlZmVyKCksZj1NO3JldHVybiBmfHwoZj1iKSxkLmFickNvbnRyb2xsZXIuZ2V0UGxheWJhY2tRdWFsaXR5KGMsZikudGhlbihmdW5jdGlvbihnKXtkLmluZGV4SGFuZGxlci5nZXRDdXJyZW50VGltZShnLnF1YWxpdHksZikudGhlbihmdW5jdGlvbihmKXtzPSEwLGE9ZixNPWIsZC5zZWVrKGYpLGQuYnVmZmVyRXh0LnVwZGF0ZURhdGEoTSxjKSxlLnJlc29sdmUoKX0pfSksZS5wcm9taXNlfSxnZXRCdWZmZXI6ZnVuY3Rpb24oKXtyZXR1cm4gTn0sc2V0QnVmZmVyOmZ1bmN0aW9uKGEpe049YX0sZ2V0TWluQnVmZmVyVGltZTpmdW5jdGlvbigpe3JldHVybiBkfSxzZXRNaW5CdWZmZXJUaW1lOmZ1bmN0aW9uKGEpe2Q9YX0sc2V0TWVkaWFTb3VyY2U6ZnVuY3Rpb24oYSl7Yj1hfSxpc1JlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIGs9PT1ofSxpc0J1ZmZlcmluZ0NvbXBsZXRlZDpmdW5jdGlvbigpe3JldHVybiB4fSxjbGVhck1ldHJpY3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO251bGwhPT1jJiZcIlwiIT09YyYmYS5tZXRyaWNzTW9kZWwuY2xlYXJDdXJyZW50TWV0cmljc0ZvclR5cGUoYyl9LHVwZGF0ZUJ1ZmZlclN0YXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztJJiZKJiYhTD8oTD0hMCxjYi5jYWxsKGEsSix0KS50aGVuKGZ1bmN0aW9uKCl7TD0hMX0pKTpkYi5jYWxsKGEpfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYz10aGlzO1kuY2FsbChjKSxjLmNsZWFyTWV0cmljcygpLGMuZnJhZ21lbnRDb250cm9sbGVyLmFib3J0UmVxdWVzdHNGb3JNb2RlbChHKSxjLmZyYWdtZW50Q29udHJvbGxlci5kZXRhY2hCdWZmZXJDb250cm9sbGVyKEcpLEc9bnVsbCx5PVtdLHo9bnVsbCxwPVtdLEE9US5kZWZlcigpLGF8fChjLnNvdXJjZUJ1ZmZlckV4dC5hYm9ydChiLE4pLGMuc291cmNlQnVmZmVyRXh0LnJlbW92ZVNvdXJjZUJ1ZmZlcihiLE4pKSxNPW51bGwsTj1udWxsfSxzdGFydDpXLHNlZWs6WCxzdG9wOll9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyQ29udHJvbGxlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJDb250cm9sbGVyfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhLGIsYz0wLGQ9MCxlPW51bGwsZj1udWxsLGc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZXRyaWNzRXh0LmdldEN1cnJlbnRIdHRwUmVxdWVzdChhKTtyZXR1cm4gbnVsbCE9PWI/KGIudHJlc3BvbnNlLmdldFRpbWUoKS1iLnRyZXF1ZXN0LmdldFRpbWUoKSkvMWUzOjB9LGg9ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMsZz1RLmRlZmVyKCk7cmV0dXJuIFEud2hlbihlP2IuYWJyQ29udHJvbGxlci5nZXRQbGF5YmFja1F1YWxpdHkoXCJhdWRpb1wiLGUpOmMpLnRoZW4oZnVuY3Rpb24oZSl7US53aGVuKGY/Yi5hYnJDb250cm9sbGVyLmdldFBsYXliYWNrUXVhbGl0eShcInZpZGVvXCIsZik6ZCkudGhlbihmdW5jdGlvbihiKXthPWUucXVhbGl0eT09PWMmJmIucXVhbGl0eT09PWQsYT1hfHxlLmNvbmZpZGVuY2U9PT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5TVFJPTkcmJmIuY29uZmlkZW5jZT09PU1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlLlNUUk9ORyxnLnJlc29sdmUoYSl9KX0pLGcucHJvbWlzZX07cmV0dXJue3N5c3RlbTp2b2lkIDAsdmlkZW9Nb2RlbDp2b2lkIDAsbWFuaWZlc3RFeHQ6dm9pZCAwLG1ldHJpY3NFeHQ6dm9pZCAwLG1ldHJpY3NNb2RlbDp2b2lkIDAsYWJyQ29udHJvbGxlcjp2b2lkIDAsYnVmZmVyTWF4OnZvaWQgMCx1cGRhdGVEYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGc9YS5SZXByZXNlbnRhdGlvbl9hc0FycmF5Lmxlbmd0aC0xO1wiYXVkaW9cIj09PWI/KGM9ZyxlPWEpOlwidmlkZW9cIj09PWImJihkPWcsZj1hKX0sZ2V0VG9wUXVhbGl0eUluZGV4OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuXCJhdWRpb1wiPT09YT9iPWM6XCJ2aWRlb1wiPT09YSYmKGI9ZCksYn0sZGVjaWRlQnVmZmVyTGVuZ3RoOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGE9TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuREVGQVVMVF9NSU5fQlVGRkVSX1RJTUU8YyYmYz5iP01hdGgubWF4KE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkRFRkFVTFRfTUlOX0JVRkZFUl9USU1FLGIpOmI+PWM/TWF0aC5taW4oYyxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5ERUZBVUxUX01JTl9CVUZGRVJfVElNRSk6TWF0aC5taW4oYyxiKSxRLndoZW4oYSl9LGdldExlYXN0QnVmZmVyTGV2ZWw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm1ldHJpY3NNb2RlbC5nZXRSZWFkT25seU1ldHJpY3NGb3IoXCJ2aWRlb1wiKSxiPXRoaXMubWV0cmljc0V4dC5nZXRDdXJyZW50QnVmZmVyTGV2ZWwoYSksYz10aGlzLm1ldHJpY3NNb2RlbC5nZXRSZWFkT25seU1ldHJpY3NGb3IoXCJhdWRpb1wiKSxkPXRoaXMubWV0cmljc0V4dC5nZXRDdXJyZW50QnVmZmVyTGV2ZWwoYyksZT1udWxsO3JldHVybiBlPW51bGw9PT1ifHxudWxsPT09ZD9udWxsIT09ZD9kLmxldmVsOm51bGwhPT1iP2IubGV2ZWw6bnVsbDpNYXRoLm1pbihkLmxldmVsLGIubGV2ZWwpfSxnZXRSZXF1aXJlZEJ1ZmZlckxlbmd0aDpmdW5jdGlvbihjLGQsZSxmKXt2YXIgaSxqPXRoaXMsaz1qLm1ldHJpY3NNb2RlbC5nZXRSZWFkT25seU1ldHJpY3NGb3IoXCJ2aWRlb1wiKSxsPWoubWV0cmljc01vZGVsLmdldFJlYWRPbmx5TWV0cmljc0ZvcihcImF1ZGlvXCIpLG09Zj49TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuTE9OR19GT1JNX0NPTlRFTlRfRFVSQVRJT05fVEhSRVNIT0xELG49US5kZWZlcigpLG89bnVsbDtyZXR1cm4gai5idWZmZXJNYXg9PT1NZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfU0laRV9NSU4/KGk9YSxuLnJlc29sdmUoaSkpOmouYnVmZmVyTWF4PT09TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1NJWkVfSU5GSU5JVFk/KGk9ZixuLnJlc29sdmUoaSkpOmouYnVmZmVyTWF4PT09TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1NJWkVfUkVRVUlSRUQ/KGI9YSxlfHxjfHwobz1oLmNhbGwoaikpLFEud2hlbihvKS50aGVuKGZ1bmN0aW9uKGEpe2EmJihiPW0/TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1RJTUVfQVRfVE9QX1FVQUxJVFlfTE9OR19GT1JNOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkJVRkZFUl9USU1FX0FUX1RPUF9RVUFMSVRZKSxpPWIrZCtNYXRoLm1heChnLmNhbGwoaixrKSxnLmNhbGwoaixsKSksbi5yZXNvbHZlKGkpfSkpOm4ucmVqZWN0KFwiaW52YWxpZCBidWZmZXJNYXggdmFsdWU6IFwiK2ouYnVmZmVyTWF4KSxuLnByb21pc2V9LGdldEJ1ZmZlclRhcmdldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1iP2E6Yn19fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5CVUZGRVJfU0laRV9SRVFVSVJFRD1cInJlcXVpcmVkXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1NJWkVfTUlOPVwibWluXCIsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuQlVGRkVSX1NJWkVfSU5GSU5JVFk9XCJpbmZpbml0eVwiLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkJVRkZFUl9USU1FX0FUX1NUQVJUVVA9MSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5ERUZBVUxUX01JTl9CVUZGRVJfVElNRT04LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkJVRkZFUl9USU1FX0FUX1RPUF9RVUFMSVRZPTMwLE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5CdWZmZXJFeHRlbnNpb25zLkJVRkZFUl9USU1FX0FUX1RPUF9RVUFMSVRZX0xPTkdfRk9STT0zMDAsTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMuTE9OR19GT1JNX0NPTlRFTlRfRFVSQVRJT05fVEhSRVNIT0xEPTYwMCxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuQnVmZmVyRXh0ZW5zaW9ucy5wcm90b3R5cGUuY29uc3RydWN0b3I9TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkJ1ZmZlckV4dGVuc2lvbnMsTWVkaWFQbGF5ZXIudXRpbHMuQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCJ9LE1lZGlhUGxheWVyLnV0aWxzLkNhcGFiaWxpdGllcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLnV0aWxzLkNhcGFiaWxpdGllcyxzdXBwb3J0c01lZGlhU291cmNlOmZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9XCJXZWJLaXRNZWRpYVNvdXJjZVwiaW4gd2luZG93LGI9XCJNZWRpYVNvdXJjZVwiaW4gd2luZG93O3JldHVybiBhfHxifSxzdXBwb3J0c01lZGlhS2V5czpmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPVwiV2ViS2l0TWVkaWFLZXlzXCJpbiB3aW5kb3csYj1cIk1TTWVkaWFLZXlzXCJpbiB3aW5kb3csYz1cIk1lZGlhS2V5c1wiaW4gd2luZG93O3JldHVybiBhfHxifHxjfSxzdXBwb3J0c0NvZGVjOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7aWYoIShhIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkpdGhyb3dcImVsZW1lbnQgbXVzdCBiZSBvZiB0eXBlIEhUTUxWaWRlb0VsZW1lbnQuXCI7dmFyIGM9YS5jYW5QbGF5VHlwZShiKTtyZXR1cm5cInByb2JhYmx5XCI9PT1jfX0sTWVkaWFQbGF5ZXIudXRpbHMuRGVidWc9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT0hMDtyZXR1cm57ZXZlbnRCdXM6dm9pZCAwLHNldExvZ1RvQnJvd3NlckNvbnNvbGU6ZnVuY3Rpb24oYil7YT1ifSxnZXRMb2dUb0Jyb3dzZXJDb25zb2xlOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGxvZzpmdW5jdGlvbihiKXthJiZjb25zb2xlLmxvZyhiKSx0aGlzLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQoe3R5cGU6XCJsb2dcIixtZXNzYWdlOmJ9KX19fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRXJyb3JIYW5kbGVyPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJue2V2ZW50QnVzOnZvaWQgMCxjYXBhYmlsaXR5RXJyb3I6ZnVuY3Rpb24oYSl7dGhpcy5ldmVudEJ1cy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwiZXJyb3JcIixlcnJvcjpcImNhcGFiaWxpdHlcIixldmVudDphfSl9LGRvd25sb2FkRXJyb3I6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudCh7dHlwZTpcImVycm9yXCIsZXJyb3I6XCJkb3dubG9hZFwiLGV2ZW50OntpZDphLHVybDpiLHJlcXVlc3Q6Y319KX0sbWFuaWZlc3RFcnJvcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5ldmVudEJ1cy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwiZXJyb3JcIixlcnJvcjpcIm1hbmlmZXN0RXJyb3JcIixldmVudDp7bWVzc2FnZTphLGlkOmIsbWFuaWZlc3Q6Y319KX0sbWVkaWFTb3VyY2VFcnJvcjpmdW5jdGlvbihhKXt0aGlzLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQoe3R5cGU6XCJlcnJvclwiLGVycm9yOlwibWVkaWFzb3VyY2VcIixldmVudDphfSl9LG1lZGlhS2V5U2Vzc2lvbkVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudCh7dHlwZTpcImVycm9yXCIsZXJyb3I6XCJrZXlfc2Vzc2lvblwiLGV2ZW50OmF9KX0sbWVkaWFLZXlNZXNzYWdlRXJyb3I6ZnVuY3Rpb24oYSl7dGhpcy5ldmVudEJ1cy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwiZXJyb3JcIixlcnJvcjpcImtleV9tZXNzYWdlXCIsZXZlbnQ6YX0pfSxtZWRpYUtleVN5c3RlbVNlbGVjdGlvbkVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudCh7dHlwZTpcImVycm9yXCIsZXJyb3I6XCJrZXlfc3lzdGVtX3NlbGVjdGlvblwiLGV2ZW50OmF9KX19fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRXJyb3JIYW5kbGVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkVycm9ySGFuZGxlcn0sTWVkaWFQbGF5ZXIudXRpbHMuRXZlbnRCdXM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYSxiPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9KGM/XCIxXCI6XCIwXCIpK2I7cmV0dXJuIGQgaW4gYXx8KGFbZF09W10pLGFbZF19LGM9ZnVuY3Rpb24oKXthPXt9fTtyZXR1cm4gYygpLHthZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1iKGEsZCksZj1lLmluZGV4T2YoYyk7LTE9PT1mJiZlLnB1c2goYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWIoYSxkKSxmPWUuaW5kZXhPZihjKTstMSE9PWYmJmUuc3BsaWNlKGYsMSl9LGRpc3BhdGNoRXZlbnQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWIoYS50eXBlLCExKS5zbGljZSgpLGQ9MDtkPGMubGVuZ3RoO2QrKyljW2RdLmNhbGwodGhpcyxhKTtyZXR1cm4hYS5kZWZhdWx0UHJldmVudGVkfX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudENvbnRyb2xsZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1bXSxiPWZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1hLmxlbmd0aCxkPTA7Yz5kO2QrKylpZihhW2RdLmdldENvbnRleHQoKT09YilyZXR1cm4gYVtkXTtyZXR1cm4gbnVsbH0sYz1mdW5jdGlvbigpe2Zvcih2YXIgYj0hMCxjPWEubGVuZ3RoLGQ9MDtjPmQ7ZCsrKWlmKCFhW2RdLmlzUmVhZHkoKSl7Yj0hMTticmVha31yZXR1cm4gYn0sZD1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0uZXhlY3V0ZUN1cnJlbnRSZXF1ZXN0KCl9O3JldHVybntzeXN0ZW06dm9pZCAwLGRlYnVnOnZvaWQgMCxwcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hJiZhLmJ5dGVMZW5ndGg+MCYmKGI9bmV3IFVpbnQ4QXJyYXkoYSkpLFEud2hlbihiKX0sYXR0YWNoQnVmZmVyQ29udHJvbGxlcjpmdW5jdGlvbihjKXtpZighYylyZXR1cm4gbnVsbDt2YXIgZD1iKGMpO3JldHVybiBkfHwoZD10aGlzLnN5c3RlbS5nZXRPYmplY3QoXCJmcmFnbWVudE1vZGVsXCIpLGQuc2V0Q29udGV4dChjKSxhLnB1c2goZCkpLGR9LGRldGFjaEJ1ZmZlckNvbnRyb2xsZXI6ZnVuY3Rpb24oYil7dmFyIGM9YS5pbmRleE9mKGIpO2M+LTEmJmEuc3BsaWNlKGMsMSl9LG9uQnVmZmVyQ29udHJvbGxlclN0YXRlQ2hhbmdlOmZ1bmN0aW9uKCl7YygpJiZkLmNhbGwodGhpcyl9LGlzRnJhZ21lbnRMb2FkZWRPclBlbmRpbmc6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWIoYSk7cmV0dXJuIGU/ZD1lLmlzRnJhZ21lbnRMb2FkZWRPclBlbmRpbmcoYyk6ITF9LGdldFBlbmRpbmdSZXF1ZXN0czpmdW5jdGlvbihhKXt2YXIgYz1iKGEpO3JldHVybiBjP2MuZ2V0UGVuZGluZ1JlcXVlc3RzKCk6bnVsbH0sZ2V0TG9hZGluZ1JlcXVlc3RzOmZ1bmN0aW9uKGEpe3ZhciBjPWIoYSk7cmV0dXJuIGM/Yy5nZXRMb2FkaW5nUmVxdWVzdHMoKTpudWxsfSxpc0luaXRpYWxpemF0aW9uUmVxdWVzdDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS50eXBlJiZcImluaXRpYWxpemF0aW9uIHNlZ21lbnRcIj09PWEudHlwZS50b0xvd2VyQ2FzZSgpfSxnZXRMb2FkaW5nVGltZTpmdW5jdGlvbihhKXt2YXIgYz1iKGEpO3JldHVybiBjP2MuZ2V0TG9hZGluZ1RpbWUoKTpudWxsfSxnZXRFeGVjdXRlZFJlcXVlc3RGb3JUaW1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE/YS5nZXRFeGVjdXRlZFJlcXVlc3RGb3JUaW1lKGIpOm51bGx9LHJlbW92ZUV4ZWN1dGVkUmVxdWVzdDpmdW5jdGlvbihhLGIpe2EmJmEucmVtb3ZlRXhlY3V0ZWRSZXF1ZXN0KGIpfSxyZW1vdmVFeGVjdXRlZFJlcXVlc3RzQmVmb3JlVGltZTpmdW5jdGlvbihhLGIpe2EmJmEucmVtb3ZlRXhlY3V0ZWRSZXF1ZXN0c0JlZm9yZVRpbWUoYil9LGNhbmNlbFBlbmRpbmdSZXF1ZXN0c0Zvck1vZGVsOmZ1bmN0aW9uKGEpe2EmJmEuY2FuY2VsUGVuZGluZ1JlcXVlc3RzKCl9LGFib3J0UmVxdWVzdHNGb3JNb2RlbDpmdW5jdGlvbihhKXthJiZhLmFib3J0UmVxdWVzdHMoKX0scHJlcGFyZUZyYWdtZW50Rm9yTG9hZGluZzpmdW5jdGlvbihhLGMsZCxlLGYsZyl7dmFyIGg9YihhKTtyZXR1cm4gaCYmYyYmIXRoaXMuaXNGcmFnbWVudExvYWRlZE9yUGVuZGluZyhhLGMpPyhoLmFkZFJlcXVlc3QoYyksaC5zZXRDYWxsYmFja3MoZCxlLGYsZyksUS53aGVuKCEwKSk6US53aGVuKG51bGwpfX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudENvbnRyb2xsZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRnJhZ21lbnRDb250cm9sbGVyfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRnJhZ21lbnRMb2FkZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT0zLGI9NTAwLGM9W10sZD1mdW5jdGlvbihhLGUpe3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdCxnPW51bGwsaD0hMCxpPSEwLGo9dGhpcztjLnB1c2goZiksYS5yZXF1ZXN0U3RhcnREYXRlPW5ldyBEYXRlLGEuZmlyc3RCeXRlRGF0ZT1hLnJlcXVlc3RTdGFydERhdGUsZi5vcGVuKFwiR0VUXCIsYS51cmwsITApLGYucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixhLnJhbmdlJiZmLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLFwiYnl0ZXM9XCIrYS5yYW5nZSksZi5vbnByb2dyZXNzPWZ1bmN0aW9uKGIpe2gmJihoPSExLCghYi5sZW5ndGhDb21wdXRhYmxlfHxiLmxlbmd0aENvbXB1dGFibGUmJmIudG90YWwhPWIubG9hZGVkKSYmKGEuZmlyc3RCeXRlRGF0ZT1uZXcgRGF0ZSkpfSxmLm9ubG9hZD1mdW5jdGlvbigpe2lmKCEoZi5zdGF0dXM8MjAwfHxmLnN0YXR1cz4yOTkpKXtpPSExLGEucmVxdWVzdEVuZERhdGU9bmV3IERhdGU7dmFyIGI9YS5yZXF1ZXN0RW5kRGF0ZSxjPWYucmVzcG9uc2UsZD1hLmZpcnN0Qnl0ZURhdGUuZ2V0VGltZSgpLWEucmVxdWVzdFN0YXJ0RGF0ZS5nZXRUaW1lKCksZT1hLnJlcXVlc3RFbmREYXRlLmdldFRpbWUoKS1hLmZpcnN0Qnl0ZURhdGUuZ2V0VGltZSgpLGg9YS5yZXF1ZXN0RW5kRGF0ZS5nZXRUaW1lKCktYS5yZXF1ZXN0U3RhcnREYXRlLmdldFRpbWUoKTtqLmRlYnVnLmxvZyhcInNlZ21lbnQgbG9hZGVkOiAoXCIrZi5zdGF0dXMrXCIsIFwiK2QrXCJtcywgXCIrZStcIm1zLCBcIitoK1wibXMpIFwiK2EudXJsKSxnPWoubWV0cmljc01vZGVsLmFkZEh0dHBSZXF1ZXN0KGEuc3RyZWFtVHlwZSxudWxsLGEudHlwZSxhLnVybCxudWxsLGEucmFuZ2UsYS5yZXF1ZXN0U3RhcnREYXRlLGEuZmlyc3RCeXRlRGF0ZSxhLnJlcXVlc3RFbmREYXRlLGYuc3RhdHVzLG51bGwsYS5kdXJhdGlvbiksai5tZXRyaWNzTW9kZWwuYXBwZW5kSHR0cFRyYWNlKGcsYiwobmV3IERhdGUpLmdldFRpbWUoKS1iLmdldFRpbWUoKSxbYy5ieXRlTGVuZ3RoXSksYS5kZWZlcnJlZC5yZXNvbHZlKHtkYXRhOmMscmVxdWVzdDphfSl9fSxmLm9ubG9hZGVuZD1mLm9uZXJyb3I9ZnVuY3Rpb24oKXtpZigtMSE9PWMuaW5kZXhPZihmKSYmKGMuc3BsaWNlKGMuaW5kZXhPZihmKSwxKSxpKSl7aT0hMSxhLnJlcXVlc3RFbmREYXRlPW5ldyBEYXRlO3ZhciBoPWEuZmlyc3RCeXRlRGF0ZS5nZXRUaW1lKCktYS5yZXF1ZXN0U3RhcnREYXRlLmdldFRpbWUoKSxrPWEucmVxdWVzdEVuZERhdGUuZ2V0VGltZSgpLWEuZmlyc3RCeXRlRGF0ZS5nZXRUaW1lKCksbD1hLnJlcXVlc3RFbmREYXRlLmdldFRpbWUoKS1hLnJlcXVlc3RTdGFydERhdGUuZ2V0VGltZSgpO2ouZGVidWcubG9nKFwic2VnbWVudCBsb2FkZWQ6IChcIitmLnN0YXR1cytcIiwgXCIraCtcIm1zLCBcIitrK1wibXMsIFwiK2wrXCJtcykgXCIrYS51cmwpLGc9ai5tZXRyaWNzTW9kZWwuYWRkSHR0cFJlcXVlc3QoYS5zdHJlYW1UeXBlLG51bGwsYS50eXBlLGEudXJsLG51bGwsYS5yYW5nZSxhLnJlcXVlc3RTdGFydERhdGUsYS5maXJzdEJ5dGVEYXRlLGEucmVxdWVzdEVuZERhdGUsZi5zdGF0dXMsbnVsbCxhLmR1cmF0aW9uKSxlPjA/KGouZGVidWcubG9nKFwiRmFpbGVkIGxvYWRpbmcgc2VnbWVudDogXCIrYS51cmwrXCIsIHJldHJ5IGluIFwiK2IrXCJtc1wiK1wiIGF0dGVtcHRzOiBcIitlKSxlLS0sc2V0VGltZW91dChmdW5jdGlvbigpe2QuY2FsbChqLGEsZSl9LGIpKTooai5kZWJ1Zy5sb2coXCJGYWlsZWQgbG9hZGluZyBzZWdtZW50OiBcIithLnVybCtcIiBubyByZXRyeSBhdHRlbXB0cyBsZWZ0XCIpLGouZXJySGFuZGxlci5kb3dubG9hZEVycm9yKFwiY29udGVudFwiLGEudXJsLGYpLGEuZGVmZXJyZWQucmVqZWN0KGYpKX19LGYuc2VuZCgpfTtyZXR1cm57bWV0cmljc01vZGVsOnZvaWQgMCxlcnJIYW5kbGVyOnZvaWQgMCxkZWJ1Zzp2b2lkIDAsbG9hZDpmdW5jdGlvbihiKXtyZXR1cm4gYj8oYi5kZWZlcnJlZD1RLmRlZmVyKCksZC5jYWxsKHRoaXMsYixhKSxiLmRlZmVycmVkLnByb21pc2UpOlEud2hlbihudWxsKX0sYWJvcnQ6ZnVuY3Rpb24oKXt2YXIgYSxiLGQ9Yy5sZW5ndGg7Zm9yKGE9MDtkPmE7YSs9MSliPWNbYV0sY1thXT1udWxsLGIuYWJvcnQoKSxiPW51bGw7Yz1bXX19fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRnJhZ21lbnRMb2FkZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRnJhZ21lbnRMb2FkZXJ9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5GcmFnbWVudE1vZGVsPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGEsYixjLGQsZSxmPVtdLGc9W10saD1bXSxpPTUsaj1mdW5jdGlvbihlKXt2YXIgZyxpPXRoaXM7Yi5jYWxsKGEsZSksZz1mdW5jdGlvbihiLGQpe2guc3BsaWNlKGguaW5kZXhPZihiKSwxKSxmLnB1c2goYiksYy5jYWxsKGEsYixkKSxiLmRlZmVycmVkPW51bGx9LGkuZnJhZ21lbnRMb2FkZXIubG9hZChlKS50aGVuKGcuYmluZChhLGUpLGQuYmluZChhLGUpKX0saz1mdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFbYl08Y1tiXT8tMTphW2JdPmNbYl0/MTowfTthLnNvcnQoYyl9LGw9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5sZW5ndGgtMTtmb3IoZD1lO2Q+PTA7ZC09MSlpZihjPWFbZF0sYy51cmw9PT1iLnVybCYmYy5zdGFydFRpbWU9PT1iLnN0YXJ0VGltZSlyZXR1cm4hMDtyZXR1cm4hMX0sbT1mdW5jdGlvbihhKXt2YXIgYj1mLmluZGV4T2YoYSk7LTEhPT1iJiZmLnNwbGljZShiLDEpfTtyZXR1cm57c3lzdGVtOnZvaWQgMCxkZWJ1Zzp2b2lkIDAsZnJhZ21lbnRMb2FkZXI6dm9pZCAwLHNldENvbnRleHQ6ZnVuY3Rpb24oYil7YT1ifSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGFkZFJlcXVlc3Q6ZnVuY3Rpb24oYSl7YSYmKGcucHVzaChhKSxrLmNhbGwodGhpcyxnLFwiaW5kZXhcIikpfSxzZXRDYWxsYmFja3M6ZnVuY3Rpb24oYSxmLGcsaCl7Yj1hLGU9aCxkPWcsYz1mfSxpc0ZyYWdtZW50TG9hZGVkT3JQZW5kaW5nOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjPXRoaXMsZD0hMSxlPWYubGVuZ3RoLTEsaT1lO2k+PTA7aS09MSlpZihiPWZbaV0sYS5zdGFydFRpbWU9PT1iLnN0YXJ0VGltZXx8XCJjb21wbGV0ZVwiPT09Yi5hY3Rpb24mJmEuYWN0aW9uPT09Yi5hY3Rpb24pe2lmKGMuZGVidWcubG9nKGEuc3RyZWFtVHlwZStcIiBGcmFnbWVudCBhbHJlYWR5IGxvYWRlZCBmb3IgdGltZTogXCIrYS5zdGFydFRpbWUpLGEudXJsPT09Yi51cmwpe2MuZGVidWcubG9nKGEuc3RyZWFtVHlwZStcIiBGcmFnbWVudCB1cmwgYWxyZWFkeSBsb2FkZWQ6IFwiK2EudXJsKSxkPSEwO2JyZWFrfW0oYSl9cmV0dXJuIGR8fChkPWwuY2FsbChjLGcsYSl8fGwuY2FsbChjLGgsYSkpLGR9LGlzUmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gYS5pc1JlYWR5KCl9LGdldFBlbmRpbmdSZXF1ZXN0czpmdW5jdGlvbigpe3JldHVybiBnfSxnZXRMb2FkaW5nUmVxdWVzdHM6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sZ2V0TG9hZGluZ1RpbWU6ZnVuY3Rpb24oKXt2YXIgYSxiLGM9MDtmb3IoYj1mLmxlbmd0aC0xO2I+PTA7Yi09MSlpZihhPWZbYl0sYS5yZXF1ZXN0RW5kRGF0ZSBpbnN0YW5jZW9mIERhdGUmJmEuZmlyc3RCeXRlRGF0ZSBpbnN0YW5jZW9mIERhdGUpe2M9YS5yZXF1ZXN0RW5kRGF0ZS5nZXRUaW1lKCktYS5maXJzdEJ5dGVEYXRlLmdldFRpbWUoKTticmVha31yZXR1cm4gY30sZ2V0RXhlY3V0ZWRSZXF1ZXN0Rm9yVGltZTpmdW5jdGlvbihhKXt2YXIgYixjPWYubGVuZ3RoLTEsZD0wLzAsZT0wLzAsZz1udWxsO2ZvcihiPWM7Yj49MDtiLT0xKWlmKGc9ZltiXSxkPWcuc3RhcnRUaW1lLGU9ZCtnLmR1cmF0aW9uLCFpc05hTihkKSYmIWlzTmFOKGUpJiZhPmQmJmU+YSlyZXR1cm4gZztyZXR1cm4gbnVsbH0scmVtb3ZlRXhlY3V0ZWRSZXF1ZXN0OmZ1bmN0aW9uKGEpe20uY2FsbCh0aGlzLGEpfSxyZW1vdmVFeGVjdXRlZFJlcXVlc3RzQmVmb3JlVGltZTpmdW5jdGlvbihhKXt2YXIgYixjPWYubGVuZ3RoLTEsZD0wLzAsZT1udWxsO2ZvcihiPWM7Yj49MDtiLT0xKWU9ZltiXSxkPWUuc3RhcnRUaW1lLCFpc05hTihkKSYmYT5kJiZtLmNhbGwodGhpcyxlKX0sY2FuY2VsUGVuZGluZ1JlcXVlc3RzOmZ1bmN0aW9uKCl7Zz1bXX0sYWJvcnRSZXF1ZXN0czpmdW5jdGlvbigpe3RoaXMuZnJhZ21lbnRMb2FkZXIuYWJvcnQoKSxoPVtdfSxleGVjdXRlQ3VycmVudFJlcXVlc3Q6ZnVuY3Rpb24oKXt2YXIgYixjPXRoaXM7aWYoMCE9PWcubGVuZ3RoJiYhKGgubGVuZ3RoPj1pKSlzd2l0Y2goYj1nLnNoaWZ0KCksYi5hY3Rpb24pe2Nhc2VcImNvbXBsZXRlXCI6Zi5wdXNoKGIpLGUuY2FsbChhLGIpO2JyZWFrO2Nhc2VcImRvd25sb2FkXCI6aC5wdXNoKGIpLGouY2FsbChjLGIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5kZWJ1Zy5sb2coXCJVbmtub3duIHJlcXVlc3QgYWN0aW9uLlwiKX19fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLkZyYWdtZW50TW9kZWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuRnJhZ21lbnRNb2RlbH0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1hbmlmZXN0TG9hZGVyPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9MyxiPTUwMCxjPW51bGwsZD1mdW5jdGlvbihhKXt2YXIgYj1udWxsO3JldHVybi0xIT09YS5pbmRleE9mKFwiL1wiKSYmKGI9YS5zdWJzdHJpbmcoMCxhLmxhc3RJbmRleE9mKFwiL1wiKSsxKSksYn0sZT1mdW5jdGlvbihhLGYpe3ZhciBnPWQoYSksaD1uZXcgWE1MSHR0cFJlcXVlc3QsaT1uZXcgRGF0ZSxqPSEwLGs9dGhpczt0aGlzLmRlYnVnLmxvZyhcIlN0YXJ0IGxvYWRpbmcgbWFuaWZlc3Q6IFwiK2EpLGgub3BlbihcIkdFVFwiLGEsITApLGgub25sb2FkPWZ1bmN0aW9uKCl7aC5zdGF0dXM8MjAwfHxoLnN0YXR1cz4yOTl8fChqPSExLGsubWV0cmljc01vZGVsLmFkZEh0dHBSZXF1ZXN0KFwic3RyZWFtXCIsbnVsbCxcIk1QRFwiLGEsbnVsbCxudWxsLGksbmV3IERhdGUsaC5zdGF0dXMsbnVsbCxudWxsKSxrLnBhcnNlci5wYXJzZShoLnJlc3BvbnNlVGV4dCxnKS50aGVuKGZ1bmN0aW9uKGIpe2IubXBkVXJsPWEsYy5yZXNvbHZlKGIpfSxmdW5jdGlvbigpe2MucmVqZWN0KGgpfSkpfSxoLm9ubG9hZGVuZD1oLm9uZXJyb3I9ZnVuY3Rpb24oKXtqJiYoaj0hMSxrLm1ldHJpY3NNb2RlbC5hZGRIdHRwUmVxdWVzdChcInN0cmVhbVwiLG51bGwsXCJNUERcIixhLG51bGwsbnVsbCxpLG5ldyBEYXRlLGguc3RhdHVzLG51bGwsbnVsbCksZj4wPyhrLmRlYnVnLmxvZyhcIkZhaWxlZCBsb2FkaW5nIG1hbmlmZXN0OiBcIithK1wiLCByZXRyeSBpbiBcIitiK1wibXNcIitcIiBhdHRlbXB0czogXCIrZiksZi0tLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNhbGwoayxhLGYpfSxiKSk6KGsuZGVidWcubG9nKFwiRmFpbGVkIGxvYWRpbmcgbWFuaWZlc3Q6IFwiK2ErXCIgbm8gcmV0cnkgYXR0ZW1wdHMgbGVmdFwiKSxrLmVyckhhbmRsZXIuZG93bmxvYWRFcnJvcihcIm1hbmlmZXN0XCIsYSxoKSxjLnJlamVjdChoKSkpfSxoLnNlbmQoKX07cmV0dXJue2RlYnVnOnZvaWQgMCxwYXJzZXI6dm9pZCAwLGVyckhhbmRsZXI6dm9pZCAwLG1ldHJpY3NNb2RlbDp2b2lkIDAsbG9hZDpmdW5jdGlvbihiKXtyZXR1cm4gYz1RLmRlZmVyKCksZS5jYWxsKHRoaXMsYixhKSxjLnByb21pc2V9fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1hbmlmZXN0TG9hZGVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1hbmlmZXN0TG9hZGVyfSxNZWRpYVBsYXllci5tb2RlbHMuTWFuaWZlc3RNb2RlbD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhO3JldHVybntnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiBhfSxzZXRWYWx1ZTpmdW5jdGlvbihiKXthPWJ9fX0sTWVkaWFQbGF5ZXIubW9kZWxzLk1hbmlmZXN0TW9kZWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5tb2RlbHMuTWFuaWZlc3RNb2RlbH0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1hbmlmZXN0VXBkYXRlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPTAvMCxiPW51bGwsYz1udWxsLGQ9ZnVuY3Rpb24oKXtudWxsIT09YiYmKGNsZWFySW50ZXJ2YWwoYiksYj1udWxsKX0sZT1mdW5jdGlvbigpe2QuY2FsbCh0aGlzKSxpc05hTihhKXx8KHRoaXMuZGVidWcubG9nKFwiUmVmcmVzaCBtYW5pZmVzdCBpbiBcIithK1wiIHNlY29uZHMuXCIpLGI9c2V0SW50ZXJ2YWwoYy5iaW5kKHRoaXMpLDFlMyphLHRoaXMpKX0sZj1mdW5jdGlvbigpe3ZhciBiPXRoaXMsYz1iLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKTt2b2lkIDAhPT1jJiZudWxsIT09YyYmYi5tYW5pZmVzdEV4dC5nZXRSZWZyZXNoRGVsYXkoYykudGhlbihmdW5jdGlvbihjKXthPWMsZS5jYWxsKGIpfSl9O3JldHVybiBjPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGM9Yi5tcGRVcmw7Yi5oYXNPd25Qcm9wZXJ0eShcIkxvY2F0aW9uXCIpJiYoYz1iLkxvY2F0aW9uKSxhLmRlYnVnLmxvZyhcIlJlZnJlc2ggbWFuaWZlc3QgQCBcIitjKSxhLm1hbmlmZXN0TG9hZGVyLmxvYWQoYykudGhlbihmdW5jdGlvbihiKXthLm1hbmlmZXN0TW9kZWwuc2V0VmFsdWUoYiksYS5kZWJ1Zy5sb2coXCJNYW5pZmVzdCBoYXMgYmVlbiByZWZyZXNoZWQuXCIpLGEuZGVidWcubG9nKGIpLGYuY2FsbChhKSxhLnN5c3RlbS5ub3RpZnkoXCJtYW5pZmVzdFVwZGF0ZWRcIil9KX0se2RlYnVnOnZvaWQgMCxzeXN0ZW06dm9pZCAwLG1hbmlmZXN0TW9kZWw6dm9pZCAwLG1hbmlmZXN0RXh0OnZvaWQgMCxtYW5pZmVzdExvYWRlcjp2b2lkIDAsc2V0dXA6ZnVuY3Rpb24oKXtmLmNhbGwodGhpcyl9LGluaXQ6ZnVuY3Rpb24oKXtmLmNhbGwodGhpcyl9LHN0b3A6ZnVuY3Rpb24oKXtkLmNhbGwodGhpcyl9fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1hbmlmZXN0VXBkYXRlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5NYW5pZmVzdFVwZGF0ZXJ9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5NZWRpYVNvdXJjZUV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLk1lZGlhU291cmNlRXh0ZW5zaW9ucy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5NZWRpYVNvdXJjZUV4dGVuc2lvbnMsY3JlYXRlTWVkaWFTb3VyY2U6ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1cIldlYktpdE1lZGlhU291cmNlXCJpbiB3aW5kb3csYj1cIk1lZGlhU291cmNlXCJpbiB3aW5kb3c7cmV0dXJuIGI/US53aGVuKG5ldyBNZWRpYVNvdXJjZSk6YT9RLndoZW4obmV3IFdlYktpdE1lZGlhU291cmNlKTpudWxsfSxhdHRhY2hNZWRpYVNvdXJjZTpmdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3JldHVybiBiLnNldFNvdXJjZSh3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChhKSksUS53aGVuKCEwKX0sZGV0YWNoTWVkaWFTb3VyY2U6ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGEuc2V0U291cmNlKFwiXCIpLFEud2hlbighMCl9LHNldER1cmF0aW9uOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGEuZHVyYXRpb249YixRLndoZW4oYS5kdXJhdGlvbil9LHNpZ25hbEVuZE9mU3RyZWFtOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBhLmVuZE9mU3RyZWFtKCksUS53aGVuKCEwKX19LE1lZGlhUGxheWVyLm1vZGVscy5NZXRyaWNzTW9kZWw9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm57c3lzdGVtOnZvaWQgMCxzdHJlYW1NZXRyaWNzOnt9LGNsZWFyQ3VycmVudE1ldHJpY3NGb3JUeXBlOmZ1bmN0aW9uKGEpe2RlbGV0ZSB0aGlzLnN0cmVhbU1ldHJpY3NbYV19LGNsZWFyQWxsQ3VycmVudE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbU1ldHJpY3M9e319LGdldFJlYWRPbmx5TWV0cmljc0ZvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdHJlYW1NZXRyaWNzLmhhc093blByb3BlcnR5KGEpP3RoaXMuc3RyZWFtTWV0cmljc1thXTpudWxsfSxnZXRNZXRyaWNzRm9yOmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiB0aGlzLnN0cmVhbU1ldHJpY3MuaGFzT3duUHJvcGVydHkoYSk/Yj10aGlzLnN0cmVhbU1ldHJpY3NbYV06KGI9dGhpcy5zeXN0ZW0uZ2V0T2JqZWN0KFwibWV0cmljc1wiKSx0aGlzLnN0cmVhbU1ldHJpY3NbYV09YiksYn0sYWRkVGNwQ29ubmVjdGlvbjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9bmV3IE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuVENQQ29ubmVjdGlvbjtyZXR1cm4gZy50Y3BpZD1iLGcuZGVzdD1jLGcudG9wZW49ZCxnLnRjbG9zZT1lLGcudGNvbm5lY3Q9Zix0aGlzLmdldE1ldHJpY3NGb3IoYSkuVGNwTGlzdC5wdXNoKGcpLGd9LGFkZEh0dHBSZXF1ZXN0OmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsKXt2YXIgbT1uZXcgTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5IVFRQUmVxdWVzdDtyZXR1cm4gbS50Y3BpZD1iLG0udHlwZT1jLG0udXJsPWQsbS5hY3R1YWx1cmw9ZSxtLnJhbmdlPWYsbS50cmVxdWVzdD1nLG0udHJlc3BvbnNlPWgsbS50ZmluaXNoPWksbS5yZXNwb25zZWNvZGU9aixtLmludGVydmFsPWssbS5tZWRpYWR1cmF0aW9uPWwsdGhpcy5nZXRNZXRyaWNzRm9yKGEpLkh0dHBMaXN0LnB1c2gobSksbX0sYXBwZW5kSHR0cFRyYWNlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW5ldyBNZWRpYVBsYXllci52by5tZXRyaWNzLkhUVFBSZXF1ZXN0LlRyYWNlO3JldHVybiBlLnM9YixlLmQ9YyxlLmI9ZCxhLnRyYWNlLnB1c2goZSksZX0sYWRkUmVwcmVzZW50YXRpb25Td2l0Y2g6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1uZXcgTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5SZXByZXNlbnRhdGlvblN3aXRjaDtyZXR1cm4gZi50PWIsZi5tdD1jLGYudG89ZCxmLmx0bz1lLHRoaXMuZ2V0TWV0cmljc0ZvcihhKS5SZXBTd2l0Y2hMaXN0LnB1c2goZiksZn0sYWRkQnVmZmVyTGV2ZWw6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW5ldyBNZWRpYVBsYXllci52by5tZXRyaWNzLkJ1ZmZlckxldmVsO3JldHVybiBkLnQ9YixkLmxldmVsPWMsdGhpcy5nZXRNZXRyaWNzRm9yKGEpLkJ1ZmZlckxldmVsLnB1c2goZCksZH0sYWRkUGxheUxpc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bmV3IE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3Q7cmV0dXJuIGUuc3RhcnQ9YixlLm1zdGFydD1jLGUuc3RhcnR0eXBlPWQsdGhpcy5nZXRNZXRyaWNzRm9yKGEpLlBsYXlMaXN0LnB1c2goZSksZX0sYXBwZW5kUGxheUxpc3RUcmFjZTpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe3ZhciBpPW5ldyBNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlO3JldHVybiBpLnJlcHJlc2VudGF0aW9uaWQ9YixpLnN1YnJlcGxldmVsPWMsaS5zdGFydD1kLGkubXN0YXJ0PWUsaS5kdXJhdGlvbj1mLGkucGxheWJhY2tzcGVlZD1nLGkuc3RvcHJlYXNvbj1oLGEudHJhY2UucHVzaChpKSxpfX19LE1lZGlhUGxheWVyLm1vZGVscy5NZXRyaWNzTW9kZWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5tb2RlbHMuTWV0cmljc01vZGVsfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUHJvdGVjdGlvbkNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1udWxsLGI9bnVsbCxjPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7Yi5wcm90ZWN0aW9uTW9kZWwucmVtb3ZlS2V5U3lzdGVtKGEpfSxkPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPXRoaXMsZT0wO2U8Yi5sZW5ndGg7KytlKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7KytmKWlmKGJbZV0uaXNTdXBwb3J0ZWQoY1tmXSkmJmQucHJvdGVjdGlvbkV4dC5zdXBwb3J0c0NvZGVjKGJbZV0ua2V5c1R5cGVTdHJpbmcsYSkpe3ZhciBnPWQubWFuaWZlc3RFeHQuZ2V0S0lEKGNbZl0pO3JldHVybiBnfHwoZz1cInVua25vd25cIiksZC5wcm90ZWN0aW9uTW9kZWwuYWRkS2V5U3lzdGVtKGcsY1tmXSxiW2VdKSxkLmRlYnVnLmxvZyhcIkRSTTogU2VsZWN0ZWQgS2V5IFN5c3RlbTogXCIrYltlXS5rZXlzVHlwZVN0cmluZytcIiBGb3IgS0lEOiBcIitnKSxnfXRocm93IG5ldyBFcnJvcihcIkRSTTogVGhlIHByb3RlY3Rpb24gc3lzdGVtIGZvciB0aGlzIGNvbnRlbnQgaXMgbm90IHN1cHBvcnRlZC5cIil9LGU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMsZT1udWxsLGY9bnVsbDtkLnByb3RlY3Rpb25Nb2RlbC5uZWVkVG9BZGRLZXlTZXNzaW9uKGEpJiYoZj1kLnByb3RlY3Rpb25Nb2RlbC5nZXRJbml0RGF0YShhKSwhZiYmYz8oZj1jLGQuZGVidWcubG9nKFwiRFJNOiBVc2luZyBpbml0ZGF0YSBmcm9tIG5lZWRza2V5IGV2ZW50LiBsZW5ndGg6IFwiK2YubGVuZ3RoKSk6ZiYmZC5kZWJ1Zy5sb2coXCJEUk06IFVzaW5nIGluaXRkYXRhIGZyb20gcHJoZWFkZXIgaW4gbXBkLiBsZW5ndGg6IFwiK2YubGVuZ3RoKSxmPyhlPWQucHJvdGVjdGlvbk1vZGVsLmFkZEtleVNlc3Npb24oYSxiLGYpLGQuZGVidWcubG9nKFwiRFJNOiBBZGRlZCBLZXkgU2Vzc2lvbiBbXCIrZS5zZXNzaW9uSWQrXCJdIGZvciBLSUQ6IFwiK2ErXCIgdHlwZTogXCIrYitcIiBpbml0RGF0YSBsZW5ndGg6IFwiK2YubGVuZ3RoKSk6ZC5kZWJ1Zy5sb2coXCJEUk06IGluaXRkYXRhIGlzIG51bGwuXCIpKX0sZj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmPXRoaXM7cmV0dXJuIGU9Zi5wcm90ZWN0aW9uTW9kZWwudXBkYXRlRnJvbU1lc3NhZ2UoYSxjLGQpLGUudGhlbihmdW5jdGlvbihhKXtiLnVwZGF0ZShhKX0pLGV9O3JldHVybntzeXN0ZW06dm9pZCAwLGRlYnVnOnZvaWQgMCxtYW5pZmVzdEV4dDp2b2lkIDAsY2FwYWJpbGl0aWVzOnZvaWQgMCx2aWRlb01vZGVsOnZvaWQgMCxwcm90ZWN0aW9uTW9kZWw6dm9pZCAwLHByb3RlY3Rpb25FeHQ6dm9pZCAwLHNldHVwOmZ1bmN0aW9uKCl7Yj10aGlzLnByb3RlY3Rpb25FeHQuZ2V0S2V5U3lzdGVtcygpfSxpbml0OmZ1bmN0aW9uKGIsYyl7dGhpcy52aWRlb01vZGVsPWIsdGhpcy5wcm90ZWN0aW9uTW9kZWw9YyxhPXRoaXMudmlkZW9Nb2RlbC5nZXRFbGVtZW50KClcclxufSxzZWxlY3RLZXlTeXN0ZW06ZCxlbnN1cmVLZXlTZXNzaW9uOmUsdXBkYXRlRnJvbU1lc3NhZ2U6Zix0ZWFyZG93bktleVN5c3RlbTpjfX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25Db250cm9sbGVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25Db250cm9sbGVyfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUHJvdGVjdGlvbkV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25FeHRlbnNpb25zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlByb3RlY3Rpb25FeHRlbnNpb25zLHN1cHBvcnRzQ29kZWM6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYz1cIldlYktpdE1lZGlhS2V5c1wiaW4gd2luZG93LGQ9XCJNU01lZGlhS2V5c1wiaW4gd2luZG93LGU9XCJNZWRpYUtleXNcImluIHdpbmRvdztyZXR1cm4gZT9NZWRpYUtleXMuaXNUeXBlU3VwcG9ydGVkKGEsYik6Yz9XZWJLaXRNZWRpYUtleXMuaXNUeXBlU3VwcG9ydGVkKGEsYik6ZD9NU01lZGlhS2V5cy5pc1R5cGVTdXBwb3J0ZWQoYSxiKTohMX0sY3JlYXRlTWVkaWFLZXlzOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPVwiV2ViS2l0TWVkaWFLZXlzXCJpbiB3aW5kb3csYz1cIk1TTWVkaWFLZXlzXCJpbiB3aW5kb3csZD1cIk1lZGlhS2V5c1wiaW4gd2luZG93O3JldHVybiBkP25ldyBNZWRpYUtleXMoYSk6Yj9uZXcgV2ViS2l0TWVkaWFLZXlzKGEpOmM/bmV3IE1TTWVkaWFLZXlzKGEpOm51bGx9LHNldE1lZGlhS2V5OmZ1bmN0aW9uKGEsYil7dmFyIGM9XCJXZWJLaXRTZXRNZWRpYUtleXNcImluIGEsZD1cIm1zU2V0TWVkaWFLZXlzXCJpbiBhLGU9XCJTZXRNZWRpYUtleXNcImluIGE7cmV0dXJuIGU/YS5TZXRNZWRpYUtleXMoYik6Yz9hLldlYktpdFNldE1lZGlhS2V5cyhiKTpkP2EubXNTZXRNZWRpYUtleXMoYik6KHRoaXMuZGVidWcubG9nKFwibm8gc2V0bWVkaWFrZXlzIGZ1bmN0aW9uIGluIGVsZW1lbnRcIiksdm9pZCAwKX0sY3JlYXRlU2Vzc2lvbjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuY3JlYXRlU2Vzc2lvbihiLGMpfSxnZXRLZXlTeXN0ZW1zOmZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RLmRlZmVyKCksZD1udWxsLGU9W10sZj1uZXcgRE9NUGFyc2VyLGc9Zi5wYXJzZUZyb21TdHJpbmcoYSxcImFwcGxpY2F0aW9uL3htbFwiKTtpZighZy5nZXRFbGVtZW50c0J5VGFnTmFtZShcIkNoYWxsZW5nZVwiKVswXSlyZXR1cm4gYy5yZWplY3QoXCJEUk06IHBsYXlyZWFkeSB1cGRhdGUsIGNhbiBub3QgZmluZCBDaGFsbGVuZ2UgaW4ga2V5TWVzc2FnZVwiKSxjLnByb21pc2U7dmFyIGg9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZShcIkNoYWxsZW5nZVwiKVswXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTtoJiYoZD1CQVNFNjQuZGVjb2RlKGgpKTt2YXIgaT1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibmFtZVwiKSxqPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ2YWx1ZVwiKTtpZihpLmxlbmd0aCE9ai5sZW5ndGgpcmV0dXJuIGMucmVqZWN0KFwiRFJNOiBwbGF5cmVhZHkgdXBkYXRlLCBpbnZhbGlkIGhlYWRlciBuYW1lL3ZhbHVlIHBhaXIgaW4ga2V5TWVzc2FnZVwiKSxjLnByb21pc2U7Zm9yKHZhciBrPTA7azxpLmxlbmd0aDtrKyspZVtrXT17bmFtZTppW2tdLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlLHZhbHVlOmpba10uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWV9O3ZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gbC5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PWwuc3RhdHVzP2MucmVzb2x2ZShuZXcgVWludDhBcnJheShsLnJlc3BvbnNlKSk6Yy5yZWplY3QoJ0RSTTogcGxheXJlYWR5IHVwZGF0ZSwgWEhSIHN0YXR1cyBpcyBcIicrbC5zdGF0dXNUZXh0KydcIiAoJytsLnN0YXR1cytcIiksIGV4cGVjdGVkIHRvIGJlIDIwMC4gcmVhZHlTdGF0ZSBpcyBcIitsLnJlYWR5U3RhdGUpfSxsLm9uYWJvcnQ9ZnVuY3Rpb24oKXtjLnJlamVjdCgnRFJNOiBwbGF5cmVhZHkgdXBkYXRlLCBYSFIgYWJvcnRlZC4gc3RhdHVzIGlzIFwiJytsLnN0YXR1c1RleHQrJ1wiICgnK2wuc3RhdHVzK1wiKSwgcmVhZHlTdGF0ZSBpcyBcIitsLnJlYWR5U3RhdGUpfSxsLm9uZXJyb3I9ZnVuY3Rpb24oKXtjLnJlamVjdCgnRFJNOiBwbGF5cmVhZHkgdXBkYXRlLCBYSFIgZXJyb3IuIHN0YXR1cyBpcyBcIicrbC5zdGF0dXNUZXh0KydcIiAoJytsLnN0YXR1cytcIiksIHJlYWR5U3RhdGUgaXMgXCIrbC5yZWFkeVN0YXRlKX0sbC5vcGVuKFwiUE9TVFwiLGIpLGwucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixlJiZlLmZvckVhY2goZnVuY3Rpb24oYSl7bC5zZXRSZXF1ZXN0SGVhZGVyKGEubmFtZSxhLnZhbHVlKX0pLGwuc2VuZChkKSxjLnByb21pc2V9LGI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09PWEmJjA9PT1iLmxlbmd0aH0sYz1mdW5jdGlvbihhKXt2YXIgYj0wLGM9MCxkPTAsZT1uZXcgVWludDhBcnJheShbMTEyLDExNSwxMTUsMTA0LDAsMCwwLDBdKSxmPW5ldyBVaW50OEFycmF5KFsxNTQsNCwyNDAsMTIxLDE1Miw2NCw2NiwxMzQsMTcxLDE0NiwyMzAsOTEsMjI0LDEzNiw5NSwxNDldKSxnPW51bGwsaD1udWxsLGk9bnVsbCxqPW51bGw7aWYoXCJwcm9cImluIGEpZz1CQVNFNjQuZGVjb2RlQXJyYXkoYS5wcm8uX190ZXh0KTtlbHNle2lmKCEoXCJwcmhlYWRlclwiaW4gYSkpcmV0dXJuIG51bGw7Zz1CQVNFNjQuZGVjb2RlQXJyYXkoYS5wcmhlYWRlci5fX3RleHQpfXJldHVybiBjPWcubGVuZ3RoLGQ9NCtlLmxlbmd0aCtmLmxlbmd0aCs0K2MsaD1uZXcgQXJyYXlCdWZmZXIoZCksaT1uZXcgVWludDhBcnJheShoKSxqPW5ldyBEYXRhVmlldyhoKSxqLnNldFVpbnQzMihiLGQpLGIrPTQsaS5zZXQoZSxiKSxiKz1lLmxlbmd0aCxpLnNldChmLGIpLGIrPWYubGVuZ3RoLGouc2V0VWludDMyKGIsYyksYis9NCxpLnNldChnLGIpLGIrPWMsaX07cmV0dXJuW3tzY2hlbWVJZFVyaTpcInVybjp1dWlkOjlhMDRmMDc5LTk4NDAtNDI4Ni1hYjkyLWU2NWJlMDg4NWY5NVwiLGtleXNUeXBlU3RyaW5nOlwiY29tLm1pY3Jvc29mdC5wbGF5cmVhZHlcIixpc1N1cHBvcnRlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zY2hlbWVJZFVyaT09PWEuc2NoZW1lSWRVcmkudG9Mb3dlckNhc2UoKX0sbmVlZFRvQWRkS2V5U2Vzc2lvbjpiLGdldEluaXREYXRhOmMsZ2V0VXBkYXRlOmF9LHtzY2hlbWVJZFVyaTpcInVybjptcGVnOmRhc2g6bXA0cHJvdGVjdGlvbjoyMDExXCIsa2V5c1R5cGVTdHJpbmc6XCJjb20ubWljcm9zb2Z0LnBsYXlyZWFkeVwiLGlzU3VwcG9ydGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNjaGVtZUlkVXJpPT09YS5zY2hlbWVJZFVyaS50b0xvd2VyQ2FzZSgpJiZcImNlbmNcIj09PWEudmFsdWUudG9Mb3dlckNhc2UoKX0sbmVlZFRvQWRkS2V5U2Vzc2lvbjpiLGdldEluaXREYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldFVwZGF0ZTphfSx7c2NoZW1lSWRVcmk6XCJ1cm46dXVpZDowMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixrZXlzVHlwZVN0cmluZzpcIndlYmtpdC1vcmcudzMuY2xlYXJrZXlcIixpc1N1cHBvcnRlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zY2hlbWVJZFVyaT09PWEuc2NoZW1lSWRVcmkudG9Mb3dlckNhc2UoKX0sbmVlZFRvQWRkS2V5U2Vzc2lvbjpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRJbml0RGF0YTpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRVcGRhdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIFEud2hlbihhKX19XX0sYWRkS2V5OmZ1bmN0aW9uKGEsYixjLGQsZSl7YS53ZWJraXRBZGRLZXkoYixjLGQsZSl9LGdlbmVyYXRlS2V5UmVxdWVzdDpmdW5jdGlvbihhLGIsYyl7YS53ZWJraXRHZW5lcmF0ZUtleVJlcXVlc3QoYixjKX0sbGlzdGVuVG9OZWVkS2V5OmZ1bmN0aW9uKGEsYil7YS5saXN0ZW4oXCJ3ZWJraXRuZWVka2V5XCIsYiksYS5saXN0ZW4oXCJtc25lZWRrZXlcIixiKSxhLmxpc3RlbihcIm5lZWRLZXlcIixiKX0sbGlzdGVuVG9LZXlFcnJvcjpmdW5jdGlvbihhLGIpe2EuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleWVycm9yXCIsYiwhMSksYS5hZGRFdmVudExpc3RlbmVyKFwibXNrZXllcnJvclwiLGIsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihcImtleWVycm9yXCIsYiwhMSl9LGxpc3RlblRvS2V5TWVzc2FnZTpmdW5jdGlvbihhLGIpe2EuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleW1lc3NhZ2VcIixiLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJtc2tleW1lc3NhZ2VcIixiLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXltZXNzYWdlXCIsYiwhMSl9LGxpc3RlblRvS2V5QWRkZWQ6ZnVuY3Rpb24oYSxiKXthLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJraXRrZXlhZGRlZFwiLGIsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihcIm1za2V5YWRkZWRcIixiLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlhZGRlZFwiLGIsITEpfSx1bmxpc3RlblRvS2V5RXJyb3I6ZnVuY3Rpb24oYSxiKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3ZWJraXRrZXllcnJvclwiLGIpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1za2V5ZXJyb3JcIixiKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXllcnJvclwiLGIpfSx1bmxpc3RlblRvS2V5TWVzc2FnZTpmdW5jdGlvbihhLGIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleW1lc3NhZ2VcIixiKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtc2tleW1lc3NhZ2VcIixiKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXltZXNzYWdlXCIsYil9LHVubGlzdGVuVG9LZXlBZGRlZDpmdW5jdGlvbihhLGIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndlYmtpdGtleWFkZGVkXCIsYiksYS5yZW1vdmVFdmVudExpc3RlbmVyKFwibXNrZXlhZGRlZFwiLGIpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWFkZGVkXCIsYil9fSxNZWRpYVBsYXllci5tb2RlbHMuUHJvdGVjdGlvbk1vZGVsPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9bnVsbCxiPW51bGwsYz1udWxsLGQ9bnVsbCxlPVtdO3JldHVybntzeXN0ZW06dm9pZCAwLHZpZGVvTW9kZWw6dm9pZCAwLHByb3RlY3Rpb25FeHQ6dm9pZCAwLHNldHVwOmZ1bmN0aW9uKCl7YT10aGlzLnZpZGVvTW9kZWwuZ2V0RWxlbWVudCgpfSxpbml0OmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9Nb2RlbD1iLGE9dGhpcy52aWRlb01vZGVsLmdldEVsZW1lbnQoKX0sYWRkS2V5U2Vzc2lvbjpmdW5jdGlvbihhLGYsZyl7dmFyIGg9bnVsbDtyZXR1cm4gaD10aGlzLnByb3RlY3Rpb25FeHQuY3JlYXRlU2Vzc2lvbihlW2FdLmtleXMsZixnKSx0aGlzLnByb3RlY3Rpb25FeHQubGlzdGVuVG9LZXlBZGRlZChoLGIpLHRoaXMucHJvdGVjdGlvbkV4dC5saXN0ZW5Ub0tleUVycm9yKGgsYyksdGhpcy5wcm90ZWN0aW9uRXh0Lmxpc3RlblRvS2V5TWVzc2FnZShoLGQpLGVbYV0uaW5pdERhdGE9ZyxlW2FdLmtleVNlc3Npb25zLnB1c2goaCksaH0sYWRkS2V5U3lzdGVtOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZj1udWxsO2Y9dGhpcy5wcm90ZWN0aW9uRXh0LmNyZWF0ZU1lZGlhS2V5cyhkLmtleXNUeXBlU3RyaW5nKSx0aGlzLnByb3RlY3Rpb25FeHQuc2V0TWVkaWFLZXkoYSxmKSxlW2JdPXtrSUQ6Yixjb250ZW50UHJvdGVjdGlvbjpjLGtleVN5c3RlbTpkLGtleXM6Zixpbml0RGF0YTpudWxsLGtleVNlc3Npb25zOltdfX0scmVtb3ZlS2V5U3lzdGVtOmZ1bmN0aW9uKGEpe2lmKG51bGwhPT1hJiZ2b2lkIDAhPT1lW2FdJiYwIT09ZVthXS5rZXlTZXNzaW9ucy5sZW5ndGgpe2Zvcih2YXIgZj1lW2FdLmtleVNlc3Npb25zLGc9MDtnPGYubGVuZ3RoOysrZyl0aGlzLnByb3RlY3Rpb25FeHQudW5saXN0ZW5Ub0tleUVycm9yKGZbZ10sYyksdGhpcy5wcm90ZWN0aW9uRXh0LnVubGlzdGVuVG9LZXlBZGRlZChmW2ddLGIpLHRoaXMucHJvdGVjdGlvbkV4dC51bmxpc3RlblRvS2V5TWVzc2FnZShmW2ddLGQpLGZbZ10uY2xvc2UoKTtlW2FdPXZvaWQgMH19LG5lZWRUb0FkZEtleVNlc3Npb246ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtyZXR1cm4gYj1lW2FdLGIua2V5U3lzdGVtLm5lZWRUb0FkZEtleVNlc3Npb24oYi5pbml0RGF0YSxiLmtleVNlc3Npb25zKX0sZ2V0SW5pdERhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtyZXR1cm4gYj1lW2FdLGIua2V5U3lzdGVtLmdldEluaXREYXRhKGIuY29udGVudFByb3RlY3Rpb24pfSx1cGRhdGVGcm9tTWVzc2FnZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGVbYV0ua2V5U3lzdGVtLmdldFVwZGF0ZShiLGMpfSxsaXN0ZW5Ub05lZWRLZXk6ZnVuY3Rpb24oYSl7dGhpcy5wcm90ZWN0aW9uRXh0Lmxpc3RlblRvTmVlZEtleSh0aGlzLnZpZGVvTW9kZWwsYSl9LGxpc3RlblRvS2V5RXJyb3I6ZnVuY3Rpb24oYSl7Yz1hO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7KytiKWZvcih2YXIgZD1lW2JdLmtleVNlc3Npb25zLGY9MDtmPGQubGVuZ3RoOysrZil0aGlzLnByb3RlY3Rpb25FeHQubGlzdGVuVG9LZXlFcnJvcihkW2ZdLGEpfSxsaXN0ZW5Ub0tleU1lc3NhZ2U6ZnVuY3Rpb24oYSl7ZD1hO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7KytiKWZvcih2YXIgYz1lW2JdLmtleVNlc3Npb25zLGY9MDtmPGMubGVuZ3RoOysrZil0aGlzLnByb3RlY3Rpb25FeHQubGlzdGVuVG9LZXlNZXNzYWdlKGNbZl0sYSl9LGxpc3RlblRvS2V5QWRkZWQ6ZnVuY3Rpb24oYSl7Yj1hO2Zvcih2YXIgYz0wO2M8ZS5sZW5ndGg7KytjKWZvcih2YXIgZD1lW2NdLmtleVNlc3Npb25zLGY9MDtmPGQubGVuZ3RoOysrZil0aGlzLnByb3RlY3Rpb25FeHQubGlzdGVuVG9LZXlBZGRlZChkW2ZdLGEpfX19LE1lZGlhUGxheWVyLm1vZGVscy5Qcm90ZWN0aW9uTW9kZWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5tb2RlbHMuUHJvdGVjdGlvbk1vZGVsfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUmVxdWVzdFNjaGVkdWxlcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhPVtdLGI9bnVsbCxjPW51bGwsZD1mdW5jdGlvbihhLGIpe2lmKGEmJmIpe3ZhciBjPWcoYSk7Y3x8KGM9ZS5jYWxsKHRoaXMsYSkpLGMuc2V0SXNTY2hlZHVsZWQoITApLGMuc2V0U2NoZWR1bGVkVGFzayhiKSxqLmNhbGwodGhpcyksYi5jYWxsKGEpfX0sZT1mdW5jdGlvbihiKXtpZighYilyZXR1cm4gbnVsbDt2YXIgYz10aGlzLnN5c3RlbS5nZXRPYmplY3QoXCJzY2hlZHVsZXJNb2RlbFwiKTtyZXR1cm4gYy5zZXRDb250ZXh0KGIpLGEucHVzaChjKSxjfSxmPWZ1bmN0aW9uKGIpe3ZhciBjPWEuaW5kZXhPZihiKTstMSE9PWMmJmEuc3BsaWNlKGMsMSl9LGc9ZnVuY3Rpb24oYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYVtjXS5nZXRDb250ZXh0KCk9PT1iKXJldHVybiBhW2NdO3JldHVybiBudWxsfSxoPWZ1bmN0aW9uKCl7aS5jYWxsKHRoaXMpfSxpPWZ1bmN0aW9uKCl7Zm9yKHZhciBiLGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sYi5nZXRJc1NjaGVkdWxlZCgpJiZiLmV4ZWN1dGVTY2hlZHVsZWRUYXNrKCl9LGo9ZnVuY3Rpb24oKXtudWxsPT09YyYmKHRoaXMuYWRqdXN0RXhlY3V0ZUludGVydmFsKCksYz1zZXRJbnRlcnZhbChoLmJpbmQodGhpcyksYikpfSxrPWZ1bmN0aW9uKGIpe3ZhciBjPWcoYik7YyYmKGYoYyksMD09PWEubGVuZ3RoJiZsLmNhbGwodGhpcykpfSxsPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjKSxjPW51bGx9O3JldHVybntzeXN0ZW06dm9pZCAwLGRlYnVnOnZvaWQgMCxzY2hlZHVsZXJFeHQ6dm9pZCAwLGlzU2NoZWR1bGVkOmZ1bmN0aW9uKGEpe3ZhciBiPWcoYSk7cmV0dXJuISFiJiZiLmdldElzU2NoZWR1bGVkKCl9LGdldEV4ZWN1dGVJbnRlcnZhbDpmdW5jdGlvbigpe3JldHVybiBifSxhZGp1c3RFeGVjdXRlSW50ZXJ2YWw6ZnVuY3Rpb24oKXtpZighKGEubGVuZ3RoPDEpKXt2YXIgZD10aGlzLnNjaGVkdWxlckV4dC5nZXRFeGVjdXRlSW50ZXJ2YWwoYVswXS5nZXRDb250ZXh0KCkpO2IhPT1kJiYoYj1kLG51bGwhPT1jJiYodGhpcy5kZWJ1Zy5sb2coXCJDaGFuZ2luZyBleGVjdXRlIGludGVydmFsOiBcIitiKSxjbGVhckludGVydmFsKGMpLGM9c2V0SW50ZXJ2YWwoaC5iaW5kKHRoaXMpLGIpKSl9fSxzdGFydFNjaGVkdWxpbmc6ZCxzdG9wU2NoZWR1bGluZzprfX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlJlcXVlc3RTY2hlZHVsZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuUmVxdWVzdFNjaGVkdWxlcn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNjaGVkdWxlckV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIn0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNjaGVkdWxlckV4dGVuc2lvbnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU2NoZWR1bGVyRXh0ZW5zaW9ucyxnZXRFeGVjdXRlSW50ZXJ2YWw6ZnVuY3Rpb24oYSl7dmFyIGI9MWUzO3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBhLmdldE1pbkJ1ZmZlclRpbWUmJihiPTFlMyphLmdldE1pbkJ1ZmZlclRpbWUoKS80LGI9TWF0aC5tYXgoYiwxZTMpKSxifX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNjaGVkdWxlck1vZGVsPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGEsYixjPSExO3JldHVybntzeXN0ZW06dm9pZCAwLGRlYnVnOnZvaWQgMCxzY2hlZHVsZXJFeHQ6dm9pZCAwLHNldENvbnRleHQ6ZnVuY3Rpb24oYil7YT1ifSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldFNjaGVkdWxlZFRhc2s6ZnVuY3Rpb24oYSl7Yj1hfSxleGVjdXRlU2NoZWR1bGVkVGFzazpmdW5jdGlvbigpe2IuY2FsbChhKX0sc2V0SXNTY2hlZHVsZWQ6ZnVuY3Rpb24oYSl7Yz1hfSxnZXRJc1NjaGVkdWxlZDpmdW5jdGlvbigpe3JldHVybiBjfX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5TY2hlZHVsZXJNb2RlbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5TY2hlZHVsZXJNb2RlbH0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNvdXJjZUJ1ZmZlckV4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLnN5c3RlbT12b2lkIDAsdGhpcy5tYW5pZmVzdEV4dD12b2lkIDB9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5Tb3VyY2VCdWZmZXJFeHRlbnNpb25zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlNvdXJjZUJ1ZmZlckV4dGVuc2lvbnMsY3JlYXRlU291cmNlQnVmZmVyOmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGM9US5kZWZlcigpLGQ9dGhpczt0cnl7Yy5yZXNvbHZlKGEuYWRkU291cmNlQnVmZmVyKGIpKX1jYXRjaChlKXtkLm1hbmlmZXN0RXh0LmdldElzVGV4dFRyYWNrKGIpP2MucmVzb2x2ZShkLnN5c3RlbS5nZXRPYmplY3QoXCJ0ZXh0VlRUU291cmNlQnVmZmVyXCIpKTpjLnJlamVjdChlLmRlc2NyaXB0aW9uKX1yZXR1cm4gYy5wcm9taXNlfSxyZW1vdmVTb3VyY2VCdWZmZXI6ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYz1RLmRlZmVyKCk7dHJ5e2MucmVzb2x2ZShhLnJlbW92ZVNvdXJjZUJ1ZmZlcihiKSl9Y2F0Y2goZCl7Yy5yZWplY3QoZC5kZXNjcmlwdGlvbil9cmV0dXJuIGMucHJvbWlzZX0sZ2V0QnVmZmVyUmFuZ2U6ZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkLGUsZj1udWxsLGc9MCxoPTAsaT1udWxsLGo9bnVsbCxrPTAsbD1jfHwuMTU7dHJ5e2Y9YS5idWZmZXJlZH1jYXRjaChtKXtyZXR1cm4gUS53aGVuKG51bGwpfWlmKG51bGwhPT1mKXtmb3IoZT0wLGQ9Zi5sZW5ndGg7ZD5lO2UrPTEpaWYoZz1mLnN0YXJ0KGUpLGg9Zi5lbmQoZSksbnVsbD09PWkpe2lmKGs9TWF0aC5hYnMoZy1iKSxiPj1nJiZoPmIpe2k9ZyxqPWg7Y29udGludWV9aWYobD49ayl7aT1nLGo9aDtjb250aW51ZX19ZWxzZXtpZihrPWctaiwhKGw+PWspKWJyZWFrO2o9aH1pZihudWxsIT09aSlyZXR1cm4gUS53aGVuKHtzdGFydDppLGVuZDpqfSl9cmV0dXJuIFEud2hlbihudWxsKX0sZ2V0QWxsUmFuZ2VzOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e3JldHVybiBiPWEuYnVmZmVyZWQsUS53aGVuKGIpfWNhdGNoKGMpe3JldHVybiBRLndoZW4obnVsbCl9fSxnZXRCdWZmZXJMZW5ndGg6ZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkPXRoaXMsZT1RLmRlZmVyKCk7cmV0dXJuIGQuZ2V0QnVmZmVyUmFuZ2UoYSxiLGMpLnRoZW4oZnVuY3Rpb24oYSl7bnVsbD09PWE/ZS5yZXNvbHZlKDApOmUucmVzb2x2ZShhLmVuZC1iKX0pLGUucHJvbWlzZX0sd2FpdEZvclVwZGF0ZUVuZDpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYixjPVEuZGVmZXIoKSxkPTUwLGU9ZnVuY3Rpb24oKXthLnVwZGF0aW5nfHwoY2xlYXJJbnRlcnZhbChiKSxjLnJlc29sdmUoITApKX0sZj1mdW5jdGlvbigpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWVuZFwiLGYsITEpLGMucmVzb2x2ZSghMCl9O2lmKGEuaGFzT3duUHJvcGVydHkoXCJhZGRFdmVudExpc3RlbmVyXCIpKXRyeXthLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVlbmRcIixmLCExKX1jYXRjaChnKXtiPXNldEludGVydmFsKGUsZCl9ZWxzZSBiPXNldEludGVydmFsKGUsZCk7cmV0dXJuIGMucHJvbWlzZX0sYXBwZW5kOmZ1bmN0aW9uKGEsYil7dmFyIGM9US5kZWZlcigpO3RyeXtcImFwcGVuZFwiaW4gYT9hLmFwcGVuZChiKTpcImFwcGVuZEJ1ZmZlclwiaW4gYSYmYS5hcHBlbmRCdWZmZXIoYiksdGhpcy53YWl0Rm9yVXBkYXRlRW5kKGEpLnRoZW4oZnVuY3Rpb24oKXtjLnJlc29sdmUoKX0pfWNhdGNoKGQpe2MucmVqZWN0KHtlcnI6ZCxkYXRhOmJ9KX1yZXR1cm4gYy5wcm9taXNlfSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1RLmRlZmVyKCk7dHJ5e2I+PTAmJmQ+YiYmYz5iJiZcImVuZGVkXCIhPT1lLnJlYWR5U3RhdGUmJmEucmVtb3ZlKGIsYyksdGhpcy53YWl0Rm9yVXBkYXRlRW5kKGEpLnRoZW4oZnVuY3Rpb24oKXtmLnJlc29sdmUoKX0pfWNhdGNoKGcpe2YucmVqZWN0KGcpfXJldHVybiBmLnByb21pc2V9LGFib3J0OmZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGM9US5kZWZlcigpO3RyeXtcIm9wZW5cIj09PWEucmVhZHlTdGF0ZSYmYi5hYm9ydCgpLGMucmVzb2x2ZSgpfWNhdGNoKGQpe2MucmVqZWN0KGQuZGVzY3JpcHRpb24pfXJldHVybiBjLnByb21pc2V9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscT1udWxsLHI9bnVsbCxzPW51bGwsdD1udWxsLHU9LTEsdj1udWxsLHc9LTEseD1udWxsLHk9LTEsej0hMCxBPSExLEI9ITEsQz1udWxsLEQ9W10sRT0tMSxGPW51bGwsRz1mdW5jdGlvbigpe3RoaXMuZGVidWcubG9nKFwiQXR0ZW1wdGluZyBwbGF5Li4uXCIpLEEmJih0aGlzLmRlYnVnLmxvZyhcIkRvIHBsYXkuXCIpLHRoaXMudmlkZW9Nb2RlbC5wbGF5KCkpfSxIPWZ1bmN0aW9uKCl7dGhpcy5kZWJ1Zy5sb2coXCJEbyBwYXVzZS5cIiksdGhpcy52aWRlb01vZGVsLnBhdXNlKCl9LEk9ZnVuY3Rpb24oYSl7dGhpcy5kZWJ1Zy5sb2coXCJBdHRlbXB0aW5nIHNlZWsuLi5cIiksQSYmKHRoaXMuZGVidWcubG9nKFwiRG8gc2VlazogXCIrYSksdGhpcy5zeXN0ZW0ubm90aWZ5KFwic2V0Q3VycmVudFRpbWVcIiksdGhpcy52aWRlb01vZGVsLnNldEN1cnJlbnRUaW1lKGEpLHQmJnQuc2VlayhhKSx2JiZ2LnNlZWsoYSkpfSxKPWZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcztpZihiPVwibXNuZWVka2V5XCIhPT1hLnR5cGU/YS50eXBlOnEsRC5wdXNoKHt0eXBlOmIsaW5pdERhdGE6YS5pbml0RGF0YX0pLHRoaXMuZGVidWcubG9nKFwiRFJNOiBLZXkgcmVxdWlyZWQgZm9yIC0gXCIrYikscyYmcSYmIUMpdHJ5e0M9Yy5wcm90ZWN0aW9uQ29udHJvbGxlci5zZWxlY3RLZXlTeXN0ZW0ocSxzKX1jYXRjaChkKXtILmNhbGwoYyksYy5kZWJ1Zy5sb2coZCksYy5lcnJIYW5kbGVyLm1lZGlhS2V5U3lzdGVtU2VsZWN0aW9uRXJyb3IoZCl9QyYmYy5wcm90ZWN0aW9uQ29udHJvbGxlci5lbnN1cmVLZXlTZXNzaW9uKEMsYixhLmluaXREYXRhKX0sSz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9bnVsbCxkPW51bGwsZT1udWxsLGY9bnVsbDt0aGlzLmRlYnVnLmxvZyhcIkRSTTogR290IGEga2V5IG1lc3NhZ2UuLi5cIiksYz1hLnRhcmdldCxkPW5ldyBVaW50MTZBcnJheShhLm1lc3NhZ2UuYnVmZmVyKSxlPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxkKSxmPWEuZGVzdGluYXRpb25VUkwsYi5wcm90ZWN0aW9uQ29udHJvbGxlci51cGRhdGVGcm9tTWVzc2FnZShDLGMsZSxmKS5mYWlsKGZ1bmN0aW9uKGEpe0guY2FsbChiKSxiLmRlYnVnLmxvZyhhKSxiLmVyckhhbmRsZXIubWVkaWFLZXlNZXNzYWdlRXJyb3IoYSl9KX0sTD1mdW5jdGlvbigpe3RoaXMuZGVidWcubG9nKFwiRFJNOiBLZXkgYWRkZWQuXCIpfSxNPWZ1bmN0aW9uKCl7dmFyIGEsYj1ldmVudC50YXJnZXQ7c3dpdGNoKGE9XCJEUk06IE1lZGlhS2V5RXJyb3IgLSBzZXNzaW9uSWQ6IFwiK2Iuc2Vzc2lvbklkK1wiIGVycm9yQ29kZTogXCIrYi5lcnJvci5jb2RlK1wiIHN5c3RlbUVycm9yQ29kZTogXCIrYi5lcnJvci5zeXN0ZW1Db2RlK1wiIFtcIixiLmVycm9yLmNvZGUpe2Nhc2UgMTphKz1cIk1FRElBX0tFWUVSUl9VTktOT1dOIC0gQW4gdW5zcGVjaWZpZWQgZXJyb3Igb2NjdXJyZWQuIFRoaXMgdmFsdWUgaXMgdXNlZCBmb3IgZXJyb3JzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55IG9mIHRoZSBvdGhlciBjb2Rlcy5cIjticmVhaztjYXNlIDI6YSs9XCJNRURJQV9LRVlFUlJfQ0xJRU5UIC0gVGhlIEtleSBTeXN0ZW0gY291bGQgbm90IGJlIGluc3RhbGxlZCBvciB1cGRhdGVkLlwiO2JyZWFrO2Nhc2UgMzphKz1cIk1FRElBX0tFWUVSUl9TRVJWSUNFIC0gVGhlIG1lc3NhZ2UgcGFzc2VkIGludG8gdXBkYXRlIGluZGljYXRlZCBhbiBlcnJvciBmcm9tIHRoZSBsaWNlbnNlIHNlcnZpY2UuXCI7YnJlYWs7Y2FzZSA0OmErPVwiTUVESUFfS0VZRVJSX09VVFBVVCAtIFRoZXJlIGlzIG5vIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlIHdpdGggdGhlIHJlcXVpcmVkIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIGNvbnRlbnQgcHJvdGVjdGlvbiBzeXN0ZW0uXCI7YnJlYWs7Y2FzZSA1OmErPVwiTUVESUFfS0VZRVJSX0hBUkRXQVJFQ0hBTkdFIC0gQSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNoYW5nZSBjYXVzZWQgYSBjb250ZW50IHByb3RlY3Rpb24gZXJyb3IuXCI7YnJlYWs7Y2FzZSA2OmErPVwiTUVESUFfS0VZRVJSX0RPTUFJTiAtIEFuIGVycm9yIG9jY3VycmVkIGluIGEgbXVsdGktZGV2aWNlIGRvbWFpbiBsaWNlbnNpbmcgY29uZmlndXJhdGlvbi4gVGhlIG1vc3QgY29tbW9uIGVycm9yIGlzIGEgZmFpbHVyZSB0byBqb2luIHRoZSBkb21haW4uXCJ9YSs9XCJdXCIsdGhpcy5kZWJ1Zy5sb2coYSksdGhpcy5lcnJIYW5kbGVyLm1lZGlhS2V5U2Vzc2lvbkVycm9yKGEpfSxOPWZ1bmN0aW9uKGEpe3ZhciBiPVEuZGVmZXIoKSxjPXRoaXMsZD1mdW5jdGlvbihlKXtjLmRlYnVnLmxvZyhcIk1lZGlhU291cmNlIGlzIG9wZW4hXCIpLGMuZGVidWcubG9nKGUpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNvdXJjZW9wZW5cIixkKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3ZWJraXRzb3VyY2VvcGVuXCIsZCksYi5yZXNvbHZlKGEpfTtyZXR1cm4gYy5kZWJ1Zy5sb2coXCJNZWRpYVNvdXJjZSBzaG91bGQgYmUgY2xvc2VkLiBUaGUgYWN0dWFsIHJlYWR5U3RhdGUgaXM6IFwiK2EucmVhZHlTdGF0ZSksYS5hZGRFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLGQsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmtpdHNvdXJjZW9wZW5cIixkLCExKSxjLm1lZGlhU291cmNlRXh0LmF0dGFjaE1lZGlhU291cmNlKGEsYy52aWRlb01vZGVsKSxjLmRlYnVnLmxvZyhcIk1lZGlhU291cmNlIGF0dGFjaGVkIHRvIHZpZGVvLiAgV2FpdGluZyBvbiBvcGVuLi4uXCIpLGIucHJvbWlzZX0sTz1mdW5jdGlvbigpe3ZhciBjPXRoaXM7dCYmdC5yZXNldChCKSx2JiZ2LnJlc2V0KEIpLGImJmMubWVkaWFTb3VyY2VFeHQuZGV0YWNoTWVkaWFTb3VyY2UoYy52aWRlb01vZGVsKSxBPSExLEM9bnVsbCxEPVtdLHM9bnVsbCx0PW51bGwsdj1udWxsLHg9bnVsbCxxPW51bGwscj1udWxsLGI9bnVsbCxhPW51bGx9LFA9ZnVuY3Rpb24oYixjLGQsZSl7aWYoYiYmYyYmZClpZihudWxsPT09dCYmbnVsbD09PXYmJm51bGw9PT14KXt2YXIgZj1cIk5vIHN0cmVhbXMgdG8gcGxheS5cIjt0aGlzLmVyckhhbmRsZXIubWFuaWZlc3RFcnJvcihmLFwibm9zdHJlYW1zXCIsYSksdGhpcy5kZWJ1Zy5sb2coZiksZS5yZWplY3QoKX1lbHNlIHRoaXMuZGVidWcubG9nKFwiTWVkaWFTb3VyY2UgaW5pdGlhbGl6ZWQhXCIpLGUucmVzb2x2ZSghMCl9LFI9ZnVuY3Rpb24oKXt0aGlzLmRlYnVnLmxvZyhcIkdldHRpbmcgTWVkaWFTb3VyY2UgcmVhZHkuLi5cIik7dmFyIGE9US5kZWZlcigpLGM9ITEsZD0hMSxlPSExLGY9dGhpcyxnPWYubWFuaWZlc3RNb2RlbC5nZXRWYWx1ZSgpLGg9Zi5tYW5pZmVzdEV4dC5nZXRJc0xpdmUoZyk7cmV0dXJuIGYuZGVidWcubG9nKFwiR2F0aGVyaW5nIGluZm9ybWF0aW9uIGZvciBidWZmZXJzLiAoMSlcIiksZi5tYW5pZmVzdEV4dC5nZXREdXJhdGlvbihnLGgpLnRoZW4oZnVuY3Rpb24oKXtmLm1hbmlmZXN0RXh0LmdldFZpZGVvRGF0YShnLEUpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIG51bGwhPT1oPyhmLmRlYnVnLmxvZyhcIkNyZWF0ZSB2aWRlbyBidWZmZXIuXCIpLGYubWFuaWZlc3RFeHQuZ2V0RGF0YUluZGV4KGgsZyxFKS50aGVuKGZ1bmN0aW9uKGEpe3U9YSxmLmRlYnVnLmxvZyhcIlNhdmUgdmlkZW8gdHJhY2s6IFwiK3UpfSksZi5tYW5pZmVzdEV4dC5nZXRDb2RlYyhoKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBmLmRlYnVnLmxvZyhcIlZpZGVvIGNvZGVjOiBcIithKSxxPWEsZi5tYW5pZmVzdEV4dC5nZXRDb250ZW50UHJvdGVjdGlvbkRhdGEoaCkudGhlbihmdW5jdGlvbihjKXtpZihmLmRlYnVnLmxvZyhcIlZpZGVvIGNvbnRlbnRQcm90ZWN0aW9uXCIpLGMmJiFmLmNhcGFiaWxpdGllcy5zdXBwb3J0c01lZGlhS2V5cygpKXJldHVybiBmLmVyckhhbmRsZXIuY2FwYWJpbGl0eUVycm9yKFwibWVkaWFrZXlzXCIpLFEud2hlbihudWxsKTtpZihzPWMsIWYuY2FwYWJpbGl0aWVzLnN1cHBvcnRzQ29kZWMoZi52aWRlb01vZGVsLmdldEVsZW1lbnQoKSxhKSl7dmFyIGQ9XCJWaWRlbyBDb2RlYyAoXCIrYStcIikgaXMgbm90IHN1cHBvcnRlZC5cIjtyZXR1cm4gZi5lcnJIYW5kbGVyLm1hbmlmZXN0RXJyb3IoZCxcImNvZGVjXCIsZyksZi5kZWJ1Zy5sb2coZCksUS53aGVuKG51bGwpfXJldHVybiBmLnNvdXJjZUJ1ZmZlckV4dC5jcmVhdGVTb3VyY2VCdWZmZXIoYixhKX0pfSkudGhlbihmdW5jdGlvbihnKXtudWxsPT09Zz9mLmRlYnVnLmxvZyhcIk5vIGJ1ZmZlciB3YXMgY3JlYXRlZCwgc2tpcHBpbmcgdmlkZW8gc3RyZWFtLlwiKToodD1mLnN5c3RlbS5nZXRPYmplY3QoXCJidWZmZXJDb250cm9sbGVyXCIpLHQuaW5pdGlhbGl6ZShcInZpZGVvXCIsRSxoLGcsZi52aWRlb01vZGVsLGYucmVxdWVzdFNjaGVkdWxlcixmLmZyYWdtZW50Q29udHJvbGxlcixiKSxmLmRlYnVnLmxvZyhcIlZpZGVvIGlzIHJlYWR5IVwiKSksYz0hMCxQLmNhbGwoZixjLGQsZSxhKX0sZnVuY3Rpb24oKXtmLmVyckhhbmRsZXIubWVkaWFTb3VyY2VFcnJvcihcIkVycm9yIGNyZWF0aW5nIHZpZGVvIHNvdXJjZSBidWZmZXIuXCIpLGM9ITAsUC5jYWxsKGYsYyxkLGUsYSl9KSk6KGYuZGVidWcubG9nKFwiTm8gdmlkZW8gZGF0YS5cIiksYz0hMCxQLmNhbGwoZixjLGQsZSxhKSksZi5tYW5pZmVzdEV4dC5nZXRBdWRpb0RhdGFzKGcsRSl9KS50aGVuKGZ1bmN0aW9uKGgpe3JldHVybiBudWxsIT09aCYmaC5sZW5ndGg+MD8oZi5kZWJ1Zy5sb2coXCJIYXZlIGF1ZGlvIHN0cmVhbXM6IFwiK2gubGVuZ3RoKSxmLm1hbmlmZXN0RXh0LmdldFByaW1hcnlBdWRpb0RhdGEoZyxFKS50aGVuKGZ1bmN0aW9uKGgpe2YubWFuaWZlc3RFeHQuZ2V0RGF0YUluZGV4KGgsZyxFKS50aGVuKGZ1bmN0aW9uKGEpe3c9YSxmLmRlYnVnLmxvZyhcIlNhdmUgYXVkaW8gdHJhY2s6IFwiK3cpfSksZi5tYW5pZmVzdEV4dC5nZXRDb2RlYyhoKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBmLmRlYnVnLmxvZyhcIkF1ZGlvIGNvZGVjOiBcIithKSxyPWEsZi5tYW5pZmVzdEV4dC5nZXRDb250ZW50UHJvdGVjdGlvbkRhdGEoaCkudGhlbihmdW5jdGlvbihjKXtpZihmLmRlYnVnLmxvZyhcIkF1ZGlvIGNvbnRlbnRQcm90ZWN0aW9uXCIpLGMmJiFmLmNhcGFiaWxpdGllcy5zdXBwb3J0c01lZGlhS2V5cygpKXJldHVybiBmLmVyckhhbmRsZXIuY2FwYWJpbGl0eUVycm9yKFwibWVkaWFrZXlzXCIpLFEud2hlbihudWxsKTtpZihzPWMsIWYuY2FwYWJpbGl0aWVzLnN1cHBvcnRzQ29kZWMoZi52aWRlb01vZGVsLmdldEVsZW1lbnQoKSxhKSl7dmFyIGQ9XCJBdWRpbyBDb2RlYyAoXCIrYStcIikgaXMgbm90IHN1cHBvcnRlZC5cIjtyZXR1cm4gZi5lcnJIYW5kbGVyLm1hbmlmZXN0RXJyb3IoZCxcImNvZGVjXCIsZyksZi5kZWJ1Zy5sb2coZCksUS53aGVuKG51bGwpfXJldHVybiBmLnNvdXJjZUJ1ZmZlckV4dC5jcmVhdGVTb3VyY2VCdWZmZXIoYixhKX0pfSkudGhlbihmdW5jdGlvbihnKXtudWxsPT09Zz9mLmRlYnVnLmxvZyhcIk5vIGJ1ZmZlciB3YXMgY3JlYXRlZCwgc2tpcHBpbmcgYXVkaW8gc3RyZWFtLlwiKToodj1mLnN5c3RlbS5nZXRPYmplY3QoXCJidWZmZXJDb250cm9sbGVyXCIpLHYuaW5pdGlhbGl6ZShcImF1ZGlvXCIsRSxoLGcsZi52aWRlb01vZGVsLGYucmVxdWVzdFNjaGVkdWxlcixmLmZyYWdtZW50Q29udHJvbGxlcixiKSxmLmRlYnVnLmxvZyhcIkF1ZGlvIGlzIHJlYWR5IVwiKSksZD0hMCxQLmNhbGwoZixjLGQsZSxhKX0sZnVuY3Rpb24oKXtmLmVyckhhbmRsZXIubWVkaWFTb3VyY2VFcnJvcihcIkVycm9yIGNyZWF0aW5nIGF1ZGlvIHNvdXJjZSBidWZmZXIuXCIpLGQ9ITAsUC5jYWxsKGYsYyxkLGUsYSl9KX0pKTooZi5kZWJ1Zy5sb2coXCJObyBhdWRpbyBzdHJlYW1zLlwiKSxkPSEwLFAuY2FsbChmLGMsZCxlLGEpKSxmLm1hbmlmZXN0RXh0LmdldFRleHREYXRhKGcsRSl9KS50aGVuKGZ1bmN0aW9uKGgpe3ZhciBpO251bGwhPT1oPyhmLm1hbmlmZXN0RXh0LmdldERhdGFJbmRleChoLGcsRSkudGhlbihmdW5jdGlvbihhKXt5PWEsZi5kZWJ1Zy5sb2coXCJTYXZlIHRleHQgdHJhY2s6IFwiK3kpfSksZi5tYW5pZmVzdEV4dC5nZXRNaW1lVHlwZShoKS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBpPWEsZi5zb3VyY2VCdWZmZXJFeHQuY3JlYXRlU291cmNlQnVmZmVyKGIsaSl9KS50aGVuKGZ1bmN0aW9uKGIpe251bGw9PT1iP2YuZGVidWcubG9nKFwiU291cmNlIGJ1ZmZlciB3YXMgbm90IGNyZWF0ZWQgZm9yIHRleHQgdHJhY2tcIik6KHg9Zi5zeXN0ZW0uZ2V0T2JqZWN0KFwidGV4dENvbnRyb2xsZXJcIikseC5pbml0aWFsaXplKEUsaCxiLGYudmlkZW9Nb2RlbCksYi5oYXNPd25Qcm9wZXJ0eShcImluaXRpYWxpemVcIikmJmIuaW5pdGlhbGl6ZShpLHgpLGYuZGVidWcubG9nKFwiVGV4dCBpcyByZWFkeSFcIiksZT0hMCxQLmNhbGwoZixjLGQsZSxhKSl9LGZ1bmN0aW9uKGIpe2YuZGVidWcubG9nKFwiRXJyb3IgY3JlYXRpbmcgdGV4dCBzb3VyY2UgYnVmZmVyOlwiKSxmLmRlYnVnLmxvZyhiKSxmLmVyckhhbmRsZXIubWVkaWFTb3VyY2VFcnJvcihcIkVycm9yIGNyZWF0aW5nIHRleHQgc291cmNlIGJ1ZmZlci5cIiksZT0hMCxQLmNhbGwoZixjLGQsZSxhKX0pKTooZi5kZWJ1Zy5sb2coXCJObyB0ZXh0IHRyYWNrcy5cIiksZT0hMCxQLmNhbGwoZixjLGQsZSxhKSl9KX0pLGEucHJvbWlzZX0sUz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1RLmRlZmVyKCksZD1hLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxlPWEubWFuaWZlc3RFeHQuZ2V0SXNMaXZlKGQpO3JldHVybiBhLmRlYnVnLmxvZyhcIkdldHRpbmcgcmVhZHkgZm9yIHBsYXliYWNrLi4uXCIpLGEubWFuaWZlc3RFeHQuZ2V0RHVyYXRpb25Gb3JQZXJpb2QoRSxhLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxlKS50aGVuKGZ1bmN0aW9uKGEpe2w9YX0pLGEubWFuaWZlc3RFeHQuZ2V0RHVyYXRpb24oYS5tYW5pZmVzdE1vZGVsLmdldFZhbHVlKCksZSkudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gYS5kZWJ1Zy5sb2coXCJTZXR0aW5nIGR1cmF0aW9uOiBcIitjKSxhLm1lZGlhU291cmNlRXh0LnNldER1cmF0aW9uKGIsYyl9KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGEuZGVidWcubG9nKFwiRHVyYXRpb24gc3VjY2Vzc2Z1bGx5IHNldC5cIiksYS5tYW5pZmVzdEV4dC5nZXRQZXJpb2RTdGFydChhLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSxFKX0pLnRoZW4oZnVuY3Rpb24oYSl7Rj1hLEE9ITAsYy5yZXNvbHZlKCEwKX0pLGMucHJvbWlzZX0sVD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5kZWJ1Zy5sb2coXCJHb3QgbG9hZG1ldGFkYXRhIGV2ZW50LlwiKSxjLnJlc29sdmUobnVsbCl9LFU9ZnVuY3Rpb24oKXt0aGlzLmRlYnVnLmxvZyhcIkdvdCBwbGF5IGV2ZW50LlwiKSxBJiYobnVsbCE9PUY/KHRoaXMuZGVidWcubG9nKFwiU3RhcnRpbmcgc2VnbWVudCBsb2FkaW5nIGF0IG9mZnNldDogXCIrRiksdCYmdC5zZWVrKEYpLHYmJnYuc2VlayhGKSx4JiZ4LnNlZWsoRikpOih0JiZ0LnN0YXJ0KCksdiYmdi5zdGFydCgpLHgmJnguc3RhcnQoKSkpfSxWPWZ1bmN0aW9uKCl7dGhpcy5kZWJ1Zy5sb2coXCJHb3QgcGF1c2UgZXZlbnQuXCIpLHRoaXMuc2NoZWR1bGVXaGlsZVBhdXNlZHx8YWIuY2FsbCh0aGlzKX0sVz1mdW5jdGlvbihhKXt2YXIgYj1hLnNyY0VsZW1lbnQuZXJyb3IsYz1iLmNvZGUsZD1cIlwiO2lmKC0xIT09Yyl7c3dpdGNoKGMpe2Nhc2UgMTpkPVwiTUVESUFfRVJSX0FCT1JURURcIjticmVhaztjYXNlIDI6ZD1cIk1FRElBX0VSUl9ORVRXT1JLXCI7YnJlYWs7Y2FzZSAzOmQ9XCJNRURJQV9FUlJfREVDT0RFXCI7YnJlYWs7Y2FzZSA0OmQ9XCJNRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURURcIjticmVhaztjYXNlIDU6ZD1cIk1FRElBX0VSUl9FTkNSWVBURURcIn1CPSEwLHRoaXMuZGVidWcubG9nKFwiVmlkZW8gRWxlbWVudCBFcnJvcjogXCIrZCksdGhpcy5kZWJ1Zy5sb2coYiksdGhpcy5lcnJIYW5kbGVyLm1lZGlhU291cmNlRXJyb3IoZCksdGhpcy5yZXNldCgpfX0sWD1mdW5jdGlvbigpe3RoaXMuZGVidWcubG9nKFwiR290IHNlZWtpbmcgZXZlbnQuXCIpO3ZhciBhPXRoaXMudmlkZW9Nb2RlbC5nZXRDdXJyZW50VGltZSgpO3QmJnQuc2VlayhhKSx2JiZ2LnNlZWsoYSl9LFk9ZnVuY3Rpb24oKXt0aGlzLmRlYnVnLmxvZyhcIlNlZWsgY29tcGxldGUuXCIpLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJzZWVraW5nXCIsaCksdGhpcy52aWRlb01vZGVsLnVubGlzdGVuKFwic2Vla2VkXCIsaSl9LFo9ZnVuY3Rpb24oKXtfLmNhbGwodGhpcyl9LCQ9ZnVuY3Rpb24oKXtfLmNhbGwodGhpcyl9LF89ZnVuY3Rpb24oKXt0JiZ0LnVwZGF0ZUJ1ZmZlclN0YXRlKCksdiYmdi51cGRhdGVCdWZmZXJTdGF0ZSgpfSxhYj1mdW5jdGlvbigpe3QmJnQuc3RvcCgpLHYmJnYuc3RvcCgpfSxiYj1mdW5jdGlvbihkKXt2YXIgZT10aGlzO3JldHVybiBlLmRlYnVnLmxvZyhcIlN0cmVhbSBzdGFydCBsb2FkaW5nLlwiKSxhPWQsZS5tZWRpYVNvdXJjZUV4dC5jcmVhdGVNZWRpYVNvdXJjZSgpLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIGUuZGVidWcubG9nKFwiTWVkaWFTb3VyY2UgY3JlYXRlZC5cIiksTi5jYWxsKGUsYSl9KS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBiPWEsZS5kZWJ1Zy5sb2coXCJNZWRpYVNvdXJjZSBzZXQgdXAuXCIpLFIuY2FsbChlKX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWJ1Zy5sb2coXCJTdGFydCBpbml0aWFsaXppbmcgcGxheWJhY2suXCIpLFMuY2FsbChlKX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gej8oZS5kZWJ1Zy5sb2coXCJQbGF5YmFjayBpbml0aWFsaXplZCFcIiksYy5wcm9taXNlKTp2b2lkIDB9KS50aGVuKGZ1bmN0aW9uKCl7ZS5kZWJ1Zy5sb2coXCJlbGVtZW50IGxvYWRlZCFcIiksMD09PUUmJkcuY2FsbChlKX0pfSxjYj1mdW5jdGlvbigpe3RoaXMuZGVidWcubG9nKFwiQ3VycmVudCB0aW1lIGhhcyBjaGFuZ2VkLCBibG9jayBwcm9ncmFtbWF0aWMgc2Vlay5cIiksdGhpcy52aWRlb01vZGVsLnVubGlzdGVuKFwic2Vla2luZ1wiLGgpLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJzZWVrZWRcIixpKX0sZGI9ZnVuY3Rpb24oKXt0JiYhdC5pc0J1ZmZlcmluZ0NvbXBsZXRlZCgpfHx2JiYhdi5pc0J1ZmZlcmluZ0NvbXBsZXRlZCgpfHxiJiZ0aGlzLm1lZGlhU291cmNlRXh0LnNpZ25hbEVuZE9mU3RyZWFtKGIpfSxlYj1mdW5jdGlvbigpe2FiLmNhbGwodGhpcyl9LGZiPWZ1bmN0aW9uKCl7dmFyIGEsYixjPXRoaXMsZD1jLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKTtjLmRlYnVnLmxvZyhcIk1hbmlmZXN0IHVwZGF0ZWQuLi4gc2V0IG5ldyBkYXRhIG9uIGJ1ZmZlcnMuXCIpLHQmJihhPXQuZ2V0RGF0YSgpLGEmJmEuaGFzT3duUHJvcGVydHkoXCJpZFwiKT9jLm1hbmlmZXN0RXh0LmdldERhdGFGb3JJZChhLmlkLGQsRSkudGhlbihmdW5jdGlvbihhKXt0LnNldERhdGEoYSl9KTpjLm1hbmlmZXN0RXh0LmdldERhdGFGb3JJbmRleCh1LGQsRSkudGhlbihmdW5jdGlvbihhKXt0LnNldERhdGEoYSl9KSksdiYmKGI9di5nZXREYXRhKCksYiYmYi5oYXNPd25Qcm9wZXJ0eShcImlkXCIpP2MubWFuaWZlc3RFeHQuZ2V0RGF0YUZvcklkKGIuaWQsZCxFKS50aGVuKGZ1bmN0aW9uKGEpe3Yuc2V0RGF0YShhKX0pOmMubWFuaWZlc3RFeHQuZ2V0RGF0YUZvckluZGV4KHcsZCxFKS50aGVuKGZ1bmN0aW9uKGEpe3Yuc2V0RGF0YShhKX0pKX07cmV0dXJue3N5c3RlbTp2b2lkIDAsdmlkZW9Nb2RlbDp2b2lkIDAsbWFuaWZlc3RMb2FkZXI6dm9pZCAwLG1hbmlmZXN0TW9kZWw6dm9pZCAwLG1lZGlhU291cmNlRXh0OnZvaWQgMCxzb3VyY2VCdWZmZXJFeHQ6dm9pZCAwLGJ1ZmZlckV4dDp2b2lkIDAsbWFuaWZlc3RFeHQ6dm9pZCAwLGZyYWdtZW50Q29udHJvbGxlcjp2b2lkIDAsYWJyQ29udHJvbGxlcjp2b2lkIDAsZnJhZ21lbnRFeHQ6dm9pZCAwLHByb3RlY3Rpb25Nb2RlbDp2b2lkIDAscHJvdGVjdGlvbkNvbnRyb2xsZXI6dm9pZCAwLHByb3RlY3Rpb25FeHQ6dm9pZCAwLGNhcGFiaWxpdGllczp2b2lkIDAsZGVidWc6dm9pZCAwLG1ldHJpY3NFeHQ6dm9pZCAwLGVyckhhbmRsZXI6dm9pZCAwLHJlcXVlc3RTY2hlZHVsZXI6dm9pZCAwLHNjaGVkdWxlV2hpbGVQYXVzZWQ6dm9pZCAwLHNldHVwOmZ1bmN0aW9uKCl7dGhpcy5zeXN0ZW0ubWFwSGFuZGxlcihcIm1hbmlmZXN0VXBkYXRlZFwiLHZvaWQgMCxmYi5iaW5kKHRoaXMpKSx0aGlzLnN5c3RlbS5tYXBIYW5kbGVyKFwic2V0Q3VycmVudFRpbWVcIix2b2lkIDAsY2IuYmluZCh0aGlzKSksdGhpcy5zeXN0ZW0ubWFwSGFuZGxlcihcImJ1ZmZlcmluZ0NvbXBsZXRlZFwiLHZvaWQgMCxkYi5iaW5kKHRoaXMpKSx0aGlzLnN5c3RlbS5tYXBIYW5kbGVyKFwic2VnbWVudExvYWRpbmdGYWlsZWRcIix2b2lkIDAsZWIuYmluZCh0aGlzKSksYz1RLmRlZmVyKCksZT1VLmJpbmQodGhpcyksZj1WLmJpbmQodGhpcyksZz1XLmJpbmQodGhpcyksaD1YLmJpbmQodGhpcyksaT1ZLmJpbmQodGhpcyksaz1aLmJpbmQodGhpcyksaj0kLmJpbmQodGhpcyksZD1ULmJpbmQodGhpcyl9LGxvYWQ6ZnVuY3Rpb24oYSxiKXtFPWIsYmIuY2FsbCh0aGlzLGEpfSxzZXRWaWRlb01vZGVsOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9Nb2RlbD1hLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJwbGF5XCIsZSksdGhpcy52aWRlb01vZGVsLmxpc3RlbihcInBhdXNlXCIsZiksdGhpcy52aWRlb01vZGVsLmxpc3RlbihcImVycm9yXCIsZyksdGhpcy52aWRlb01vZGVsLmxpc3RlbihcInNlZWtpbmdcIixoKSx0aGlzLnZpZGVvTW9kZWwubGlzdGVuKFwidGltZXVwZGF0ZVwiLGopLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJwcm9ncmVzc1wiLGspLHRoaXMudmlkZW9Nb2RlbC5saXN0ZW4oXCJsb2FkZWRtZXRhZGF0YVwiLGQpfSxpbml0UHJvdGVjdGlvbjpmdW5jdGlvbigpe209Si5iaW5kKHRoaXMpLG49Sy5iaW5kKHRoaXMpLG89TC5iaW5kKHRoaXMpLHA9TS5iaW5kKHRoaXMpLHRoaXMucHJvdGVjdGlvbk1vZGVsPXRoaXMuc3lzdGVtLmdldE9iamVjdChcInByb3RlY3Rpb25Nb2RlbFwiKSx0aGlzLnByb3RlY3Rpb25Nb2RlbC5pbml0KHRoaXMuZ2V0VmlkZW9Nb2RlbCgpKSx0aGlzLnByb3RlY3Rpb25Db250cm9sbGVyPXRoaXMuc3lzdGVtLmdldE9iamVjdChcInByb3RlY3Rpb25Db250cm9sbGVyXCIpLHRoaXMucHJvdGVjdGlvbkNvbnRyb2xsZXIuaW5pdCh0aGlzLnZpZGVvTW9kZWwsdGhpcy5wcm90ZWN0aW9uTW9kZWwpLHRoaXMucHJvdGVjdGlvbk1vZGVsLmxpc3RlblRvTmVlZEtleShtKSx0aGlzLnByb3RlY3Rpb25Nb2RlbC5saXN0ZW5Ub0tleU1lc3NhZ2UobiksdGhpcy5wcm90ZWN0aW9uTW9kZWwubGlzdGVuVG9LZXlFcnJvcihwKSx0aGlzLnByb3RlY3Rpb25Nb2RlbC5saXN0ZW5Ub0tleUFkZGVkKG8pfSxnZXRWaWRlb01vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9Nb2RlbH0sZ2V0TWFuaWZlc3RFeHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBhLm1hbmlmZXN0RXh0fSxzZXRBdXRvUGxheTpmdW5jdGlvbihhKXt6PWF9LGdldEF1dG9QbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHp9LHJlc2V0OmZ1bmN0aW9uKCl7SC5jYWxsKHRoaXMpLHRoaXMudmlkZW9Nb2RlbC51bmxpc3RlbihcInBsYXlcIixlKSx0aGlzLnZpZGVvTW9kZWwudW5saXN0ZW4oXCJwYXVzZVwiLGYpLHRoaXMudmlkZW9Nb2RlbC51bmxpc3RlbihcImVycm9yXCIsZyksdGhpcy52aWRlb01vZGVsLnVubGlzdGVuKFwic2Vla2luZ1wiLGgpLHRoaXMudmlkZW9Nb2RlbC51bmxpc3RlbihcInRpbWV1cGRhdGVcIixqKSx0aGlzLnZpZGVvTW9kZWwudW5saXN0ZW4oXCJwcm9ncmVzc1wiLGspLHRoaXMudmlkZW9Nb2RlbC51bmxpc3RlbihcImxvYWRlZG1ldGFkYXRhXCIsZCksTy5jYWxsKHRoaXMpLHRoaXMucHJvdGVjdGlvbkNvbnRyb2xsZXImJnRoaXMucHJvdGVjdGlvbkNvbnRyb2xsZXIudGVhcmRvd25LZXlTeXN0ZW0oQyksdGhpcy5wcm90ZWN0aW9uQ29udHJvbGxlcj12b2lkIDAsdGhpcy5wcm90ZWN0aW9uTW9kZWw9dm9pZCAwLHRoaXMuZnJhZ21lbnRDb250cm9sbGVyPXZvaWQgMCx0aGlzLnJlcXVlc3RTY2hlZHVsZXI9dm9pZCAwLGM9US5kZWZlcigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRQZXJpb2RJbmRleDpmdW5jdGlvbihhKXtFPWF9LGdldFBlcmlvZEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIEV9LGdldFN0YXJ0VGltZTpmdW5jdGlvbigpe3JldHVybiBGfSxwbGF5Okcsc2VlazpJLHBhdXNlOkh9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlN0cmVhbX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlN0cmVhbUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYSxiPVtdLGM9NCxkPTMsZT0hMCxmPW51bGwsZz1mdW5jdGlvbigpe2EucGxheSgpfSxoPWZ1bmN0aW9uKCl7YS5wYXVzZSgpfSxpPWZ1bmN0aW9uKGIpe2Euc2VlayhiKX0saj1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0RWxlbWVudCgpLGQ9Yi5nZXRFbGVtZW50KCk7cmV0dXJuIGQucGFyZW50Tm9kZXx8Yy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGMpLGMuc3R5bGUud2lkdGg9XCIwcHhcIixkLnN0eWxlLndpZHRoPVwiMTAwJVwiLG0oYyxkKSxsKGEpLGsoYiksUS53aGVuKCEwKX0saz1mdW5jdGlvbihhKXthLmxpc3RlbihcInNlZWtpbmdcIixwKSxhLmxpc3RlbihcInByb2dyZXNzXCIsbikscigpJiZhLmxpc3RlbihcInRpbWV1cGRhdGVcIixvKX0sbD1mdW5jdGlvbihhKXthLnVubGlzdGVuKFwic2Vla2luZ1wiLHApLGEudW5saXN0ZW4oXCJwcm9ncmVzc1wiLG4pLGEudW5saXN0ZW4oXCJ0aW1ldXBkYXRlXCIsbyl9LG09ZnVuY3Rpb24oYSxiKXtbXCJjb250cm9sc1wiLFwibG9vcFwiLFwibXV0ZWRcIixcInBsYXliYWNrUmF0ZVwiLFwidm9sdW1lXCJdLmZvckVhY2goZnVuY3Rpb24oYyl7YltjXT1hW2NdfSl9LG49ZnVuY3Rpb24oKXt2YXIgYj1hLmdldFZpZGVvTW9kZWwoKS5nZXRFbGVtZW50KCkuYnVmZmVyZWQ7aWYoYi5sZW5ndGgpe3ZhciBkPWIubGVuZ3RoLTEsZT1iLmVuZChkKSxmPWEuZ2V0U3RhcnRUaW1lKCkrYS5nZXREdXJhdGlvbigpLWU7Yz5mJiYoYS5nZXRWaWRlb01vZGVsKCkudW5saXN0ZW4oXCJwcm9ncmVzc1wiLG4pLHEoKSl9fSxvPWZ1bmN0aW9uKCl7aWYoIWEuZ2V0VmlkZW9Nb2RlbCgpLmdldEVsZW1lbnQoKS5zZWVraW5nKXt2YXIgYj1hLmdldFN0YXJ0VGltZSgpK2EuZ2V0RHVyYXRpb24oKSxjPWEuZ2V0VmlkZW9Nb2RlbCgpLmdldEN1cnJlbnRUaW1lKCk7ZD5iLWMmJnYoYSxyKCkpfX0scD1mdW5jdGlvbigpe3ZhciBiPWEuZ2V0VmlkZW9Nb2RlbCgpLmdldEN1cnJlbnRUaW1lKCksYz1zKGIpO2MmJmMhPT1hJiZ2KGEsYyxiKX0scT1mdW5jdGlvbigpe3ZhciBhPXIoKTthJiZhLnNlZWsoYS5nZXRTdGFydFRpbWUoKSl9LHI9ZnVuY3Rpb24oKXt2YXIgYz1hLmdldFBlcmlvZEluZGV4KCkrMTtyZXR1cm4gYzxiLmxlbmd0aD9iW2NdOm51bGx9LHM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZD1udWxsLGU9MCxmPWIubGVuZ3RoO2Y+ZTtlKyspaWYoZD1iW2VdLGMrPWQuZ2V0RHVyYXRpb24oKSxjPmEpcmV0dXJuIGR9LHQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnN5c3RlbS5nZXRPYmplY3QoXCJ2aWRlb01vZGVsXCIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO3JldHVybiBhLnNldEVsZW1lbnQoYiksYX0sdT1mdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sdj1mdW5jdGlvbihiLGMsZCl7YiYmYyYmYiE9PWMmJlEud2hlbihmfHwhMCkudGhlbihmdW5jdGlvbigpe2IucGF1c2UoKSxhPWMsZj1qKGIuZ2V0VmlkZW9Nb2RlbCgpLGMuZ2V0VmlkZW9Nb2RlbCgpKSxkP2koYi5nZXRWaWRlb01vZGVsKCkuZ2V0Q3VycmVudFRpbWUoKSk6aShjLmdldFN0YXJ0VGltZSgpKSxnKCl9KX07cmV0dXJue3N5c3RlbTp2b2lkIDAsdmlkZW9Nb2RlbDp2b2lkIDAsbWFuaWZlc3RMb2FkZXI6dm9pZCAwLG1hbmlmZXN0VXBkYXRlcjp2b2lkIDAsbWFuaWZlc3RNb2RlbDp2b2lkIDAsbWVkaWFTb3VyY2VFeHQ6dm9pZCAwLHNvdXJjZUJ1ZmZlckV4dDp2b2lkIDAsYnVmZmVyRXh0OnZvaWQgMCxtYW5pZmVzdEV4dDp2b2lkIDAsZnJhZ21lbnRDb250cm9sbGVyOnZvaWQgMCxhYnJDb250cm9sbGVyOnZvaWQgMCxmcmFnbWVudEV4dDp2b2lkIDAsY2FwYWJpbGl0aWVzOnZvaWQgMCxkZWJ1Zzp2b2lkIDAsbWV0cmljc0V4dDp2b2lkIDAsZXJySGFuZGxlcjp2b2lkIDAsZ2V0TWFuaWZlc3RFeHQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRNYW5pZmVzdEV4dCgpfSxzZXRBdXRvUGxheTpmdW5jdGlvbihhKXtlPWF9LGdldEF1dG9QbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGdldFZpZGVvTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb01vZGVsfSxzZXRWaWRlb01vZGVsOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9Nb2RlbD1hfSxsb2FkOmZ1bmN0aW9uKGMpe3ZhciBkLGY9dGhpcztmLm1hbmlmZXN0TG9hZGVyLmxvYWQoYykudGhlbihmdW5jdGlvbihjKXtmLm1hbmlmZXN0TW9kZWwuc2V0VmFsdWUoYyksZi5kZWJ1Zy5sb2coXCJNYW5pZmVzdCBoYXMgbG9hZGVkLlwiKSxmLmRlYnVnLmxvZyhmLm1hbmlmZXN0TW9kZWwuZ2V0VmFsdWUoKSksZi5tYW5pZmVzdFVwZGF0ZXIuaW5pdCgpLGYubWFuaWZlc3RFeHQuZ2V0UGVyaW9kQ291bnQoYykudGhlbihmdW5jdGlvbihnKXtmb3IodmFyIGg9MDtnPmg7aCsrKWQ9Zi5zeXN0ZW0uZ2V0T2JqZWN0KFwic3RyZWFtXCIpLGQuc2V0VmlkZW9Nb2RlbCgwPT09aD9mLnZpZGVvTW9kZWw6dC5jYWxsKGYpKSxkLmluaXRQcm90ZWN0aW9uKCksZC5zZXRBdXRvUGxheShlKSxkLmxvYWQoYyxoKSxiLnB1c2goZCk7YT1iWzBdLGsoYS5nZXRWaWRlb01vZGVsKCkpfSl9LGZ1bmN0aW9uKCl7Zi5yZXNldCgpfSl9LHJlc2V0OmZ1bmN0aW9uKCl7YSYmbChhLmdldFZpZGVvTW9kZWwoKSk7Zm9yKHZhciBjPTAsZD1iLmxlbmd0aDtkPmM7YysrKXt2YXIgZT1iW2NdO2UucmVzZXQoKSxlIT09YSYmdShlLmdldFZpZGVvTW9kZWwoKS5nZXRFbGVtZW50KCkpfWI9W10sdGhpcy5tYW5pZmVzdFVwZGF0ZXIuc3RvcCgpLHRoaXMubWFuaWZlc3RNb2RlbC5zZXRWYWx1ZShudWxsKSxmPW51bGwsYT1udWxsfSxwbGF5Omcsc2VlazppLHBhdXNlOmh9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5TdHJlYW1Db250cm9sbGVyfSxNZWRpYVBsYXllci5tb2RlbHMuVmlkZW9Nb2RlbD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBhLGI9W10sYz1mdW5jdGlvbigpe3JldHVybiBiLmxlbmd0aD4wfSxkPWZ1bmN0aW9uKGMpe251bGwhPT1jJiZiW2NdIT09ITAmJihiLnB1c2goYyksYltjXT0hMCxhLnBsYXliYWNrUmF0ZT0wKX0sZT1mdW5jdGlvbihkKXtpZihudWxsIT09ZCl7YltkXT0hMTt2YXIgZT1iLmluZGV4T2YoZCk7LTEhPT1lJiZiLnNwbGljZShlLDEpLGMoKT09PSExJiYoYS5wbGF5YmFja1JhdGU9MSl9fSxmPWZ1bmN0aW9uKGEsYil7Yj9kKGEpOmUoYSl9O3JldHVybntzeXN0ZW06dm9pZCAwLHNldHVwOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7YS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7YS5wYXVzZSgpfSxpc1BhdXNlZDpmdW5jdGlvbigpe3JldHVybiBhLnBhdXNlZH0sZ2V0UGxheWJhY2tSYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGEucGxheWJhY2tSYXRlfSxzZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oYil7YS5wbGF5YmFja1JhdGU9Yn0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gYS5jdXJyZW50VGltZX0sc2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oYil7YS5jdXJyZW50VGltZSE9YiYmKGEuY3VycmVudFRpbWU9Yil9LGxpc3RlbjpmdW5jdGlvbihiLGMpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx1bmxpc3RlbjpmdW5jdGlvbihiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldEVsZW1lbnQ6ZnVuY3Rpb24oYil7YT1ifSxzZXRTb3VyY2U6ZnVuY3Rpb24oYil7YS5zcmM9Yn0sc3RhbGxTdHJlYW06Zixpc1N0YWxsZWQ6Y319LE1lZGlhUGxheWVyLm1vZGVscy5WaWRlb01vZGVsLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIubW9kZWxzLlZpZGVvTW9kZWx9LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5WaWRlb01vZGVsRXh0ZW5zaW9ucz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3JldHVybntnZXREcm9wcGVkRnJhbWVzOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwhPT1hLndlYmtpdERyb3BwZWRGcmFtZUNvdW50LGM9LTE7cmV0dXJuIGImJihjPWEud2Via2l0RHJvcHBlZEZyYW1lQ291bnQpLGN9fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlZpZGVvTW9kZWxFeHRlbnNpb25zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlZpZGVvTW9kZWxFeHRlbnNpb25zfSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dENvbnRyb2xsZXI9ZnVuY3Rpb24oKXt2YXIgYSxiLGM9XCJMT0FESU5HXCIsZD1cIlJFQURZXCIsZT0hMSxmPS0xLGc9ZCxoPWZ1bmN0aW9uKGEpe3RoaXMuZGVidWcubG9nKFwiVGV4dENvbnRyb2xsZXIgc2V0U3RhdGUgdG86XCIrYSksZz1hfSxpPWZ1bmN0aW9uKCl7aWYoZSYmZz09PWQpe3ZhciBiPXRoaXM7aC5jYWxsKGIsYyksYi5pbmRleEhhbmRsZXIuZ2V0SW5pdFJlcXVlc3QoMCxhKS50aGVuKGZ1bmN0aW9uKGEpe2IuZGVidWcubG9nKFwiTG9hZGluZyB0ZXh0IHRyYWNrIGluaXRpYWxpemF0aW9uOiBcIithLnVybCksYi5kZWJ1Zy5sb2coYSksYi5mcmFnbWVudExvYWRlci5sb2FkKGEpLnRoZW4oay5iaW5kKGIsYSksbC5iaW5kKGIsYSkpLGguY2FsbChiLGMpfSl9fSxqPWZ1bmN0aW9uKCl7aS5jYWxsKHRoaXMpfSxrPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcztkLmRlYnVnLmxvZyhcIiBUZXh0IHRyYWNrIEJ5dGVzIGZpbmlzaGVkIGxvYWRpbmc6IFwiK2EudXJsKSxkLmZyYWdtZW50Q29udHJvbGxlci5wcm9jZXNzKGMuZGF0YSkudGhlbihmdW5jdGlvbihhKXtudWxsIT09YSYmKGQuZGVidWcubG9nKFwiUHVzaCB0ZXh0IHRyYWNrIGJ5dGVzOiBcIithLmJ5dGVMZW5ndGgpLGQuc291cmNlQnVmZmVyRXh0LmFwcGVuZChiLGEsZC52aWRlb01vZGVsKSl9KX0sbD1mdW5jdGlvbigpe307cmV0dXJue3ZpZGVvTW9kZWw6dm9pZCAwLGZyYWdtZW50TG9hZGVyOnZvaWQgMCxmcmFnbWVudENvbnRyb2xsZXI6dm9pZCAwLGluZGV4SGFuZGxlcjp2b2lkIDAsc291cmNlQnVmZmVyRXh0OnZvaWQgMCxkZWJ1Zzp2b2lkIDAsaW5pdGlhbGl6ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZj10aGlzO2Yuc2V0VmlkZW9Nb2RlbChkKSxmLnNldFBlcmlvZEluZGV4KGEpLGYuc2V0RGF0YShiKSxmLnNldEJ1ZmZlcihjKSxlPSEwfSxnZXRQZXJpb2RJbmRleDpmdW5jdGlvbigpe3JldHVybiBmfSxzZXRQZXJpb2RJbmRleDpmdW5jdGlvbihhKXtmPWF9LGdldFZpZGVvTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb01vZGVsfSxzZXRWaWRlb01vZGVsOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9Nb2RlbD1hfSxnZXREYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldERhdGE6ZnVuY3Rpb24oYil7YT1ifSxnZXRCdWZmZXI6ZnVuY3Rpb24oKXtyZXR1cm4gYn0sc2V0QnVmZmVyOmZ1bmN0aW9uKGEpe2I9YX0scmVzZXQ6ZnVuY3Rpb24oYSxjKXthfHwodGhpcy5zb3VyY2VCdWZmZXJFeHQuYWJvcnQoYyxiKSx0aGlzLnNvdXJjZUJ1ZmZlckV4dC5yZW1vdmVTb3VyY2VCdWZmZXIoYyxiKSl9LHN0YXJ0Omp9fSxNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dENvbnRyb2xsZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dENvbnRyb2xsZXJ9LE1lZGlhUGxheWVyLnV0aWxzLlRleHRUcmFja0V4dGVuc2lvbnM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm57YWRkVGV4dFRyYWNrOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS5hZGRUZXh0VHJhY2soXCJjYXB0aW9uc1wiLGMsZCk7Zi5kZWZhdWx0PWUsZi5tb2RlPVwic2hvd2luZ1wiO2Zvcih2YXIgZyBpbiBiKXt2YXIgaD1iW2ddO2YuYWRkQ3VlKG5ldyBUZXh0VHJhY2tDdWUoaC5zdGFydCxoLmVuZCxoLmRhdGEpKX1yZXR1cm4gUS53aGVuKGYpfSxkZWxldGVDdWVzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hLnRleHRUcmFja3NbMF0sYz1iLmN1ZXMsZD1jLmxlbmd0aDtkPj0wO2QtLSliLnJlbW92ZUN1ZShjW2RdKTtiLm1vZGU9XCJkaXNhYmxlZFwifX19LE1lZGlhUGxheWVyLmRlcGVuZGVuY2llcy5UZXh0VlRUU291cmNlQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIGEsYixjO3JldHVybntzeXN0ZW06dm9pZCAwLGV2ZW50QnVzOnZvaWQgMCxpbml0aWFsaXplOmZ1bmN0aW9uKGQsZSl7Yz1kLGE9ZS5nZXRWaWRlb01vZGVsKCkuZ2V0RWxlbWVudCgpLGI9ZS5nZXREYXRhKCl9LGFwcGVuZDpmdW5jdGlvbihjKXt2YXIgZD10aGlzO2QuZ2V0UGFyc2VyKCkucGFyc2UoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50MTZBcnJheShjKSkpLnRoZW4oZnVuY3Rpb24oYyl7dmFyIGU9Yi5SZXByZXNlbnRhdGlvbl9hc0FycmF5WzBdLmlkLGY9Yi5sYW5nO2QuZ2V0VGV4dFRyYWNrRXh0ZW5zaW9ucygpLmFkZFRleHRUcmFjayhhLGMsZSxmLCEwKS50aGVuKGZ1bmN0aW9uKCl7ZC5ldmVudEJ1cy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwidXBkYXRlZW5kXCJ9KX0pfSl9LGFib3J0OmZ1bmN0aW9uKCl7dGhpcy5nZXRUZXh0VHJhY2tFeHRlbnNpb25zKCkuZGVsZXRlQ3VlcyhhKX0sZ2V0UGFyc2VyOmZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuXCJ0ZXh0L3Z0dFwiPT09YyYmKGE9dGhpcy5zeXN0ZW0uZ2V0T2JqZWN0KFwidnR0UGFyc2VyXCIpKSxhfSxnZXRUZXh0VHJhY2tFeHRlbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3lzdGVtLmdldE9iamVjdChcInRleHRUcmFja0V4dGVuc2lvbnNcIil9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMuYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZXZlbnRCdXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyl9fX0sTWVkaWFQbGF5ZXIuZGVwZW5kZW5jaWVzLlRleHRWVFRTb3VyY2VCdWZmZXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5kZXBlbmRlbmNpZXMuVGV4dFZUVFNvdXJjZUJ1ZmZlcn0sTWVkaWFQbGF5ZXIudXRpbHMuVlRUUGFyc2VyPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zcGxpdChcIjpcIiksYz1iLmxlbmd0aC0xO3JldHVybiBhPTYwKnBhcnNlSW50KGJbYy0xXSwxMCkrcGFyc2VGbG9hdChiW2NdLDEwKSwyPT09YyYmKGErPTM2MDAqcGFyc2VJbnQoYlswXSwxMCkpLGF9O3JldHVybntwYXJzZTpmdW5jdGlvbihiKXt2YXIgYyxkPS8oPzpcXHJcXG58XFxyfFxcbikvZ20sZT0vLS0+LyxmPS8oXltcXHNdK3xbXFxzXSskKS9nLGc9W107Yj1iLnNwbGl0KGQpLGM9Yi5sZW5ndGg7Zm9yKHZhciBoPTA7Yz5oO2grKyl7dmFyIGk9YltoXTtpZihpLmxlbmd0aD4wJiZcIldFQlZUVFwiIT09aSYmaS5tYXRjaChlKSl7dmFyIGo9aS5zcGxpdChlKSxrPWJbaCsxXTtnLnB1c2goe3N0YXJ0OmEoalswXS5yZXBsYWNlKGYsXCJcIikpLGVuZDphKGpbMV0ucmVwbGFjZShmLFwiXCIpKSxkYXRhOmt9KX19cmV0dXJuIFEud2hlbihnKX19fSxNZWRpYVBsYXllci5ydWxlcy5CYXNlUnVsZXNDb2xsZWN0aW9uPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGE9W107cmV0dXJue2Rvd25sb2FkUmF0aW9SdWxlOnZvaWQgMCxpbnN1ZmZpY2llbnRCdWZmZXJSdWxlOnZvaWQgMCxnZXRSdWxlczpmdW5jdGlvbigpe3JldHVybiBRLndoZW4oYSl9LHNldHVwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmdldFJ1bGVzKCkudGhlbihmdW5jdGlvbihiKXtiLnB1c2goYS5kb3dubG9hZFJhdGlvUnVsZSksYi5wdXNoKGEuaW5zdWZmaWNpZW50QnVmZmVyUnVsZSl9KX19fSxNZWRpYVBsYXllci5ydWxlcy5CYXNlUnVsZXNDb2xsZWN0aW9uLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIucnVsZXMuQmFzZVJ1bGVzQ29sbGVjdGlvbn0sTWVkaWFQbGF5ZXIucnVsZXMuRG93bmxvYWRSYXRpb1J1bGU9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcyxlPVEuZGVmZXIoKTtyZXR1cm4gZC5tYW5pZmVzdEV4dC5nZXRSZXByZXNlbnRhdGlvbkZvcihhLGMpLnRoZW4oZnVuY3Rpb24oYSl7ZC5tYW5pZmVzdEV4dC5nZXRCYW5kd2lkdGgoYSkudGhlbihmdW5jdGlvbihhKXtlLnJlc29sdmUoYS9iKX0pfSksZS5wcm9taXNlfTtyZXR1cm57ZGVidWc6dm9pZCAwLG1hbmlmZXN0RXh0OnZvaWQgMCxjaGVja0luZGV4OmZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaCxpLGosayxsLG0sbixvPXRoaXMscD1jLkh0dHBMaXN0LHE9Ljc1O3JldHVybiBvLmRlYnVnLmxvZyhcIkNoZWNraW5nIGRvd25sb2FkIHJhdGlvIHJ1bGUuLi5cIiksYz9udWxsPT09cHx8dm9pZCAwPT09cHx8MD09PXAubGVuZ3RoPyhvLmRlYnVnLmxvZyhcIk5vIHJlcXVlc3RzIG1hZGUgZm9yIHRoaXMgc3RyZWFtIHlldCwgYmFpbGluZy5cIiksUS53aGVuKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KSk6KGU9cFtwLmxlbmd0aC0xXSxnPShlLnRmaW5pc2guZ2V0VGltZSgpLWUudHJlcXVlc3QuZ2V0VGltZSgpKS8xZTMsZj0oZS50ZmluaXNoLmdldFRpbWUoKS1lLnRyZXNwb25zZS5nZXRUaW1lKCkpLzFlMywwPj1nPyhvLmRlYnVnLmxvZyhcIkRvbid0IGtub3cgaG93IGxvbmcgdGhlIGRvd25sb2FkIG9mIHRoZSBsYXN0IGZyYWdtZW50IHRvb2ssIGJhaWxpbmcuXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdCkpOm51bGw9PT1lLm1lZGlhZHVyYXRpb258fHZvaWQgMD09PWUubWVkaWFkdXJhdGlvbnx8ZS5tZWRpYWR1cmF0aW9uPD0wPyhvLmRlYnVnLmxvZyhcIkRvbid0IGtub3cgdGhlIGR1cmF0aW9uIG9mIHRoZSBsYXN0IG1lZGlhIGZyYWdtZW50LCBiYWlsaW5nLlwiKSxRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QpKTooaz1RLmRlZmVyKCksaT1lLm1lZGlhZHVyYXRpb24vZyxoPWUubWVkaWFkdXJhdGlvbi9mKnEsaXNOYU4oaCl8fGlzTmFOKGkpPyhvLmRlYnVnLmxvZyhcIlRvdGFsIHRpbWU6IFwiK2crXCJzXCIpLG8uZGVidWcubG9nKFwiRG93bmxvYWQgdGltZTogXCIrZitcInNcIiksby5kZWJ1Zy5sb2coXCJUaGUgcmF0aW9zIGFyZSBOYU4sIGJhaWxpbmcuXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdCkpOihvLmRlYnVnLmxvZyhcIlRvdGFsIHJhdGlvOiBcIitpKSxvLmRlYnVnLmxvZyhcIkRvd25sb2FkIHJhdGlvOiBcIitoKSxvLmRlYnVnLmxvZyhcIkRvd25sb2FkIHJhdGlvOiBcIitoKSxpc05hTihoKT8oby5kZWJ1Zy5sb2coXCJJbnZhbGlkIHJhdGlvLCBiYWlsaW5nLlwiKSxrLnJlc29sdmUobmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QpKToxPmg/KG8uZGVidWcubG9nKFwiRG93bmxvYWQgcmF0aW8gaXMgcG9vci5cIiksYj4wPyhvLmRlYnVnLmxvZyhcIldlIGFyZSBub3QgYXQgdGhlIGxvd2VzdCBiaXRyYXRlLCBzbyBzd2l0Y2ggZG93bi5cIiksby5tYW5pZmVzdEV4dC5nZXRSZXByZXNlbnRhdGlvbkZvcihiLTEsZCkudGhlbihmdW5jdGlvbihhKXtvLm1hbmlmZXN0RXh0LmdldEJhbmR3aWR0aChhKS50aGVuKGZ1bmN0aW9uKGEpe28ubWFuaWZlc3RFeHQuZ2V0UmVwcmVzZW50YXRpb25Gb3IoYixkKS50aGVuKGZ1bmN0aW9uKGMpe28ubWFuaWZlc3RFeHQuZ2V0QmFuZHdpZHRoKGMpLnRoZW4oZnVuY3Rpb24oYyl7aj1hL2Msby5kZWJ1Zy5sb2coXCJTd2l0Y2ggcmF0aW86IFwiK2opLGo+aD8oby5kZWJ1Zy5sb2coXCJUaGluZ3MgbXVzdCBiZSBnb2luZyBwcmV0dHkgYmFkLCBzd2l0Y2ggYWxsIHRoZSB3YXkgZG93bi5cIiksay5yZXNvbHZlKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KDApKSk6KG8uZGVidWcubG9nKFwiVGhpbmdzIGNvdWxkIGJlIGJldHRlciwgc28ganVzdCBzd2l0Y2ggZG93biBvbmUgaW5kZXguXCIpLGsucmVzb2x2ZShuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChiLTEpKSlcclxufSl9KX0pfSkpOihvLmRlYnVnLmxvZyhcIldlIGFyZSBhdCB0aGUgbG93ZXN0IGJpdHJhdGUgYW5kIGNhbm5vdCBzd2l0Y2ggZG93biwgdXNlIGN1cnJlbnQuXCIpLGsucmVzb2x2ZShuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChiKSkpKTooby5kZWJ1Zy5sb2coXCJEb3dubG9hZCByYXRpbyBpcyBnb29kLlwiKSxvLm1hbmlmZXN0RXh0LmdldFJlcHJlc2VudGF0aW9uQ291bnQoZCkudGhlbihmdW5jdGlvbihjKXtjLT0xLGM+Yj8oby5kZWJ1Zy5sb2coXCJXZSBhcmUgbm90IGF0IHRoZSBoaWdoZXN0IGJpdHJhdGUsIHNvIHN3aXRjaCB1cC5cIiksby5tYW5pZmVzdEV4dC5nZXRSZXByZXNlbnRhdGlvbkZvcihiKzEsZCkudGhlbihmdW5jdGlvbihlKXtvLm1hbmlmZXN0RXh0LmdldEJhbmR3aWR0aChlKS50aGVuKGZ1bmN0aW9uKGUpe28ubWFuaWZlc3RFeHQuZ2V0UmVwcmVzZW50YXRpb25Gb3IoYixkKS50aGVuKGZ1bmN0aW9uKGYpe28ubWFuaWZlc3RFeHQuZ2V0QmFuZHdpZHRoKGYpLnRoZW4oZnVuY3Rpb24oZil7aWYoaj1lL2Ysby5kZWJ1Zy5sb2coXCJTd2l0Y2ggcmF0aW86IFwiK2opLGg+PWopaWYoaD4xZTMpby5kZWJ1Zy5sb2coXCJUb25zIG9mIGJhbmR3aWR0aCBhdmFpbGFibGUsIGdvIGFsbCB0aGUgd2F5IHVwLlwiKSxrLnJlc29sdmUobmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QoYy0xKSk7ZWxzZSBpZihoPjEwMClvLmRlYnVnLmxvZyhcIkp1c3QgZW5vdWdoIGJhbmR3aWR0aCBhdmFpbGFibGUsIHN3aXRjaCB1cCBvbmUuXCIpLGsucmVzb2x2ZShuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChiKzEpKTtlbHNle2ZvcihvLmRlYnVnLmxvZyhcIk5vdCBleGFjdGx5IHN1cmUgd2hlcmUgdG8gZ28sIHNvIGRvIHNvbWUgbWF0aC5cIiksbT0tMSxsPVtdOyhtKz0xKTxjOylsLnB1c2goYS5jYWxsKG8sbSxmLGQpKTtRLmFsbChsKS50aGVuKGZ1bmN0aW9uKGEpe2ZvcihtPTAsbj1hLmxlbmd0aDtuPm0mJiEoaDxhW21dKTttKz0xKTtvLmRlYnVnLmxvZyhcIkNhbGN1bGF0ZWQgaWRlYWwgbmV3IHF1YWxpdHkgaW5kZXggaXM6IFwiK20pLGsucmVzb2x2ZShuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChtKSl9KX1lbHNlIG8uZGVidWcubG9nKFwiTm90IGVub3VnaCBiYW5kd2lkdGggdG8gc3dpdGNoIHVwLlwiKSxrLnJlc29sdmUobmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QpfSl9KX0pfSkpOihvLmRlYnVnLmxvZyhcIldlIGFyZSBhdCB0aGUgaGlnaGVzdCBiaXRyYXRlIGFuZCBjYW5ub3Qgc3dpdGNoIHVwLCB1c2UgY3VycmVudC5cIiksay5yZXNvbHZlKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KGMpKSl9KSksay5wcm9taXNlKSkpOihvLmRlYnVnLmxvZyhcIk5vIG1ldHJpY3MsIGJhaWxpbmcuXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdCkpfX19LE1lZGlhUGxheWVyLnJ1bGVzLkRvd25sb2FkUmF0aW9SdWxlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIucnVsZXMuRG93bmxvYWRSYXRpb1J1bGV9LE1lZGlhUGxheWVyLnJ1bGVzLkluc3VmZmljaWVudEJ1ZmZlclJ1bGU9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT0wLGI9MztyZXR1cm57ZGVidWc6dm9pZCAwLGNoZWNrSW5kZXg6ZnVuY3Rpb24oYyxkKXt2YXIgZSxmLGc9dGhpcyxoPSExLGk9TWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuREVGQVVMVDtyZXR1cm4gZy5kZWJ1Zy5sb2coXCJDaGVja2luZyBpbnN1ZmZpY2llbnQgYnVmZmVyIHJ1bGUuLi5cIiksbnVsbD09PWQuUGxheUxpc3R8fHZvaWQgMD09PWQuUGxheUxpc3R8fDA9PT1kLlBsYXlMaXN0Lmxlbmd0aD8oZy5kZWJ1Zy5sb2coXCJOb3QgZW5vdWdoIGluZm9ybWF0aW9uIGZvciBydWxlLlwiKSxRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QpKTooZT1kLlBsYXlMaXN0W2QuUGxheUxpc3QubGVuZ3RoLTFdLG51bGw9PT1lfHx2b2lkIDA9PT1lfHwwPT09ZS50cmFjZS5sZW5ndGg/KGcuZGVidWcubG9nKFwiTm90IGVub3VnaCBpbmZvcm1hdGlvbiBmb3IgcnVsZS5cIiksUS53aGVuKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KSk6KGY9ZS50cmFjZVtlLnRyYWNlLmxlbmd0aC0yXSxudWxsPT09Znx8dm9pZCAwPT09Znx8bnVsbD09PWYuc3RvcHJlYXNvbnx8dm9pZCAwPT09Zi5zdG9wcmVhc29uPyhnLmRlYnVnLmxvZyhcIk5vdCBlbm91Z2ggaW5mb3JtYXRpb24gZm9yIHJ1bGUuXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdCkpOihmLnN0b3ByZWFzb249PT1NZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlLlJFQlVGRkVSSU5HX1JFQVNPTiYmKGg9ITAsYSs9MSxnLmRlYnVnLmxvZyhcIk51bWJlciBvZiB0aW1lcyB0aGUgYnVmZmVyIGhhcyBydW4gZHJ5OiBcIithKSksYT5iJiYoaT1NZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5TVFJPTkcsZy5kZWJ1Zy5sb2coXCJBcHBseSBTVFJPTkcgdG8gYnVmZmVyIHJ1bGUuXCIpKSxoPyhnLmRlYnVnLmxvZyhcIlRoZSBidWZmZXIgcmFuIGRyeSByZWNlbnRseSwgc3dpdGNoIGRvd24uXCIpLFEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChjLTEsaSkpKTphPmI/KGcuZGVidWcubG9nKFwiVG9vIG1hbnkgZHJ5IGJ1ZmZlciBoaXRzLCBxdWl0IHN3aXRjaGluZyBiaXRyYXRlcy5cIiksUS53aGVuKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KGMsaSkpKTpRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QoTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuTk9fQ0hBTkdFLGkpKSkpKX19fSxNZWRpYVBsYXllci5ydWxlcy5JbnN1ZmZpY2llbnRCdWZmZXJSdWxlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIucnVsZXMuSW5zdWZmaWNpZW50QnVmZmVyUnVsZX0sTWVkaWFQbGF5ZXIucnVsZXMuTGltaXRTd2l0Y2hlc1J1bGU9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgYT0xMCxiPTJlNCxjPTUsZD0wO3JldHVybntkZWJ1Zzp2b2lkIDAsY2hlY2tJbmRleDpmdW5jdGlvbihlLGYpe2lmKGQ+MClyZXR1cm4gZC09MSxRLndoZW4obmV3IE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QoZSxNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5TVFJPTkcpKTt2YXIgZyxoLGksaj10aGlzLGs9ITEsbD0obmV3IERhdGUpLmdldFRpbWUoKSxtPWYuUmVwU3dpdGNoTGlzdC5sZW5ndGg7Zm9yKGouZGVidWcubG9nKFwiQ2hlY2tpbmcgbGltaXQgc3dpdGNoZXMgcnVsZS4uLlwiKSxpPW0tMTtpPj0wO2ktPTEpe2lmKGc9Zi5SZXBTd2l0Y2hMaXN0W2ldLGg9bC1nLnQuZ2V0VGltZSgpLGg+PWIpe2ouZGVidWcubG9nKFwiUmVhY2hlZCB0aW1lIGxpbWl0LCBiYWlsaW5nLlwiKTticmVha31pZihpPj1hKXtqLmRlYnVnLmxvZyhcIkZvdW5kIHRvbyBtYW55IHN3aXRjaGVzIHdpdGhpbiB2YWxpZGF0aW9uIHRpbWUsIGZvcmNlIHRoZSBzdHJlYW0gdG8gbm90IGNoYW5nZS5cIiksaz0hMDticmVha319cmV0dXJuIGs/KGouZGVidWcubG9nKFwiV2FpdCBzb21lIHRpbWUgYmVmb3JlIGFsbG93aW5nIGFub3RoZXIgc3dpdGNoLlwiKSxkPWMsUS53aGVuKG5ldyBNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0KGUsTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuU1RST05HKSkpOlEud2hlbihuZXcgTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdChNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LnByb3RvdHlwZS5OT19DSEFOR0UsTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdC5wcm90b3R5cGUuU1RST05HKSl9fX0sTWVkaWFQbGF5ZXIucnVsZXMuTGltaXRTd2l0Y2hlc1J1bGUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5ydWxlcy5MaW1pdFN3aXRjaGVzUnVsZX0sTWVkaWFQbGF5ZXIucnVsZXMuU3dpdGNoUmVxdWVzdD1mdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3RoaXMucXVhbGl0eT1hLHRoaXMucHJpb3JpdHk9Yix2b2lkIDA9PT10aGlzLnF1YWxpdHkmJih0aGlzLnF1YWxpdHk9OTk5KSx2b2lkIDA9PT10aGlzLnByaW9yaXR5JiYodGhpcy5wcmlvcml0eT0uNSl9LE1lZGlhUGxheWVyLnJ1bGVzLlN3aXRjaFJlcXVlc3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci5ydWxlcy5Td2l0Y2hSZXF1ZXN0LE5PX0NIQU5HRTo5OTksREVGQVVMVDouNSxTVFJPTkc6MSxXRUFLOjB9LE1lZGlhUGxheWVyLm1vZGVscy5NZXRyaWNzTGlzdD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3JldHVybntUY3BMaXN0OltdLEh0dHBMaXN0OltdLFJlcFN3aXRjaExpc3Q6W10sQnVmZmVyTGV2ZWw6W10sUGxheUxpc3Q6W10sRHJvcHBlZEZyYW1lczpbXX19LE1lZGlhUGxheWVyLm1vZGVscy5NZXRyaWNzTGlzdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLm1vZGVscy5NZXRyaWNzTGlzdH0sTWVkaWFQbGF5ZXIudm8uU2VnbWVudFJlcXVlc3Q9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLmFjdGlvbj1cImRvd25sb2FkXCIsdGhpcy5zdGFydFRpbWU9MC8wLHRoaXMuc3RyZWFtVHlwZT1udWxsLHRoaXMudHlwZT1udWxsLHRoaXMuZHVyYXRpb249MC8wLHRoaXMudGltZXNjYWxlPTAvMCx0aGlzLnJhbmdlPW51bGwsdGhpcy51cmw9bnVsbCx0aGlzLnJlcXVlc3RTdGFydERhdGU9bnVsbCx0aGlzLmZpcnN0Qnl0ZURhdGU9bnVsbCx0aGlzLnJlcXVlc3RFbmREYXRlPW51bGwsdGhpcy5kZWZlcnJlZD1udWxsLHRoaXMucXVhbGl0eT0wLzAsdGhpcy5pbmRleD0wLzB9LE1lZGlhUGxheWVyLnZvLlNlZ21lbnRSZXF1ZXN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudm8uU2VnbWVudFJlcXVlc3QsQUNUSU9OX0RPV05MT0FEOlwiZG93bmxvYWRcIixBQ1RJT05fQ09NUExFVEU6XCJjb21wbGV0ZVwifSxNZWRpYVBsYXllci52by5tZXRyaWNzLkJ1ZmZlckxldmVsPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy50PW51bGwsdGhpcy5sZXZlbD1udWxsfSxNZWRpYVBsYXllci52by5tZXRyaWNzLkJ1ZmZlckxldmVsLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudm8ubWV0cmljcy5CdWZmZXJMZXZlbH0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5Ecm9wcGVkRnJhbWVzPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy50aW1lPW51bGwsdGhpcy5kcm9wcGVkRnJhbWVzPW51bGx9LE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuRHJvcHBlZEZyYW1lcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1lZGlhUGxheWVyLnZvLm1ldHJpY3MuRHJvcHBlZEZyYW1lc30sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5IVFRQUmVxdWVzdD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3RoaXMudGNwaWQ9bnVsbCx0aGlzLnR5cGU9bnVsbCx0aGlzLnVybD1udWxsLHRoaXMuYWN0dWFsdXJsPW51bGwsdGhpcy5yYW5nZT1udWxsLHRoaXMudHJlcXVlc3Q9bnVsbCx0aGlzLnRyZXNwb25zZT1udWxsLHRoaXMudGZpbmlzaD1udWxsLHRoaXMucmVzcG9uc2Vjb2RlPW51bGwsdGhpcy5pbnRlcnZhbD1udWxsLHRoaXMubWVkaWFkdXJhdGlvbj1udWxsLHRoaXMudHJhY2U9W119LE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuSFRUUFJlcXVlc3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci52by5tZXRyaWNzLkhUVFBSZXF1ZXN0fSxNZWRpYVBsYXllci52by5tZXRyaWNzLkhUVFBSZXF1ZXN0LlRyYWNlPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy5zPW51bGwsdGhpcy5kPW51bGwsdGhpcy5iPVtdfSxNZWRpYVBsYXllci52by5tZXRyaWNzLkhUVFBSZXF1ZXN0LlRyYWNlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudm8ubWV0cmljcy5IVFRQUmVxdWVzdC5UcmFjZX0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdD1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3RoaXMuc3RhcnQ9bnVsbCx0aGlzLm1zdGFydD1udWxsLHRoaXMuc3RhcnR0eXBlPW51bGwsdGhpcy50cmFjZT1bXX0sTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZT1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3RoaXMucmVwcmVzZW50YXRpb25pZD1udWxsLHRoaXMuc3VicmVwbGV2ZWw9bnVsbCx0aGlzLnN0YXJ0PW51bGwsdGhpcy5tc3RhcnQ9bnVsbCx0aGlzLmR1cmF0aW9uPW51bGwsdGhpcy5wbGF5YmFja3NwZWVkPW51bGwsdGhpcy5zdG9wcmVhc29uPW51bGx9LE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0fSxNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LklOSVRJQUxfUExBWV9TVEFSVF9SRUFTT049XCJpbml0aWFsX3N0YXJ0XCIsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5TRUVLX1NUQVJUX1JFQVNPTj1cInNlZWtcIixNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZSgpfSxNZWRpYVBsYXllci52by5tZXRyaWNzLlBsYXlMaXN0LlRyYWNlLlVTRVJfUkVRVUVTVF9TVE9QX1JFQVNPTj1cInVzZXJfcmVxdWVzdFwiLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUGxheUxpc3QuVHJhY2UuUkVQUkVTRU5UQVRJT05fU1dJVENIX1NUT1BfUkVBU09OPVwicmVwcmVzZW50YXRpb25fc3dpdGNoXCIsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5FTkRfT0ZfQ09OVEVOVF9TVE9QX1JFQVNPTj1cImVuZF9vZl9jb250ZW50XCIsTWVkaWFQbGF5ZXIudm8ubWV0cmljcy5QbGF5TGlzdC5UcmFjZS5SRUJVRkZFUklOR19SRUFTT049XCJyZWJ1ZmZlcmluZ1wiLE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUmVwcmVzZW50YXRpb25Td2l0Y2g9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLnQ9bnVsbCx0aGlzLm10PW51bGwsdGhpcy50bz1udWxsLHRoaXMubHRvPW51bGx9LE1lZGlhUGxheWVyLnZvLm1ldHJpY3MuUmVwcmVzZW50YXRpb25Td2l0Y2gucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci52by5tZXRyaWNzLlJlcHJlc2VudGF0aW9uU3dpdGNofSxNZWRpYVBsYXllci52by5tZXRyaWNzLlRDUENvbm5lY3Rpb249ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLnRjcGlkPW51bGwsdGhpcy5kZXN0PW51bGwsdGhpcy50b3Blbj1udWxsLHRoaXMudGNsb3NlPW51bGwsdGhpcy50Y29ubmVjdD1udWxsfSxNZWRpYVBsYXllci52by5tZXRyaWNzLlRDUENvbm5lY3Rpb24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNZWRpYVBsYXllci52by5tZXRyaWNzLlRDUENvbm5lY3Rpb259OyJdLCJmaWxlIjoiZGFzaC5hbGwuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.blockUI.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.blockUI.js index dda48ee72..9887b62ab 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.blockUI.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.blockUI.js @@ -618,4 +618,4 @@ })(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnkuYmxvY2tVSS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBibG9ja1VJIHBsdWdpblxuICogVmVyc2lvbiAyLjY2LjAtMjAxMy4xMC4wOVxuICogUmVxdWlyZXMgalF1ZXJ5IHYxLjcgb3IgbGF0ZXJcbiAqXG4gKiBFeGFtcGxlcyBhdDogaHR0cDovL21hbHN1cC5jb20vanF1ZXJ5L2Jsb2NrL1xuICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTMgTS4gQWxzdXBcbiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbFxuICpcbiAqIFRoYW5rcyB0byBBbWlyLUhvc3NlaW4gU29iaGkgZm9yIHNvbWUgZXhjZWxsZW50IGNvbnRyaWJ1dGlvbnMhXG4gKi9cblxuOyhmdW5jdGlvbigpIHtcbi8qanNoaW50IGVxZXFlcTpmYWxzZSBjdXJseTpmYWxzZSBsYXRlZGVmOmZhbHNlICovXG5cInVzZSBzdHJpY3RcIjtcblxuXHRmdW5jdGlvbiBzZXR1cCgkKSB7XG5cdFx0JC5mbi5fZmFkZUluID0gJC5mbi5mYWRlSW47XG5cblx0XHR2YXIgbm9PcCA9ICQubm9vcCB8fCBmdW5jdGlvbigpIHt9O1xuXG5cdFx0Ly8gdGhpcyBiaXQgaXMgdG8gZW5zdXJlIHdlIGRvbid0IGNhbGwgc2V0RXhwcmVzc2lvbiB3aGVuIHdlIHNob3VsZG4ndCAod2l0aCBleHRyYSBtdXNjbGUgdG8gaGFuZGxlXG5cdFx0Ly8gY29uZnVzaW5nIHVzZXJBZ2VudCBzdHJpbmdzIG9uIFZpc3RhKVxuXHRcdHZhciBtc2llID0gL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cdFx0dmFyIGllNiAgPSAvTVNJRSA2LjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgISAvTVNJRSA4LjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cdFx0dmFyIG1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgMDtcblx0XHR2YXIgc2V0RXhwciA9ICQuaXNGdW5jdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGUuc2V0RXhwcmVzc2lvbiApO1xuXG5cdFx0Ly8gZ2xvYmFsICQgbWV0aG9kcyBmb3IgYmxvY2tpbmcvdW5ibG9ja2luZyB0aGUgZW50aXJlIHBhZ2Vcblx0XHQkLmJsb2NrVUkgICA9IGZ1bmN0aW9uKG9wdHMpIHsgaW5zdGFsbCh3aW5kb3csIG9wdHMpOyB9O1xuXHRcdCQudW5ibG9ja1VJID0gZnVuY3Rpb24ob3B0cykgeyByZW1vdmUod2luZG93LCBvcHRzKTsgfTtcblxuXHRcdC8vIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgcXVpY2sgZ3Jvd2wtbGlrZSBub3RpZmljYXRpb25zICAoaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPWdyb3dsKVxuXHRcdCQuZ3Jvd2xVSSA9IGZ1bmN0aW9uKHRpdGxlLCBtZXNzYWdlLCB0aW1lb3V0LCBvbkNsb3NlKSB7XG5cdFx0XHR2YXIgJG0gPSAkKCc8ZGl2IGNsYXNzPVwiZ3Jvd2xVSVwiPjwvZGl2PicpO1xuXHRcdFx0aWYgKHRpdGxlKSAkbS5hcHBlbmQoJzxoMT4nK3RpdGxlKyc8L2gxPicpO1xuXHRcdFx0aWYgKG1lc3NhZ2UpICRtLmFwcGVuZCgnPGgyPicrbWVzc2FnZSsnPC9oMj4nKTtcblx0XHRcdGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHRpbWVvdXQgPSAzMDAwO1xuXG5cdFx0XHQvLyBBZGRlZCBieSBrb25hcHVuOiBTZXQgdGltZW91dCB0byAzMCBzZWNvbmRzIGlmIHRoaXMgZ3Jvd2wgaXMgbW91c2VkIG92ZXIsIGxpa2Ugbm9ybWFsIHRvYXN0IG5vdGlmaWNhdGlvbnNcblx0XHRcdHZhciBjYWxsQmxvY2sgPSBmdW5jdGlvbihvcHRzKSB7XG5cdFx0XHRcdG9wdHMgPSBvcHRzIHx8IHt9O1xuXG5cdFx0XHRcdCQuYmxvY2tVSSh7XG5cdFx0XHRcdFx0bWVzc2FnZTogJG0sXG5cdFx0XHRcdFx0ZmFkZUluIDogdHlwZW9mIG9wdHMuZmFkZUluICAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRzLmZhZGVJbiAgOiA3MDAsXG5cdFx0XHRcdFx0ZmFkZU91dDogdHlwZW9mIG9wdHMuZmFkZU91dCAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRzLmZhZGVPdXQgOiAxMDAwLFxuXHRcdFx0XHRcdHRpbWVvdXQ6IHR5cGVvZiBvcHRzLnRpbWVvdXQgIT09ICd1bmRlZmluZWQnID8gb3B0cy50aW1lb3V0IDogdGltZW91dCxcblx0XHRcdFx0XHRjZW50ZXJZOiBmYWxzZSxcblx0XHRcdFx0XHRzaG93T3ZlcmxheTogZmFsc2UsXG5cdFx0XHRcdFx0b25VbmJsb2NrOiBvbkNsb3NlLFxuXHRcdFx0XHRcdGNzczogJC5ibG9ja1VJLmRlZmF1bHRzLmdyb3dsQ1NTXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0Y2FsbEJsb2NrKCk7XG5cdFx0XHR2YXIgbm9ubW91c2VkT3BhY2l0eSA9ICRtLmNzcygnb3BhY2l0eScpO1xuXHRcdFx0JG0ubW91c2VvdmVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjYWxsQmxvY2soe1xuXHRcdFx0XHRcdGZhZGVJbjogMCxcblx0XHRcdFx0XHR0aW1lb3V0OiAzMDAwMFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgZGlzcGxheUJsb2NrID0gJCgnLmJsb2NrTXNnJyk7XG5cdFx0XHRcdGRpc3BsYXlCbG9jay5zdG9wKCk7IC8vIGNhbmNlbCBmYWRlb3V0IGlmIGl0IGhhcyBzdGFydGVkXG5cdFx0XHRcdGRpc3BsYXlCbG9jay5mYWRlVG8oMzAwLCAxKTsgLy8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgbWVzc2FnZSBieSByZW1vdmluZyB0cmFuc3BhcmVuY3lcblx0XHRcdH0pLm1vdXNlb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkKCcuYmxvY2tNc2cnKS5mYWRlT3V0KDEwMDApO1xuXHRcdFx0fSk7XG5cdFx0XHQvLyBFbmQga29uYXB1biBhZGRpdGlvbnNcblx0XHR9O1xuXG5cdFx0Ly8gcGx1Z2luIG1ldGhvZCBmb3IgYmxvY2tpbmcgZWxlbWVudCBjb250ZW50XG5cdFx0JC5mbi5ibG9jayA9IGZ1bmN0aW9uKG9wdHMpIHtcblx0XHRcdGlmICggdGhpc1swXSA9PT0gd2luZG93ICkge1xuXHRcdFx0XHQkLmJsb2NrVUkoIG9wdHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHR2YXIgZnVsbE9wdHMgPSAkLmV4dGVuZCh7fSwgJC5ibG9ja1VJLmRlZmF1bHRzLCBvcHRzIHx8IHt9KTtcblx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyICRlbCA9ICQodGhpcyk7XG5cdFx0XHRcdGlmIChmdWxsT3B0cy5pZ25vcmVJZkJsb2NrZWQgJiYgJGVsLmRhdGEoJ2Jsb2NrVUkuaXNCbG9ja2VkJykpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHQkZWwudW5ibG9jayh7IGZhZGVPdXQ6IDAgfSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCQuY3NzKHRoaXMsJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYycpIHtcblx0XHRcdFx0XHR0aGlzLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcblx0XHRcdFx0XHQkKHRoaXMpLmRhdGEoJ2Jsb2NrVUkuc3RhdGljJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zdHlsZS56b29tID0gMTsgLy8gZm9yY2UgJ2hhc0xheW91dCcgaW4gaWVcblx0XHRcdFx0aW5zdGFsbCh0aGlzLCBvcHRzKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvLyBwbHVnaW4gbWV0aG9kIGZvciB1bmJsb2NraW5nIGVsZW1lbnQgY29udGVudFxuXHRcdCQuZm4udW5ibG9jayA9IGZ1bmN0aW9uKG9wdHMpIHtcblx0XHRcdGlmICggdGhpc1swXSA9PT0gd2luZG93ICkge1xuXHRcdFx0XHQkLnVuYmxvY2tVSSggb3B0cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJlbW92ZSh0aGlzLCBvcHRzKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQkLmJsb2NrVUkudmVyc2lvbiA9IDIuNjY7IC8vIDJuZCBnZW5lcmF0aW9uIGJsb2NraW5nIGF0IG5vIGV4dHJhIGNvc3QhXG5cblx0XHQvLyBvdmVycmlkZSB0aGVzZSBpbiB5b3VyIGNvZGUgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZCBzdHlsZVxuXHRcdCQuYmxvY2tVSS5kZWZhdWx0cyA9IHtcblx0XHRcdC8vIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gYmxvY2tpbmcgKHVzZSBudWxsIGZvciBubyBtZXNzYWdlKVxuXHRcdFx0bWVzc2FnZTogICc8aDE+UGxlYXNlIHdhaXQuLi48L2gxPicsXG5cblx0XHRcdHRpdGxlOiBudWxsLFx0XHQvLyB0aXRsZSBzdHJpbmc7IG9ubHkgdXNlZCB3aGVuIHRoZW1lID09IHRydWVcblx0XHRcdGRyYWdnYWJsZTogdHJ1ZSxcdC8vIG9ubHkgdXNlZCB3aGVuIHRoZW1lID09IHRydWUgKHJlcXVpcmVzIGpxdWVyeS11aS5qcyB0byBiZSBsb2FkZWQpXG5cblx0XHRcdHRoZW1lOiBmYWxzZSwgLy8gc2V0IHRvIHRydWUgdG8gdXNlIHdpdGggalF1ZXJ5IFVJIHRoZW1lc1xuXG5cdFx0XHQvLyBzdHlsZXMgZm9yIHRoZSBtZXNzYWdlIHdoZW4gYmxvY2tpbmc7IGlmIHlvdSB3aXNoIHRvIGRpc2FibGVcblx0XHRcdC8vIHRoZXNlIGFuZCB1c2UgYW4gZXh0ZXJuYWwgc3R5bGVzaGVldCB0aGVuIGRvIHRoaXMgaW4geW91ciBjb2RlOlxuXHRcdFx0Ly8gJC5ibG9ja1VJLmRlZmF1bHRzLmNzcyA9IHt9O1xuXHRcdFx0Y3NzOiB7XG5cdFx0XHRcdHBhZGRpbmc6XHQwLFxuXHRcdFx0XHRtYXJnaW46XHRcdDAsXG5cdFx0XHRcdHdpZHRoOlx0XHQnMzAlJyxcblx0XHRcdFx0dG9wOlx0XHQnNDAlJyxcblx0XHRcdFx0bGVmdDpcdFx0JzM1JScsXG5cdFx0XHRcdHRleHRBbGlnbjpcdCdjZW50ZXInLFxuXHRcdFx0XHRjb2xvcjpcdFx0JyMwMDAnLFxuXHRcdFx0XHRib3JkZXI6XHRcdCczcHggc29saWQgI2FhYScsXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjonI2ZmZicsXG5cdFx0XHRcdGN1cnNvcjpcdFx0J3dhaXQnXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBtaW5pbWFsIHN0eWxlIHNldCB1c2VkIHdoZW4gdGhlbWVzIGFyZSB1c2VkXG5cdFx0XHR0aGVtZWRDU1M6IHtcblx0XHRcdFx0d2lkdGg6XHQnMzAlJyxcblx0XHRcdFx0dG9wOlx0JzQwJScsXG5cdFx0XHRcdGxlZnQ6XHQnMzUlJ1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gc3R5bGVzIGZvciB0aGUgb3ZlcmxheVxuXHRcdFx0b3ZlcmxheUNTUzogIHtcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOlx0JyMwMDAnLFxuXHRcdFx0XHRvcGFjaXR5Olx0XHRcdDAuNixcblx0XHRcdFx0Y3Vyc29yOlx0XHRcdFx0J3dhaXQnXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBzdHlsZSB0byByZXBsYWNlIHdhaXQgY3Vyc29yIGJlZm9yZSB1bmJsb2NraW5nIHRvIGNvcnJlY3QgaXNzdWVcblx0XHRcdC8vIG9mIGxpbmdlcmluZyB3YWl0IGN1cnNvclxuXHRcdFx0Y3Vyc29yUmVzZXQ6ICdkZWZhdWx0JyxcblxuXHRcdFx0Ly8gc3R5bGVzIGFwcGxpZWQgd2hlbiB1c2luZyAkLmdyb3dsVUlcblx0XHRcdGdyb3dsQ1NTOiB7XG5cdFx0XHRcdHdpZHRoOlx0XHQnMzUwcHgnLFxuXHRcdFx0XHR0b3A6XHRcdCcxMHB4Jyxcblx0XHRcdFx0bGVmdDpcdFx0JycsXG5cdFx0XHRcdHJpZ2h0Olx0XHQnMTBweCcsXG5cdFx0XHRcdGJvcmRlcjpcdFx0J25vbmUnLFxuXHRcdFx0XHRwYWRkaW5nOlx0JzVweCcsXG5cdFx0XHRcdG9wYWNpdHk6XHQwLjYsXG5cdFx0XHRcdGN1cnNvcjpcdFx0J2RlZmF1bHQnLFxuXHRcdFx0XHRjb2xvcjpcdFx0JyNmZmYnLFxuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6ICcjMDAwJyxcblx0XHRcdFx0Jy13ZWJraXQtYm9yZGVyLXJhZGl1cyc6JzEwcHgnLFxuXHRcdFx0XHQnLW1vei1ib3JkZXItcmFkaXVzJzpcdCcxMHB4Jyxcblx0XHRcdFx0J2JvcmRlci1yYWRpdXMnOlx0XHQnMTBweCdcblx0XHRcdH0sXG5cblx0XHRcdC8vIElFIGlzc3VlczogJ2Fib3V0OmJsYW5rJyBmYWlscyBvbiBIVFRQUyBhbmQgamF2YXNjcmlwdDpmYWxzZSBpcyBzLWwtby13XG5cdFx0XHQvLyAoaGF0IHRpcCB0byBKb3JnZSBILiBOLiBkZSBWYXNjb25jZWxvcylcblx0XHRcdC8qanNoaW50IHNjcmlwdHVybDp0cnVlICovXG5cdFx0XHRpZnJhbWVTcmM6IC9eaHR0cHMvaS50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmIHx8ICcnKSA/ICdqYXZhc2NyaXB0OmZhbHNlJyA6ICdhYm91dDpibGFuaycsXG5cblx0XHRcdC8vIGZvcmNlIHVzYWdlIG9mIGlmcmFtZSBpbiBub24tSUUgYnJvd3NlcnMgKGhhbmR5IGZvciBibG9ja2luZyBhcHBsZXRzKVxuXHRcdFx0Zm9yY2VJZnJhbWU6IGZhbHNlLFxuXG5cdFx0XHQvLyB6LWluZGV4IGZvciB0aGUgYmxvY2tpbmcgb3ZlcmxheVxuXHRcdFx0YmFzZVo6IDEwMDAsXG5cblx0XHRcdC8vIHNldCB0aGVzZSB0byB0cnVlIHRvIGhhdmUgdGhlIG1lc3NhZ2UgYXV0b21hdGljYWxseSBjZW50ZXJlZFxuXHRcdFx0Y2VudGVyWDogdHJ1ZSwgLy8gPC0tIG9ubHkgZWZmZWN0cyBlbGVtZW50IGJsb2NraW5nIChwYWdlIGJsb2NrIGNvbnRyb2xsZWQgdmlhIGNzcyBhYm92ZSlcblx0XHRcdGNlbnRlclk6IHRydWUsXG5cblx0XHRcdC8vIGFsbG93IGJvZHkgZWxlbWVudCB0byBiZSBzdGV0Y2hlZCBpbiBpZTY7IHRoaXMgbWFrZXMgYmxvY2tpbmcgbG9vayBiZXR0ZXJcblx0XHRcdC8vIG9uIFwic2hvcnRcIiBwYWdlcy4gIGRpc2FibGUgaWYgeW91IHdpc2ggdG8gcHJldmVudCBjaGFuZ2VzIHRvIHRoZSBib2R5IGhlaWdodFxuXHRcdFx0YWxsb3dCb2R5U3RyZXRjaDogdHJ1ZSxcblxuXHRcdFx0Ly8gZW5hYmxlIGlmIHlvdSB3YW50IGtleSBhbmQgbW91c2UgZXZlbnRzIHRvIGJlIGRpc2FibGVkIGZvciBjb250ZW50IHRoYXQgaXMgYmxvY2tlZFxuXHRcdFx0YmluZEV2ZW50czogdHJ1ZSxcblxuXHRcdFx0Ly8gYmUgZGVmYXVsdCBibG9ja1VJIHdpbGwgc3VwcmVzcyB0YWIgbmF2aWdhdGlvbiBmcm9tIGxlYXZpbmcgYmxvY2tpbmcgY29udGVudFxuXHRcdFx0Ly8gKGlmIGJpbmRFdmVudHMgaXMgdHJ1ZSlcblx0XHRcdGNvbnN0cmFpblRhYktleTogdHJ1ZSxcblxuXHRcdFx0Ly8gZmFkZUluIHRpbWUgaW4gbWlsbGlzOyBzZXQgdG8gMCB0byBkaXNhYmxlIGZhZGVJbiBvbiBibG9ja1xuXHRcdFx0ZmFkZUluOiAgMjAwLFxuXG5cdFx0XHQvLyBmYWRlT3V0IHRpbWUgaW4gbWlsbGlzOyBzZXQgdG8gMCB0byBkaXNhYmxlIGZhZGVPdXQgb24gdW5ibG9ja1xuXHRcdFx0ZmFkZU91dDogIDQwMCxcblxuXHRcdFx0Ly8gdGltZSBpbiBtaWxsaXMgdG8gd2FpdCBiZWZvcmUgYXV0by11bmJsb2NraW5nOyBzZXQgdG8gMCB0byBkaXNhYmxlIGF1dG8tdW5ibG9ja1xuXHRcdFx0dGltZW91dDogMCxcblxuXHRcdFx0Ly8gZGlzYWJsZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzaG93IHRoZSBvdmVybGF5XG5cdFx0XHRzaG93T3ZlcmxheTogdHJ1ZSxcblxuXHRcdFx0Ly8gaWYgdHJ1ZSwgZm9jdXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIGZpcnN0IGF2YWlsYWJsZSBpbnB1dCBmaWVsZCB3aGVuXG5cdFx0XHQvLyBwYWdlIGJsb2NraW5nXG5cdFx0XHRmb2N1c0lucHV0OiB0cnVlLFxuXG4gICAgICAgICAgICAvLyBlbGVtZW50cyB0aGF0IGNhbiByZWNlaXZlIGZvY3VzXG4gICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50czogJzppbnB1dDplbmFibGVkOnZpc2libGUnLFxuXG5cdFx0XHQvLyBzdXBwcmVzc2VzIHRoZSB1c2Ugb2Ygb3ZlcmxheSBzdHlsZXMgb24gRkYvTGludXggKGR1ZSB0byBwZXJmb3JtYW5jZSBpc3N1ZXMgd2l0aCBvcGFjaXR5KVxuXHRcdFx0Ly8gbm8gbG9uZ2VyIG5lZWRlZCBpbiAyMDEyXG5cdFx0XHQvLyBhcHBseVBsYXRmb3JtT3BhY2l0eVJ1bGVzOiB0cnVlLFxuXG5cdFx0XHQvLyBjYWxsYmFjayBtZXRob2QgaW52b2tlZCB3aGVuIGZhZGVJbiBoYXMgY29tcGxldGVkIGFuZCBibG9ja2luZyBtZXNzYWdlIGlzIHZpc2libGVcblx0XHRcdG9uQmxvY2s6IG51bGwsXG5cblx0XHRcdC8vIGNhbGxiYWNrIG1ldGhvZCBpbnZva2VkIHdoZW4gdW5ibG9ja2luZyBoYXMgY29tcGxldGVkOyB0aGUgY2FsbGJhY2sgaXNcblx0XHRcdC8vIHBhc3NlZCB0aGUgZWxlbWVudCB0aGF0IGhhcyBiZWVuIHVuYmxvY2tlZCAod2hpY2ggaXMgdGhlIHdpbmRvdyBvYmplY3QgZm9yIHBhZ2Vcblx0XHRcdC8vIGJsb2NrcykgYW5kIHRoZSBvcHRpb25zIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhlIHVuYmxvY2sgY2FsbDpcblx0XHRcdC8vXHRvblVuYmxvY2soZWxlbWVudCwgb3B0aW9ucylcblx0XHRcdG9uVW5ibG9jazogbnVsbCxcblxuXHRcdFx0Ly8gY2FsbGJhY2sgbWV0aG9kIGludm9rZWQgd2hlbiB0aGUgb3ZlcmxheSBhcmVhIGlzIGNsaWNrZWQuXG5cdFx0XHQvLyBzZXR0aW5nIHRoaXMgd2lsbCB0dXJuIHRoZSBjdXJzb3IgdG8gYSBwb2ludGVyLCBvdGhlcndpc2UgY3Vyc29yIGRlZmluZWQgaW4gb3ZlcmxheUNzcyB3aWxsIGJlIHVzZWQuXG5cdFx0XHRvbk92ZXJsYXlDbGljazogbnVsbCxcblxuXHRcdFx0Ly8gZG9uJ3QgYXNrOyBpZiB5b3UgcmVhbGx5IG11c3Qga25vdzogaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL3JlcXVpcmVkVXBsb2Fkcy9qcXVlcnktZW4vYnJvd3NlX3RocmVhZC90aHJlYWQvMzY2NDBhODczMDUwMzU5NS8yZjZhNzlhNzdhNzhlNDkzIzJmNmE3OWE3N2E3OGU0OTNcblx0XHRcdHF1aXJrc21vZGVPZmZzZXRIYWNrOiA0LFxuXG5cdFx0XHQvLyBjbGFzcyBuYW1lIG9mIHRoZSBtZXNzYWdlIGJsb2NrXG5cdFx0XHRibG9ja01zZ0NsYXNzOiAnYmxvY2tNc2cnLFxuXG5cdFx0XHQvLyBpZiBpdCBpcyBhbHJlYWR5IGJsb2NrZWQsIHRoZW4gaWdub3JlIGl0IChkb24ndCB1bmJsb2NrIGFuZCByZWJsb2NrKVxuXHRcdFx0aWdub3JlSWZCbG9ja2VkOiBmYWxzZVxuXHRcdH07XG5cblx0XHQvLyBwcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucyBmb2xsb3cuLi5cblxuXHRcdHZhciBwYWdlQmxvY2sgPSBudWxsO1xuXHRcdHZhciBwYWdlQmxvY2tFbHMgPSBbXTtcblxuXHRcdGZ1bmN0aW9uIGluc3RhbGwoZWwsIG9wdHMpIHtcblx0XHRcdHZhciBjc3MsIHRoZW1lZENTUztcblx0XHRcdHZhciBmdWxsID0gKGVsID09IHdpbmRvdyk7XG5cdFx0XHR2YXIgbXNnID0gKG9wdHMgJiYgb3B0cy5tZXNzYWdlICE9PSB1bmRlZmluZWQgPyBvcHRzLm1lc3NhZ2UgOiB1bmRlZmluZWQpO1xuXHRcdFx0b3B0cyA9ICQuZXh0ZW5kKHt9LCAkLmJsb2NrVUkuZGVmYXVsdHMsIG9wdHMgfHwge30pO1xuXG5cdFx0XHRpZiAob3B0cy5pZ25vcmVJZkJsb2NrZWQgJiYgJChlbCkuZGF0YSgnYmxvY2tVSS5pc0Jsb2NrZWQnKSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRvcHRzLm92ZXJsYXlDU1MgPSAkLmV4dGVuZCh7fSwgJC5ibG9ja1VJLmRlZmF1bHRzLm92ZXJsYXlDU1MsIG9wdHMub3ZlcmxheUNTUyB8fCB7fSk7XG5cdFx0XHRjc3MgPSAkLmV4dGVuZCh7fSwgJC5ibG9ja1VJLmRlZmF1bHRzLmNzcywgb3B0cy5jc3MgfHwge30pO1xuXHRcdFx0aWYgKG9wdHMub25PdmVybGF5Q2xpY2spXG5cdFx0XHRcdG9wdHMub3ZlcmxheUNTUy5jdXJzb3IgPSAncG9pbnRlcic7XG5cblx0XHRcdHRoZW1lZENTUyA9ICQuZXh0ZW5kKHt9LCAkLmJsb2NrVUkuZGVmYXVsdHMudGhlbWVkQ1NTLCBvcHRzLnRoZW1lZENTUyB8fCB7fSk7XG5cdFx0XHRtc2cgPSBtc2cgPT09IHVuZGVmaW5lZCA/IG9wdHMubWVzc2FnZSA6IG1zZztcblxuXHRcdFx0Ly8gcmVtb3ZlIHRoZSBjdXJyZW50IGJsb2NrIChpZiB0aGVyZSBpcyBvbmUpXG5cdFx0XHRpZiAoZnVsbCAmJiBwYWdlQmxvY2spXG5cdFx0XHRcdHJlbW92ZSh3aW5kb3csIHtmYWRlT3V0OjB9KTtcblxuXHRcdFx0Ly8gaWYgYW4gZXhpc3RpbmcgZWxlbWVudCBpcyBiZWluZyB1c2VkIGFzIHRoZSBibG9ja2luZyBjb250ZW50IHRoZW4gd2UgY2FwdHVyZVxuXHRcdFx0Ly8gaXRzIGN1cnJlbnQgcGxhY2UgaW4gdGhlIERPTSAoYW5kIGN1cnJlbnQgZGlzcGxheSBzdHlsZSkgc28gd2UgY2FuIHJlc3RvcmVcblx0XHRcdC8vIGl0IHdoZW4gd2UgdW5ibG9ja1xuXHRcdFx0aWYgKG1zZyAmJiB0eXBlb2YgbXNnICE9ICdzdHJpbmcnICYmIChtc2cucGFyZW50Tm9kZSB8fCBtc2cuanF1ZXJ5KSkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IG1zZy5qcXVlcnkgPyBtc2dbMF0gOiBtc2c7XG5cdFx0XHRcdHZhciBkYXRhID0ge307XG5cdFx0XHRcdCQoZWwpLmRhdGEoJ2Jsb2NrVUkuaGlzdG9yeScsIGRhdGEpO1xuXHRcdFx0XHRkYXRhLmVsID0gbm9kZTtcblx0XHRcdFx0ZGF0YS5wYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdGRhdGEuZGlzcGxheSA9IG5vZGUuc3R5bGUuZGlzcGxheTtcblx0XHRcdFx0ZGF0YS5wb3NpdGlvbiA9IG5vZGUuc3R5bGUucG9zaXRpb247XG5cdFx0XHRcdGlmIChkYXRhLnBhcmVudClcblx0XHRcdFx0XHRkYXRhLnBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtcblx0XHRcdH1cblxuXHRcdFx0JChlbCkuZGF0YSgnYmxvY2tVSS5vblVuYmxvY2snLCBvcHRzLm9uVW5ibG9jayk7XG5cdFx0XHR2YXIgeiA9IG9wdHMuYmFzZVo7XG5cblx0XHRcdC8vIGJsb2NrVUkgdXNlcyAzIGxheWVycyBmb3IgYmxvY2tpbmcsIGZvciBzaW1wbGljaXR5IHRoZXkgYXJlIGFsbCB1c2VkIG9uIGV2ZXJ5IHBsYXRmb3JtO1xuXHRcdFx0Ly8gbGF5ZXIxIGlzIHRoZSBpZnJhbWUgbGF5ZXIgd2hpY2ggaXMgdXNlZCB0byBzdXByZXNzIGJsZWVkIHRocm91Z2ggb2YgdW5kZXJseWluZyBjb250ZW50XG5cdFx0XHQvLyBsYXllcjIgaXMgdGhlIG92ZXJsYXkgbGF5ZXIgd2hpY2ggaGFzIG9wYWNpdHkgYW5kIGEgd2FpdCBjdXJzb3IgKGJ5IGRlZmF1bHQpXG5cdFx0XHQvLyBsYXllcjMgaXMgdGhlIG1lc3NhZ2UgY29udGVudCB0aGF0IGlzIGRpc3BsYXllZCB3aGlsZSBibG9ja2luZ1xuXHRcdFx0dmFyIGx5cjEsIGx5cjIsIGx5cjMsIHM7XG5cdFx0XHRpZiAobXNpZSB8fCBvcHRzLmZvcmNlSWZyYW1lKVxuXHRcdFx0XHRseXIxID0gJCgnPGlmcmFtZSBjbGFzcz1cImJsb2NrVUlcIiBzdHlsZT1cInotaW5kZXg6JysgKHorKykgKyc7ZGlzcGxheTpub25lO2JvcmRlcjpub25lO21hcmdpbjowO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MFwiIHNyYz1cIicrb3B0cy5pZnJhbWVTcmMrJ1wiPjwvaWZyYW1lPicpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRseXIxID0gJCgnPGRpdiBjbGFzcz1cImJsb2NrVUlcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvZGl2PicpO1xuXG5cdFx0XHRpZiAob3B0cy50aGVtZSlcblx0XHRcdFx0bHlyMiA9ICQoJzxkaXYgY2xhc3M9XCJibG9ja1VJIGJsb2NrT3ZlcmxheSB1aS13aWRnZXQtb3ZlcmxheVwiIHN0eWxlPVwiei1pbmRleDonKyAoeisrKSArJztkaXNwbGF5Om5vbmVcIj48L2Rpdj4nKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bHlyMiA9ICQoJzxkaXYgY2xhc3M9XCJibG9ja1VJIGJsb2NrT3ZlcmxheVwiIHN0eWxlPVwiei1pbmRleDonKyAoeisrKSArJztkaXNwbGF5Om5vbmU7Ym9yZGVyOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG9wOjA7bGVmdDowXCI+PC9kaXY+Jyk7XG5cblx0XHRcdGlmIChvcHRzLnRoZW1lICYmIGZ1bGwpIHtcblx0XHRcdFx0cyA9ICc8ZGl2IGNsYXNzPVwiYmxvY2tVSSAnICsgb3B0cy5ibG9ja01zZ0NsYXNzICsgJyBibG9ja1BhZ2UgdWktZGlhbG9nIHVpLXdpZGdldCB1aS1jb3JuZXItYWxsXCIgc3R5bGU9XCJ6LWluZGV4OicrKHorMTApKyc7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmZpeGVkXCI+Jztcblx0XHRcdFx0aWYgKCBvcHRzLnRpdGxlICkge1xuXHRcdFx0XHRcdHMgKz0gJzxkaXYgY2xhc3M9XCJ1aS13aWRnZXQtaGVhZGVyIHVpLWRpYWxvZy10aXRsZWJhciB1aS1jb3JuZXItYWxsIGJsb2NrVGl0bGVcIj4nKyhvcHRzLnRpdGxlIHx8ICcmbmJzcDsnKSsnPC9kaXY+Jztcblx0XHRcdFx0fVxuXHRcdFx0XHRzICs9ICc8ZGl2IGNsYXNzPVwidWktd2lkZ2V0LWNvbnRlbnQgdWktZGlhbG9nLWNvbnRlbnRcIj48L2Rpdj4nO1xuXHRcdFx0XHRzICs9ICc8L2Rpdj4nO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAob3B0cy50aGVtZSkge1xuXHRcdFx0XHRzID0gJzxkaXYgY2xhc3M9XCJibG9ja1VJICcgKyBvcHRzLmJsb2NrTXNnQ2xhc3MgKyAnIGJsb2NrRWxlbWVudCB1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGxcIiBzdHlsZT1cInotaW5kZXg6JysoeisxMCkrJztkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGVcIj4nO1xuXHRcdFx0XHRpZiAoIG9wdHMudGl0bGUgKSB7XG5cdFx0XHRcdFx0cyArPSAnPGRpdiBjbGFzcz1cInVpLXdpZGdldC1oZWFkZXIgdWktZGlhbG9nLXRpdGxlYmFyIHVpLWNvcm5lci1hbGwgYmxvY2tUaXRsZVwiPicrKG9wdHMudGl0bGUgfHwgJyZuYnNwOycpKyc8L2Rpdj4nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHMgKz0gJzxkaXYgY2xhc3M9XCJ1aS13aWRnZXQtY29udGVudCB1aS1kaWFsb2ctY29udGVudFwiPjwvZGl2Pic7XG5cdFx0XHRcdHMgKz0gJzwvZGl2Pic7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChmdWxsKSB7XG5cdFx0XHRcdHMgPSAnPGRpdiBjbGFzcz1cImJsb2NrVUkgJyArIG9wdHMuYmxvY2tNc2dDbGFzcyArICcgYmxvY2tQYWdlXCIgc3R5bGU9XCJ6LWluZGV4OicrKHorMTApKyc7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmZpeGVkXCI+PC9kaXY+Jztcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRzID0gJzxkaXYgY2xhc3M9XCJibG9ja1VJICcgKyBvcHRzLmJsb2NrTXNnQ2xhc3MgKyAnIGJsb2NrRWxlbWVudFwiIHN0eWxlPVwiei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZVwiPjwvZGl2Pic7XG5cdFx0XHR9XG5cdFx0XHRseXIzID0gJChzKTtcblxuXHRcdFx0Ly8gaWYgd2UgaGF2ZSBhIG1lc3NhZ2UsIHN0eWxlIGl0XG5cdFx0XHRpZiAobXNnKSB7XG5cdFx0XHRcdGlmIChvcHRzLnRoZW1lKSB7XG5cdFx0XHRcdFx0bHlyMy5jc3ModGhlbWVkQ1NTKTtcblx0XHRcdFx0XHRseXIzLmFkZENsYXNzKCd1aS13aWRnZXQtY29udGVudCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRseXIzLmNzcyhjc3MpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzdHlsZSB0aGUgb3ZlcmxheVxuXHRcdFx0aWYgKCFvcHRzLnRoZW1lIC8qJiYgKCFvcHRzLmFwcGx5UGxhdGZvcm1PcGFjaXR5UnVsZXMpKi8pXG5cdFx0XHRcdGx5cjIuY3NzKG9wdHMub3ZlcmxheUNTUyk7XG5cdFx0XHRseXIyLmNzcygncG9zaXRpb24nLCBmdWxsID8gJ2ZpeGVkJyA6ICdhYnNvbHV0ZScpO1xuXG5cdFx0XHQvLyBtYWtlIGlmcmFtZSBsYXllciB0cmFuc3BhcmVudCBpbiBJRVxuXHRcdFx0aWYgKG1zaWUgfHwgb3B0cy5mb3JjZUlmcmFtZSlcblx0XHRcdFx0bHlyMS5jc3MoJ29wYWNpdHknLDAuMCk7XG5cblx0XHRcdC8vJChbbHlyMVswXSxseXIyWzBdLGx5cjNbMF1dKS5hcHBlbmRUbyhmdWxsID8gJ2JvZHknIDogZWwpO1xuXHRcdFx0dmFyIGxheWVycyA9IFtseXIxLGx5cjIsbHlyM10sICRwYXIgPSBmdWxsID8gJCgnYm9keScpIDogJChlbCk7XG5cdFx0XHQkLmVhY2gobGF5ZXJzLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dGhpcy5hcHBlbmRUbygkcGFyKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAob3B0cy50aGVtZSAmJiBvcHRzLmRyYWdnYWJsZSAmJiAkLmZuLmRyYWdnYWJsZSkge1xuXHRcdFx0XHRseXIzLmRyYWdnYWJsZSh7XG5cdFx0XHRcdFx0aGFuZGxlOiAnLnVpLWRpYWxvZy10aXRsZWJhcicsXG5cdFx0XHRcdFx0Y2FuY2VsOiAnbGknXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpZTcgbXVzdCB1c2UgYWJzb2x1dGUgcG9zaXRpb25pbmcgaW4gcXVpcmtzIG1vZGUgYW5kIHRvIGFjY291bnQgZm9yIGFjdGl2ZXggaXNzdWVzICh3aGVuIHNjcm9sbGluZylcblx0XHRcdHZhciBleHByID0gc2V0RXhwciAmJiAoISQuc3VwcG9ydC5ib3hNb2RlbCB8fCAkKCdvYmplY3QsZW1iZWQnLCBmdWxsID8gbnVsbCA6IGVsKS5sZW5ndGggPiAwKTtcblx0XHRcdGlmIChpZTYgfHwgZXhwcikge1xuXHRcdFx0XHQvLyBnaXZlIGJvZHkgMTAwJSBoZWlnaHRcblx0XHRcdFx0aWYgKGZ1bGwgJiYgb3B0cy5hbGxvd0JvZHlTdHJldGNoICYmICQuc3VwcG9ydC5ib3hNb2RlbClcblx0XHRcdFx0XHQkKCdodG1sLGJvZHknKS5jc3MoJ2hlaWdodCcsJzEwMCUnKTtcblxuXHRcdFx0XHQvLyBmaXggaWU2IGlzc3VlIHdoZW4gYmxvY2tlZCBlbGVtZW50IGhhcyBhIGJvcmRlciB3aWR0aFxuXHRcdFx0XHRpZiAoKGllNiB8fCAhJC5zdXBwb3J0LmJveE1vZGVsKSAmJiAhZnVsbCkge1xuXHRcdFx0XHRcdHZhciB0ID0gc3ooZWwsJ2JvcmRlclRvcFdpZHRoJyksIGwgPSBzeihlbCwnYm9yZGVyTGVmdFdpZHRoJyk7XG5cdFx0XHRcdFx0dmFyIGZpeFQgPSB0ID8gJygwIC0gJyt0KycpJyA6IDA7XG5cdFx0XHRcdFx0dmFyIGZpeEwgPSBsID8gJygwIC0gJytsKycpJyA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBzaW11bGF0ZSBmaXhlZCBwb3NpdGlvblxuXHRcdFx0XHQkLmVhY2gobGF5ZXJzLCBmdW5jdGlvbihpLG8pIHtcblx0XHRcdFx0XHR2YXIgcyA9IG9bMF0uc3R5bGU7XG5cdFx0XHRcdFx0cy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRcdFx0aWYgKGkgPCAyKSB7XG5cdFx0XHRcdFx0XHRpZiAoZnVsbClcblx0XHRcdFx0XHRcdFx0cy5zZXRFeHByZXNzaW9uKCdoZWlnaHQnLCdNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpIC0gKGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsPzA6JytvcHRzLnF1aXJrc21vZGVPZmZzZXRIYWNrKycpICsgXCJweFwiJyk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHMuc2V0RXhwcmVzc2lvbignaGVpZ2h0JywndGhpcy5wYXJlbnROb2RlLm9mZnNldEhlaWdodCArIFwicHhcIicpO1xuXHRcdFx0XHRcdFx0aWYgKGZ1bGwpXG5cdFx0XHRcdFx0XHRcdHMuc2V0RXhwcmVzc2lvbignd2lkdGgnLCdqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCArIFwicHhcIicpO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRzLnNldEV4cHJlc3Npb24oJ3dpZHRoJywndGhpcy5wYXJlbnROb2RlLm9mZnNldFdpZHRoICsgXCJweFwiJyk7XG5cdFx0XHRcdFx0XHRpZiAoZml4TCkgcy5zZXRFeHByZXNzaW9uKCdsZWZ0JywgZml4TCk7XG5cdFx0XHRcdFx0XHRpZiAoZml4VCkgcy5zZXRFeHByZXNzaW9uKCd0b3AnLCBmaXhUKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAob3B0cy5jZW50ZXJZKSB7XG5cdFx0XHRcdFx0XHRpZiAoZnVsbCkgcy5zZXRFeHByZXNzaW9uKCd0b3AnLCcoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkgLyAyIC0gKHRoaXMub2Zmc2V0SGVpZ2h0IC8gMikgKyAoYmxhaCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIDogZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsgXCJweFwiJyk7XG5cdFx0XHRcdFx0XHRzLm1hcmdpblRvcCA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKCFvcHRzLmNlbnRlclkgJiYgZnVsbCkge1xuXHRcdFx0XHRcdFx0dmFyIHRvcCA9IChvcHRzLmNzcyAmJiBvcHRzLmNzcy50b3ApID8gcGFyc2VJbnQob3B0cy5jc3MudG9wLCAxMCkgOiAwO1xuXHRcdFx0XHRcdFx0dmFyIGV4cHJlc3Npb24gPSAnKChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSArICcrdG9wKycpICsgXCJweFwiJztcblx0XHRcdFx0XHRcdHMuc2V0RXhwcmVzc2lvbigndG9wJyxleHByZXNzaW9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzaG93IHRoZSBtZXNzYWdlXG5cdFx0XHRpZiAobXNnKSB7XG5cdFx0XHRcdGlmIChvcHRzLnRoZW1lKVxuXHRcdFx0XHRcdGx5cjMuZmluZCgnLnVpLXdpZGdldC1jb250ZW50JykuYXBwZW5kKG1zZyk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRseXIzLmFwcGVuZChtc2cpO1xuXHRcdFx0XHRpZiAobXNnLmpxdWVyeSB8fCBtc2cubm9kZVR5cGUpXG5cdFx0XHRcdFx0JChtc2cpLnNob3coKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKChtc2llIHx8IG9wdHMuZm9yY2VJZnJhbWUpICYmIG9wdHMuc2hvd092ZXJsYXkpXG5cdFx0XHRcdGx5cjEuc2hvdygpOyAvLyBvcGFjaXR5IGlzIHplcm9cblx0XHRcdGlmIChvcHRzLmZhZGVJbikge1xuXHRcdFx0XHR2YXIgY2IgPSBvcHRzLm9uQmxvY2sgPyBvcHRzLm9uQmxvY2sgOiBub09wO1xuXHRcdFx0XHR2YXIgY2IxID0gKG9wdHMuc2hvd092ZXJsYXkgJiYgIW1zZykgPyBjYiA6IG5vT3A7XG5cdFx0XHRcdHZhciBjYjIgPSBtc2cgPyBjYiA6IG5vT3A7XG5cdFx0XHRcdGlmIChvcHRzLnNob3dPdmVybGF5KVxuXHRcdFx0XHRcdGx5cjIuX2ZhZGVJbihvcHRzLmZhZGVJbiwgY2IxKTtcblx0XHRcdFx0aWYgKG1zZylcblx0XHRcdFx0XHRseXIzLl9mYWRlSW4ob3B0cy5mYWRlSW4sIGNiMik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aWYgKG9wdHMuc2hvd092ZXJsYXkpXG5cdFx0XHRcdFx0bHlyMi5zaG93KCk7XG5cdFx0XHRcdGlmIChtc2cpXG5cdFx0XHRcdFx0bHlyMy5zaG93KCk7XG5cdFx0XHRcdGlmIChvcHRzLm9uQmxvY2spXG5cdFx0XHRcdFx0b3B0cy5vbkJsb2NrKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGJpbmQga2V5IGFuZCBtb3VzZSBldmVudHNcblx0XHRcdGJpbmQoMSwgZWwsIG9wdHMpO1xuXG5cdFx0XHRpZiAoZnVsbCkge1xuXHRcdFx0XHRwYWdlQmxvY2sgPSBseXIzWzBdO1xuXHRcdFx0XHRwYWdlQmxvY2tFbHMgPSAkKG9wdHMuZm9jdXNhYmxlRWxlbWVudHMscGFnZUJsb2NrKTtcblx0XHRcdFx0aWYgKG9wdHMuZm9jdXNJbnB1dClcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZvY3VzLCAyMCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNlbnRlcihseXIzWzBdLCBvcHRzLmNlbnRlclgsIG9wdHMuY2VudGVyWSk7XG5cblx0XHRcdGlmIChvcHRzLnRpbWVvdXQpIHtcblx0XHRcdFx0Ly8gYXV0by11bmJsb2NrXG5cdFx0XHRcdHZhciB0byA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKGZ1bGwpXG5cdFx0XHRcdFx0XHQkLnVuYmxvY2tVSShvcHRzKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHQkKGVsKS51bmJsb2NrKG9wdHMpO1xuXHRcdFx0XHR9LCBvcHRzLnRpbWVvdXQpO1xuXHRcdFx0XHQkKGVsKS5kYXRhKCdibG9ja1VJLnRpbWVvdXQnLCB0byk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBibG9ja1xuXHRcdGZ1bmN0aW9uIHJlbW92ZShlbCwgb3B0cykge1xuXHRcdFx0dmFyIGNvdW50O1xuXHRcdFx0dmFyIGZ1bGwgPSAoZWwgPT0gd2luZG93KTtcblx0XHRcdHZhciAkZWwgPSAkKGVsKTtcblx0XHRcdHZhciBkYXRhID0gJGVsLmRhdGEoJ2Jsb2NrVUkuaGlzdG9yeScpO1xuXHRcdFx0dmFyIHRvID0gJGVsLmRhdGEoJ2Jsb2NrVUkudGltZW91dCcpO1xuXHRcdFx0aWYgKHRvKSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0byk7XG5cdFx0XHRcdCRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLnRpbWVvdXQnKTtcblx0XHRcdH1cblx0XHRcdG9wdHMgPSAkLmV4dGVuZCh7fSwgJC5ibG9ja1VJLmRlZmF1bHRzLCBvcHRzIHx8IHt9KTtcblx0XHRcdGJpbmQoMCwgZWwsIG9wdHMpOyAvLyB1bmJpbmQgZXZlbnRzXG5cblx0XHRcdGlmIChvcHRzLm9uVW5ibG9jayA9PT0gbnVsbCkge1xuXHRcdFx0XHRvcHRzLm9uVW5ibG9jayA9ICRlbC5kYXRhKCdibG9ja1VJLm9uVW5ibG9jaycpO1xuXHRcdFx0XHQkZWwucmVtb3ZlRGF0YSgnYmxvY2tVSS5vblVuYmxvY2snKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGVscztcblx0XHRcdGlmIChmdWxsKSAvLyBjcmF6eSBzZWxlY3RvciB0byBoYW5kbGUgb2RkIGZpZWxkIGVycm9ycyBpbiBpZTYvN1xuXHRcdFx0XHRlbHMgPSAkKCdib2R5JykuY2hpbGRyZW4oKS5maWx0ZXIoJy5ibG9ja1VJJykuYWRkKCdib2R5ID4gLmJsb2NrVUknKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZWxzID0gJGVsLmZpbmQoJz4uYmxvY2tVSScpO1xuXG5cdFx0XHQvLyBmaXggY3Vyc29yIGlzc3VlXG5cdFx0XHRpZiAoIG9wdHMuY3Vyc29yUmVzZXQgKSB7XG5cdFx0XHRcdGlmICggZWxzLmxlbmd0aCA+IDEgKVxuXHRcdFx0XHRcdGVsc1sxXS5zdHlsZS5jdXJzb3IgPSBvcHRzLmN1cnNvclJlc2V0O1xuXHRcdFx0XHRpZiAoIGVscy5sZW5ndGggPiAyIClcblx0XHRcdFx0XHRlbHNbMl0uc3R5bGUuY3Vyc29yID0gb3B0cy5jdXJzb3JSZXNldDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZ1bGwpXG5cdFx0XHRcdHBhZ2VCbG9jayA9IHBhZ2VCbG9ja0VscyA9IG51bGw7XG5cblx0XHRcdGlmIChvcHRzLmZhZGVPdXQpIHtcblx0XHRcdFx0Y291bnQgPSBlbHMubGVuZ3RoO1xuXHRcdFx0XHRlbHMuc3RvcCgpLmZhZGVPdXQob3B0cy5mYWRlT3V0LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIC0tY291bnQgPT09IDApXG5cdFx0XHRcdFx0XHRyZXNldChlbHMsZGF0YSxvcHRzLGVsKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJlc2V0KGVscywgZGF0YSwgb3B0cywgZWwpO1xuXHRcdH1cblxuXHRcdC8vIG1vdmUgYmxvY2tpbmcgZWxlbWVudCBiYWNrIGludG8gdGhlIERPTSB3aGVyZSBpdCBzdGFydGVkXG5cdFx0ZnVuY3Rpb24gcmVzZXQoZWxzLGRhdGEsb3B0cyxlbCkge1xuXHRcdFx0dmFyICRlbCA9ICQoZWwpO1xuXHRcdFx0aWYgKCAkZWwuZGF0YSgnYmxvY2tVSS5pc0Jsb2NrZWQnKSApXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0ZWxzLmVhY2goZnVuY3Rpb24oaSxvKSB7XG5cdFx0XHRcdC8vIHJlbW92ZSB2aWEgRE9NIGNhbGxzIHNvIHdlIGRvbid0IGxvc2UgZXZlbnQgaGFuZGxlcnNcblx0XHRcdFx0aWYgKHRoaXMucGFyZW50Tm9kZSlcblx0XHRcdFx0XHR0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGRhdGEgJiYgZGF0YS5lbCkge1xuXHRcdFx0XHRkYXRhLmVsLnN0eWxlLmRpc3BsYXkgPSBkYXRhLmRpc3BsYXk7XG5cdFx0XHRcdGRhdGEuZWwuc3R5bGUucG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uO1xuXHRcdFx0XHRpZiAoZGF0YS5wYXJlbnQpXG5cdFx0XHRcdFx0ZGF0YS5wYXJlbnQuYXBwZW5kQ2hpbGQoZGF0YS5lbCk7XG5cdFx0XHRcdCRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLmhpc3RvcnknKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCRlbC5kYXRhKCdibG9ja1VJLnN0YXRpYycpKSB7XG5cdFx0XHRcdCRlbC5jc3MoJ3Bvc2l0aW9uJywgJ3N0YXRpYycpOyAvLyAjMjJcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZiBvcHRzLm9uVW5ibG9jayA9PSAnZnVuY3Rpb24nKVxuXHRcdFx0XHRvcHRzLm9uVW5ibG9jayhlbCxvcHRzKTtcblxuXHRcdFx0Ly8gZml4IGlzc3VlIGluIFNhZmFyaSA2IHdoZXJlIGJsb2NrIGFydGlmYWN0cyByZW1haW4gdW50aWwgcmVmbG93XG5cdFx0XHR2YXIgYm9keSA9ICQoZG9jdW1lbnQuYm9keSksIHcgPSBib2R5LndpZHRoKCksIGNzc1cgPSBib2R5WzBdLnN0eWxlLndpZHRoO1xuXHRcdFx0Ym9keS53aWR0aCh3LTEpLndpZHRoKHcpO1xuXHRcdFx0Ym9keVswXS5zdHlsZS53aWR0aCA9IGNzc1c7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZC91bmJpbmQgdGhlIGhhbmRsZXJcblx0XHRmdW5jdGlvbiBiaW5kKGIsIGVsLCBvcHRzKSB7XG5cdFx0XHR2YXIgZnVsbCA9IGVsID09IHdpbmRvdywgJGVsID0gJChlbCk7XG5cblx0XHRcdC8vIGRvbid0IGJvdGhlciB1bmJpbmRpbmcgaWYgdGhlcmUgaXMgbm90aGluZyB0byB1bmJpbmRcblx0XHRcdGlmICghYiAmJiAoZnVsbCAmJiAhcGFnZUJsb2NrIHx8ICFmdWxsICYmICEkZWwuZGF0YSgnYmxvY2tVSS5pc0Jsb2NrZWQnKSkpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0JGVsLmRhdGEoJ2Jsb2NrVUkuaXNCbG9ja2VkJywgYik7XG5cblx0XHRcdC8vIGRvbid0IGJpbmQgZXZlbnRzIHdoZW4gb3ZlcmxheSBpcyBub3QgaW4gdXNlIG9yIGlmIGJpbmRFdmVudHMgaXMgZmFsc2Vcblx0XHRcdGlmICghZnVsbCB8fCAhb3B0cy5iaW5kRXZlbnRzIHx8IChiICYmICFvcHRzLnNob3dPdmVybGF5KSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHQvLyBiaW5kIGFuY2hvcnMgYW5kIGlucHV0cyBmb3IgbW91c2UgYW5kIGtleSBldmVudHNcblx0XHRcdHZhciBldmVudHMgPSAnbW91c2Vkb3duIG1vdXNldXAga2V5ZG93biBrZXlwcmVzcyBrZXl1cCB0b3VjaHN0YXJ0IHRvdWNoZW5kIHRvdWNobW92ZSc7XG5cdFx0XHRpZiAoYilcblx0XHRcdFx0JChkb2N1bWVudCkuYmluZChldmVudHMsIG9wdHMsIGhhbmRsZXIpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHQkKGRvY3VtZW50KS51bmJpbmQoZXZlbnRzLCBoYW5kbGVyKTtcblxuXHRcdC8vIGZvcm1lciBpbXBsLi4uXG5cdFx0Ly9cdFx0dmFyICRlID0gJCgnYSw6aW5wdXQnKTtcblx0XHQvL1x0XHRiID8gJGUuYmluZChldmVudHMsIG9wdHMsIGhhbmRsZXIpIDogJGUudW5iaW5kKGV2ZW50cywgaGFuZGxlcik7XG5cdFx0fVxuXG5cdFx0Ly8gZXZlbnQgaGFuZGxlciB0byBzdXBwcmVzcyBrZXlib2FyZC9tb3VzZSBldmVudHMgd2hlbiBibG9ja2luZ1xuXHRcdGZ1bmN0aW9uIGhhbmRsZXIoZSkge1xuXHRcdFx0Ly8gYWxsb3cgdGFiIG5hdmlnYXRpb24gKGNvbmRpdGlvbmFsbHkpXG5cdFx0XHRpZiAoZS50eXBlID09PSAna2V5ZG93bicgJiYgZS5rZXlDb2RlICYmIGUua2V5Q29kZSA9PSA5KSB7XG5cdFx0XHRcdGlmIChwYWdlQmxvY2sgJiYgZS5kYXRhLmNvbnN0cmFpblRhYktleSkge1xuXHRcdFx0XHRcdHZhciBlbHMgPSBwYWdlQmxvY2tFbHM7XG5cdFx0XHRcdFx0dmFyIGZ3ZCA9ICFlLnNoaWZ0S2V5ICYmIGUudGFyZ2V0ID09PSBlbHNbZWxzLmxlbmd0aC0xXTtcblx0XHRcdFx0XHR2YXIgYmFjayA9IGUuc2hpZnRLZXkgJiYgZS50YXJnZXQgPT09IGVsc1swXTtcblx0XHRcdFx0XHRpZiAoZndkIHx8IGJhY2spIHtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmb2N1cyhiYWNrKTt9LDEwKTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHZhciBvcHRzID0gZS5kYXRhO1xuXHRcdFx0dmFyIHRhcmdldCA9ICQoZS50YXJnZXQpO1xuXHRcdFx0aWYgKHRhcmdldC5oYXNDbGFzcygnYmxvY2tPdmVybGF5JykgJiYgb3B0cy5vbk92ZXJsYXlDbGljaylcblx0XHRcdFx0b3B0cy5vbk92ZXJsYXlDbGljayhlKTtcblxuXHRcdFx0Ly8gYWxsb3cgZXZlbnRzIHdpdGhpbiB0aGUgbWVzc2FnZSBjb250ZW50XG5cdFx0XHRpZiAodGFyZ2V0LnBhcmVudHMoJ2Rpdi4nICsgb3B0cy5ibG9ja01zZ0NsYXNzKS5sZW5ndGggPiAwKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdFx0Ly8gYWxsb3cgZXZlbnRzIGZvciBjb250ZW50IHRoYXQgaXMgbm90IGJlaW5nIGJsb2NrZWRcblx0XHRcdHJldHVybiB0YXJnZXQucGFyZW50cygpLmNoaWxkcmVuKCkuZmlsdGVyKCdkaXYuYmxvY2tVSScpLmxlbmd0aCA9PT0gMDtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmb2N1cyhiYWNrKSB7XG5cdFx0XHRpZiAoIXBhZ2VCbG9ja0Vscylcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0dmFyIGUgPSBwYWdlQmxvY2tFbHNbYmFjaz09PXRydWUgPyBwYWdlQmxvY2tFbHMubGVuZ3RoLTEgOiAwXTtcblx0XHRcdGlmIChlKVxuXHRcdFx0XHRlLmZvY3VzKCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2VudGVyKGVsLCB4LCB5KSB7XG5cdFx0XHR2YXIgcCA9IGVsLnBhcmVudE5vZGUsIHMgPSBlbC5zdHlsZTtcblx0XHRcdHZhciBsID0gKChwLm9mZnNldFdpZHRoIC0gZWwub2Zmc2V0V2lkdGgpLzIpIC0gc3oocCwnYm9yZGVyTGVmdFdpZHRoJyk7XG5cdFx0XHR2YXIgdCA9ICgocC5vZmZzZXRIZWlnaHQgLSBlbC5vZmZzZXRIZWlnaHQpLzIpIC0gc3oocCwnYm9yZGVyVG9wV2lkdGgnKTtcblx0XHRcdGlmICh4KSBzLmxlZnQgPSBsID4gMCA/IChsKydweCcpIDogJzAnO1xuXHRcdFx0aWYgKHkpIHMudG9wICA9IHQgPiAwID8gKHQrJ3B4JykgOiAnMCc7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc3ooZWwsIHApIHtcblx0XHRcdHJldHVybiBwYXJzZUludCgkLmNzcyhlbCxwKSwxMCl8fDA7XG5cdFx0fVxuXG5cdH1cblxuXG5cdC8qZ2xvYmFsIGRlZmluZTp0cnVlICovXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgJiYgZGVmaW5lLmFtZC5qUXVlcnkpIHtcblx0XHRkZWZpbmUoWydqcXVlcnknXSwgc2V0dXApO1xuXHR9IGVsc2Uge1xuXHRcdHNldHVwKGpRdWVyeSk7XG5cdH1cblxufSkoKTtcbiJdLCJmaWxlIjoianF1ZXJ5LmJsb2NrVUkuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnkuYmxvY2tVSS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcclxuICogalF1ZXJ5IGJsb2NrVUkgcGx1Z2luXHJcbiAqIFZlcnNpb24gMi42Ni4wLTIwMTMuMTAuMDlcclxuICogUmVxdWlyZXMgalF1ZXJ5IHYxLjcgb3IgbGF0ZXJcclxuICpcclxuICogRXhhbXBsZXMgYXQ6IGh0dHA6Ly9tYWxzdXAuY29tL2pxdWVyeS9ibG9jay9cclxuICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTMgTS4gQWxzdXBcclxuICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6XHJcbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcbiAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbFxyXG4gKlxyXG4gKiBUaGFua3MgdG8gQW1pci1Ib3NzZWluIFNvYmhpIGZvciBzb21lIGV4Y2VsbGVudCBjb250cmlidXRpb25zIVxyXG4gKi9cclxuXHJcbjsoZnVuY3Rpb24oKSB7XHJcbi8qanNoaW50IGVxZXFlcTpmYWxzZSBjdXJseTpmYWxzZSBsYXRlZGVmOmZhbHNlICovXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuXHRmdW5jdGlvbiBzZXR1cCgkKSB7XHJcblx0XHQkLmZuLl9mYWRlSW4gPSAkLmZuLmZhZGVJbjtcclxuXHJcblx0XHR2YXIgbm9PcCA9ICQubm9vcCB8fCBmdW5jdGlvbigpIHt9O1xyXG5cclxuXHRcdC8vIHRoaXMgYml0IGlzIHRvIGVuc3VyZSB3ZSBkb24ndCBjYWxsIHNldEV4cHJlc3Npb24gd2hlbiB3ZSBzaG91bGRuJ3QgKHdpdGggZXh0cmEgbXVzY2xlIHRvIGhhbmRsZVxyXG5cdFx0Ly8gY29uZnVzaW5nIHVzZXJBZ2VudCBzdHJpbmdzIG9uIFZpc3RhKVxyXG5cdFx0dmFyIG1zaWUgPSAvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuXHRcdHZhciBpZTYgID0gL01TSUUgNi4wLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEgL01TSUUgOC4wLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xyXG5cdFx0dmFyIG1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgMDtcclxuXHRcdHZhciBzZXRFeHByID0gJC5pc0Z1bmN0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZS5zZXRFeHByZXNzaW9uICk7XHJcblxyXG5cdFx0Ly8gZ2xvYmFsICQgbWV0aG9kcyBmb3IgYmxvY2tpbmcvdW5ibG9ja2luZyB0aGUgZW50aXJlIHBhZ2VcclxuXHRcdCQuYmxvY2tVSSAgID0gZnVuY3Rpb24ob3B0cykgeyBpbnN0YWxsKHdpbmRvdywgb3B0cyk7IH07XHJcblx0XHQkLnVuYmxvY2tVSSA9IGZ1bmN0aW9uKG9wdHMpIHsgcmVtb3ZlKHdpbmRvdywgb3B0cyk7IH07XHJcblxyXG5cdFx0Ly8gY29udmVuaWVuY2UgbWV0aG9kIGZvciBxdWljayBncm93bC1saWtlIG5vdGlmaWNhdGlvbnMgIChodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9Z3Jvd2wpXHJcblx0XHQkLmdyb3dsVUkgPSBmdW5jdGlvbih0aXRsZSwgbWVzc2FnZSwgdGltZW91dCwgb25DbG9zZSkge1xyXG5cdFx0XHR2YXIgJG0gPSAkKCc8ZGl2IGNsYXNzPVwiZ3Jvd2xVSVwiPjwvZGl2PicpO1xyXG5cdFx0XHRpZiAodGl0bGUpICRtLmFwcGVuZCgnPGgxPicrdGl0bGUrJzwvaDE+Jyk7XHJcblx0XHRcdGlmIChtZXNzYWdlKSAkbS5hcHBlbmQoJzxoMj4nK21lc3NhZ2UrJzwvaDI+Jyk7XHJcblx0XHRcdGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHRpbWVvdXQgPSAzMDAwO1xyXG5cclxuXHRcdFx0Ly8gQWRkZWQgYnkga29uYXB1bjogU2V0IHRpbWVvdXQgdG8gMzAgc2Vjb25kcyBpZiB0aGlzIGdyb3dsIGlzIG1vdXNlZCBvdmVyLCBsaWtlIG5vcm1hbCB0b2FzdCBub3RpZmljYXRpb25zXHJcblx0XHRcdHZhciBjYWxsQmxvY2sgPSBmdW5jdGlvbihvcHRzKSB7XHJcblx0XHRcdFx0b3B0cyA9IG9wdHMgfHwge307XHJcblxyXG5cdFx0XHRcdCQuYmxvY2tVSSh7XHJcblx0XHRcdFx0XHRtZXNzYWdlOiAkbSxcclxuXHRcdFx0XHRcdGZhZGVJbiA6IHR5cGVvZiBvcHRzLmZhZGVJbiAgIT09ICd1bmRlZmluZWQnID8gb3B0cy5mYWRlSW4gIDogNzAwLFxyXG5cdFx0XHRcdFx0ZmFkZU91dDogdHlwZW9mIG9wdHMuZmFkZU91dCAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRzLmZhZGVPdXQgOiAxMDAwLFxyXG5cdFx0XHRcdFx0dGltZW91dDogdHlwZW9mIG9wdHMudGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRzLnRpbWVvdXQgOiB0aW1lb3V0LFxyXG5cdFx0XHRcdFx0Y2VudGVyWTogZmFsc2UsXHJcblx0XHRcdFx0XHRzaG93T3ZlcmxheTogZmFsc2UsXHJcblx0XHRcdFx0XHRvblVuYmxvY2s6IG9uQ2xvc2UsXHJcblx0XHRcdFx0XHRjc3M6ICQuYmxvY2tVSS5kZWZhdWx0cy5ncm93bENTU1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Y2FsbEJsb2NrKCk7XHJcblx0XHRcdHZhciBub25tb3VzZWRPcGFjaXR5ID0gJG0uY3NzKCdvcGFjaXR5Jyk7XHJcblx0XHRcdCRtLm1vdXNlb3ZlcihmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRjYWxsQmxvY2soe1xyXG5cdFx0XHRcdFx0ZmFkZUluOiAwLFxyXG5cdFx0XHRcdFx0dGltZW91dDogMzAwMDBcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0dmFyIGRpc3BsYXlCbG9jayA9ICQoJy5ibG9ja01zZycpO1xyXG5cdFx0XHRcdGRpc3BsYXlCbG9jay5zdG9wKCk7IC8vIGNhbmNlbCBmYWRlb3V0IGlmIGl0IGhhcyBzdGFydGVkXHJcblx0XHRcdFx0ZGlzcGxheUJsb2NrLmZhZGVUbygzMDAsIDEpOyAvLyBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSBtZXNzYWdlIGJ5IHJlbW92aW5nIHRyYW5zcGFyZW5jeVxyXG5cdFx0XHR9KS5tb3VzZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHQkKCcuYmxvY2tNc2cnKS5mYWRlT3V0KDEwMDApO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8gRW5kIGtvbmFwdW4gYWRkaXRpb25zXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHBsdWdpbiBtZXRob2QgZm9yIGJsb2NraW5nIGVsZW1lbnQgY29udGVudFxyXG5cdFx0JC5mbi5ibG9jayA9IGZ1bmN0aW9uKG9wdHMpIHtcclxuXHRcdFx0aWYgKCB0aGlzWzBdID09PSB3aW5kb3cgKSB7XHJcblx0XHRcdFx0JC5ibG9ja1VJKCBvcHRzICk7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFyIGZ1bGxPcHRzID0gJC5leHRlbmQoe30sICQuYmxvY2tVSS5kZWZhdWx0cywgb3B0cyB8fCB7fSk7XHJcblx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHR2YXIgJGVsID0gJCh0aGlzKTtcclxuXHRcdFx0XHRpZiAoZnVsbE9wdHMuaWdub3JlSWZCbG9ja2VkICYmICRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKVxyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdCRlbC51bmJsb2NrKHsgZmFkZU91dDogMCB9KTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGlmICgkLmNzcyh0aGlzLCdwb3NpdGlvbicpID09ICdzdGF0aWMnKSB7XHJcblx0XHRcdFx0XHR0aGlzLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuXHRcdFx0XHRcdCQodGhpcykuZGF0YSgnYmxvY2tVSS5zdGF0aWMnLCB0cnVlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5zdHlsZS56b29tID0gMTsgLy8gZm9yY2UgJ2hhc0xheW91dCcgaW4gaWVcclxuXHRcdFx0XHRpbnN0YWxsKHRoaXMsIG9wdHMpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gcGx1Z2luIG1ldGhvZCBmb3IgdW5ibG9ja2luZyBlbGVtZW50IGNvbnRlbnRcclxuXHRcdCQuZm4udW5ibG9jayA9IGZ1bmN0aW9uKG9wdHMpIHtcclxuXHRcdFx0aWYgKCB0aGlzWzBdID09PSB3aW5kb3cgKSB7XHJcblx0XHRcdFx0JC51bmJsb2NrVUkoIG9wdHMgKTtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJlbW92ZSh0aGlzLCBvcHRzKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9O1xyXG5cclxuXHRcdCQuYmxvY2tVSS52ZXJzaW9uID0gMi42NjsgLy8gMm5kIGdlbmVyYXRpb24gYmxvY2tpbmcgYXQgbm8gZXh0cmEgY29zdCFcclxuXHJcblx0XHQvLyBvdmVycmlkZSB0aGVzZSBpbiB5b3VyIGNvZGUgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZCBzdHlsZVxyXG5cdFx0JC5ibG9ja1VJLmRlZmF1bHRzID0ge1xyXG5cdFx0XHQvLyBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIGJsb2NraW5nICh1c2UgbnVsbCBmb3Igbm8gbWVzc2FnZSlcclxuXHRcdFx0bWVzc2FnZTogICc8aDE+UGxlYXNlIHdhaXQuLi48L2gxPicsXHJcblxyXG5cdFx0XHR0aXRsZTogbnVsbCxcdFx0Ly8gdGl0bGUgc3RyaW5nOyBvbmx5IHVzZWQgd2hlbiB0aGVtZSA9PSB0cnVlXHJcblx0XHRcdGRyYWdnYWJsZTogdHJ1ZSxcdC8vIG9ubHkgdXNlZCB3aGVuIHRoZW1lID09IHRydWUgKHJlcXVpcmVzIGpxdWVyeS11aS5qcyB0byBiZSBsb2FkZWQpXHJcblxyXG5cdFx0XHR0aGVtZTogZmFsc2UsIC8vIHNldCB0byB0cnVlIHRvIHVzZSB3aXRoIGpRdWVyeSBVSSB0aGVtZXNcclxuXHJcblx0XHRcdC8vIHN0eWxlcyBmb3IgdGhlIG1lc3NhZ2Ugd2hlbiBibG9ja2luZzsgaWYgeW91IHdpc2ggdG8gZGlzYWJsZVxyXG5cdFx0XHQvLyB0aGVzZSBhbmQgdXNlIGFuIGV4dGVybmFsIHN0eWxlc2hlZXQgdGhlbiBkbyB0aGlzIGluIHlvdXIgY29kZTpcclxuXHRcdFx0Ly8gJC5ibG9ja1VJLmRlZmF1bHRzLmNzcyA9IHt9O1xyXG5cdFx0XHRjc3M6IHtcclxuXHRcdFx0XHRwYWRkaW5nOlx0MCxcclxuXHRcdFx0XHRtYXJnaW46XHRcdDAsXHJcblx0XHRcdFx0d2lkdGg6XHRcdCczMCUnLFxyXG5cdFx0XHRcdHRvcDpcdFx0JzQwJScsXHJcblx0XHRcdFx0bGVmdDpcdFx0JzM1JScsXHJcblx0XHRcdFx0dGV4dEFsaWduOlx0J2NlbnRlcicsXHJcblx0XHRcdFx0Y29sb3I6XHRcdCcjMDAwJyxcclxuXHRcdFx0XHRib3JkZXI6XHRcdCczcHggc29saWQgI2FhYScsXHJcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOicjZmZmJyxcclxuXHRcdFx0XHRjdXJzb3I6XHRcdCd3YWl0J1xyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0Ly8gbWluaW1hbCBzdHlsZSBzZXQgdXNlZCB3aGVuIHRoZW1lcyBhcmUgdXNlZFxyXG5cdFx0XHR0aGVtZWRDU1M6IHtcclxuXHRcdFx0XHR3aWR0aDpcdCczMCUnLFxyXG5cdFx0XHRcdHRvcDpcdCc0MCUnLFxyXG5cdFx0XHRcdGxlZnQ6XHQnMzUlJ1xyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0Ly8gc3R5bGVzIGZvciB0aGUgb3ZlcmxheVxyXG5cdFx0XHRvdmVybGF5Q1NTOiAge1xyXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjpcdCcjMDAwJyxcclxuXHRcdFx0XHRvcGFjaXR5Olx0XHRcdDAuNixcclxuXHRcdFx0XHRjdXJzb3I6XHRcdFx0XHQnd2FpdCdcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdC8vIHN0eWxlIHRvIHJlcGxhY2Ugd2FpdCBjdXJzb3IgYmVmb3JlIHVuYmxvY2tpbmcgdG8gY29ycmVjdCBpc3N1ZVxyXG5cdFx0XHQvLyBvZiBsaW5nZXJpbmcgd2FpdCBjdXJzb3JcclxuXHRcdFx0Y3Vyc29yUmVzZXQ6ICdkZWZhdWx0JyxcclxuXHJcblx0XHRcdC8vIHN0eWxlcyBhcHBsaWVkIHdoZW4gdXNpbmcgJC5ncm93bFVJXHJcblx0XHRcdGdyb3dsQ1NTOiB7XHJcblx0XHRcdFx0d2lkdGg6XHRcdCczNTBweCcsXHJcblx0XHRcdFx0dG9wOlx0XHQnMTBweCcsXHJcblx0XHRcdFx0bGVmdDpcdFx0JycsXHJcblx0XHRcdFx0cmlnaHQ6XHRcdCcxMHB4JyxcclxuXHRcdFx0XHRib3JkZXI6XHRcdCdub25lJyxcclxuXHRcdFx0XHRwYWRkaW5nOlx0JzVweCcsXHJcblx0XHRcdFx0b3BhY2l0eTpcdDAuNixcclxuXHRcdFx0XHRjdXJzb3I6XHRcdCdkZWZhdWx0JyxcclxuXHRcdFx0XHRjb2xvcjpcdFx0JyNmZmYnLFxyXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogJyMwMDAnLFxyXG5cdFx0XHRcdCctd2Via2l0LWJvcmRlci1yYWRpdXMnOicxMHB4JyxcclxuXHRcdFx0XHQnLW1vei1ib3JkZXItcmFkaXVzJzpcdCcxMHB4JyxcclxuXHRcdFx0XHQnYm9yZGVyLXJhZGl1cyc6XHRcdCcxMHB4J1xyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0Ly8gSUUgaXNzdWVzOiAnYWJvdXQ6YmxhbmsnIGZhaWxzIG9uIEhUVFBTIGFuZCBqYXZhc2NyaXB0OmZhbHNlIGlzIHMtbC1vLXdcclxuXHRcdFx0Ly8gKGhhdCB0aXAgdG8gSm9yZ2UgSC4gTi4gZGUgVmFzY29uY2Vsb3MpXHJcblx0XHRcdC8qanNoaW50IHNjcmlwdHVybDp0cnVlICovXHJcblx0XHRcdGlmcmFtZVNyYzogL15odHRwcy9pLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJycpID8gJ2phdmFzY3JpcHQ6ZmFsc2UnIDogJ2Fib3V0OmJsYW5rJyxcclxuXHJcblx0XHRcdC8vIGZvcmNlIHVzYWdlIG9mIGlmcmFtZSBpbiBub24tSUUgYnJvd3NlcnMgKGhhbmR5IGZvciBibG9ja2luZyBhcHBsZXRzKVxyXG5cdFx0XHRmb3JjZUlmcmFtZTogZmFsc2UsXHJcblxyXG5cdFx0XHQvLyB6LWluZGV4IGZvciB0aGUgYmxvY2tpbmcgb3ZlcmxheVxyXG5cdFx0XHRiYXNlWjogMTAwMCxcclxuXHJcblx0XHRcdC8vIHNldCB0aGVzZSB0byB0cnVlIHRvIGhhdmUgdGhlIG1lc3NhZ2UgYXV0b21hdGljYWxseSBjZW50ZXJlZFxyXG5cdFx0XHRjZW50ZXJYOiB0cnVlLCAvLyA8LS0gb25seSBlZmZlY3RzIGVsZW1lbnQgYmxvY2tpbmcgKHBhZ2UgYmxvY2sgY29udHJvbGxlZCB2aWEgY3NzIGFib3ZlKVxyXG5cdFx0XHRjZW50ZXJZOiB0cnVlLFxyXG5cclxuXHRcdFx0Ly8gYWxsb3cgYm9keSBlbGVtZW50IHRvIGJlIHN0ZXRjaGVkIGluIGllNjsgdGhpcyBtYWtlcyBibG9ja2luZyBsb29rIGJldHRlclxyXG5cdFx0XHQvLyBvbiBcInNob3J0XCIgcGFnZXMuICBkaXNhYmxlIGlmIHlvdSB3aXNoIHRvIHByZXZlbnQgY2hhbmdlcyB0byB0aGUgYm9keSBoZWlnaHRcclxuXHRcdFx0YWxsb3dCb2R5U3RyZXRjaDogdHJ1ZSxcclxuXHJcblx0XHRcdC8vIGVuYWJsZSBpZiB5b3Ugd2FudCBrZXkgYW5kIG1vdXNlIGV2ZW50cyB0byBiZSBkaXNhYmxlZCBmb3IgY29udGVudCB0aGF0IGlzIGJsb2NrZWRcclxuXHRcdFx0YmluZEV2ZW50czogdHJ1ZSxcclxuXHJcblx0XHRcdC8vIGJlIGRlZmF1bHQgYmxvY2tVSSB3aWxsIHN1cHJlc3MgdGFiIG5hdmlnYXRpb24gZnJvbSBsZWF2aW5nIGJsb2NraW5nIGNvbnRlbnRcclxuXHRcdFx0Ly8gKGlmIGJpbmRFdmVudHMgaXMgdHJ1ZSlcclxuXHRcdFx0Y29uc3RyYWluVGFiS2V5OiB0cnVlLFxyXG5cclxuXHRcdFx0Ly8gZmFkZUluIHRpbWUgaW4gbWlsbGlzOyBzZXQgdG8gMCB0byBkaXNhYmxlIGZhZGVJbiBvbiBibG9ja1xyXG5cdFx0XHRmYWRlSW46ICAyMDAsXHJcblxyXG5cdFx0XHQvLyBmYWRlT3V0IHRpbWUgaW4gbWlsbGlzOyBzZXQgdG8gMCB0byBkaXNhYmxlIGZhZGVPdXQgb24gdW5ibG9ja1xyXG5cdFx0XHRmYWRlT3V0OiAgNDAwLFxyXG5cclxuXHRcdFx0Ly8gdGltZSBpbiBtaWxsaXMgdG8gd2FpdCBiZWZvcmUgYXV0by11bmJsb2NraW5nOyBzZXQgdG8gMCB0byBkaXNhYmxlIGF1dG8tdW5ibG9ja1xyXG5cdFx0XHR0aW1lb3V0OiAwLFxyXG5cclxuXHRcdFx0Ly8gZGlzYWJsZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzaG93IHRoZSBvdmVybGF5XHJcblx0XHRcdHNob3dPdmVybGF5OiB0cnVlLFxyXG5cclxuXHRcdFx0Ly8gaWYgdHJ1ZSwgZm9jdXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIGZpcnN0IGF2YWlsYWJsZSBpbnB1dCBmaWVsZCB3aGVuXHJcblx0XHRcdC8vIHBhZ2UgYmxvY2tpbmdcclxuXHRcdFx0Zm9jdXNJbnB1dDogdHJ1ZSxcclxuXHJcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgY2FuIHJlY2VpdmUgZm9jdXNcclxuICAgICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHM6ICc6aW5wdXQ6ZW5hYmxlZDp2aXNpYmxlJyxcclxuXHJcblx0XHRcdC8vIHN1cHByZXNzZXMgdGhlIHVzZSBvZiBvdmVybGF5IHN0eWxlcyBvbiBGRi9MaW51eCAoZHVlIHRvIHBlcmZvcm1hbmNlIGlzc3VlcyB3aXRoIG9wYWNpdHkpXHJcblx0XHRcdC8vIG5vIGxvbmdlciBuZWVkZWQgaW4gMjAxMlxyXG5cdFx0XHQvLyBhcHBseVBsYXRmb3JtT3BhY2l0eVJ1bGVzOiB0cnVlLFxyXG5cclxuXHRcdFx0Ly8gY2FsbGJhY2sgbWV0aG9kIGludm9rZWQgd2hlbiBmYWRlSW4gaGFzIGNvbXBsZXRlZCBhbmQgYmxvY2tpbmcgbWVzc2FnZSBpcyB2aXNpYmxlXHJcblx0XHRcdG9uQmxvY2s6IG51bGwsXHJcblxyXG5cdFx0XHQvLyBjYWxsYmFjayBtZXRob2QgaW52b2tlZCB3aGVuIHVuYmxvY2tpbmcgaGFzIGNvbXBsZXRlZDsgdGhlIGNhbGxiYWNrIGlzXHJcblx0XHRcdC8vIHBhc3NlZCB0aGUgZWxlbWVudCB0aGF0IGhhcyBiZWVuIHVuYmxvY2tlZCAod2hpY2ggaXMgdGhlIHdpbmRvdyBvYmplY3QgZm9yIHBhZ2VcclxuXHRcdFx0Ly8gYmxvY2tzKSBhbmQgdGhlIG9wdGlvbnMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGUgdW5ibG9jayBjYWxsOlxyXG5cdFx0XHQvL1x0b25VbmJsb2NrKGVsZW1lbnQsIG9wdGlvbnMpXHJcblx0XHRcdG9uVW5ibG9jazogbnVsbCxcclxuXHJcblx0XHRcdC8vIGNhbGxiYWNrIG1ldGhvZCBpbnZva2VkIHdoZW4gdGhlIG92ZXJsYXkgYXJlYSBpcyBjbGlja2VkLlxyXG5cdFx0XHQvLyBzZXR0aW5nIHRoaXMgd2lsbCB0dXJuIHRoZSBjdXJzb3IgdG8gYSBwb2ludGVyLCBvdGhlcndpc2UgY3Vyc29yIGRlZmluZWQgaW4gb3ZlcmxheUNzcyB3aWxsIGJlIHVzZWQuXHJcblx0XHRcdG9uT3ZlcmxheUNsaWNrOiBudWxsLFxyXG5cclxuXHRcdFx0Ly8gZG9uJ3QgYXNrOyBpZiB5b3UgcmVhbGx5IG11c3Qga25vdzogaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL3JlcXVpcmVkVXBsb2Fkcy9qcXVlcnktZW4vYnJvd3NlX3RocmVhZC90aHJlYWQvMzY2NDBhODczMDUwMzU5NS8yZjZhNzlhNzdhNzhlNDkzIzJmNmE3OWE3N2E3OGU0OTNcclxuXHRcdFx0cXVpcmtzbW9kZU9mZnNldEhhY2s6IDQsXHJcblxyXG5cdFx0XHQvLyBjbGFzcyBuYW1lIG9mIHRoZSBtZXNzYWdlIGJsb2NrXHJcblx0XHRcdGJsb2NrTXNnQ2xhc3M6ICdibG9ja01zZycsXHJcblxyXG5cdFx0XHQvLyBpZiBpdCBpcyBhbHJlYWR5IGJsb2NrZWQsIHRoZW4gaWdub3JlIGl0IChkb24ndCB1bmJsb2NrIGFuZCByZWJsb2NrKVxyXG5cdFx0XHRpZ25vcmVJZkJsb2NrZWQ6IGZhbHNlXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zIGZvbGxvdy4uLlxyXG5cclxuXHRcdHZhciBwYWdlQmxvY2sgPSBudWxsO1xyXG5cdFx0dmFyIHBhZ2VCbG9ja0VscyA9IFtdO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGluc3RhbGwoZWwsIG9wdHMpIHtcclxuXHRcdFx0dmFyIGNzcywgdGhlbWVkQ1NTO1xyXG5cdFx0XHR2YXIgZnVsbCA9IChlbCA9PSB3aW5kb3cpO1xyXG5cdFx0XHR2YXIgbXNnID0gKG9wdHMgJiYgb3B0cy5tZXNzYWdlICE9PSB1bmRlZmluZWQgPyBvcHRzLm1lc3NhZ2UgOiB1bmRlZmluZWQpO1xyXG5cdFx0XHRvcHRzID0gJC5leHRlbmQoe30sICQuYmxvY2tVSS5kZWZhdWx0cywgb3B0cyB8fCB7fSk7XHJcblxyXG5cdFx0XHRpZiAob3B0cy5pZ25vcmVJZkJsb2NrZWQgJiYgJChlbCkuZGF0YSgnYmxvY2tVSS5pc0Jsb2NrZWQnKSlcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRvcHRzLm92ZXJsYXlDU1MgPSAkLmV4dGVuZCh7fSwgJC5ibG9ja1VJLmRlZmF1bHRzLm92ZXJsYXlDU1MsIG9wdHMub3ZlcmxheUNTUyB8fCB7fSk7XHJcblx0XHRcdGNzcyA9ICQuZXh0ZW5kKHt9LCAkLmJsb2NrVUkuZGVmYXVsdHMuY3NzLCBvcHRzLmNzcyB8fCB7fSk7XHJcblx0XHRcdGlmIChvcHRzLm9uT3ZlcmxheUNsaWNrKVxyXG5cdFx0XHRcdG9wdHMub3ZlcmxheUNTUy5jdXJzb3IgPSAncG9pbnRlcic7XHJcblxyXG5cdFx0XHR0aGVtZWRDU1MgPSAkLmV4dGVuZCh7fSwgJC5ibG9ja1VJLmRlZmF1bHRzLnRoZW1lZENTUywgb3B0cy50aGVtZWRDU1MgfHwge30pO1xyXG5cdFx0XHRtc2cgPSBtc2cgPT09IHVuZGVmaW5lZCA/IG9wdHMubWVzc2FnZSA6IG1zZztcclxuXHJcblx0XHRcdC8vIHJlbW92ZSB0aGUgY3VycmVudCBibG9jayAoaWYgdGhlcmUgaXMgb25lKVxyXG5cdFx0XHRpZiAoZnVsbCAmJiBwYWdlQmxvY2spXHJcblx0XHRcdFx0cmVtb3ZlKHdpbmRvdywge2ZhZGVPdXQ6MH0pO1xyXG5cclxuXHRcdFx0Ly8gaWYgYW4gZXhpc3RpbmcgZWxlbWVudCBpcyBiZWluZyB1c2VkIGFzIHRoZSBibG9ja2luZyBjb250ZW50IHRoZW4gd2UgY2FwdHVyZVxyXG5cdFx0XHQvLyBpdHMgY3VycmVudCBwbGFjZSBpbiB0aGUgRE9NIChhbmQgY3VycmVudCBkaXNwbGF5IHN0eWxlKSBzbyB3ZSBjYW4gcmVzdG9yZVxyXG5cdFx0XHQvLyBpdCB3aGVuIHdlIHVuYmxvY2tcclxuXHRcdFx0aWYgKG1zZyAmJiB0eXBlb2YgbXNnICE9ICdzdHJpbmcnICYmIChtc2cucGFyZW50Tm9kZSB8fCBtc2cuanF1ZXJ5KSkge1xyXG5cdFx0XHRcdHZhciBub2RlID0gbXNnLmpxdWVyeSA/IG1zZ1swXSA6IG1zZztcclxuXHRcdFx0XHR2YXIgZGF0YSA9IHt9O1xyXG5cdFx0XHRcdCQoZWwpLmRhdGEoJ2Jsb2NrVUkuaGlzdG9yeScsIGRhdGEpO1xyXG5cdFx0XHRcdGRhdGEuZWwgPSBub2RlO1xyXG5cdFx0XHRcdGRhdGEucGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xyXG5cdFx0XHRcdGRhdGEuZGlzcGxheSA9IG5vZGUuc3R5bGUuZGlzcGxheTtcclxuXHRcdFx0XHRkYXRhLnBvc2l0aW9uID0gbm9kZS5zdHlsZS5wb3NpdGlvbjtcclxuXHRcdFx0XHRpZiAoZGF0YS5wYXJlbnQpXHJcblx0XHRcdFx0XHRkYXRhLnBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0JChlbCkuZGF0YSgnYmxvY2tVSS5vblVuYmxvY2snLCBvcHRzLm9uVW5ibG9jayk7XHJcblx0XHRcdHZhciB6ID0gb3B0cy5iYXNlWjtcclxuXHJcblx0XHRcdC8vIGJsb2NrVUkgdXNlcyAzIGxheWVycyBmb3IgYmxvY2tpbmcsIGZvciBzaW1wbGljaXR5IHRoZXkgYXJlIGFsbCB1c2VkIG9uIGV2ZXJ5IHBsYXRmb3JtO1xyXG5cdFx0XHQvLyBsYXllcjEgaXMgdGhlIGlmcmFtZSBsYXllciB3aGljaCBpcyB1c2VkIHRvIHN1cHJlc3MgYmxlZWQgdGhyb3VnaCBvZiB1bmRlcmx5aW5nIGNvbnRlbnRcclxuXHRcdFx0Ly8gbGF5ZXIyIGlzIHRoZSBvdmVybGF5IGxheWVyIHdoaWNoIGhhcyBvcGFjaXR5IGFuZCBhIHdhaXQgY3Vyc29yIChieSBkZWZhdWx0KVxyXG5cdFx0XHQvLyBsYXllcjMgaXMgdGhlIG1lc3NhZ2UgY29udGVudCB0aGF0IGlzIGRpc3BsYXllZCB3aGlsZSBibG9ja2luZ1xyXG5cdFx0XHR2YXIgbHlyMSwgbHlyMiwgbHlyMywgcztcclxuXHRcdFx0aWYgKG1zaWUgfHwgb3B0cy5mb3JjZUlmcmFtZSlcclxuXHRcdFx0XHRseXIxID0gJCgnPGlmcmFtZSBjbGFzcz1cImJsb2NrVUlcIiBzdHlsZT1cInotaW5kZXg6JysgKHorKykgKyc7ZGlzcGxheTpub25lO2JvcmRlcjpub25lO21hcmdpbjowO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MFwiIHNyYz1cIicrb3B0cy5pZnJhbWVTcmMrJ1wiPjwvaWZyYW1lPicpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0bHlyMSA9ICQoJzxkaXYgY2xhc3M9XCJibG9ja1VJXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj48L2Rpdj4nKTtcclxuXHJcblx0XHRcdGlmIChvcHRzLnRoZW1lKVxyXG5cdFx0XHRcdGx5cjIgPSAkKCc8ZGl2IGNsYXNzPVwiYmxvY2tVSSBibG9ja092ZXJsYXkgdWktd2lkZ2V0LW92ZXJsYXlcIiBzdHlsZT1cInotaW5kZXg6JysgKHorKykgKyc7ZGlzcGxheTpub25lXCI+PC9kaXY+Jyk7XHJcblx0XHRcdGVsc2VcclxuXHRcdFx0XHRseXIyID0gJCgnPGRpdiBjbGFzcz1cImJsb2NrVUkgYmxvY2tPdmVybGF5XCIgc3R5bGU9XCJ6LWluZGV4OicrICh6KyspICsnO2Rpc3BsYXk6bm9uZTtib3JkZXI6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjBcIj48L2Rpdj4nKTtcclxuXHJcblx0XHRcdGlmIChvcHRzLnRoZW1lICYmIGZ1bGwpIHtcclxuXHRcdFx0XHRzID0gJzxkaXYgY2xhc3M9XCJibG9ja1VJICcgKyBvcHRzLmJsb2NrTXNnQ2xhc3MgKyAnIGJsb2NrUGFnZSB1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGxcIiBzdHlsZT1cInotaW5kZXg6JysoeisxMCkrJztkaXNwbGF5Om5vbmU7cG9zaXRpb246Zml4ZWRcIj4nO1xyXG5cdFx0XHRcdGlmICggb3B0cy50aXRsZSApIHtcclxuXHRcdFx0XHRcdHMgKz0gJzxkaXYgY2xhc3M9XCJ1aS13aWRnZXQtaGVhZGVyIHVpLWRpYWxvZy10aXRsZWJhciB1aS1jb3JuZXItYWxsIGJsb2NrVGl0bGVcIj4nKyhvcHRzLnRpdGxlIHx8ICcmbmJzcDsnKSsnPC9kaXY+JztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cyArPSAnPGRpdiBjbGFzcz1cInVpLXdpZGdldC1jb250ZW50IHVpLWRpYWxvZy1jb250ZW50XCI+PC9kaXY+JztcclxuXHRcdFx0XHRzICs9ICc8L2Rpdj4nO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYgKG9wdHMudGhlbWUpIHtcclxuXHRcdFx0XHRzID0gJzxkaXYgY2xhc3M9XCJibG9ja1VJICcgKyBvcHRzLmJsb2NrTXNnQ2xhc3MgKyAnIGJsb2NrRWxlbWVudCB1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGxcIiBzdHlsZT1cInotaW5kZXg6JysoeisxMCkrJztkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGVcIj4nO1xyXG5cdFx0XHRcdGlmICggb3B0cy50aXRsZSApIHtcclxuXHRcdFx0XHRcdHMgKz0gJzxkaXYgY2xhc3M9XCJ1aS13aWRnZXQtaGVhZGVyIHVpLWRpYWxvZy10aXRsZWJhciB1aS1jb3JuZXItYWxsIGJsb2NrVGl0bGVcIj4nKyhvcHRzLnRpdGxlIHx8ICcmbmJzcDsnKSsnPC9kaXY+JztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cyArPSAnPGRpdiBjbGFzcz1cInVpLXdpZGdldC1jb250ZW50IHVpLWRpYWxvZy1jb250ZW50XCI+PC9kaXY+JztcclxuXHRcdFx0XHRzICs9ICc8L2Rpdj4nO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYgKGZ1bGwpIHtcclxuXHRcdFx0XHRzID0gJzxkaXYgY2xhc3M9XCJibG9ja1VJICcgKyBvcHRzLmJsb2NrTXNnQ2xhc3MgKyAnIGJsb2NrUGFnZVwiIHN0eWxlPVwiei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZFwiPjwvZGl2Pic7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0cyA9ICc8ZGl2IGNsYXNzPVwiYmxvY2tVSSAnICsgb3B0cy5ibG9ja01zZ0NsYXNzICsgJyBibG9ja0VsZW1lbnRcIiBzdHlsZT1cInotaW5kZXg6JysoeisxMCkrJztkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGVcIj48L2Rpdj4nO1xyXG5cdFx0XHR9XHJcblx0XHRcdGx5cjMgPSAkKHMpO1xyXG5cclxuXHRcdFx0Ly8gaWYgd2UgaGF2ZSBhIG1lc3NhZ2UsIHN0eWxlIGl0XHJcblx0XHRcdGlmIChtc2cpIHtcclxuXHRcdFx0XHRpZiAob3B0cy50aGVtZSkge1xyXG5cdFx0XHRcdFx0bHlyMy5jc3ModGhlbWVkQ1NTKTtcclxuXHRcdFx0XHRcdGx5cjMuYWRkQ2xhc3MoJ3VpLXdpZGdldC1jb250ZW50Jyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVsc2VcclxuXHRcdFx0XHRcdGx5cjMuY3NzKGNzcyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHN0eWxlIHRoZSBvdmVybGF5XHJcblx0XHRcdGlmICghb3B0cy50aGVtZSAvKiYmICghb3B0cy5hcHBseVBsYXRmb3JtT3BhY2l0eVJ1bGVzKSovKVxyXG5cdFx0XHRcdGx5cjIuY3NzKG9wdHMub3ZlcmxheUNTUyk7XHJcblx0XHRcdGx5cjIuY3NzKCdwb3NpdGlvbicsIGZ1bGwgPyAnZml4ZWQnIDogJ2Fic29sdXRlJyk7XHJcblxyXG5cdFx0XHQvLyBtYWtlIGlmcmFtZSBsYXllciB0cmFuc3BhcmVudCBpbiBJRVxyXG5cdFx0XHRpZiAobXNpZSB8fCBvcHRzLmZvcmNlSWZyYW1lKVxyXG5cdFx0XHRcdGx5cjEuY3NzKCdvcGFjaXR5JywwLjApO1xyXG5cclxuXHRcdFx0Ly8kKFtseXIxWzBdLGx5cjJbMF0sbHlyM1swXV0pLmFwcGVuZFRvKGZ1bGwgPyAnYm9keScgOiBlbCk7XHJcblx0XHRcdHZhciBsYXllcnMgPSBbbHlyMSxseXIyLGx5cjNdLCAkcGFyID0gZnVsbCA/ICQoJ2JvZHknKSA6ICQoZWwpO1xyXG5cdFx0XHQkLmVhY2gobGF5ZXJzLCBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHR0aGlzLmFwcGVuZFRvKCRwYXIpO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGlmIChvcHRzLnRoZW1lICYmIG9wdHMuZHJhZ2dhYmxlICYmICQuZm4uZHJhZ2dhYmxlKSB7XHJcblx0XHRcdFx0bHlyMy5kcmFnZ2FibGUoe1xyXG5cdFx0XHRcdFx0aGFuZGxlOiAnLnVpLWRpYWxvZy10aXRsZWJhcicsXHJcblx0XHRcdFx0XHRjYW5jZWw6ICdsaSdcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaWU3IG11c3QgdXNlIGFic29sdXRlIHBvc2l0aW9uaW5nIGluIHF1aXJrcyBtb2RlIGFuZCB0byBhY2NvdW50IGZvciBhY3RpdmV4IGlzc3VlcyAod2hlbiBzY3JvbGxpbmcpXHJcblx0XHRcdHZhciBleHByID0gc2V0RXhwciAmJiAoISQuc3VwcG9ydC5ib3hNb2RlbCB8fCAkKCdvYmplY3QsZW1iZWQnLCBmdWxsID8gbnVsbCA6IGVsKS5sZW5ndGggPiAwKTtcclxuXHRcdFx0aWYgKGllNiB8fCBleHByKSB7XHJcblx0XHRcdFx0Ly8gZ2l2ZSBib2R5IDEwMCUgaGVpZ2h0XHJcblx0XHRcdFx0aWYgKGZ1bGwgJiYgb3B0cy5hbGxvd0JvZHlTdHJldGNoICYmICQuc3VwcG9ydC5ib3hNb2RlbClcclxuXHRcdFx0XHRcdCQoJ2h0bWwsYm9keScpLmNzcygnaGVpZ2h0JywnMTAwJScpO1xyXG5cclxuXHRcdFx0XHQvLyBmaXggaWU2IGlzc3VlIHdoZW4gYmxvY2tlZCBlbGVtZW50IGhhcyBhIGJvcmRlciB3aWR0aFxyXG5cdFx0XHRcdGlmICgoaWU2IHx8ICEkLnN1cHBvcnQuYm94TW9kZWwpICYmICFmdWxsKSB7XHJcblx0XHRcdFx0XHR2YXIgdCA9IHN6KGVsLCdib3JkZXJUb3BXaWR0aCcpLCBsID0gc3ooZWwsJ2JvcmRlckxlZnRXaWR0aCcpO1xyXG5cdFx0XHRcdFx0dmFyIGZpeFQgPSB0ID8gJygwIC0gJyt0KycpJyA6IDA7XHJcblx0XHRcdFx0XHR2YXIgZml4TCA9IGwgPyAnKDAgLSAnK2wrJyknIDogMDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIHNpbXVsYXRlIGZpeGVkIHBvc2l0aW9uXHJcblx0XHRcdFx0JC5lYWNoKGxheWVycywgZnVuY3Rpb24oaSxvKSB7XHJcblx0XHRcdFx0XHR2YXIgcyA9IG9bMF0uc3R5bGU7XHJcblx0XHRcdFx0XHRzLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuXHRcdFx0XHRcdGlmIChpIDwgMikge1xyXG5cdFx0XHRcdFx0XHRpZiAoZnVsbClcclxuXHRcdFx0XHRcdFx0XHRzLnNldEV4cHJlc3Npb24oJ2hlaWdodCcsJ01hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgLSAoalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWw/MDonK29wdHMucXVpcmtzbW9kZU9mZnNldEhhY2srJykgKyBcInB4XCInKTtcclxuXHRcdFx0XHRcdFx0ZWxzZVxyXG5cdFx0XHRcdFx0XHRcdHMuc2V0RXhwcmVzc2lvbignaGVpZ2h0JywndGhpcy5wYXJlbnROb2RlLm9mZnNldEhlaWdodCArIFwicHhcIicpO1xyXG5cdFx0XHRcdFx0XHRpZiAoZnVsbClcclxuXHRcdFx0XHRcdFx0XHRzLnNldEV4cHJlc3Npb24oJ3dpZHRoJywnalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIHx8IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggKyBcInB4XCInKTtcclxuXHRcdFx0XHRcdFx0ZWxzZVxyXG5cdFx0XHRcdFx0XHRcdHMuc2V0RXhwcmVzc2lvbignd2lkdGgnLCd0aGlzLnBhcmVudE5vZGUub2Zmc2V0V2lkdGggKyBcInB4XCInKTtcclxuXHRcdFx0XHRcdFx0aWYgKGZpeEwpIHMuc2V0RXhwcmVzc2lvbignbGVmdCcsIGZpeEwpO1xyXG5cdFx0XHRcdFx0XHRpZiAoZml4VCkgcy5zZXRFeHByZXNzaW9uKCd0b3AnLCBmaXhUKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsc2UgaWYgKG9wdHMuY2VudGVyWSkge1xyXG5cdFx0XHRcdFx0XHRpZiAoZnVsbCkgcy5zZXRFeHByZXNzaW9uKCd0b3AnLCcoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkgLyAyIC0gKHRoaXMub2Zmc2V0SGVpZ2h0IC8gMikgKyAoYmxhaCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIDogZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsgXCJweFwiJyk7XHJcblx0XHRcdFx0XHRcdHMubWFyZ2luVG9wID0gMDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsc2UgaWYgKCFvcHRzLmNlbnRlclkgJiYgZnVsbCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgdG9wID0gKG9wdHMuY3NzICYmIG9wdHMuY3NzLnRvcCkgPyBwYXJzZUludChvcHRzLmNzcy50b3AsIDEwKSA6IDA7XHJcblx0XHRcdFx0XHRcdHZhciBleHByZXNzaW9uID0gJygoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgOiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCkgKyAnK3RvcCsnKSArIFwicHhcIic7XHJcblx0XHRcdFx0XHRcdHMuc2V0RXhwcmVzc2lvbigndG9wJyxleHByZXNzaW9uKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gc2hvdyB0aGUgbWVzc2FnZVxyXG5cdFx0XHRpZiAobXNnKSB7XHJcblx0XHRcdFx0aWYgKG9wdHMudGhlbWUpXHJcblx0XHRcdFx0XHRseXIzLmZpbmQoJy51aS13aWRnZXQtY29udGVudCcpLmFwcGVuZChtc2cpO1xyXG5cdFx0XHRcdGVsc2VcclxuXHRcdFx0XHRcdGx5cjMuYXBwZW5kKG1zZyk7XHJcblx0XHRcdFx0aWYgKG1zZy5qcXVlcnkgfHwgbXNnLm5vZGVUeXBlKVxyXG5cdFx0XHRcdFx0JChtc2cpLnNob3coKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKChtc2llIHx8IG9wdHMuZm9yY2VJZnJhbWUpICYmIG9wdHMuc2hvd092ZXJsYXkpXHJcblx0XHRcdFx0bHlyMS5zaG93KCk7IC8vIG9wYWNpdHkgaXMgemVyb1xyXG5cdFx0XHRpZiAob3B0cy5mYWRlSW4pIHtcclxuXHRcdFx0XHR2YXIgY2IgPSBvcHRzLm9uQmxvY2sgPyBvcHRzLm9uQmxvY2sgOiBub09wO1xyXG5cdFx0XHRcdHZhciBjYjEgPSAob3B0cy5zaG93T3ZlcmxheSAmJiAhbXNnKSA/IGNiIDogbm9PcDtcclxuXHRcdFx0XHR2YXIgY2IyID0gbXNnID8gY2IgOiBub09wO1xyXG5cdFx0XHRcdGlmIChvcHRzLnNob3dPdmVybGF5KVxyXG5cdFx0XHRcdFx0bHlyMi5fZmFkZUluKG9wdHMuZmFkZUluLCBjYjEpO1xyXG5cdFx0XHRcdGlmIChtc2cpXHJcblx0XHRcdFx0XHRseXIzLl9mYWRlSW4ob3B0cy5mYWRlSW4sIGNiMik7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0aWYgKG9wdHMuc2hvd092ZXJsYXkpXHJcblx0XHRcdFx0XHRseXIyLnNob3coKTtcclxuXHRcdFx0XHRpZiAobXNnKVxyXG5cdFx0XHRcdFx0bHlyMy5zaG93KCk7XHJcblx0XHRcdFx0aWYgKG9wdHMub25CbG9jaylcclxuXHRcdFx0XHRcdG9wdHMub25CbG9jaygpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBiaW5kIGtleSBhbmQgbW91c2UgZXZlbnRzXHJcblx0XHRcdGJpbmQoMSwgZWwsIG9wdHMpO1xyXG5cclxuXHRcdFx0aWYgKGZ1bGwpIHtcclxuXHRcdFx0XHRwYWdlQmxvY2sgPSBseXIzWzBdO1xyXG5cdFx0XHRcdHBhZ2VCbG9ja0VscyA9ICQob3B0cy5mb2N1c2FibGVFbGVtZW50cyxwYWdlQmxvY2spO1xyXG5cdFx0XHRcdGlmIChvcHRzLmZvY3VzSW5wdXQpXHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZvY3VzLCAyMCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdGNlbnRlcihseXIzWzBdLCBvcHRzLmNlbnRlclgsIG9wdHMuY2VudGVyWSk7XHJcblxyXG5cdFx0XHRpZiAob3B0cy50aW1lb3V0KSB7XHJcblx0XHRcdFx0Ly8gYXV0by11bmJsb2NrXHJcblx0XHRcdFx0dmFyIHRvID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdGlmIChmdWxsKVxyXG5cdFx0XHRcdFx0XHQkLnVuYmxvY2tVSShvcHRzKTtcclxuXHRcdFx0XHRcdGVsc2VcclxuXHRcdFx0XHRcdFx0JChlbCkudW5ibG9jayhvcHRzKTtcclxuXHRcdFx0XHR9LCBvcHRzLnRpbWVvdXQpO1xyXG5cdFx0XHRcdCQoZWwpLmRhdGEoJ2Jsb2NrVUkudGltZW91dCcsIHRvKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHJlbW92ZSB0aGUgYmxvY2tcclxuXHRcdGZ1bmN0aW9uIHJlbW92ZShlbCwgb3B0cykge1xyXG5cdFx0XHR2YXIgY291bnQ7XHJcblx0XHRcdHZhciBmdWxsID0gKGVsID09IHdpbmRvdyk7XHJcblx0XHRcdHZhciAkZWwgPSAkKGVsKTtcclxuXHRcdFx0dmFyIGRhdGEgPSAkZWwuZGF0YSgnYmxvY2tVSS5oaXN0b3J5Jyk7XHJcblx0XHRcdHZhciB0byA9ICRlbC5kYXRhKCdibG9ja1VJLnRpbWVvdXQnKTtcclxuXHRcdFx0aWYgKHRvKSB7XHJcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRvKTtcclxuXHRcdFx0XHQkZWwucmVtb3ZlRGF0YSgnYmxvY2tVSS50aW1lb3V0Jyk7XHJcblx0XHRcdH1cclxuXHRcdFx0b3B0cyA9ICQuZXh0ZW5kKHt9LCAkLmJsb2NrVUkuZGVmYXVsdHMsIG9wdHMgfHwge30pO1xyXG5cdFx0XHRiaW5kKDAsIGVsLCBvcHRzKTsgLy8gdW5iaW5kIGV2ZW50c1xyXG5cclxuXHRcdFx0aWYgKG9wdHMub25VbmJsb2NrID09PSBudWxsKSB7XHJcblx0XHRcdFx0b3B0cy5vblVuYmxvY2sgPSAkZWwuZGF0YSgnYmxvY2tVSS5vblVuYmxvY2snKTtcclxuXHRcdFx0XHQkZWwucmVtb3ZlRGF0YSgnYmxvY2tVSS5vblVuYmxvY2snKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGVscztcclxuXHRcdFx0aWYgKGZ1bGwpIC8vIGNyYXp5IHNlbGVjdG9yIHRvIGhhbmRsZSBvZGQgZmllbGQgZXJyb3JzIGluIGllNi83XHJcblx0XHRcdFx0ZWxzID0gJCgnYm9keScpLmNoaWxkcmVuKCkuZmlsdGVyKCcuYmxvY2tVSScpLmFkZCgnYm9keSA+IC5ibG9ja1VJJyk7XHJcblx0XHRcdGVsc2VcclxuXHRcdFx0XHRlbHMgPSAkZWwuZmluZCgnPi5ibG9ja1VJJyk7XHJcblxyXG5cdFx0XHQvLyBmaXggY3Vyc29yIGlzc3VlXHJcblx0XHRcdGlmICggb3B0cy5jdXJzb3JSZXNldCApIHtcclxuXHRcdFx0XHRpZiAoIGVscy5sZW5ndGggPiAxIClcclxuXHRcdFx0XHRcdGVsc1sxXS5zdHlsZS5jdXJzb3IgPSBvcHRzLmN1cnNvclJlc2V0O1xyXG5cdFx0XHRcdGlmICggZWxzLmxlbmd0aCA+IDIgKVxyXG5cdFx0XHRcdFx0ZWxzWzJdLnN0eWxlLmN1cnNvciA9IG9wdHMuY3Vyc29yUmVzZXQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChmdWxsKVxyXG5cdFx0XHRcdHBhZ2VCbG9jayA9IHBhZ2VCbG9ja0VscyA9IG51bGw7XHJcblxyXG5cdFx0XHRpZiAob3B0cy5mYWRlT3V0KSB7XHJcblx0XHRcdFx0Y291bnQgPSBlbHMubGVuZ3RoO1xyXG5cdFx0XHRcdGVscy5zdG9wKCkuZmFkZU91dChvcHRzLmZhZGVPdXQsIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0aWYgKCAtLWNvdW50ID09PSAwKVxyXG5cdFx0XHRcdFx0XHRyZXNldChlbHMsZGF0YSxvcHRzLGVsKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0cmVzZXQoZWxzLCBkYXRhLCBvcHRzLCBlbCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gbW92ZSBibG9ja2luZyBlbGVtZW50IGJhY2sgaW50byB0aGUgRE9NIHdoZXJlIGl0IHN0YXJ0ZWRcclxuXHRcdGZ1bmN0aW9uIHJlc2V0KGVscyxkYXRhLG9wdHMsZWwpIHtcclxuXHRcdFx0dmFyICRlbCA9ICQoZWwpO1xyXG5cdFx0XHRpZiAoICRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpIClcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRlbHMuZWFjaChmdW5jdGlvbihpLG8pIHtcclxuXHRcdFx0XHQvLyByZW1vdmUgdmlhIERPTSBjYWxscyBzbyB3ZSBkb24ndCBsb3NlIGV2ZW50IGhhbmRsZXJzXHJcblx0XHRcdFx0aWYgKHRoaXMucGFyZW50Tm9kZSlcclxuXHRcdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoZGF0YSAmJiBkYXRhLmVsKSB7XHJcblx0XHRcdFx0ZGF0YS5lbC5zdHlsZS5kaXNwbGF5ID0gZGF0YS5kaXNwbGF5O1xyXG5cdFx0XHRcdGRhdGEuZWwuc3R5bGUucG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uO1xyXG5cdFx0XHRcdGlmIChkYXRhLnBhcmVudClcclxuXHRcdFx0XHRcdGRhdGEucGFyZW50LmFwcGVuZENoaWxkKGRhdGEuZWwpO1xyXG5cdFx0XHRcdCRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLmhpc3RvcnknKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCRlbC5kYXRhKCdibG9ja1VJLnN0YXRpYycpKSB7XHJcblx0XHRcdFx0JGVsLmNzcygncG9zaXRpb24nLCAnc3RhdGljJyk7IC8vICMyMlxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAodHlwZW9mIG9wdHMub25VbmJsb2NrID09ICdmdW5jdGlvbicpXHJcblx0XHRcdFx0b3B0cy5vblVuYmxvY2soZWwsb3B0cyk7XHJcblxyXG5cdFx0XHQvLyBmaXggaXNzdWUgaW4gU2FmYXJpIDYgd2hlcmUgYmxvY2sgYXJ0aWZhY3RzIHJlbWFpbiB1bnRpbCByZWZsb3dcclxuXHRcdFx0dmFyIGJvZHkgPSAkKGRvY3VtZW50LmJvZHkpLCB3ID0gYm9keS53aWR0aCgpLCBjc3NXID0gYm9keVswXS5zdHlsZS53aWR0aDtcclxuXHRcdFx0Ym9keS53aWR0aCh3LTEpLndpZHRoKHcpO1xyXG5cdFx0XHRib2R5WzBdLnN0eWxlLndpZHRoID0gY3NzVztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBiaW5kL3VuYmluZCB0aGUgaGFuZGxlclxyXG5cdFx0ZnVuY3Rpb24gYmluZChiLCBlbCwgb3B0cykge1xyXG5cdFx0XHR2YXIgZnVsbCA9IGVsID09IHdpbmRvdywgJGVsID0gJChlbCk7XHJcblxyXG5cdFx0XHQvLyBkb24ndCBib3RoZXIgdW5iaW5kaW5nIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5iaW5kXHJcblx0XHRcdGlmICghYiAmJiAoZnVsbCAmJiAhcGFnZUJsb2NrIHx8ICFmdWxsICYmICEkZWwuZGF0YSgnYmxvY2tVSS5pc0Jsb2NrZWQnKSkpXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0JGVsLmRhdGEoJ2Jsb2NrVUkuaXNCbG9ja2VkJywgYik7XHJcblxyXG5cdFx0XHQvLyBkb24ndCBiaW5kIGV2ZW50cyB3aGVuIG92ZXJsYXkgaXMgbm90IGluIHVzZSBvciBpZiBiaW5kRXZlbnRzIGlzIGZhbHNlXHJcblx0XHRcdGlmICghZnVsbCB8fCAhb3B0cy5iaW5kRXZlbnRzIHx8IChiICYmICFvcHRzLnNob3dPdmVybGF5KSlcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHQvLyBiaW5kIGFuY2hvcnMgYW5kIGlucHV0cyBmb3IgbW91c2UgYW5kIGtleSBldmVudHNcclxuXHRcdFx0dmFyIGV2ZW50cyA9ICdtb3VzZWRvd24gbW91c2V1cCBrZXlkb3duIGtleXByZXNzIGtleXVwIHRvdWNoc3RhcnQgdG91Y2hlbmQgdG91Y2htb3ZlJztcclxuXHRcdFx0aWYgKGIpXHJcblx0XHRcdFx0JChkb2N1bWVudCkuYmluZChldmVudHMsIG9wdHMsIGhhbmRsZXIpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0JChkb2N1bWVudCkudW5iaW5kKGV2ZW50cywgaGFuZGxlcik7XHJcblxyXG5cdFx0Ly8gZm9ybWVyIGltcGwuLi5cclxuXHRcdC8vXHRcdHZhciAkZSA9ICQoJ2EsOmlucHV0Jyk7XHJcblx0XHQvL1x0XHRiID8gJGUuYmluZChldmVudHMsIG9wdHMsIGhhbmRsZXIpIDogJGUudW5iaW5kKGV2ZW50cywgaGFuZGxlcik7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZXZlbnQgaGFuZGxlciB0byBzdXBwcmVzcyBrZXlib2FyZC9tb3VzZSBldmVudHMgd2hlbiBibG9ja2luZ1xyXG5cdFx0ZnVuY3Rpb24gaGFuZGxlcihlKSB7XHJcblx0XHRcdC8vIGFsbG93IHRhYiBuYXZpZ2F0aW9uIChjb25kaXRpb25hbGx5KVxyXG5cdFx0XHRpZiAoZS50eXBlID09PSAna2V5ZG93bicgJiYgZS5rZXlDb2RlICYmIGUua2V5Q29kZSA9PSA5KSB7XHJcblx0XHRcdFx0aWYgKHBhZ2VCbG9jayAmJiBlLmRhdGEuY29uc3RyYWluVGFiS2V5KSB7XHJcblx0XHRcdFx0XHR2YXIgZWxzID0gcGFnZUJsb2NrRWxzO1xyXG5cdFx0XHRcdFx0dmFyIGZ3ZCA9ICFlLnNoaWZ0S2V5ICYmIGUudGFyZ2V0ID09PSBlbHNbZWxzLmxlbmd0aC0xXTtcclxuXHRcdFx0XHRcdHZhciBiYWNrID0gZS5zaGlmdEtleSAmJiBlLnRhcmdldCA9PT0gZWxzWzBdO1xyXG5cdFx0XHRcdFx0aWYgKGZ3ZCB8fCBiYWNrKSB7XHJcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmb2N1cyhiYWNrKTt9LDEwKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR2YXIgb3B0cyA9IGUuZGF0YTtcclxuXHRcdFx0dmFyIHRhcmdldCA9ICQoZS50YXJnZXQpO1xyXG5cdFx0XHRpZiAodGFyZ2V0Lmhhc0NsYXNzKCdibG9ja092ZXJsYXknKSAmJiBvcHRzLm9uT3ZlcmxheUNsaWNrKVxyXG5cdFx0XHRcdG9wdHMub25PdmVybGF5Q2xpY2soZSk7XHJcblxyXG5cdFx0XHQvLyBhbGxvdyBldmVudHMgd2l0aGluIHRoZSBtZXNzYWdlIGNvbnRlbnRcclxuXHRcdFx0aWYgKHRhcmdldC5wYXJlbnRzKCdkaXYuJyArIG9wdHMuYmxvY2tNc2dDbGFzcykubGVuZ3RoID4gMClcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdC8vIGFsbG93IGV2ZW50cyBmb3IgY29udGVudCB0aGF0IGlzIG5vdCBiZWluZyBibG9ja2VkXHJcblx0XHRcdHJldHVybiB0YXJnZXQucGFyZW50cygpLmNoaWxkcmVuKCkuZmlsdGVyKCdkaXYuYmxvY2tVSScpLmxlbmd0aCA9PT0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBmb2N1cyhiYWNrKSB7XHJcblx0XHRcdGlmICghcGFnZUJsb2NrRWxzKVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0dmFyIGUgPSBwYWdlQmxvY2tFbHNbYmFjaz09PXRydWUgPyBwYWdlQmxvY2tFbHMubGVuZ3RoLTEgOiAwXTtcclxuXHRcdFx0aWYgKGUpXHJcblx0XHRcdFx0ZS5mb2N1cygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNlbnRlcihlbCwgeCwgeSkge1xyXG5cdFx0XHR2YXIgcCA9IGVsLnBhcmVudE5vZGUsIHMgPSBlbC5zdHlsZTtcclxuXHRcdFx0dmFyIGwgPSAoKHAub2Zmc2V0V2lkdGggLSBlbC5vZmZzZXRXaWR0aCkvMikgLSBzeihwLCdib3JkZXJMZWZ0V2lkdGgnKTtcclxuXHRcdFx0dmFyIHQgPSAoKHAub2Zmc2V0SGVpZ2h0IC0gZWwub2Zmc2V0SGVpZ2h0KS8yKSAtIHN6KHAsJ2JvcmRlclRvcFdpZHRoJyk7XHJcblx0XHRcdGlmICh4KSBzLmxlZnQgPSBsID4gMCA/IChsKydweCcpIDogJzAnO1xyXG5cdFx0XHRpZiAoeSkgcy50b3AgID0gdCA+IDAgPyAodCsncHgnKSA6ICcwJztcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBzeihlbCwgcCkge1xyXG5cdFx0XHRyZXR1cm4gcGFyc2VJbnQoJC5jc3MoZWwscCksMTApfHwwO1xyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvKmdsb2JhbCBkZWZpbmU6dHJ1ZSAqL1xyXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgJiYgZGVmaW5lLmFtZC5qUXVlcnkpIHtcclxuXHRcdGRlZmluZShbJ2pxdWVyeSddLCBzZXR1cCk7XHJcblx0fSBlbHNlIHtcclxuXHRcdHNldHVwKGpRdWVyeSk7XHJcblx0fVxyXG5cclxufSkoKTtcclxuIl0sImZpbGUiOiJqcXVlcnkuYmxvY2tVSS5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload-process.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload-process.js index 511f68268..464c2e0c0 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload-process.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload-process.js @@ -171,4 +171,4 @@ })); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnkuZmlsZXVwbG9hZC1wcm9jZXNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBqUXVlcnkgRmlsZSBVcGxvYWQgUHJvY2Vzc2luZyBQbHVnaW4gMS4zLjBcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZFxuICpcbiAqIENvcHlyaWdodCAyMDEyLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuXG4vKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi9cbi8qIGdsb2JhbCBkZWZpbmUsIHdpbmRvdyAqL1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZTpcbiAgICAgICAgZGVmaW5lKFtcbiAgICAgICAgICAgICdqcXVlcnknLFxuICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQnXG4gICAgICAgIF0sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczpcbiAgICAgICAgZmFjdG9yeShcbiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnlcbiAgICAgICAgKTtcbiAgICB9XG59KGZ1bmN0aW9uICgkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIG9yaWdpbmFsQWRkID0gJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLm9wdGlvbnMuYWRkO1xuXG4gICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0XG4gICAgLy8gd2l0aCBmaWxlIHByb2Nlc3NpbmcgZnVuY3Rpb25hbGl0eTpcbiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHtcblxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAvLyBUaGUgbGlzdCBvZiBwcm9jZXNzaW5nIGFjdGlvbnM6XG4gICAgICAgICAgICBwcm9jZXNzUXVldWU6IFtcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RlYnVnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgIGRhdGEucHJvY2VzcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy5maWxldXBsb2FkKCdwcm9jZXNzJywgZGF0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxBZGQuY2FsbCh0aGlzLCBlLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBwcm9jZXNzQWN0aW9uczoge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIGxvZzogZnVuY3Rpb24gKGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlW29wdGlvbnMudHlwZV0oXG4gICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nIFwiJyArIGRhdGEuZmlsZXNbZGF0YS5pbmRleF0ubmFtZSArICdcIidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgfSxcblxuICAgICAgICBfcHJvY2Vzc0ZpbGU6IGZ1bmN0aW9uIChkYXRhLCBvcmlnaW5hbERhdGEpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhhdCwgW2RhdGFdKSxcbiAgICAgICAgICAgICAgICBjaGFpbiA9IGRmZC5wcm9taXNlKCk7XG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7XG4gICAgICAgICAgICAkLmVhY2goZGF0YS5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uIChpLCBzZXR0aW5ncykge1xuICAgICAgICAgICAgICAgIHZhciBmdW5jID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVqZWN0V2l0aCh0aGF0LCBbb3JpZ2luYWxEYXRhXSkucHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LnByb2Nlc3NBY3Rpb25zW3NldHRpbmdzLmFjdGlvbl0uY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucGlwZShmdW5jLCBzZXR0aW5ncy5hbHdheXMgJiYgZnVuYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNoYWluXG4gICAgICAgICAgICAgICAgLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzZG9uZScsIG51bGwsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NhbHdheXMnLCBudWxsLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBjaGFpbjtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0XG4gICAgICAgIC8vIGFyZSBzdHJpbmdzIHN0YXJ0aW5nIHdpdGggYW4gXCJAXCIsIHVzaW5nIHRoZSByZW1haW5pbmdcbiAgICAgICAgLy8gc3Vic3RyaW5nIGFzIGtleSBmb3IgdGhlIG9wdGlvbiBtYXAsXG4gICAgICAgIC8vIGUuZy4gXCJAYXV0b1VwbG9hZFwiIGlzIHJlcGxhY2VkIHdpdGggb3B0aW9ucy5hdXRvVXBsb2FkOlxuICAgICAgICBfdHJhbnNmb3JtUHJvY2Vzc1F1ZXVlOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMucHJvY2Vzc1F1ZXVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0ge30sXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB0aGlzLnByZWZpeCA9PT0gdHJ1ZSA/IGFjdGlvbiA6IHRoaXMucHJlZml4O1xuICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5jaGFyQXQoMCkgPT09ICdAJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IG9wdGlvbnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKSA6IGtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NRdWV1ZS5wdXNoKHNldHRpbmdzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3B0aW9ucy5wcm9jZXNzUXVldWUgPSBwcm9jZXNzUXVldWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGVzIGN1cnJlbnRseSBpbiB0aGUgcHJvY2Vzc3NpbmcgcXVldWU6XG4gICAgICAgIHByb2Nlc3Npbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLFxuICAgICAgICAvLyByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgdGhhdCBhbGxvd3MgdG8gYmluZCBjYWxsYmFja3M6XG4gICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIGRhdGEpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucHJvY2Vzc1F1ZXVlICYmIG9wdGlvbnMucHJvY2Vzc1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvY2Vzc2luZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzc3RhcnQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJC5lYWNoKGRhdGEuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IGluZGV4ID8gJC5leHRlbmQoe30sIG9wdGlvbnMpIDogb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fcHJvY2Vzc0ZpbGUob3B0cywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBvcHRzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX3Byb2Nlc3NpbmcgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnBpcGUoZnVuYywgZnVuYylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hbHdheXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3Byb2Nlc3NpbmcgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzc3RvcCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlcigpO1xuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc2luZyA9IDA7XG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcylcbiAgICAgICAgICAgICAgICAucHJvbWlzZSgpO1xuICAgICAgICB9XG5cbiAgICB9KTtcblxufSkpO1xuIl0sImZpbGUiOiJqcXVlcnkuZmlsZXVwbG9hZC1wcm9jZXNzLmpzIiwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnkuZmlsZXVwbG9hZC1wcm9jZXNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIGpRdWVyeSBGaWxlIFVwbG9hZCBQcm9jZXNzaW5nIFBsdWdpbiAxLjMuMFxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWRcclxuICpcclxuICogQ29weXJpZ2h0IDIwMTIsIFNlYmFzdGlhbiBUc2NoYW5cclxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XHJcbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXHJcbiAqL1xyXG5cclxuLyoganNoaW50IG5vbWVuOmZhbHNlICovXHJcbi8qIGdsb2JhbCBkZWZpbmUsIHdpbmRvdyAqL1xyXG5cclxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6XHJcbiAgICAgICAgZGVmaW5lKFtcclxuICAgICAgICAgICAgJ2pxdWVyeScsXHJcbiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJ1xyXG4gICAgICAgIF0sIGZhY3RvcnkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6XHJcbiAgICAgICAgZmFjdG9yeShcclxuICAgICAgICAgICAgd2luZG93LmpRdWVyeVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0oZnVuY3Rpb24gKCQpIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7XHJcblxyXG4gICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0XHJcbiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OlxyXG4gICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7XHJcblxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOlxyXG4gICAgICAgICAgICBwcm9jZXNzUXVldWU6IFtcclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKFxyXG4gICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nIFwiJyArIGRhdGEuZmlsZXNbZGF0YS5pbmRleF0ubmFtZSArICdcIidcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKi9cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfcHJvY2Vzc0ZpbGU6IGZ1bmN0aW9uIChkYXRhLCBvcmlnaW5hbERhdGEpIHtcclxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLnJlc29sdmVXaXRoKHRoYXQsIFtkYXRhXSksXHJcbiAgICAgICAgICAgICAgICBjaGFpbiA9IGRmZC5wcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3Byb2Nlc3MnLCBudWxsLCBkYXRhKTtcclxuICAgICAgICAgICAgJC5lYWNoKGRhdGEucHJvY2Vzc1F1ZXVlLCBmdW5jdGlvbiAoaSwgc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmdW5jID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxEYXRhLmVycm9yVGhyb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVqZWN0V2l0aCh0aGF0LCBbb3JpZ2luYWxEYXRhXSkucHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5wcm9jZXNzQWN0aW9uc1tzZXR0aW5ncy5hY3Rpb25dLmNhbGwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBjaGFpbiA9IGNoYWluLnBpcGUoZnVuYywgc2V0dGluZ3MuYWx3YXlzICYmIGZ1bmMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2hhaW5cclxuICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzZG9uZScsIG51bGwsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NhbHdheXMnLCBudWxsLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2ZhaWwnLCBudWxsLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGNoYWluO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIFJlcGxhY2VzIHRoZSBzZXR0aW5ncyBvZiBlYWNoIHByb2Nlc3NRdWV1ZSBpdGVtIHRoYXRcclxuICAgICAgICAvLyBhcmUgc3RyaW5ncyBzdGFydGluZyB3aXRoIGFuIFwiQFwiLCB1c2luZyB0aGUgcmVtYWluaW5nXHJcbiAgICAgICAgLy8gc3Vic3RyaW5nIGFzIGtleSBmb3IgdGhlIG9wdGlvbiBtYXAsXHJcbiAgICAgICAgLy8gZS5nLiBcIkBhdXRvVXBsb2FkXCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6XHJcbiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdO1xyXG4gICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7XHJcbiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZTpcclxuICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLFxyXG4gICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczpcclxuICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnBpcGUoZnVuYywgZnVuYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcylcclxuICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxufSkpO1xyXG4iXSwiZmlsZSI6ImpxdWVyeS5maWxldXBsb2FkLXByb2Nlc3MuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload-validate.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload-validate.js index 8b835e374..4a522257a 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload-validate.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload-validate.js @@ -118,4 +118,4 @@ })); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnkuZmlsZXVwbG9hZC12YWxpZGF0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogalF1ZXJ5IEZpbGUgVXBsb2FkIFZhbGlkYXRpb24gUGx1Z2luIDEuMS4yXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWRcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMywgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKi9cblxuLyogZ2xvYmFsIGRlZmluZSwgd2luZG93ICovXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOlxuICAgICAgICBkZWZpbmUoW1xuICAgICAgICAgICAgJ2pxdWVyeScsXG4gICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC1wcm9jZXNzJ1xuICAgICAgICBdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6XG4gICAgICAgIGZhY3RvcnkoXG4gICAgICAgICAgICB3aW5kb3cualF1ZXJ5XG4gICAgICAgICk7XG4gICAgfVxufShmdW5jdGlvbiAoJCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIEFwcGVuZCB0byB0aGUgZGVmYXVsdCBwcm9jZXNzUXVldWU6XG4gICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLm9wdGlvbnMucHJvY2Vzc1F1ZXVlLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3ZhbGlkYXRlJyxcbiAgICAgICAgICAgIC8vIEFsd2F5cyB0cmlnZ2VyIHRoaXMgYWN0aW9uLFxuICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGUgcHJldmlvdXMgYWN0aW9uIHdhcyByZWplY3RlZDogXG4gICAgICAgICAgICBhbHdheXM6IHRydWUsXG4gICAgICAgICAgICAvLyBPcHRpb25zIHRha2VuIGZyb20gdGhlIGdsb2JhbCBvcHRpb25zIG1hcDpcbiAgICAgICAgICAgIGFjY2VwdEZpbGVUeXBlczogJ0AnLFxuICAgICAgICAgICAgbWF4RmlsZVNpemU6ICdAJyxcbiAgICAgICAgICAgIG1pbkZpbGVTaXplOiAnQCcsXG4gICAgICAgICAgICBtYXhOdW1iZXJPZkZpbGVzOiAnQCcsXG4gICAgICAgICAgICBkaXNhYmxlZDogJ0BkaXNhYmxlVmFsaWRhdGlvbidcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBUaGUgRmlsZSBVcGxvYWQgVmFsaWRhdGlvbiBwbHVnaW4gZXh0ZW5kcyB0aGUgZmlsZXVwbG9hZCB3aWRnZXRcbiAgICAvLyB3aXRoIGZpbGUgdmFsaWRhdGlvbiBmdW5jdGlvbmFsaXR5OlxuICAgICQud2lkZ2V0KCdibHVlaW1wLmZpbGV1cGxvYWQnLCAkLmJsdWVpbXAuZmlsZXVwbG9hZCwge1xuXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGZvciBhbGxvd2VkIGZpbGUgdHlwZXMsIG1hdGNoZXNcbiAgICAgICAgICAgIC8vIGFnYWluc3QgZWl0aGVyIGZpbGUgdHlwZSBvciBmaWxlIG5hbWU6XG4gICAgICAgICAgICBhY2NlcHRGaWxlVHlwZXM6IC8oXFwufFxcLykoZ2lmfGpwZT9nfHBuZykkL2ksXG4gICAgICAgICAgICAvLyBUaGUgbWF4aW11bSBhbGxvd2VkIGZpbGUgc2l6ZSBpbiBieXRlczpcbiAgICAgICAgICAgIG1heEZpbGVTaXplOiAxMDAwMDAwMCwgLy8gMTAgTUJcbiAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVtIGFsbG93ZWQgZmlsZSBzaXplIGluIGJ5dGVzOlxuICAgICAgICAgICAgbWluRmlsZVNpemU6IHVuZGVmaW5lZCwgLy8gTm8gbWluaW1hbCBmaWxlIHNpemVcbiAgICAgICAgICAgIC8vIFRoZSBsaW1pdCBvZiBmaWxlcyB0byBiZSB1cGxvYWRlZDpcbiAgICAgICAgICAgIG1heE51bWJlck9mRmlsZXM6IDEwLFxuICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcyxcbiAgICAgICAgICAgIC8vIGhhcyB0byBiZSBvdmVycmlkZW4gZm9yIG1heE51bWJlck9mRmlsZXMgdmFsaWRhdGlvbjpcbiAgICAgICAgICAgIGdldE51bWJlck9mRmlsZXM6ICQubm9vcCxcblxuICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6XG4gICAgICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgICAgIG1heE51bWJlck9mRmlsZXM6ICdNYXhpbXVtIG51bWJlciBvZiBmaWxlcyBleGNlZWRlZCcsXG4gICAgICAgICAgICAgICAgYWNjZXB0RmlsZVR5cGVzOiAnRmlsZSB0eXBlIG5vdCBhbGxvd2VkJyxcbiAgICAgICAgICAgICAgICBtYXhGaWxlU2l6ZTogJ0ZpbGUgaXMgdG9vIGxhcmdlJyxcbiAgICAgICAgICAgICAgICBtaW5GaWxlU2l6ZTogJ0ZpbGUgaXMgdG9vIHNtYWxsJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHByb2Nlc3NBY3Rpb25zOiB7XG5cbiAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGRhdGEuZmlsZXNbZGF0YS5pbmRleF0sXG4gICAgICAgICAgICAgICAgICAgIGZpbGVTaXplO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm1pbkZpbGVTaXplIHx8IG9wdGlvbnMubWF4RmlsZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUgPSBmaWxlLnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncy5nZXROdW1iZXJPZkZpbGVzKCkgfHwgMCkgKyBkYXRhLmZpbGVzLmxlbmd0aCA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBzZXR0aW5ncy5pMThuKCdtYXhOdW1iZXJPZkZpbGVzJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmFjY2VwdEZpbGVUeXBlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShvcHRpb25zLmFjY2VwdEZpbGVUeXBlcy50ZXN0KGZpbGUudHlwZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzLnRlc3QoZmlsZS5uYW1lKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJvciA9IHNldHRpbmdzLmkxOG4oJ2FjY2VwdEZpbGVUeXBlcycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZVNpemUgPiBvcHRpb25zLm1heEZpbGVTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBzZXR0aW5ncy5pMThuKCdtYXhGaWxlU2l6ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJC50eXBlKGZpbGVTaXplKSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplIDwgb3B0aW9ucy5taW5GaWxlU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gc2V0dGluZ3MuaTE4bignbWluRmlsZVNpemUnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZmlsZS5lcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUuZXJyb3IgfHwgZGF0YS5maWxlcy5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgodGhpcywgW2RhdGFdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgodGhpcywgW2RhdGFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbn0pKTtcbiJdLCJmaWxlIjoianF1ZXJ5LmZpbGV1cGxvYWQtdmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnkuZmlsZXVwbG9hZC12YWxpZGF0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBqUXVlcnkgRmlsZSBVcGxvYWQgVmFsaWRhdGlvbiBQbHVnaW4gMS4xLjJcclxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkXHJcbiAqXHJcbiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuXHJcbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxyXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxyXG4gKi9cclxuXHJcbi8qIGdsb2JhbCBkZWZpbmUsIHdpbmRvdyAqL1xyXG5cclxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6XHJcbiAgICAgICAgZGVmaW5lKFtcclxuICAgICAgICAgICAgJ2pxdWVyeScsXHJcbiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXByb2Nlc3MnXHJcbiAgICAgICAgXSwgZmFjdG9yeSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczpcclxuICAgICAgICBmYWN0b3J5KFxyXG4gICAgICAgICAgICB3aW5kb3cualF1ZXJ5XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufShmdW5jdGlvbiAoJCkge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0byB0aGUgZGVmYXVsdCBwcm9jZXNzUXVldWU6XHJcbiAgICAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5wcm9jZXNzUXVldWUucHVzaChcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFjdGlvbjogJ3ZhbGlkYXRlJyxcclxuICAgICAgICAgICAgLy8gQWx3YXlzIHRyaWdnZXIgdGhpcyBhY3Rpb24sXHJcbiAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIHByZXZpb3VzIGFjdGlvbiB3YXMgcmVqZWN0ZWQ6IFxyXG4gICAgICAgICAgICBhbHdheXM6IHRydWUsXHJcbiAgICAgICAgICAgIC8vIE9wdGlvbnMgdGFrZW4gZnJvbSB0aGUgZ2xvYmFsIG9wdGlvbnMgbWFwOlxyXG4gICAgICAgICAgICBhY2NlcHRGaWxlVHlwZXM6ICdAJyxcclxuICAgICAgICAgICAgbWF4RmlsZVNpemU6ICdAJyxcclxuICAgICAgICAgICAgbWluRmlsZVNpemU6ICdAJyxcclxuICAgICAgICAgICAgbWF4TnVtYmVyT2ZGaWxlczogJ0AnLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogJ0BkaXNhYmxlVmFsaWRhdGlvbidcclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIC8vIFRoZSBGaWxlIFVwbG9hZCBWYWxpZGF0aW9uIHBsdWdpbiBleHRlbmRzIHRoZSBmaWxldXBsb2FkIHdpZGdldFxyXG4gICAgLy8gd2l0aCBmaWxlIHZhbGlkYXRpb24gZnVuY3Rpb25hbGl0eTpcclxuICAgICQud2lkZ2V0KCdibHVlaW1wLmZpbGV1cGxvYWQnLCAkLmJsdWVpbXAuZmlsZXVwbG9hZCwge1xyXG5cclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGFsbG93ZWQgZmlsZSB0eXBlcywgbWF0Y2hlc1xyXG4gICAgICAgICAgICAvLyBhZ2FpbnN0IGVpdGhlciBmaWxlIHR5cGUgb3IgZmlsZSBuYW1lOlxyXG4gICAgICAgICAgICBhY2NlcHRGaWxlVHlwZXM6IC8oXFwufFxcLykoZ2lmfGpwZT9nfHBuZykkL2ksXHJcbiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGFsbG93ZWQgZmlsZSBzaXplIGluIGJ5dGVzOlxyXG4gICAgICAgICAgICBtYXhGaWxlU2l6ZTogMTAwMDAwMDAsIC8vIDEwIE1CXHJcbiAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVtIGFsbG93ZWQgZmlsZSBzaXplIGluIGJ5dGVzOlxyXG4gICAgICAgICAgICBtaW5GaWxlU2l6ZTogdW5kZWZpbmVkLCAvLyBObyBtaW5pbWFsIGZpbGUgc2l6ZVxyXG4gICAgICAgICAgICAvLyBUaGUgbGltaXQgb2YgZmlsZXMgdG8gYmUgdXBsb2FkZWQ6XHJcbiAgICAgICAgICAgIG1heE51bWJlck9mRmlsZXM6IDEwLFxyXG4gICAgICAgICAgICAqL1xyXG5cclxuICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcyxcclxuICAgICAgICAgICAgLy8gaGFzIHRvIGJlIG92ZXJyaWRlbiBmb3IgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOlxyXG4gICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiAkLm5vb3AsXHJcblxyXG4gICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczpcclxuICAgICAgICAgICAgbWVzc2FnZXM6IHtcclxuICAgICAgICAgICAgICAgIG1heE51bWJlck9mRmlsZXM6ICdNYXhpbXVtIG51bWJlciBvZiBmaWxlcyBleGNlZWRlZCcsXHJcbiAgICAgICAgICAgICAgICBhY2NlcHRGaWxlVHlwZXM6ICdGaWxlIHR5cGUgbm90IGFsbG93ZWQnLFxyXG4gICAgICAgICAgICAgICAgbWF4RmlsZVNpemU6ICdGaWxlIGlzIHRvbyBsYXJnZScsXHJcbiAgICAgICAgICAgICAgICBtaW5GaWxlU2l6ZTogJ0ZpbGUgaXMgdG9vIHNtYWxsJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHtcclxuXHJcbiAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB0aGlzLm9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGRhdGEuZmlsZXNbZGF0YS5pbmRleF0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZVNpemU7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5taW5GaWxlU2l6ZSB8fCBvcHRpb25zLm1heEZpbGVTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUgPSBmaWxlLnNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcykgPT09ICdudW1iZXInICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncy5nZXROdW1iZXJPZkZpbGVzKCkgfHwgMCkgKyBkYXRhLmZpbGVzLmxlbmd0aCA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1heE51bWJlck9mRmlsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gc2V0dGluZ3MuaTE4bignbWF4TnVtYmVyT2ZGaWxlcycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmFjY2VwdEZpbGVUeXBlcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAhKG9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzLnRlc3QoZmlsZS50eXBlKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFjY2VwdEZpbGVUeXBlcy50ZXN0KGZpbGUubmFtZSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJvciA9IHNldHRpbmdzLmkxOG4oJ2FjY2VwdEZpbGVUeXBlcycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlU2l6ZSA+IG9wdGlvbnMubWF4RmlsZVNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gc2V0dGluZ3MuaTE4bignbWF4RmlsZVNpemUnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJC50eXBlKGZpbGVTaXplKSA9PT0gJ251bWJlcicgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUgPCBvcHRpb25zLm1pbkZpbGVTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJvciA9IHNldHRpbmdzLmkxOG4oJ21pbkZpbGVTaXplJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWxlLmVycm9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGUuZXJyb3IgfHwgZGF0YS5maWxlcy5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMuZXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3RXaXRoKHRoaXMsIFtkYXRhXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCh0aGlzLCBbZGF0YV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxufSkpO1xyXG4iXSwiZmlsZSI6ImpxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlLmpzIiwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0= \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload.js index c01baa8ab..82f33e628 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jquery.fileupload.js @@ -1425,4 +1425,4 @@ })); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnkuZmlsZXVwbG9hZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiA1LjQwLjFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZFxuICpcbiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuXG4vKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi9cbi8qIGdsb2JhbCBkZWZpbmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqL1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZTpcbiAgICAgICAgZGVmaW5lKFtcbiAgICAgICAgICAgICdqcXVlcnknLFxuICAgICAgICAgICAgJ2pxdWVyeS51aS53aWRnZXQnXG4gICAgICAgIF0sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczpcbiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTtcbiAgICB9XG59KGZ1bmN0aW9uICgkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8gRGV0ZWN0IGZpbGUgaW5wdXQgc3VwcG9ydCwgYmFzZWQgb25cbiAgICAvLyBodHRwOi8vdmlsamFtaXMuY29tL2Jsb2cvMjAxMi9maWxlLXVwbG9hZC1zdXBwb3J0LW9uLW1vYmlsZS9cbiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKFxuICAgICAgICAvLyBIYW5kbGUgZGV2aWNlcyB3aGljaCBnaXZlIGZhbHNlIHBvc2l0aXZlcyBmb3IgdGhlIGZlYXR1cmUgZGV0ZWN0aW9uOlxuICAgICAgICAnKEFuZHJvaWQgKDFcXFxcLlswMTU2XXwyXFxcXC5bMDFdKSknICtcbiAgICAgICAgICAgICd8KFdpbmRvd3MgUGhvbmUgKE9TIDd8OFxcXFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICtcbiAgICAgICAgICAgICd8KHcoZWIpP09TQnJvd3Nlcil8KHdlYk9TKScgK1xuICAgICAgICAgICAgJ3woS2luZGxlLygxXFxcXC4wfDJcXFxcLlswNV18M1xcXFwuMCkpJ1xuICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHxcbiAgICAgICAgLy8gRmVhdHVyZSBkZXRlY3Rpb24gZm9yIGFsbCBvdGhlciBkZXZpY2VzOlxuICAgICAgICAkKCc8aW5wdXQgdHlwZT1cImZpbGVcIj4nKS5wcm9wKCdkaXNhYmxlZCcpKTtcblxuICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLFxuICAgIC8vIGFzIHNvbWUgU2FmYXJpIHZlcnNpb25zICg1Pykgc3VwcG9ydCBYSFIgZmlsZSB1cGxvYWRzIHZpYSB0aGUgRm9ybURhdGEgQVBJLFxuICAgIC8vIGJ1dCBub3Qgbm9uLW11bHRpcGFydCBYSFIgZmlsZSB1cGxvYWRzLlxuICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvclxuICAgIC8vIHdpbmRvdy5Qcm9ncmVzc0V2ZW50IGluc3RlYWQgdG8gZGV0ZWN0IFhIUjIgZmlsZSB1cGxvYWQgY2FwYWJpbGl0eTpcbiAgICAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCA9ICEhKHdpbmRvdy5Qcm9ncmVzc0V2ZW50ICYmIHdpbmRvdy5GaWxlUmVhZGVyKTtcbiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7XG5cbiAgICAvLyBEZXRlY3Qgc3VwcG9ydCBmb3IgQmxvYiBzbGljaW5nIChyZXF1aXJlZCBmb3IgY2h1bmtlZCB1cGxvYWRzKTpcbiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8XG4gICAgICAgIEJsb2IucHJvdG90eXBlLndlYmtpdFNsaWNlIHx8IEJsb2IucHJvdG90eXBlLm1velNsaWNlKTtcblxuICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWRcbiAgICAvLyB2aWEgZmlsZUlucHV0IHNldHRpbmcgYW5kIHBhc3RlIG9yIGRyb3AgZXZlbnRzIG9mIHRoZSBnaXZlbiBkcm9wWm9uZS5cbiAgICAvLyBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBqUXVlcnkgV2lkZ2V0IG1ldGhvZHMsIHRoZSBmaWxldXBsb2FkIHdpZGdldFxuICAgIC8vIGV4cG9zZXMgdGhlIFwiYWRkXCIgYW5kIFwic2VuZFwiIG1ldGhvZHMsIHRvIGFkZCBvciBkaXJlY3RseSBzZW5kIGZpbGVzIHVzaW5nXG4gICAgLy8gdGhlIGZpbGV1cGxvYWQgQVBJLlxuICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yXG4gICAgLy8gXCJhZGRcIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGVcbiAgICAvLyB0aGUgXCJhZGRcIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLlxuICAgICQud2lkZ2V0KCdibHVlaW1wLmZpbGV1cGxvYWQnLCB7XG5cbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgLy8gVGhlIGRyb3AgdGFyZ2V0IGVsZW1lbnQocyksIGJ5IHRoZSBkZWZhdWx0IHRoZSBjb21wbGV0ZSBkb2N1bWVudC5cbiAgICAgICAgICAgIC8vIFNldCB0byBudWxsIHRvIGRpc2FibGUgZHJhZyAmIGRyb3Agc3VwcG9ydDpcbiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSxcbiAgICAgICAgICAgIC8vIFRoZSBwYXN0ZSB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LlxuICAgICAgICAgICAgLy8gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSBwYXN0ZSBzdXBwb3J0OlxuICAgICAgICAgICAgcGFzdGVab25lOiAkKGRvY3VtZW50KSxcbiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy5cbiAgICAgICAgICAgIC8vIElmIHVuZGVmaW5lZCwgaXQgaXMgc2V0IHRvIHRoZSBmaWxlIGlucHV0IGZpZWxkcyBpbnNpZGVcbiAgICAgICAgICAgIC8vIG9mIHRoZSB3aWRnZXQgZWxlbWVudCBvbiBwbHVnaW4gaW5pdGlhbGl6YXRpb24uXG4gICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuXG4gICAgICAgICAgICBmaWxlSW5wdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggYSBjbG9uZSBhZnRlclxuICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnRcbiAgICAgICAgICAgIC8vIHF1ZXVlcyBhbmQgYWxsb3dzIGNoYW5nZSBldmVudHMgdG8gYmUgZmlyZWQgZm9yIHRoZSBzYW1lIGZpbGVcbiAgICAgICAgICAgIC8vIHNlbGVjdGlvbiwgYnV0IGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlOlxuICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSxcbiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIGZpbGUgZm9ybSBkYXRhICh0aGUgcmVxdWVzdCBhcmd1bWVudCBuYW1lKS5cbiAgICAgICAgICAgIC8vIElmIHVuZGVmaW5lZCBvciBlbXB0eSwgdGhlIG5hbWUgcHJvcGVydHkgb2YgdGhlIGZpbGUgaW5wdXQgZmllbGQgaXNcbiAgICAgICAgICAgIC8vIHVzZWQsIG9yIFwiZmlsZXNbXVwiIGlmIHRoZSBmaWxlIGlucHV0IG5hbWUgcHJvcGVydHkgaXMgYWxzbyBlbXB0eSxcbiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOlxuICAgICAgICAgICAgcGFyYW1OYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBlYWNoIGZpbGUgb2YgYSBzZWxlY3Rpb24gaXMgdXBsb2FkZWQgdXNpbmcgYW4gaW5kaXZpZHVhbFxuICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlXG4gICAgICAgICAgICAvLyBzZWxlY3Rpb25zIGluIG9uZSByZXF1ZXN0IGVhY2g6XG4gICAgICAgICAgICBzaW5nbGVGaWxlVXBsb2FkczogdHJ1ZSxcbiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDpcbiAgICAgICAgICAgIGxpbWl0TXVsdGlGaWxlVXBsb2FkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmVcbiAgICAgICAgICAgIC8vIFhIUiByZXF1ZXN0IHRvIGtlZXAgdGhlIHJlcXVlc3Qgc2l6ZSB1bmRlciBvciBlcXVhbCB0byB0aGUgZGVmaW5lZFxuICAgICAgICAgICAgLy8gbGltaXQgaW4gYnl0ZXM6XG4gICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIE11bHRpcGFydCBmaWxlIHVwbG9hZHMgYWRkIGEgbnVtYmVyIG9mIGJ5dGVzIHRvIGVhY2ggdXBsb2FkZWQgZmlsZSxcbiAgICAgICAgICAgIC8vIHRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIG9wdGlvbiBhZGRzIGFuIG92ZXJoZWFkIGZvciBlYWNoIGZpbGUgdXNlZFxuICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOlxuICAgICAgICAgICAgbGltaXRNdWx0aUZpbGVVcGxvYWRTaXplT3ZlcmhlYWQ6IDUxMixcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlIHRvIGlzc3VlIGFsbCBmaWxlIHVwbG9hZCByZXF1ZXN0c1xuICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOlxuICAgICAgICAgICAgc2VxdWVudGlhbFVwbG9hZHM6IGZhbHNlLFxuICAgICAgICAgICAgLy8gVG8gbGltaXQgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHVwbG9hZHMsXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDpcbiAgICAgICAgICAgIGxpbWl0Q29uY3VycmVudFVwbG9hZHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlIHRvIGZvcmNlIGlmcmFtZSB0cmFuc3BvcnQgdXBsb2FkczpcbiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSxcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgbG9jYXRpb24gb2YgYSByZWRpcmVjdCB1cmwgb24gdGhlXG4gICAgICAgICAgICAvLyBvcmlnaW4gc2VydmVyLCBmb3IgY3Jvc3MtZG9tYWluIGlmcmFtZSB0cmFuc3BvcnQgdXBsb2FkczpcbiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSByZWRpcmVjdCB1cmwsIHNlbnQgYXMgcGFydCBvZiB0aGUgZm9ybVxuICAgICAgICAgICAgLy8gZGF0YSBhbmQgc2V0IHRvICdyZWRpcmVjdCcgaWYgdGhpcyBvcHRpb24gaXMgZW1wdHk6XG4gICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHBvc3RNZXNzYWdlIHdpbmRvdyxcbiAgICAgICAgICAgIC8vIHRvIGVuYWJsZSBwb3N0TWVzc2FnZSB0cmFuc3BvcnQgdXBsb2FkczpcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBYSFIgZmlsZSB1cGxvYWRzIGFyZSBzZW50IGFzIG11bHRpcGFydC9mb3JtLWRhdGEuXG4gICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBpcyBhbHdheXMgdXNpbmcgbXVsdGlwYXJ0L2Zvcm0tZGF0YS5cbiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczpcbiAgICAgICAgICAgIG11bHRpcGFydDogdHJ1ZSxcbiAgICAgICAgICAgIC8vIFRvIHVwbG9hZCBsYXJnZSBmaWxlcyBpbiBzbWFsbGVyIGNodW5rcywgc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uXG4gICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIG9yIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIEJsb2IgQVBJLCBmaWxlcyB3aWxsXG4gICAgICAgICAgICAvLyBiZSB1cGxvYWRlZCBhcyBhIHdob2xlLlxuICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBXaGVuIGEgbm9uLW11bHRpcGFydCB1cGxvYWQgb3IgYSBjaHVua2VkIG11bHRpcGFydCB1cGxvYWQgaGFzIGJlZW5cbiAgICAgICAgICAgIC8vIGFib3J0ZWQsIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSB0aGUgdXBsb2FkIGJ5IHNldHRpbmdcbiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0XG4gICAgICAgICAgICAvLyB1c2VmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIG9wdGlvbnMgb2JqZWN0IGluc2lkZSBvZiB0aGUgXCJhZGRcIiBvclxuICAgICAgICAgICAgLy8gXCJzZW5kXCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLlxuICAgICAgICAgICAgdXBsb2FkZWRCeXRlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgZmlsZSB1cGxvYWRzIGFyZSByZW1vdmVkIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0b1xuICAgICAgICAgICAgLy8gcHJldmVudCByZWNhbGN1bGF0aW5nIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgZGF0YTpcbiAgICAgICAgICAgIHJlY2FsY3VsYXRlUHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czpcbiAgICAgICAgICAgIHByb2dyZXNzSW50ZXJ2YWw6IDEwMCxcbiAgICAgICAgICAgIC8vIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBjYWxjdWxhdGUgcHJvZ3Jlc3MgYml0cmF0ZTpcbiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLFxuICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgdXBsb2FkcyBhcmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYWRkaW5nIGZpbGVzOlxuICAgICAgICAgICAgYXV0b1VwbG9hZDogdHJ1ZSxcblxuICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6XG4gICAgICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJ1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWRcbiAgICAgICAgICAgIC8vIGFuZCBhbiBvYmplY3Qgd2l0aCBjb250ZXh0IHNwZWNpZmljIGRhdGEgYXMgYXJndW1lbnRzOlxuICAgICAgICAgICAgaTE4bjogZnVuY3Rpb24gKG1lc3NhZ2UsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGNvbnRleHQsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0XG4gICAgICAgICAgICAvLyB1c2luZyB0aGlzIG9wdGlvbiwgd2hpY2ggYWNjZXB0cyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggbmFtZSBhbmRcbiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXMsIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHN1Y2ggYW4gYXJyYXksIGEgRm9ybURhdGFcbiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuXG4gICAgICAgICAgICAvLyBUaGUgZm9ybSBvZiB0aGUgZmlyc3QgZmlsZUlucHV0IGlzIGdpdmVuIGFzIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb246XG4gICAgICAgICAgICBmb3JtRGF0YTogZnVuY3Rpb24gKGZvcm0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkXG4gICAgICAgICAgICAvLyB3aWRnZXQgKHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgZHJhZyAmIGRyb3AsIHBhc3RlIG9yIGFkZCBBUEkgY2FsbCkuXG4gICAgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlRmlsZVVwbG9hZHMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZVxuICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlXG4gICAgICAgICAgICAvLyBvbmNlIGZvciBlYWNoIGZpbGUgc2VsZWN0aW9uLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuXG4gICAgICAgICAgICAvLyBUaGUgZGF0YSBvYmplY3QgY29udGFpbnMgYSBmaWxlcyBwcm9wZXJ0eSBob2xkaW5nIHRoZSBhZGRlZCBmaWxlc1xuICAgICAgICAgICAgLy8gYW5kIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgcGx1Z2luIG9wdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgYWpheCBzZXR0aW5ncy5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBMaXN0ZW5lcnMgZm9yIHRoaXMgY2FsbGJhY2sgY2FuIGFsc28gYmUgYm91bmQgdGhlIGZvbGxvd2luZyB3YXk6XG4gICAgICAgICAgICAvLyAuYmluZCgnZmlsZXVwbG9hZGFkZCcsIGZ1bmMpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGFuZCBhbGxvd3MgdG8gYXR0YWNoIGFkZGl0aW9uYWxcbiAgICAgICAgICAgIC8vIGhhbmRsZXJzIHVzaW5nIGpRdWVyeSdzIERlZmVycmVkIGNhbGxiYWNrczpcbiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTtcbiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmF1dG9VcGxvYWQgfHwgKGRhdGEuYXV0b1VwbG9hZCAhPT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKCkuZG9uZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBPdGhlciBjYWxsYmFja3M6XG5cbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6XG4gICAgICAgICAgICAvLyBzdWJtaXQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdWJtaXQnLCBmdW5jKTtcblxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6XG4gICAgICAgICAgICAvLyBzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc2VuZCcsIGZ1bmMpO1xuXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOlxuICAgICAgICAgICAgLy8gZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGRvbmUnLCBmdW5jKTtcblxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6XG4gICAgICAgICAgICAvLyBmYWlsOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZmFpbCcsIGZ1bmMpO1xuXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6XG4gICAgICAgICAgICAvLyBhbHdheXM6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhbHdheXMnLCBmdW5jKTtcblxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6XG4gICAgICAgICAgICAvLyBwcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHByb2dyZXNzJywgZnVuYyk7XG5cbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czpcbiAgICAgICAgICAgIC8vIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3NhbGwnLCBmdW5jKTtcblxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6XG4gICAgICAgICAgICAvLyBzdGFydDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0YXJ0JywgZnVuYyk7XG5cbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDpcbiAgICAgICAgICAgIC8vIHN0b3A6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdG9wJywgZnVuYyk7XG5cbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6XG4gICAgICAgICAgICAvLyBjaGFuZ2U6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaGFuZ2UnLCBmdW5jKTtcblxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOlxuICAgICAgICAgICAgLy8gcGFzdGU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwYXN0ZScsIGZ1bmMpO1xuXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOlxuICAgICAgICAgICAgLy8gZHJvcDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGRyb3AnLCBmdW5jKTtcblxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6XG4gICAgICAgICAgICAvLyBkcmFnb3ZlcjogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGRyYWdvdmVyJywgZnVuYyk7XG5cbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDpcbiAgICAgICAgICAgIC8vIGNodW5rc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNodW5rc2VuZCcsIGZ1bmMpO1xuXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOlxuICAgICAgICAgICAgLy8gY2h1bmtkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtkb25lJywgZnVuYyk7XG5cbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOlxuICAgICAgICAgICAgLy8gY2h1bmtmYWlsOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtmYWlsJywgZnVuYyk7XG5cbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6XG4gICAgICAgICAgICAvLyBjaHVua2Fsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNodW5rYWx3YXlzJywgZnVuYyk7XG5cbiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLlxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgalF1ZXJ5IGFqYXggc2V0dGluZ3MgcmVxdWlyZWQgZm9yIHRoZSBmaWxlIHVwbG9hZHM6XG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgICAgICBjYWNoZTogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBBIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IHJlcXVpcmUgcmVpbml0aWFsaXppbmcgZXZlbnQgbGlzdGVuZXJzIGFuZC9vclxuICAgICAgICAvLyBzcGVjaWFsIGluaXRpYWxpemF0aW9uIGNvZGU6XG4gICAgICAgIF9zcGVjaWFsT3B0aW9uczogW1xuICAgICAgICAgICAgJ2ZpbGVJbnB1dCcsXG4gICAgICAgICAgICAnZHJvcFpvbmUnLFxuICAgICAgICAgICAgJ3Bhc3RlWm9uZScsXG4gICAgICAgICAgICAnbXVsdGlwYXJ0JyxcbiAgICAgICAgICAgICdmb3JjZUlmcmFtZVRyYW5zcG9ydCdcbiAgICAgICAgXSxcblxuICAgICAgICBfYmxvYlNsaWNlOiAkLnN1cHBvcnQuYmxvYlNsaWNlICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlO1xuICAgICAgICAgICAgcmV0dXJuIHNsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX0JpdHJhdGVUaW1lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDtcbiAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmdldEJpdHJhdGUgPSBmdW5jdGlvbiAobm93LCBsb2FkZWQsIGludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJpdHJhdGUgfHwgIWludGVydmFsIHx8IHRpbWVEaWZmID4gaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gKGxvYWRlZCAtIHRoaXMubG9hZGVkKSAqICgxMDAwIC8gdGltZURpZmYpICogODtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gbm93O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaXNYSFJVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gIW9wdGlvbnMuZm9yY2VJZnJhbWVUcmFuc3BvcnQgJiZcbiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHxcbiAgICAgICAgICAgICAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfZ2V0Rm9ybURhdGE6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgZm9ybURhdGE7XG4gICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm9ybURhdGEob3B0aW9ucy5mb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcblxuICAgICAgICBfZ2V0VG90YWw6IGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICAgICAgdmFyIHRvdGFsID0gMDtcbiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgdG90YWwgKz0gZmlsZS5zaXplIHx8IDE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0b3RhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSB7XG4gICAgICAgICAgICAgICAgbG9hZGVkOiAwLFxuICAgICAgICAgICAgICAgIHRvdGFsOiAwLFxuICAgICAgICAgICAgICAgIGJpdHJhdGU6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICQuZXh0ZW5kKG9iai5fcHJvZ3Jlc3MsIHByb2dyZXNzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9pbml0UmVzcG9uc2VPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBwcm9wO1xuICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHByb3AgaW4gb2JqLl9yZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqLl9yZXNwb25zZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iai5fcmVzcG9uc2UgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfb25Qcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm93ID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSksXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChub3cgLSBkYXRhLl90aW1lIDwgZGF0YS5wcm9ncmVzc0ludGVydmFsKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgIT09IGUudG90YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRhLl90aW1lID0gbm93O1xuICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgIGUubG9hZGVkIC8gZS50b3RhbCAqIChkYXRhLmNodW5rU2l6ZSB8fCBkYXRhLl9wcm9ncmVzcy50b3RhbClcbiAgICAgICAgICAgICAgICApICsgKGRhdGEudXBsb2FkZWRCeXRlcyB8fCAwKTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGVcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZ2xvYmFsIGxvYWRlZCBjb3VudGVyOlxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCArPSAobG9hZGVkIC0gZGF0YS5fcHJvZ3Jlc3MubG9hZGVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoXG4gICAgICAgICAgICAgICAgICAgIG5vdyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MubG9hZGVkID0gZGF0YS5sb2FkZWQgPSBsb2FkZWQ7XG4gICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKFxuICAgICAgICAgICAgICAgICAgICBub3csXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSBjdXN0b20gcHJvZ3Jlc3MgZXZlbnQgd2l0aCBhIHRvdGFsIGRhdGEgcHJvcGVydHkgc2V0XG4gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGFcbiAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBjYWxjdWxhdGVkIGFjY29yZGluZ2x5OlxuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXG4gICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsXG4gICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3Byb2dyZXNzJywge2RlbGVnYXRlZEV2ZW50OiBlfSksXG4gICAgICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSBnbG9iYWwgcHJvZ3Jlc3MgZXZlbnQgZm9yIGFsbCBjdXJyZW50IGZpbGUgdXBsb2FkcyxcbiAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgYWpheCBjYWxscyBxdWV1ZWQgZm9yIHNlcXVlbnRpYWwgZmlsZSB1cGxvYWRzOlxuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXG4gICAgICAgICAgICAgICAgICAgICdwcm9ncmVzc2FsbCcsXG4gICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3Byb2dyZXNzYWxsJywge2RlbGVnYXRlZEV2ZW50OiBlfSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdFByb2dyZXNzTGlzdGVuZXI6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgeGhyID0gb3B0aW9ucy54aHIgPyBvcHRpb25zLnhocigpIDogJC5hamF4U2V0dGluZ3MueGhyKCk7XG4gICAgICAgICAgICAvLyBBY2Nlc3NzIHRvIHRoZSBuYXRpdmUgWEhSIG9iamVjdCBpcyByZXF1aXJlZCB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDpcbiAgICAgICAgICAgIGlmICh4aHIudXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgJCh4aHIudXBsb2FkKS5iaW5kKCdwcm9ncmVzcycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9ncmVzcyBldmVudCBwcm9wZXJ0aWVzIGdldCBjb3BpZWQgb3ZlcjpcbiAgICAgICAgICAgICAgICAgICAgZS5sZW5ndGhDb21wdXRhYmxlID0gb2UubGVuZ3RoQ29tcHV0YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7XG4gICAgICAgICAgICAgICAgICAgIGUudG90YWwgPSBvZS50b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcyhlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnhociA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhocjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9pc0luc3RhbmNlT2Y6IGZ1bmN0aW9uICh0eXBlLCBvYmopIHtcbiAgICAgICAgICAgIC8vIENyb3NzLWZyYW1lIGluc3RhbmNlb2YgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIGZvcm1EYXRhLFxuICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLFxuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBub24tbXVsdGlwYXJ0IHNldHRpbmcgaWYgbm90IHN1cHBvcnRlZDpcbiAgICAgICAgICAgICAgICBtdWx0aXBhcnQgPSBvcHRpb25zLm11bHRpcGFydCB8fCAhJC5zdXBwb3J0LnhockZpbGVVcGxvYWQsXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lWzBdIDogb3B0aW9ucy5wYXJhbU5hbWU7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucy5oZWFkZXJzKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1SYW5nZSddID0gb3B0aW9ucy5jb250ZW50UmFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LURpc3Bvc2l0aW9uJ10gPSAnYXR0YWNobWVudDsgZmlsZW5hbWU9XCInICtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnXCInO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRlbnRUeXBlID0gZmlsZS50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IG9wdGlvbnMuYmxvYiB8fCBmaWxlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93LnBvc3RNZXNzYWdlIGRvZXMgbm90IGFsbG93IHNlbmRpbmcgRm9ybURhdGFcbiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb3JtRGF0YSBhcnJheSBhbmQgbGV0IHRoZSBwb3N0TWVzc2FnZSB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBGb3JtRGF0YSBvYmplY3Qgb3V0IG9mIHRoaXMgYXJyYXk6XG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5ibG9iXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5faXNJbnN0YW5jZU9mKCdGb3JtRGF0YScsIG9wdGlvbnMuZm9ybURhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IG9wdGlvbnMuZm9ybURhdGE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpLCBmdW5jdGlvbiAoaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChwYXJhbU5hbWUsIG9wdGlvbnMuYmxvYiwgZmlsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGFsbG93cyB0aGUgdGVzdHMgdG8gcnVuIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW1teSBvYmplY3RzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5faXNJbnN0YW5jZU9mKCdCbG9iJywgZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZVtpbmRleF0pIHx8IHBhcmFtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCbG9iIHJlZmVyZW5jZSBpcyBub3QgbmVlZGVkIGFueW1vcmUsIGZyZWUgbWVtb3J5OlxuICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAgICAgdmFyIHRhcmdldEhvc3QgPSAkKCc8YT48L2E+JykucHJvcCgnaHJlZicsIG9wdGlvbnMudXJsKS5wcm9wKCdob3N0Jyk7XG4gICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBkYXRhVHlwZSB0byBpZnJhbWUgZW5hYmxlcyB0aGUgaWZyYW1lIHRyYW5zcG9ydDpcbiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7XG4gICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBhY2NlcHRzIGEgc2VyaWFsaXplZCBhcnJheSBhcyBmb3JtIGRhdGE6XG4gICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczpcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlZGlyZWN0ICYmIHRhcmdldEhvc3QgJiYgdGFyZ2V0SG9zdCAhPT0gbG9jYXRpb24uaG9zdCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybURhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMucmVkaXJlY3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2h1bmtlZFVwbG9hZChvcHRpb25zLCB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFhIUkRhdGEob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHBvc3RNZXNzYWdlIHRyYW5zcG9ydDpcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhVHlwZSA9ICdwb3N0bWVzc2FnZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdElmcmFtZVNldHRpbmdzKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCksXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gb3B0aW9ucy5wYXJhbU5hbWU7XG4gICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkge1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtdO1xuICAgICAgICAgICAgICAgIGZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChpbnB1dC5wcm9wKCdmaWxlcycpIHx8IFsxXSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEkLmlzQXJyYXkocGFyYW1OYW1lKSkge1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdEZvcm1TZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlXG4gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIGZvcm0sIGlmIGF2YWlsYWJsZTpcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtIHx8ICFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBnaXZlbiBmaWxlIGlucHV0IGRvZXNuJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGZvcm0sXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHdpZGdldCBmaWxlIGlucHV0J3MgZm9ybTpcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJCh0aGlzLm9wdGlvbnMuZmlsZUlucHV0LnByb3AoJ2Zvcm0nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIG11c3QgYmUgXCJQT1NUXCIgb3IgXCJQVVRcIjpcbiAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IChvcHRpb25zLnR5cGUgfHxcbiAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJydcbiAgICAgICAgICAgICAgICApLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlICE9PSAnUE9TVCcgJiYgb3B0aW9ucy50eXBlICE9PSAnUFVUJyAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0ID0gb3B0aW9ucy5mb3JtLmF0dHIoJ2FjY2VwdC1jaGFyc2V0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2dldEFKQVhTZXR0aW5nczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7XG4gICAgICAgICAgICB0aGlzLl9pbml0Rm9ybVNldHRpbmdzKG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5faW5pdERhdGFTZXR0aW5ncyhvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLFxuICAgICAgICAvLyB3aGlsZSBqUXVlcnkgMS44KyByZW1vdmVkIC5pc1JlamVjdGVkKCkgYW5kIC5pc1Jlc29sdmVkKCk6XG4gICAgICAgIF9nZXREZWZlcnJlZFN0YXRlOiBmdW5jdGlvbiAoZGVmZXJyZWQpIHtcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5zdGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncmVzb2x2ZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncmVqZWN0ZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJztcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudFxuICAgICAgICAvLyBtZXRob2RzIG9mIHRoZSBnaXZlbiBQcm9taXNlIG9iamVjdDpcbiAgICAgICAgX2VuaGFuY2VQcm9taXNlOiBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lO1xuICAgICAgICAgICAgcHJvbWlzZS5lcnJvciA9IHByb21pc2UuZmFpbDtcbiAgICAgICAgICAgIHByb21pc2UuY29tcGxldGUgPSBwcm9taXNlLmFsd2F5cztcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoXG4gICAgICAgIC8vIHRoZSBqcVhIUiBtZXRob2RzIGFib3J0LCBzdWNjZXNzLCBlcnJvciBhbmQgY29tcGxldGU6XG4gICAgICAgIF9nZXRYSFJQcm9taXNlOiBmdW5jdGlvbiAocmVzb2x2ZU9yUmVqZWN0LCBjb250ZXh0LCBhcmdzKSB7XG4gICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLFxuICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpO1xuICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcy5vcHRpb25zLmNvbnRleHQgfHwgcHJvbWlzZTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVPclJlamVjdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBkZmQucHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6XG4gICAgICAgIF9hZGRDb252ZW5pZW5jZU1ldGhvZHM6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhhdCwgYXJncykucHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZUZ1bmMgfHwgcmVqZWN0RnVuYykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLl9wcm9jZXNzUXVldWUgPSB0aGlzLl9wcm9jZXNzUXVldWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKS5waXBlKHJlc29sdmVGdW5jLCByZWplY3RGdW5jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUoKSAhPT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuanFYSFIgPSB0aGlzLmpxWEhSID1cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJtaXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3N1Ym1pdCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICkgIT09IGZhbHNlKSAmJiB0aGF0Ll9vblNlbmQoZSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkYXRhLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnO1xuICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWwnLCBudWxsLCB0aGlzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGF0YS5zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qcVhIUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NRdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmpxWEhSICYmIHRoaXMuX3Byb2Nlc3NRdWV1ZSAmJiB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpID09PSAncGVuZGluZyc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGF0YS5wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGF0YS5yZXNwb25zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZVxuICAgICAgICAvLyBhbmQgcmV0dXJucyB0aGUgdXBsb2FkZWQgYnl0ZXM6XG4gICAgICAgIF9nZXRVcGxvYWRlZEJ5dGVzOiBmdW5jdGlvbiAoanFYSFIpIHtcbiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLFxuICAgICAgICAgICAgICAgIHBhcnRzID0gcmFuZ2UgJiYgcmFuZ2Uuc3BsaXQoJy0nKSxcbiAgICAgICAgICAgICAgICB1cHBlckJ5dGVzUG9zID0gcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuICAgICAgICAgICAgcmV0dXJuIHVwcGVyQnl0ZXNQb3MgJiYgdXBwZXJCeXRlc1BvcyArIDE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVXBsb2FkcyBhIGZpbGUgaW4gbXVsdGlwbGUsIHNlcXVlbnRpYWwgcmVxdWVzdHNcbiAgICAgICAgLy8gYnkgc3BsaXR0aW5nIHRoZSBmaWxlIHVwIGluIG11bHRpcGxlIGJsb2IgY2h1bmtzLlxuICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlXG4gICAgICAgIC8vIHNob3VsZCBiZSB1cGxvYWRlZCBpbiBjaHVua3MsIGJ1dCBkb2VzIG5vdCBpbnZva2UgYW55XG4gICAgICAgIC8vIHVwbG9hZCByZXF1ZXN0czpcbiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkge1xuICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzIHx8IDA7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sXG4gICAgICAgICAgICAgICAgZnMgPSBmaWxlLnNpemUsXG4gICAgICAgICAgICAgICAgdWIgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMsXG4gICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsXG4gICAgICAgICAgICAgICAgc2xpY2UgPSB0aGlzLl9ibG9iU2xpY2UsXG4gICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLFxuICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLFxuICAgICAgICAgICAgICAgIGpxWEhSLFxuICAgICAgICAgICAgICAgIHVwbG9hZDtcbiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0ZXN0T25seSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHViID49IGZzKSB7XG4gICAgICAgICAgICAgICAgZmlsZS5lcnJvciA9IG9wdGlvbnMuaTE4bigndXBsb2FkZWRCeXRlcycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6XG4gICAgICAgICAgICB1cGxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIG9wdGlvbnMgb2JqZWN0IGZvciBlYWNoIGNodW5rIHVwbG9hZDpcbiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExvYWRlZCA9IG8uX3Byb2dyZXNzLmxvYWRlZDtcbiAgICAgICAgICAgICAgICBvLmJsb2IgPSBzbGljZS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgICB1YixcbiAgICAgICAgICAgICAgICAgICAgdWIgKyBtY3MsXG4gICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgY2h1bmsgc2l6ZSwgYXMgdGhlIGJsb2IgaXRzZWxmXG4gICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOlxuICAgICAgICAgICAgICAgIG8uY2h1bmtTaXplID0gby5ibG9iLnNpemU7XG4gICAgICAgICAgICAgICAgLy8gRXhwb3NlIHRoZSBjaHVuayBieXRlcyBwb3NpdGlvbiByYW5nZTpcbiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgK1xuICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSAtIDEpICsgJy8nICsgZnM7XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgdXBsb2FkIGRhdGEgKHRoZSBibG9iIGFuZCBwb3RlbnRpYWwgZm9ybSBkYXRhKTpcbiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgcHJvZ3Jlc3MgbGlzdGVuZXJzIGZvciB0aGlzIGNodW5rIHVwbG9hZDpcbiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0UHJvZ3Jlc3NMaXN0ZW5lcihvKTtcbiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UsIG8uY29udGV4dCkpXG4gICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHViICsgby5jaHVua1NpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgbm8gZmluYWwgcHJvZ3Jlc3MgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgY2h1bms6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExvYWRlZCArIG8uY2h1bmtTaXplIC0gby5fcHJvZ3Jlc3MubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB1YiAtIG8udXBsb2FkZWRCeXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7XG4gICAgICAgICAgICAgICAgICAgICAgICBvLnJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG8udGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2RvbmUnLCBudWxsLCBvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rYWx3YXlzJywgbnVsbCwgbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgdXBsb2FkIG5vdCB5ZXQgY29tcGxldGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCBjaHVuazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG8udGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBvLmVycm9yVGhyb3duID0gZXJyb3JUaHJvd247XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rYWx3YXlzJywgbnVsbCwgbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2pxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bl1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB1cGxvYWQoKTtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9iZWZvcmVTZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzXG4gICAgICAgICAgICAgICAgLy8gYW5kIG5vIG90aGVyIHVwbG9hZHMgYXJlIGN1cnJlbnRseSBydW5uaW5nLFxuICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGltZXIgZm9yIGdsb2JhbCBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOlxuICAgICAgICAgICAgICAgIHRoaXMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGlzLl9CaXRyYXRlVGltZXIoKTtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczpcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgPSB0aGlzLl9wcm9ncmVzcy50b3RhbCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MuYml0cmF0ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRhaW5lciBvYmplY3RzIGZvciB0aGUgLnJlc3BvbnNlKCkgYW5kXG4gICAgICAgICAgICAvLyAucHJvZ3Jlc3MoKSBtZXRob2RzIG9uIHRoZSBkYXRhIG9iamVjdCBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZTpcbiAgICAgICAgICAgIHRoaXMuX2luaXRSZXNwb25zZU9iamVjdChkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc09iamVjdChkYXRhKTtcbiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7XG4gICAgICAgICAgICBkYXRhLl9wcm9ncmVzcy50b3RhbCA9IGRhdGEudG90YWwgPSB0aGlzLl9nZXRUb3RhbChkYXRhLmZpbGVzKSB8fCAxO1xuICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGdsb2JhbCBwcm9ncmVzcyB2YWx1ZXM6XG4gICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gZGF0YS5sb2FkZWQ7XG4gICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgdG90YWwgPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbCxcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IG9wdGlvbnMuX3Jlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgbm8gZmluYWwgcHJvZ3Jlc3MgZXZlbnRcbiAgICAgICAgICAgICAgICAvLyB3aXRoIGxvYWRlZCBlcXVhbGluZyB0b3RhbCBoYXMgYmVlbiB0cmlnZ2VyZWQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsXG4gICAgICAgICAgICAgICAgfSksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICByZXNwb25zZS50ZXh0U3RhdHVzID0gb3B0aW9ucy50ZXh0U3RhdHVzID0gdGV4dFN0YXR1cztcbiAgICAgICAgICAgIHJlc3BvbnNlLmpxWEhSID0gb3B0aW9ucy5qcVhIUiA9IGpxWEhSO1xuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IG9wdGlvbnMuX3Jlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVjYWxjdWxhdGVQcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbVxuICAgICAgICAgICAgICAgIC8vIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb246XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkIC09IG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3BvbnNlLmpxWEhSID0gb3B0aW9ucy5qcVhIUiA9IGpxWEhSO1xuICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XG4gICAgICAgICAgICByZXNwb25zZS5lcnJvclRocm93biA9IG9wdGlvbnMuZXJyb3JUaHJvd24gPSBlcnJvclRocm93bjtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBudWxsLCBvcHRpb25zKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfb25BbHdheXM6IGZ1bmN0aW9uIChqcVhIUm9yUmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUm9yRXJyb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlXG4gICAgICAgICAgICAvLyBvcHRpb25zIG9iamVjdCB2aWEgZG9uZSBhbmQgZmFpbCBjYWxsYmFja3NcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Fsd2F5cycsIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9vblNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIGpxWEhSLFxuICAgICAgICAgICAgICAgIGFib3J0ZWQsXG4gICAgICAgICAgICAgICAgc2xvdCxcbiAgICAgICAgICAgICAgICBwaXBlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGF0Ll9nZXRBSkFYU2V0dGluZ3MoZGF0YSksXG4gICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fc2VuZGluZyArPSAxO1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGltZXIgZm9yIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAganFYSFIgPSBqcVhIUiB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoKGFib3J0ZWQgfHwgdGhhdC5fdHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnc2VuZCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgb3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2NodW5rZWRVcGxvYWQob3B0aW9ucykgfHwgJC5hamF4KG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Eb25lKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9KS5hbHdheXMoZnVuY3Rpb24gKGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSb3JFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BbHdheXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSb3JFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fc2VuZGluZyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IHRoYXQuX3NlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaGFzIG5vdCBiZWVuIGFib3J0ZWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2dldERlZmVycmVkU3RhdGUobmV4dFNsb3QpID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTbG90LnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fYWN0aXZlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gY29tcGxldGVkLCBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0b3AgZXZlbnQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9iZWZvcmVTZW5kKGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXF1ZW50aWFsVXBsb2FkcyB8fFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPD0gdGhpcy5fc2VuZGluZykpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nsb3RzLnB1c2goc2xvdCk7XG4gICAgICAgICAgICAgICAgICAgIHBpcGUgPSBzbG90LnBpcGUoc2VuZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VxdWVuY2UgPSB0aGlzLl9zZXF1ZW5jZS5waXBlKHNlbmQsIHNlbmQpO1xuICAgICAgICAgICAgICAgICAgICBwaXBlID0gdGhpcy5fc2VxdWVuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgcGlwZWQgUHJvbWlzZSBvYmplY3QsIGVuaGFuY2VkIHdpdGggYW4gYWJvcnQgbWV0aG9kLFxuICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGRlbGVnYXRlZCB0byB0aGUganFYSFIgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHVwbG9hZCxcbiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6XG4gICAgICAgICAgICAgICAgcGlwZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IFt1bmRlZmluZWQsICdhYm9ydCcsICdhYm9ydCddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2xvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QucmVqZWN0V2l0aChvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwaXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZW5kKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX29uQWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIGRhdGEpLFxuICAgICAgICAgICAgICAgIGZpbGVzID0gZGF0YS5maWxlcyxcbiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBsaW1pdCA9IG9wdGlvbnMubGltaXRNdWx0aUZpbGVVcGxvYWRzLFxuICAgICAgICAgICAgICAgIGxpbWl0U2l6ZSA9IG9wdGlvbnMubGltaXRNdWx0aUZpbGVVcGxvYWRTaXplLFxuICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCxcbiAgICAgICAgICAgICAgICBiYXRjaFNpemUgPSAwLFxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKSxcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UsXG4gICAgICAgICAgICAgICAgZmlsZVNldCxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuICAgICAgICAgICAgaWYgKGxpbWl0U2l6ZSAmJiAoIWZpbGVzTGVuZ3RoIHx8IGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzIHx8IGxpbWl0IHx8IGxpbWl0U2l6ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW3BhcmFtTmFtZV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyB8fCBsaW1pdFNpemUpICYmIGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdO1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlc0xlbmd0aDsgaSArPSBsaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lLnNsaWNlKGksIGkgKyBsaW1pdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyAmJiBsaW1pdFNpemUpIHtcbiAgICAgICAgICAgICAgICBmaWxlU2V0ID0gW107XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGVzTGVuZ3RoOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplICs9IGZpbGVzW2ldLnNpemUgKyBvdmVyaGVhZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmF0Y2hTaXplICsgZmlsZXNbaSArIDFdLnNpemUgKyBvdmVyaGVhZCkgPiBsaW1pdFNpemUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbWl0ICYmIGkgKyAxIC0gaiA+PSBsaW1pdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaiwgaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWVTbGljZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldC5wdXNoKHBhcmFtTmFtZVNsaWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCA9IHBhcmFtTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEub3JpZ2luYWxGaWxlcyA9IGZpbGVzO1xuICAgICAgICAgICAgJC5lYWNoKGZpbGVTZXQgfHwgZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpO1xuICAgICAgICAgICAgICAgIG5ld0RhdGEuZmlsZXMgPSBmaWxlU2V0ID8gZWxlbWVudCA6IFtlbGVtZW50XTtcbiAgICAgICAgICAgICAgICBuZXdEYXRhLnBhcmFtTmFtZSA9IHBhcmFtTmFtZVNldFtpbmRleF07XG4gICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpO1xuICAgICAgICAgICAgICAgIHRoYXQuX2luaXRQcm9ncmVzc09iamVjdChuZXdEYXRhKTtcbiAgICAgICAgICAgICAgICB0aGF0Ll9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgbmV3RGF0YSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgJ2FkZCcsXG4gICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ2FkZCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLFxuICAgICAgICAgICAgICAgICAgICBuZXdEYXRhXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIF9yZXBsYWNlRmlsZUlucHV0OiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciBpbnB1dENsb25lID0gaW5wdXQuY2xvbmUodHJ1ZSk7XG4gICAgICAgICAgICAkKCc8Zm9ybT48L2Zvcm0+JykuYXBwZW5kKGlucHV0Q2xvbmUpWzBdLnJlc2V0KCk7XG4gICAgICAgICAgICAvLyBEZXRhY2hpbmcgYWxsb3dzIHRvIGluc2VydCB0aGUgZmlsZUlucHV0IG9uIGFub3RoZXIgZm9ybVxuICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOlxuICAgICAgICAgICAgaW5wdXQuYWZ0ZXIoaW5wdXRDbG9uZSkuZGV0YWNoKCk7XG4gICAgICAgICAgICAvLyBBdm9pZCBtZW1vcnkgbGVha3Mgd2l0aCB0aGUgZGV0YWNoZWQgZmlsZSBpbnB1dDpcbiAgICAgICAgICAgICQuY2xlYW5EYXRhKGlucHV0LnVuYmluZCgncmVtb3ZlJykpO1xuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXRcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzIHNldCB3aXRoIHRoZSBjbG9uZSwgd2hpY2ggaGFzIGJlZW4gY29waWVkIGluY2x1ZGluZ1xuICAgICAgICAgICAgLy8gZXZlbnQgaGFuZGxlcnM6XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsID09PSBpbnB1dFswXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRDbG9uZVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZixcbiAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoaXMuZWxlbWVudCB3aXRoIHRoZSBmaWxlIGlucHV0IGNsb25lOlxuICAgICAgICAgICAgaWYgKGlucHV0WzBdID09PSB0aGlzLmVsZW1lbnRbMF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJ5OiBmdW5jdGlvbiAoZW50cnksIHBhdGgpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksXG4gICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgIWUuZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSAkLndoZW4gcmV0dXJucyBpbW1lZGlhdGVseSBpZiBvbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHZhbGlkIGZpbGVzIGFuZCBpbnZhbGlkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIGluIG9uZSBzZXQ6XG4gICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkaXJSZWFkZXI7XG4gICAgICAgICAgICBwYXRoID0gcGF0aCB8fCAnJztcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgQ2hyb21lIGJ1ZyAjMTQ5NzM1XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgZGlyUmVhZGVyID0gZW50cnkuY3JlYXRlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoICsgZW50cnkubmFtZSArICcvJ1xuICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShmaWxlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmZhaWwoZXJyb3JIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9LCBlcnJvckhhbmRsZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYW4gZW1weSBsaXN0IGZvciBmaWxlIHN5c3RlbSBpdGVtc1xuICAgICAgICAgICAgICAgIC8vIG90aGVyIHRoYW4gZmlsZXMgb3IgZGlyZWN0b3JpZXM6XG4gICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cmllczogZnVuY3Rpb24gKGVudHJpZXMsIHBhdGgpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiAkLndoZW4uYXBwbHkoXG4gICAgICAgICAgICAgICAgJCxcbiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cnkoZW50cnksIHBhdGgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnBpcGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFxuICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9nZXREcm9wcGVkRmlsZXM6IGZ1bmN0aW9uIChkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTtcbiAgICAgICAgICAgIHZhciBpdGVtcyA9IGRhdGFUcmFuc2Zlci5pdGVtcztcbiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggJiYgKGl0ZW1zWzBdLndlYmtpdEdldEFzRW50cnkgfHxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgICAkLm1hcChpdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLndlYmtpdEdldEFzRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGl0ZW0ud2Via2l0R2V0QXNFbnRyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgJC5tYWtlQXJyYXkoZGF0YVRyYW5zZmVyLmZpbGVzKVxuICAgICAgICAgICAgKS5wcm9taXNlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7XG4gICAgICAgICAgICBmaWxlSW5wdXQgPSAkKGZpbGVJbnB1dCk7XG4gICAgICAgICAgICB2YXIgZW50cmllcyA9IGZpbGVJbnB1dC5wcm9wKCd3ZWJraXRFbnRyaWVzJykgfHxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSxcbiAgICAgICAgICAgICAgICBmaWxlcyxcbiAgICAgICAgICAgICAgICB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUZpbGVUcmVlRW50cmllcyhlbnRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpO1xuICAgICAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbGVJbnB1dC5wcm9wKCd2YWx1ZScpO1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKFtdKS5wcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdFxuICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgdGhlIEZpbGUgQVBJIGFuZCB3ZSBhZGQgYSBwc2V1ZG8gRmlsZSBvYmplY3Qgd2l0aFxuICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dCB2YWx1ZSBhcyBuYW1lIHdpdGggcGF0aCBpbmZvcm1hdGlvbiByZW1vdmVkOlxuICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXFxcLywgJycpfV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIEZpbGUgbm9ybWFsaXphdGlvbiBmb3IgU2FmYXJpIDQgYW5kIEZpcmVmb3ggMzpcbiAgICAgICAgICAgICAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICBmaWxlLnNpemUgPSBmaWxlLmZpbGVTaXplO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKGZpbGVzKS5wcm9taXNlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2dldEZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7XG4gICAgICAgICAgICBpZiAoIShmaWxlSW5wdXQgaW5zdGFuY2VvZiAkKSB8fCBmaWxlSW5wdXQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KFxuICAgICAgICAgICAgICAgICQsXG4gICAgICAgICAgICAgICAgJC5tYXAoZmlsZUlucHV0LCB0aGlzLl9nZXRTaW5nbGVGaWxlSW5wdXRGaWxlcylcbiAgICAgICAgICAgICkucGlwZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX29uQ2hhbmdlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVJbnB1dDogJChlLnRhcmdldCksXG4gICAgICAgICAgICAgICAgICAgIGZvcm06ICQoZS50YXJnZXQuZm9ybSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX3JlcGxhY2VGaWxlSW5wdXQoZGF0YS5maWxlSW5wdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhhdC5fdHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdjaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhXG4gICAgICAgICAgICAgICAgICAgICkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9vblBhc3RlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmXG4gICAgICAgICAgICAgICAgICAgIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhLml0ZW1zLFxuICAgICAgICAgICAgICAgIGRhdGEgPSB7ZmlsZXM6IFtdfTtcbiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbXMsIGZ1bmN0aW9uIChpbmRleCwgaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlICYmIGl0ZW0uZ2V0QXNGaWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdwYXN0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVxuICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX29uRHJvcDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXIsXG4gICAgICAgICAgICAgICAgZGF0YSA9IHt9O1xuICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgJiYgZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX3RyaWdnZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ2Ryb3AnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BZGQoZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfb25EcmFnT3ZlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7XG4gICAgICAgICAgICB2YXIgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXI7XG4gICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmICQuaW5BcnJheSgnRmlsZXMnLCBkYXRhVHJhbnNmZXIudHlwZXMpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2RyYWdvdmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ2RyYWdvdmVyJywge2RlbGVnYXRlZEV2ZW50OiBlfSlcbiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2luaXRFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNYSFJVcGxvYWQodGhpcy5vcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwge1xuICAgICAgICAgICAgICAgICAgICBkcmFnb3ZlcjogdGhpcy5fb25EcmFnT3ZlcixcbiAgICAgICAgICAgICAgICAgICAgZHJvcDogdGhpcy5fb25Ecm9wXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLnBhc3RlWm9uZSwge1xuICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbih0aGlzLm9wdGlvbnMuZmlsZUlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZTogdGhpcy5fb25DaGFuZ2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfZGVzdHJveUV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMuZHJvcFpvbmUsICdkcmFnb3ZlciBkcm9wJyk7XG4gICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLnBhc3RlWm9uZSwgJ3Bhc3RlJyk7XG4gICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVJbnB1dCwgJ2NoYW5nZScpO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9zZXRPcHRpb246IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTtcbiAgICAgICAgICAgIGlmIChyZWluaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXN0cm95RXZlbnRIYW5kbGVycygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc3VwZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmVpbml0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdFNwZWNpYWxPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQgPSB0aGlzLmVsZW1lbnQuaXMoJ2lucHV0W3R5cGU9XCJmaWxlXCJdJykgP1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50IDogdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0W3R5cGU9XCJmaWxlXCJdJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlSW5wdXQgaW5zdGFuY2VvZiAkKSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShvcHRpb25zLmRyb3Bab25lIGluc3RhbmNlb2YgJCkpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKG9wdGlvbnMucGFzdGVab25lIGluc3RhbmNlb2YgJCkpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9nZXRSZWdFeHA6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgnLycpLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpO1xuICAgICAgICAgICAgcGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHBhcnRzLmpvaW4oJy8nKSwgbW9kaWZpZXJzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaXNSZWdFeHBPcHRpb246IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIC9eXFwvLipcXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgY2xvbmUgPSAkKHRoaXMuZWxlbWVudFswXS5jbG9uZU5vZGUoZmFsc2UpKTtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczpcbiAgICAgICAgICAgICQuZWFjaChcbiAgICAgICAgICAgICAgICBjbG9uZS5kYXRhKCksXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFBdHRyaWJ1dGVOYW1lID0gJ2RhdGEtJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGNhbWVsQ2FzZSB0byBoeXBoZW4tYXRlZCBrZXk6XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsb25lLmF0dHIoZGF0YUF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5faXNSZWdFeHBPcHRpb24oa2V5LCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2NyZWF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7XG4gICAgICAgICAgICB0aGlzLl9pbml0U3BlY2lhbE9wdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3Nsb3RzID0gW107XG4gICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9zZW5kaW5nID0gdGhpcy5fYWN0aXZlID0gMDtcbiAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5XG4gICAgICAgIC8vIHRoZSBudW1iZXIgb2YgYWN0aXZlIHVwbG9hZHM6XG4gICAgICAgIGFjdGl2ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnlcbiAgICAgICAgLy8gdGhlIHdpZGdldCB1cGxvYWQgcHJvZ3Jlc3MuXG4gICAgICAgIC8vIEl0IHJldHVybnMgYW4gb2JqZWN0IHdpdGggbG9hZGVkLCB0b3RhbCBhbmQgYml0cmF0ZSBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOlxuICAgICAgICBwcm9ncmVzczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBhZGRpbmcgZmlsZXNcbiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2hcbiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgcHJvcGVydHkgYW5kIGNhbiBjb250YWluIGFkZGl0aW9uYWwgb3B0aW9uczpcbiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ2FkZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7XG4gICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghZGF0YSB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKG51bGwsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHNlbmRpbmcgZmlsZXNcbiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2hcbiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAgICAgIC8vIC5maWxldXBsb2FkKCdzZW5kJywge2ZpbGVzOiBmaWxlc0xpc3R9KTtcbiAgICAgICAgLy8gVGhlIG1ldGhvZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZm9yIHRoZSBmaWxlIHVwbG9hZCBjYWxsLlxuICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKGRhdGEgJiYgIXRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVJbnB1dCAmJiAhZGF0YS5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRlZDtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpxWEhSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVqZWN0KG51bGwsICdhYm9ydCcsICdhYm9ydCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dldEZpbGVJbnB1dEZpbGVzKGRhdGEuZmlsZUlucHV0KS5hbHdheXMoXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIgPSB0aGF0Ll9vblNlbmQobnVsbCwgZGF0YSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVqZWN0KGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uU2VuZChudWxsLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgZGF0YSAmJiBkYXRhLmNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICB9KTtcblxufSkpO1xuIl0sImZpbGUiOiJqcXVlcnkuZmlsZXVwbG9hZC5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnkuZmlsZXVwbG9hZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBqUXVlcnkgRmlsZSBVcGxvYWQgUGx1Z2luIDUuNDAuMVxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWRcclxuICpcclxuICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW5cclxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XHJcbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXHJcbiAqL1xyXG5cclxuLyoganNoaW50IG5vbWVuOmZhbHNlICovXHJcbi8qIGdsb2JhbCBkZWZpbmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqL1xyXG5cclxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6XHJcbiAgICAgICAgZGVmaW5lKFtcclxuICAgICAgICAgICAgJ2pxdWVyeScsXHJcbiAgICAgICAgICAgICdqcXVlcnkudWkud2lkZ2V0J1xyXG4gICAgICAgIF0sIGZhY3RvcnkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6XHJcbiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTtcclxuICAgIH1cclxufShmdW5jdGlvbiAoJCkge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIC8vIERldGVjdCBmaWxlIGlucHV0IHN1cHBvcnQsIGJhc2VkIG9uXHJcbiAgICAvLyBodHRwOi8vdmlsamFtaXMuY29tL2Jsb2cvMjAxMi9maWxlLXVwbG9hZC1zdXBwb3J0LW9uLW1vYmlsZS9cclxuICAgICQuc3VwcG9ydC5maWxlSW5wdXQgPSAhKG5ldyBSZWdFeHAoXHJcbiAgICAgICAgLy8gSGFuZGxlIGRldmljZXMgd2hpY2ggZ2l2ZSBmYWxzZSBwb3NpdGl2ZXMgZm9yIHRoZSBmZWF0dXJlIGRldGVjdGlvbjpcclxuICAgICAgICAnKEFuZHJvaWQgKDFcXFxcLlswMTU2XXwyXFxcXC5bMDFdKSknICtcclxuICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFxcXC4wKSl8KFhCTFdQKXwoWnVuZVdQKXwoV1BEZXNrdG9wKScgK1xyXG4gICAgICAgICAgICAnfCh3KGViKT9PU0Jyb3dzZXIpfCh3ZWJPUyknICtcclxuICAgICAgICAgICAgJ3woS2luZGxlLygxXFxcXC4wfDJcXFxcLlswNV18M1xcXFwuMCkpJ1xyXG4gICAgKS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSB8fFxyXG4gICAgICAgIC8vIEZlYXR1cmUgZGV0ZWN0aW9uIGZvciBhbGwgb3RoZXIgZGV2aWNlczpcclxuICAgICAgICAkKCc8aW5wdXQgdHlwZT1cImZpbGVcIj4nKS5wcm9wKCdkaXNhYmxlZCcpKTtcclxuXHJcbiAgICAvLyBUaGUgRmlsZVJlYWRlciBBUEkgaXMgbm90IGFjdHVhbGx5IHVzZWQsIGJ1dCB3b3JrcyBhcyBmZWF0dXJlIGRldGVjdGlvbixcclxuICAgIC8vIGFzIHNvbWUgU2FmYXJpIHZlcnNpb25zICg1Pykgc3VwcG9ydCBYSFIgZmlsZSB1cGxvYWRzIHZpYSB0aGUgRm9ybURhdGEgQVBJLFxyXG4gICAgLy8gYnV0IG5vdCBub24tbXVsdGlwYXJ0IFhIUiBmaWxlIHVwbG9hZHMuXHJcbiAgICAvLyB3aW5kb3cuWE1MSHR0cFJlcXVlc3RVcGxvYWQgaXMgbm90IGF2YWlsYWJsZSBvbiBJRTEwLCBzbyB3ZSBjaGVjayBmb3JcclxuICAgIC8vIHdpbmRvdy5Qcm9ncmVzc0V2ZW50IGluc3RlYWQgdG8gZGV0ZWN0IFhIUjIgZmlsZSB1cGxvYWQgY2FwYWJpbGl0eTpcclxuICAgICQuc3VwcG9ydC54aHJGaWxlVXBsb2FkID0gISEod2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZpbGVSZWFkZXIpO1xyXG4gICAgJC5zdXBwb3J0LnhockZvcm1EYXRhRmlsZVVwbG9hZCA9ICEhd2luZG93LkZvcm1EYXRhO1xyXG5cclxuICAgIC8vIERldGVjdCBzdXBwb3J0IGZvciBCbG9iIHNsaWNpbmcgKHJlcXVpcmVkIGZvciBjaHVua2VkIHVwbG9hZHMpOlxyXG4gICAgJC5zdXBwb3J0LmJsb2JTbGljZSA9IHdpbmRvdy5CbG9iICYmIChCbG9iLnByb3RvdHlwZS5zbGljZSB8fFxyXG4gICAgICAgIEJsb2IucHJvdG90eXBlLndlYmtpdFNsaWNlIHx8IEJsb2IucHJvdG90eXBlLm1velNsaWNlKTtcclxuXHJcbiAgICAvLyBUaGUgZmlsZXVwbG9hZCB3aWRnZXQgbGlzdGVucyBmb3IgY2hhbmdlIGV2ZW50cyBvbiBmaWxlIGlucHV0IGZpZWxkcyBkZWZpbmVkXHJcbiAgICAvLyB2aWEgZmlsZUlucHV0IHNldHRpbmcgYW5kIHBhc3RlIG9yIGRyb3AgZXZlbnRzIG9mIHRoZSBnaXZlbiBkcm9wWm9uZS5cclxuICAgIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGpRdWVyeSBXaWRnZXQgbWV0aG9kcywgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0XHJcbiAgICAvLyBleHBvc2VzIHRoZSBcImFkZFwiIGFuZCBcInNlbmRcIiBtZXRob2RzLCB0byBhZGQgb3IgZGlyZWN0bHkgc2VuZCBmaWxlcyB1c2luZ1xyXG4gICAgLy8gdGhlIGZpbGV1cGxvYWQgQVBJLlxyXG4gICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYWRkZWQgdmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBwYXN0ZSwgZHJhZyAmIGRyb3Agb3JcclxuICAgIC8vIFwiYWRkXCIgbWV0aG9kIGFyZSB1cGxvYWRlZCBpbW1lZGlhdGVseSwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlXHJcbiAgICAvLyB0aGUgXCJhZGRcIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLlxyXG4gICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHtcclxuXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LlxyXG4gICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6XHJcbiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSxcclxuICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB0aGUgY29tcGxldGUgZG9jdW1lbnQuXHJcbiAgICAgICAgICAgIC8vIFNldCB0byBudWxsIHRvIGRpc2FibGUgcGFzdGUgc3VwcG9ydDpcclxuICAgICAgICAgICAgcGFzdGVab25lOiAkKGRvY3VtZW50KSxcclxuICAgICAgICAgICAgLy8gVGhlIGZpbGUgaW5wdXQgZmllbGQocyksIHRoYXQgYXJlIGxpc3RlbmVkIHRvIGZvciBjaGFuZ2UgZXZlbnRzLlxyXG4gICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQsIGl0IGlzIHNldCB0byB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgaW5zaWRlXHJcbiAgICAgICAgICAgIC8vIG9mIHRoZSB3aWRnZXQgZWxlbWVudCBvbiBwbHVnaW4gaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgICAgICAgIC8vIFNldCB0byBudWxsIHRvIGRpc2FibGUgdGhlIGNoYW5nZSBsaXN0ZW5lci5cclxuICAgICAgICAgICAgZmlsZUlucHV0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggYSBjbG9uZSBhZnRlclxyXG4gICAgICAgICAgICAvLyBlYWNoIGlucHV0IGZpZWxkIGNoYW5nZSBldmVudC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgaWZyYW1lIHRyYW5zcG9ydFxyXG4gICAgICAgICAgICAvLyBxdWV1ZXMgYW5kIGFsbG93cyBjaGFuZ2UgZXZlbnRzIHRvIGJlIGZpcmVkIGZvciB0aGUgc2FtZSBmaWxlXHJcbiAgICAgICAgICAgIC8vIHNlbGVjdGlvbiwgYnV0IGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlOlxyXG4gICAgICAgICAgICByZXBsYWNlRmlsZUlucHV0OiB0cnVlLFxyXG4gICAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBmaWxlIGZvcm0gZGF0YSAodGhlIHJlcXVlc3QgYXJndW1lbnQgbmFtZSkuXHJcbiAgICAgICAgICAgIC8vIElmIHVuZGVmaW5lZCBvciBlbXB0eSwgdGhlIG5hbWUgcHJvcGVydHkgb2YgdGhlIGZpbGUgaW5wdXQgZmllbGQgaXNcclxuICAgICAgICAgICAgLy8gdXNlZCwgb3IgXCJmaWxlc1tdXCIgaWYgdGhlIGZpbGUgaW5wdXQgbmFtZSBwcm9wZXJ0eSBpcyBhbHNvIGVtcHR5LFxyXG4gICAgICAgICAgICAvLyBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nczpcclxuICAgICAgICAgICAgcGFyYW1OYW1lOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggZmlsZSBvZiBhIHNlbGVjdGlvbiBpcyB1cGxvYWRlZCB1c2luZyBhbiBpbmRpdmlkdWFsXHJcbiAgICAgICAgICAgIC8vIHJlcXVlc3QgZm9yIFhIUiB0eXBlIHVwbG9hZHMuIFNldCB0byBmYWxzZSB0byB1cGxvYWQgZmlsZVxyXG4gICAgICAgICAgICAvLyBzZWxlY3Rpb25zIGluIG9uZSByZXF1ZXN0IGVhY2g6XHJcbiAgICAgICAgICAgIHNpbmdsZUZpbGVVcGxvYWRzOiB0cnVlLFxyXG4gICAgICAgICAgICAvLyBUbyBsaW1pdCB0aGUgbnVtYmVyIG9mIGZpbGVzIHVwbG9hZGVkIHdpdGggb25lIFhIUiByZXF1ZXN0LFxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDpcclxuICAgICAgICAgICAgbGltaXRNdWx0aUZpbGVVcGxvYWRzOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgb3B0aW9uIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGZpbGVzIHVwbG9hZGVkIHdpdGggb25lXHJcbiAgICAgICAgICAgIC8vIFhIUiByZXF1ZXN0IHRvIGtlZXAgdGhlIHJlcXVlc3Qgc2l6ZSB1bmRlciBvciBlcXVhbCB0byB0aGUgZGVmaW5lZFxyXG4gICAgICAgICAgICAvLyBsaW1pdCBpbiBieXRlczpcclxuICAgICAgICAgICAgbGltaXRNdWx0aUZpbGVVcGxvYWRTaXplOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIC8vIE11bHRpcGFydCBmaWxlIHVwbG9hZHMgYWRkIGEgbnVtYmVyIG9mIGJ5dGVzIHRvIGVhY2ggdXBsb2FkZWQgZmlsZSxcclxuICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGFkZHMgYW4gb3ZlcmhlYWQgZm9yIGVhY2ggZmlsZSB1c2VkXHJcbiAgICAgICAgICAgIC8vIGluIHRoZSBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemUgY29uZmlndXJhdGlvbjpcclxuICAgICAgICAgICAgbGltaXRNdWx0aUZpbGVVcGxvYWRTaXplT3ZlcmhlYWQ6IDUxMixcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWUgdG8gaXNzdWUgYWxsIGZpbGUgdXBsb2FkIHJlcXVlc3RzXHJcbiAgICAgICAgICAgIC8vIGluIGEgc2VxdWVudGlhbCBvcmRlcjpcclxuICAgICAgICAgICAgc2VxdWVudGlhbFVwbG9hZHM6IGZhbHNlLFxyXG4gICAgICAgICAgICAvLyBUbyBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgdXBsb2FkcyxcclxuICAgICAgICAgICAgLy8gc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDA6XHJcbiAgICAgICAgICAgIGxpbWl0Q29uY3VycmVudFVwbG9hZHM6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWUgdG8gZm9yY2UgaWZyYW1lIHRyYW5zcG9ydCB1cGxvYWRzOlxyXG4gICAgICAgICAgICBmb3JjZUlmcmFtZVRyYW5zcG9ydDogZmFsc2UsXHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgbG9jYXRpb24gb2YgYSByZWRpcmVjdCB1cmwgb24gdGhlXHJcbiAgICAgICAgICAgIC8vIG9yaWdpbiBzZXJ2ZXIsIGZvciBjcm9zcy1kb21haW4gaWZyYW1lIHRyYW5zcG9ydCB1cGxvYWRzOlxyXG4gICAgICAgICAgICByZWRpcmVjdDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSByZWRpcmVjdCB1cmwsIHNlbnQgYXMgcGFydCBvZiB0aGUgZm9ybVxyXG4gICAgICAgICAgICAvLyBkYXRhIGFuZCBzZXQgdG8gJ3JlZGlyZWN0JyBpZiB0aGlzIG9wdGlvbiBpcyBlbXB0eTpcclxuICAgICAgICAgICAgcmVkaXJlY3RQYXJhbU5hbWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHBvc3RNZXNzYWdlIHdpbmRvdyxcclxuICAgICAgICAgICAgLy8gdG8gZW5hYmxlIHBvc3RNZXNzYWdlIHRyYW5zcG9ydCB1cGxvYWRzOlxyXG4gICAgICAgICAgICBwb3N0TWVzc2FnZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBYSFIgZmlsZSB1cGxvYWRzIGFyZSBzZW50IGFzIG11bHRpcGFydC9mb3JtLWRhdGEuXHJcbiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGlzIGFsd2F5cyB1c2luZyBtdWx0aXBhcnQvZm9ybS1kYXRhLlxyXG4gICAgICAgICAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZW5hYmxlIG5vbi1tdWx0aXBhcnQgWEhSIHVwbG9hZHM6XHJcbiAgICAgICAgICAgIG11bHRpcGFydDogdHJ1ZSxcclxuICAgICAgICAgICAgLy8gVG8gdXBsb2FkIGxhcmdlIGZpbGVzIGluIHNtYWxsZXIgY2h1bmtzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb25cclxuICAgICAgICAgICAgLy8gdG8gYSBwcmVmZXJyZWQgbWF4aW11bSBjaHVuayBzaXplLiBJZiBzZXQgdG8gMCwgbnVsbCBvciB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIC8vIG9yIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIEJsb2IgQVBJLCBmaWxlcyB3aWxsXHJcbiAgICAgICAgICAgIC8vIGJlIHVwbG9hZGVkIGFzIGEgd2hvbGUuXHJcbiAgICAgICAgICAgIG1heENodW5rU2l6ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAvLyBXaGVuIGEgbm9uLW11bHRpcGFydCB1cGxvYWQgb3IgYSBjaHVua2VkIG11bHRpcGFydCB1cGxvYWQgaGFzIGJlZW5cclxuICAgICAgICAgICAgLy8gYWJvcnRlZCwgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIHRoZSB1cGxvYWQgYnkgc2V0dGluZ1xyXG4gICAgICAgICAgICAvLyBpdCB0byB0aGUgc2l6ZSBvZiB0aGUgYWxyZWFkeSB1cGxvYWRlZCBieXRlcy4gVGhpcyBvcHRpb24gaXMgbW9zdFxyXG4gICAgICAgICAgICAvLyB1c2VmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIG9wdGlvbnMgb2JqZWN0IGluc2lkZSBvZiB0aGUgXCJhZGRcIiBvclxyXG4gICAgICAgICAgICAvLyBcInNlbmRcIiBjYWxsYmFja3MsIGFzIHRoZSBvcHRpb25zIGFyZSBjbG9uZWQgZm9yIGVhY2ggZmlsZSB1cGxvYWQuXHJcbiAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgZmlsZSB1cGxvYWRzIGFyZSByZW1vdmVkIGZyb20gdGhlXHJcbiAgICAgICAgICAgIC8vIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbi4gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlIHRvXHJcbiAgICAgICAgICAgIC8vIHByZXZlbnQgcmVjYWxjdWxhdGluZyB0aGUgZ2xvYmFsIHByb2dyZXNzIGRhdGE6XHJcbiAgICAgICAgICAgIHJlY2FsY3VsYXRlUHJvZ3Jlc3M6IHRydWUsXHJcbiAgICAgICAgICAgIC8vIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBjYWxjdWxhdGUgYW5kIHRyaWdnZXIgcHJvZ3Jlc3MgZXZlbnRzOlxyXG4gICAgICAgICAgICBwcm9ncmVzc0ludGVydmFsOiAxMDAsXHJcbiAgICAgICAgICAgIC8vIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBjYWxjdWxhdGUgcHJvZ3Jlc3MgYml0cmF0ZTpcclxuICAgICAgICAgICAgYml0cmF0ZUludGVydmFsOiA1MDAsXHJcbiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHVwbG9hZHMgYXJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFkZGluZyBmaWxlczpcclxuICAgICAgICAgICAgYXV0b1VwbG9hZDogdHJ1ZSxcclxuXHJcbiAgICAgICAgICAgIC8vIEVycm9yIGFuZCBpbmZvIG1lc3NhZ2VzOlxyXG4gICAgICAgICAgICBtZXNzYWdlczoge1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkZWRCeXRlczogJ1VwbG9hZGVkIGJ5dGVzIGV4Y2VlZCBmaWxlIHNpemUnXHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAvLyBUcmFuc2xhdGlvbiBmdW5jdGlvbiwgZ2V0cyB0aGUgbWVzc2FnZSBrZXkgdG8gYmUgdHJhbnNsYXRlZFxyXG4gICAgICAgICAgICAvLyBhbmQgYW4gb2JqZWN0IHdpdGggY29udGV4dCBzcGVjaWZpYyBkYXRhIGFzIGFyZ3VtZW50czpcclxuICAgICAgICAgICAgaTE4bjogZnVuY3Rpb24gKG1lc3NhZ2UsIGNvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW21lc3NhZ2VdIHx8IG1lc3NhZ2UudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGNvbnRleHQsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoJ3snICsga2V5ICsgJ30nLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgZm9ybSBkYXRhIHRvIGJlIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmlsZSB1cGxvYWRzIGNhbiBiZSBzZXRcclxuICAgICAgICAgICAgLy8gdXNpbmcgdGhpcyBvcHRpb24sIHdoaWNoIGFjY2VwdHMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kXHJcbiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXMsIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHN1Y2ggYW4gYXJyYXksIGEgRm9ybURhdGFcclxuICAgICAgICAgICAgLy8gb2JqZWN0IChmb3IgWEhSIGZpbGUgdXBsb2FkcyksIG9yIGEgc2ltcGxlIG9iamVjdC5cclxuICAgICAgICAgICAgLy8gVGhlIGZvcm0gb2YgdGhlIGZpcnN0IGZpbGVJbnB1dCBpcyBnaXZlbiBhcyBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uOlxyXG4gICAgICAgICAgICBmb3JtRGF0YTogZnVuY3Rpb24gKGZvcm0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtLnNlcmlhbGl6ZUFycmF5KCk7XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWRcclxuICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wLCBwYXN0ZSBvciBhZGQgQVBJIGNhbGwpLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlRmlsZVVwbG9hZHMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZVxyXG4gICAgICAgICAgICAvLyBjYWxsZWQgb25jZSBmb3IgZWFjaCBmaWxlIGluIHRoZSBzZWxlY3Rpb24gZm9yIFhIUiBmaWxlIHVwbG9hZHMsIGVsc2VcclxuICAgICAgICAgICAgLy8gb25jZSBmb3IgZWFjaCBmaWxlIHNlbGVjdGlvbi5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gVGhlIHVwbG9hZCBzdGFydHMgd2hlbiB0aGUgc3VibWl0IG1ldGhvZCBpcyBpbnZva2VkIG9uIHRoZSBkYXRhIHBhcmFtZXRlci5cclxuICAgICAgICAgICAgLy8gVGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGEgZmlsZXMgcHJvcGVydHkgaG9sZGluZyB0aGUgYWRkZWQgZmlsZXNcclxuICAgICAgICAgICAgLy8gYW5kIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgcGx1Z2luIG9wdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgYWpheCBzZXR0aW5ncy5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gTGlzdGVuZXJzIGZvciB0aGlzIGNhbGxiYWNrIGNhbiBhbHNvIGJlIGJvdW5kIHRoZSBmb2xsb3dpbmcgd2F5OlxyXG4gICAgICAgICAgICAvLyAuYmluZCgnZmlsZXVwbG9hZGFkZCcsIGZ1bmMpO1xyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAvLyBkYXRhLnN1Ym1pdCgpIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBhbmQgYWxsb3dzIHRvIGF0dGFjaCBhZGRpdGlvbmFsXHJcbiAgICAgICAgICAgIC8vIGhhbmRsZXJzIHVzaW5nIGpRdWVyeSdzIERlZmVycmVkIGNhbGxiYWNrczpcclxuICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKS5kb25lKGZ1bmMpLmZhaWwoZnVuYykuYWx3YXlzKGZ1bmMpO1xyXG4gICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmF1dG9VcGxvYWQgfHwgKGRhdGEuYXV0b1VwbG9hZCAhPT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maWxldXBsb2FkKCdvcHRpb24nLCAnYXV0b1VwbG9hZCcpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEucHJvY2VzcygpLmRvbmUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgLy8gT3RoZXIgY2FsbGJhY2tzOlxyXG5cclxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdWJtaXQgZXZlbnQgb2YgZWFjaCBmaWxlIHVwbG9hZDpcclxuICAgICAgICAgICAgLy8gc3VibWl0OiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3VibWl0JywgZnVuYyk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSB1cGxvYWQgcmVxdWVzdDpcclxuICAgICAgICAgICAgLy8gc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHNlbmQnLCBmdW5jKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBzdWNjZXNzZnVsIHVwbG9hZHM6XHJcbiAgICAgICAgICAgIC8vIGRvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkb25lJywgZnVuYyk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgdXBsb2FkczpcclxuICAgICAgICAgICAgLy8gZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGZhaWwnLCBmdW5jKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSByZXF1ZXN0czpcclxuICAgICAgICAgICAgLy8gYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkYWx3YXlzJywgZnVuYyk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czpcclxuICAgICAgICAgICAgLy8gcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzcycsIGZ1bmMpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGdsb2JhbCB1cGxvYWQgcHJvZ3Jlc3MgZXZlbnRzOlxyXG4gICAgICAgICAgICAvLyBwcm9ncmVzc2FsbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHByb2dyZXNzYWxsJywgZnVuYyk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDpcclxuICAgICAgICAgICAgLy8gc3RhcnQ6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdGFydCcsIGZ1bmMpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RvcCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdG9wIGV2ZW50OlxyXG4gICAgICAgICAgICAvLyBzdG9wOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RvcCcsIGZ1bmMpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGNoYW5nZSBldmVudHMgb2YgdGhlIGZpbGVJbnB1dChzKTpcclxuICAgICAgICAgICAgLy8gY2hhbmdlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2hhbmdlJywgZnVuYyk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgcGFzdGUgZXZlbnRzIHRvIHRoZSBwYXN0ZVpvbmUocyk6XHJcbiAgICAgICAgICAgIC8vIHBhc3RlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcGFzdGUnLCBmdW5jKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBkcm9wIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6XHJcbiAgICAgICAgICAgIC8vIGRyb3A6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkcm9wJywgZnVuYyk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJhZ292ZXIgZXZlbnRzIG9mIHRoZSBkcm9wWm9uZShzKTpcclxuICAgICAgICAgICAgLy8gZHJhZ292ZXI6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkcmFnb3ZlcicsIGZ1bmMpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGNodW5rIHVwbG9hZCByZXF1ZXN0OlxyXG4gICAgICAgICAgICAvLyBjaHVua3NlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua3NlbmQnLCBmdW5jKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBzdWNjZXNzZnVsIGNodW5rIHVwbG9hZHM6XHJcbiAgICAgICAgICAgIC8vIGNodW5rZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNodW5rZG9uZScsIGZ1bmMpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGNodW5rIHVwbG9hZHM6XHJcbiAgICAgICAgICAgIC8vIGNodW5rZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNodW5rZmFpbCcsIGZ1bmMpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGNvbXBsZXRlZCAoc3VjY2VzcywgYWJvcnQgb3IgZXJyb3IpIGNodW5rIHVwbG9hZCByZXF1ZXN0czpcclxuICAgICAgICAgICAgLy8gY2h1bmthbHdheXM6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2Fsd2F5cycsIGZ1bmMpO1xyXG5cclxuICAgICAgICAgICAgLy8gVGhlIHBsdWdpbiBvcHRpb25zIGFyZSB1c2VkIGFzIHNldHRpbmdzIG9iamVjdCBmb3IgdGhlIGFqYXggY2FsbHMuXHJcbiAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIGpRdWVyeSBhamF4IHNldHRpbmdzIHJlcXVpcmVkIGZvciB0aGUgZmlsZSB1cGxvYWRzOlxyXG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQSBsaXN0IG9mIG9wdGlvbnMgdGhhdCByZXF1aXJlIHJlaW5pdGlhbGl6aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQvb3JcclxuICAgICAgICAvLyBzcGVjaWFsIGluaXRpYWxpemF0aW9uIGNvZGU6XHJcbiAgICAgICAgX3NwZWNpYWxPcHRpb25zOiBbXHJcbiAgICAgICAgICAgICdmaWxlSW5wdXQnLFxyXG4gICAgICAgICAgICAnZHJvcFpvbmUnLFxyXG4gICAgICAgICAgICAncGFzdGVab25lJyxcclxuICAgICAgICAgICAgJ211bHRpcGFydCcsXHJcbiAgICAgICAgICAgICdmb3JjZUlmcmFtZVRyYW5zcG9ydCdcclxuICAgICAgICBdLFxyXG5cclxuICAgICAgICBfYmxvYlNsaWNlOiAkLnN1cHBvcnQuYmxvYlNsaWNlICYmIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHNsaWNlID0gdGhpcy5zbGljZSB8fCB0aGlzLndlYmtpdFNsaWNlIHx8IHRoaXMubW96U2xpY2U7XHJcbiAgICAgICAgICAgIHJldHVybiBzbGljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9CaXRyYXRlVGltZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmJpdHJhdGUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmdldEJpdHJhdGUgPSBmdW5jdGlvbiAobm93LCBsb2FkZWQsIGludGVydmFsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGltZURpZmYgPSBub3cgLSB0aGlzLnRpbWVzdGFtcDtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5iaXRyYXRlIHx8ICFpbnRlcnZhbCB8fCB0aW1lRGlmZiA+IGludGVydmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gKGxvYWRlZCAtIHRoaXMubG9hZGVkKSAqICgxMDAwIC8gdGltZURpZmYpICogODtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IGxvYWRlZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG5vdztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJpdHJhdGU7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2lzWEhSVXBsb2FkOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICByZXR1cm4gIW9wdGlvbnMuZm9yY2VJZnJhbWVUcmFuc3BvcnQgJiZcclxuICAgICAgICAgICAgICAgICgoIW9wdGlvbnMubXVsdGlwYXJ0ICYmICQuc3VwcG9ydC54aHJGaWxlVXBsb2FkKSB8fFxyXG4gICAgICAgICAgICAgICAgJC5zdXBwb3J0LnhockZvcm1EYXRhRmlsZVVwbG9hZCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldEZvcm1EYXRhOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YXIgZm9ybURhdGE7XHJcbiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhKG9wdGlvbnMuZm9ybSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCQuaXNBcnJheShvcHRpb25zLmZvcm1EYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm9ybURhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCQudHlwZShvcHRpb25zLmZvcm1EYXRhKSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gW107XHJcbiAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFRvdGFsOiBmdW5jdGlvbiAoZmlsZXMpIHtcclxuICAgICAgICAgICAgdmFyIHRvdGFsID0gMDtcclxuICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsICs9IGZpbGUuc2l6ZSB8fCAxO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRvdGFsO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pbml0UHJvZ3Jlc3NPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICAgICAgdmFyIHByb2dyZXNzID0ge1xyXG4gICAgICAgICAgICAgICAgbG9hZGVkOiAwLFxyXG4gICAgICAgICAgICAgICAgdG90YWw6IDAsXHJcbiAgICAgICAgICAgICAgICBiaXRyYXRlOiAwXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChvYmouX3Byb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAkLmV4dGVuZChvYmouX3Byb2dyZXNzLCBwcm9ncmVzcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvYmouX3Byb2dyZXNzID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaW5pdFJlc3BvbnNlT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgICAgICAgIHZhciBwcm9wO1xyXG4gICAgICAgICAgICBpZiAob2JqLl9yZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChwcm9wIGluIG9iai5fcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqLl9yZXNwb25zZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqLl9yZXNwb25zZVtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvYmouX3Jlc3BvbnNlID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Qcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5vdyA9ICgoRGF0ZS5ub3cpID8gRGF0ZS5ub3coKSA6IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLl90aW1lICYmIGRhdGEucHJvZ3Jlc3NJbnRlcnZhbCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobm93IC0gZGF0YS5fdGltZSA8IGRhdGEucHJvZ3Jlc3NJbnRlcnZhbCkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgIT09IGUudG90YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkYXRhLl90aW1lID0gbm93O1xyXG4gICAgICAgICAgICAgICAgbG9hZGVkID0gTWF0aC5mbG9vcihcclxuICAgICAgICAgICAgICAgICAgICBlLmxvYWRlZCAvIGUudG90YWwgKiAoZGF0YS5jaHVua1NpemUgfHwgZGF0YS5fcHJvZ3Jlc3MudG90YWwpXHJcbiAgICAgICAgICAgICAgICApICsgKGRhdGEudXBsb2FkZWRCeXRlcyB8fCAwKTtcclxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBzdGF0ZVxyXG4gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGdsb2JhbCBsb2FkZWQgY291bnRlcjpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCArPSAobG9hZGVkIC0gZGF0YS5fcHJvZ3Jlc3MubG9hZGVkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSB0aGlzLl9iaXRyYXRlVGltZXIuZ2V0Qml0cmF0ZShcclxuICAgICAgICAgICAgICAgICAgICBub3csXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYml0cmF0ZUludGVydmFsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MubG9hZGVkID0gZGF0YS5sb2FkZWQgPSBsb2FkZWQ7XHJcbiAgICAgICAgICAgICAgICBkYXRhLl9wcm9ncmVzcy5iaXRyYXRlID0gZGF0YS5iaXRyYXRlID0gZGF0YS5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgbm93LFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZCxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSBjdXN0b20gcHJvZ3Jlc3MgZXZlbnQgd2l0aCBhIHRvdGFsIGRhdGEgcHJvcGVydHkgc2V0XHJcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZmlsZSBzaXplKHMpIG9mIHRoZSBjdXJyZW50IHVwbG9hZCBhbmQgYSBsb2FkZWQgZGF0YVxyXG4gICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgY2FsY3VsYXRlZCBhY2NvcmRpbmdseTpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzJyxcclxuICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzcycsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgZ2xvYmFsIHByb2dyZXNzIGV2ZW50IGZvciBhbGwgY3VycmVudCBmaWxlIHVwbG9hZHMsXHJcbiAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgYWpheCBjYWxscyBxdWV1ZWQgZm9yIHNlcXVlbnRpYWwgZmlsZSB1cGxvYWRzOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcihcclxuICAgICAgICAgICAgICAgICAgICAncHJvZ3Jlc3NhbGwnLFxyXG4gICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3Byb2dyZXNzYWxsJywge2RlbGVnYXRlZEV2ZW50OiBlfSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaW5pdFByb2dyZXNzTGlzdGVuZXI6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcclxuICAgICAgICAgICAgICAgIHhociA9IG9wdGlvbnMueGhyID8gb3B0aW9ucy54aHIoKSA6ICQuYWpheFNldHRpbmdzLnhocigpO1xyXG4gICAgICAgICAgICAvLyBBY2Nlc3NzIHRvIHRoZSBuYXRpdmUgWEhSIG9iamVjdCBpcyByZXF1aXJlZCB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgICAgIC8vIGZvciB0aGUgdXBsb2FkIHByb2dyZXNzIGV2ZW50OlxyXG4gICAgICAgICAgICBpZiAoeGhyLnVwbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgJCh4aHIudXBsb2FkKS5iaW5kKCdwcm9ncmVzcycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9lID0gZS5vcmlnaW5hbEV2ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvZ3Jlc3MgZXZlbnQgcHJvcGVydGllcyBnZXQgY29waWVkIG92ZXI6XHJcbiAgICAgICAgICAgICAgICAgICAgZS5sZW5ndGhDb21wdXRhYmxlID0gb2UubGVuZ3RoQ29tcHV0YWJsZTtcclxuICAgICAgICAgICAgICAgICAgICBlLmxvYWRlZCA9IG9lLmxvYWRlZDtcclxuICAgICAgICAgICAgICAgICAgICBlLnRvdGFsID0gb2UudG90YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcyhlLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy54aHIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhocjtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaXNJbnN0YW5jZU9mOiBmdW5jdGlvbiAodHlwZSwgb2JqKSB7XHJcbiAgICAgICAgICAgIC8vIENyb3NzLWZyYW1lIGluc3RhbmNlb2YgY2hlY2tcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCAnICsgdHlwZSArICddJztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaW5pdFhIUkRhdGE6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcclxuICAgICAgICAgICAgICAgIGZvcm1EYXRhLFxyXG4gICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sXHJcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbm9uLW11bHRpcGFydCBzZXR0aW5nIGlmIG5vdCBzdXBwb3J0ZWQ6XHJcbiAgICAgICAgICAgICAgICBtdWx0aXBhcnQgPSBvcHRpb25zLm11bHRpcGFydCB8fCAhJC5zdXBwb3J0LnhockZpbGVVcGxvYWQsXHJcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSAkLnR5cGUob3B0aW9ucy5wYXJhbU5hbWUpID09PSAnYXJyYXknID9cclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZVswXSA6IG9wdGlvbnMucGFyYW1OYW1lO1xyXG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucy5oZWFkZXJzKTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtUmFuZ2UnXSA9IG9wdGlvbnMuY29udGVudFJhbmdlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghbXVsdGlwYXJ0IHx8IG9wdGlvbnMuYmxvYiB8fCAhdGhpcy5faXNJbnN0YW5jZU9mKCdGaWxlJywgZmlsZSkpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddID0gJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiJyArXHJcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnXCInO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghbXVsdGlwYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRlbnRUeXBlID0gZmlsZS50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gb3B0aW9ucy5ibG9iIHx8IGZpbGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJC5zdXBwb3J0LnhockZvcm1EYXRhRmlsZVVwbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cucG9zdE1lc3NhZ2UgZG9lcyBub3QgYWxsb3cgc2VuZGluZyBGb3JtRGF0YVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdHMsIHNvIHdlIGp1c3QgYWRkIHRoZSBGaWxlL0Jsb2Igb2JqZWN0cyB0b1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb3JtRGF0YSBhcnJheSBhbmQgbGV0IHRoZSBwb3N0TWVzc2FnZSB3aW5kb3dcclxuICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIEZvcm1EYXRhIG9iamVjdCBvdXQgb2YgdGhpcyBhcnJheTpcclxuICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJhbU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5ibG9iXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICgkLnR5cGUob3B0aW9ucy5wYXJhbU5hbWUpID09PSAnYXJyYXknICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5faXNJbnN0YW5jZU9mKCdGb3JtRGF0YScsIG9wdGlvbnMuZm9ybURhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gb3B0aW9ucy5mb3JtRGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyksIGZ1bmN0aW9uIChpbmRleCwgZmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChmaWVsZC5uYW1lLCBmaWVsZC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9iKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChwYXJhbU5hbWUsIG9wdGlvbnMuYmxvYiwgZmlsZS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGFsbG93cyB0aGUgdGVzdHMgdG8gcnVuIHdpdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bW15IG9iamVjdHM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5faXNJbnN0YW5jZU9mKCdGaWxlJywgZmlsZSkgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5faXNJbnN0YW5jZU9mKCdCbG9iJywgZmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgkLnR5cGUob3B0aW9ucy5wYXJhbU5hbWUpID09PSAnYXJyYXknICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZVtpbmRleF0pIHx8IHBhcmFtTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS51cGxvYWROYW1lIHx8IGZpbGUubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IGZvcm1EYXRhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEJsb2IgcmVmZXJlbmNlIGlzIG5vdCBuZWVkZWQgYW55bW9yZSwgZnJlZSBtZW1vcnk6XHJcbiAgICAgICAgICAgIG9wdGlvbnMuYmxvYiA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2luaXRJZnJhbWVTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdmFyIHRhcmdldEhvc3QgPSAkKCc8YT48L2E+JykucHJvcCgnaHJlZicsIG9wdGlvbnMudXJsKS5wcm9wKCdob3N0Jyk7XHJcbiAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIGlmcmFtZSBlbmFibGVzIHRoZSBpZnJhbWUgdHJhbnNwb3J0OlxyXG4gICAgICAgICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ2lmcmFtZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpO1xyXG4gICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBhY2NlcHRzIGEgc2VyaWFsaXplZCBhcnJheSBhcyBmb3JtIGRhdGE6XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKTtcclxuICAgICAgICAgICAgLy8gQWRkIHJlZGlyZWN0IHVybCB0byBmb3JtIGRhdGEgb24gY3Jvc3MtZG9tYWluIHVwbG9hZHM6XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlZGlyZWN0ICYmIHRhcmdldEhvc3QgJiYgdGFyZ2V0SG9zdCAhPT0gbG9jYXRpb24uaG9zdCkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnJlZGlyZWN0UGFyYW1OYW1lIHx8ICdyZWRpcmVjdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMucmVkaXJlY3RcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2luaXREYXRhU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jaHVua2VkVXBsb2FkKG9wdGlvbnMsIHRydWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFhIUkRhdGEob3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc0xpc3RlbmVyKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBkYXRhVHlwZSB0byBwb3N0bWVzc2FnZSBlbmFibGVzIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHBvc3RNZXNzYWdlIHRyYW5zcG9ydDpcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ3Bvc3RtZXNzYWdlICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0SWZyYW1lU2V0dGluZ3Mob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0UGFyYW1OYW1lOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YXIgZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCksXHJcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBvcHRpb25zLnBhcmFtTmFtZTtcclxuICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQodGhpcyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gKGlucHV0LnByb3AoJ2ZpbGVzJykgfHwgWzFdKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lLnB1c2gobmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtmaWxlSW5wdXQucHJvcCgnbmFtZScpIHx8ICdmaWxlc1tdJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoISQuaXNBcnJheShwYXJhbU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBbcGFyYW1OYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcGFyYW1OYW1lO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pbml0Rm9ybVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICAvLyBSZXRyaWV2ZSBtaXNzaW5nIG9wdGlvbnMgZnJvbSB0aGUgaW5wdXQgZmllbGQgYW5kIHRoZVxyXG4gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIGZvcm0sIGlmIGF2YWlsYWJsZTpcclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmZvcm0gfHwgIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybSA9ICQob3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBnaXZlbiBmaWxlIGlucHV0IGRvZXNuJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGZvcm0sXHJcbiAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGRlZmF1bHQgd2lkZ2V0IGZpbGUgaW5wdXQncyBmb3JtOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJCh0aGlzLm9wdGlvbnMuZmlsZUlucHV0LnByb3AoJ2Zvcm0nKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy51cmwpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy5mb3JtLnByb3AoJ2FjdGlvbicpIHx8IGxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gVGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgbXVzdCBiZSBcIlBPU1RcIiBvciBcIlBVVFwiOlxyXG4gICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAob3B0aW9ucy50eXBlIHx8XHJcbiAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLnByb3AoJ21ldGhvZCcpKSB8fCAnJ1xyXG4gICAgICAgICAgICAgICAgKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlICE9PSAnUE9TVCcgJiYgb3B0aW9ucy50eXBlICE9PSAnUFVUJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSAhPT0gJ1BBVENIJykge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCA9IG9wdGlvbnMuZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldEFKQVhTZXR0aW5nczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5faW5pdEZvcm1TZXR0aW5ncyhvcHRpb25zKTtcclxuICAgICAgICAgICAgdGhpcy5faW5pdERhdGFTZXR0aW5ncyhvcHRpb25zKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8galF1ZXJ5IDEuNiBkb2Vzbid0IHByb3ZpZGUgLnN0YXRlKCksXHJcbiAgICAgICAgLy8gd2hpbGUgalF1ZXJ5IDEuOCsgcmVtb3ZlZCAuaXNSZWplY3RlZCgpIGFuZCAuaXNSZXNvbHZlZCgpOlxyXG4gICAgICAgIF9nZXREZWZlcnJlZFN0YXRlOiBmdW5jdGlvbiAoZGVmZXJyZWQpIHtcclxuICAgICAgICAgICAgaWYgKGRlZmVycmVkLnN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQuc3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWQuaXNSZXNvbHZlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3Jlc29sdmVkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWQuaXNSZWplY3RlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JlamVjdGVkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ3BlbmRpbmcnO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIE1hcHMganFYSFIgY2FsbGJhY2tzIHRvIHRoZSBlcXVpdmFsZW50XHJcbiAgICAgICAgLy8gbWV0aG9kcyBvZiB0aGUgZ2l2ZW4gUHJvbWlzZSBvYmplY3Q6XHJcbiAgICAgICAgX2VuaGFuY2VQcm9taXNlOiBmdW5jdGlvbiAocHJvbWlzZSkge1xyXG4gICAgICAgICAgICBwcm9taXNlLnN1Y2Nlc3MgPSBwcm9taXNlLmRvbmU7XHJcbiAgICAgICAgICAgIHByb21pc2UuZXJyb3IgPSBwcm9taXNlLmZhaWw7XHJcbiAgICAgICAgICAgIHByb21pc2UuY29tcGxldGUgPSBwcm9taXNlLmFsd2F5cztcclxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGVuaGFuY2VkIHdpdGhcclxuICAgICAgICAvLyB0aGUganFYSFIgbWV0aG9kcyBhYm9ydCwgc3VjY2VzcywgZXJyb3IgYW5kIGNvbXBsZXRlOlxyXG4gICAgICAgIF9nZXRYSFJQcm9taXNlOiBmdW5jdGlvbiAocmVzb2x2ZU9yUmVqZWN0LCBjb250ZXh0LCBhcmdzKSB7XHJcbiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCksXHJcbiAgICAgICAgICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKTtcclxuICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcy5vcHRpb25zLmNvbnRleHQgfHwgcHJvbWlzZTtcclxuICAgICAgICAgICAgaWYgKHJlc29sdmVPclJlamVjdCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKGNvbnRleHQsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVPclJlamVjdCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGRmZC5yZWplY3RXaXRoKGNvbnRleHQsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBkZmQucHJvbWlzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEFkZHMgY29udmVuaWVuY2UgbWV0aG9kcyB0byB0aGUgZGF0YSBjYWxsYmFjayBhcmd1bWVudDpcclxuICAgICAgICBfYWRkQ29udmVuaWVuY2VNZXRob2RzOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBnZXRQcm9taXNlID0gZnVuY3Rpb24gKGFyZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmVXaXRoKHRoYXQsIGFyZ3MpLnByb21pc2UoKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGRhdGEucHJvY2VzcyA9IGZ1bmN0aW9uIChyZXNvbHZlRnVuYywgcmVqZWN0RnVuYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVGdW5jIHx8IHJlamVjdEZ1bmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLl9wcm9jZXNzUXVldWUgPSB0aGlzLl9wcm9jZXNzUXVldWUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVqZWN0V2l0aCh0aGF0LCBbZGF0YV0pLnByb21pc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByb21pc2UoYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5waXBlKHJlc29sdmVGdW5jLCByZWplY3RGdW5jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUXVldWUgfHwgZ2V0UHJvbWlzZShbdGhpc10pO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBkYXRhLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlKCkgIT09ICdwZW5kaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuanFYSFIgPSB0aGlzLmpxWEhSID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoYXQuX3RyaWdnZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VibWl0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3N1Ym1pdCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgJiYgdGhhdC5fb25TZW5kKGUsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIgfHwgdGhhdC5fZ2V0WEhSUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBkYXRhLmFib3J0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qcVhIUi5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvclRocm93biA9ICdhYm9ydCc7XHJcbiAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsJywgbnVsbCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGRhdGEuc3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qcVhIUikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKHRoaXMuanFYSFIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NRdWV1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKHRoaXMuX3Byb2Nlc3NRdWV1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGRhdGEucHJvY2Vzc2luZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5qcVhIUiAmJiB0aGlzLl9wcm9jZXNzUXVldWUgJiYgdGhhdFxyXG4gICAgICAgICAgICAgICAgICAgIC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpID09PSAncGVuZGluZyc7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGRhdGEucmVzcG9uc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gUGFyc2VzIHRoZSBSYW5nZSBoZWFkZXIgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlXHJcbiAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIHVwbG9hZGVkIGJ5dGVzOlxyXG4gICAgICAgIF9nZXRVcGxvYWRlZEJ5dGVzOiBmdW5jdGlvbiAoanFYSFIpIHtcclxuICAgICAgICAgICAgdmFyIHJhbmdlID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoJ1JhbmdlJyksXHJcbiAgICAgICAgICAgICAgICBwYXJ0cyA9IHJhbmdlICYmIHJhbmdlLnNwbGl0KCctJyksXHJcbiAgICAgICAgICAgICAgICB1cHBlckJ5dGVzUG9zID0gcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XHJcbiAgICAgICAgICAgIHJldHVybiB1cHBlckJ5dGVzUG9zICYmIHVwcGVyQnl0ZXNQb3MgKyAxO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIFVwbG9hZHMgYSBmaWxlIGluIG11bHRpcGxlLCBzZXF1ZW50aWFsIHJlcXVlc3RzXHJcbiAgICAgICAgLy8gYnkgc3BsaXR0aW5nIHRoZSBmaWxlIHVwIGluIG11bHRpcGxlIGJsb2IgY2h1bmtzLlxyXG4gICAgICAgIC8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsIG9ubHkgdGVzdHMgaWYgdGhlIGZpbGVcclxuICAgICAgICAvLyBzaG91bGQgYmUgdXBsb2FkZWQgaW4gY2h1bmtzLCBidXQgZG9lcyBub3QgaW52b2tlIGFueVxyXG4gICAgICAgIC8vIHVwbG9hZCByZXF1ZXN0czpcclxuICAgICAgICBfY2h1bmtlZFVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMsIHRlc3RPbmx5KSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMudXBsb2FkZWRCeXRlcyA9IG9wdGlvbnMudXBsb2FkZWRCeXRlcyB8fCAwO1xyXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBmaWxlID0gb3B0aW9ucy5maWxlc1swXSxcclxuICAgICAgICAgICAgICAgIGZzID0gZmlsZS5zaXplLFxyXG4gICAgICAgICAgICAgICAgdWIgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMsXHJcbiAgICAgICAgICAgICAgICBtY3MgPSBvcHRpb25zLm1heENodW5rU2l6ZSB8fCBmcyxcclxuICAgICAgICAgICAgICAgIHNsaWNlID0gdGhpcy5fYmxvYlNsaWNlLFxyXG4gICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLFxyXG4gICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksXHJcbiAgICAgICAgICAgICAgICBqcVhIUixcclxuICAgICAgICAgICAgICAgIHVwbG9hZDtcclxuICAgICAgICAgICAgaWYgKCEodGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykgJiYgc2xpY2UgJiYgKHViIHx8IG1jcyA8IGZzKSkgfHxcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGVzdE9ubHkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh1YiA+PSBmcykge1xyXG4gICAgICAgICAgICAgICAgZmlsZS5lcnJvciA9IG9wdGlvbnMuaTE4bigndXBsb2FkZWRCeXRlcycpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoXHJcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIFtudWxsLCAnZXJyb3InLCBmaWxlLmVycm9yXVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBUaGUgY2h1bmsgdXBsb2FkIG1ldGhvZDpcclxuICAgICAgICAgICAgdXBsb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIG9wdGlvbnMgb2JqZWN0IGZvciBlYWNoIGNodW5rIHVwbG9hZDpcclxuICAgICAgICAgICAgICAgIHZhciBvID0gJC5leHRlbmQoe30sIG9wdGlvbnMpLFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2FkZWQgPSBvLl9wcm9ncmVzcy5sb2FkZWQ7XHJcbiAgICAgICAgICAgICAgICBvLmJsb2IgPSBzbGljZS5jYWxsKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgdWIsXHJcbiAgICAgICAgICAgICAgICAgICAgdWIgKyBtY3MsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZS50eXBlXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgY2h1bmsgc2l6ZSwgYXMgdGhlIGJsb2IgaXRzZWxmXHJcbiAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGRlcmVmZXJlbmNlZCBhZnRlciBkYXRhIHByb2Nlc3Npbmc6XHJcbiAgICAgICAgICAgICAgICBvLmNodW5rU2l6ZSA9IG8uYmxvYi5zaXplO1xyXG4gICAgICAgICAgICAgICAgLy8gRXhwb3NlIHRoZSBjaHVuayBieXRlcyBwb3NpdGlvbiByYW5nZTpcclxuICAgICAgICAgICAgICAgIG8uY29udGVudFJhbmdlID0gJ2J5dGVzICcgKyB1YiArICctJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKHViICsgby5jaHVua1NpemUgLSAxKSArICcvJyArIGZzO1xyXG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgdXBsb2FkIGRhdGEgKHRoZSBibG9iIGFuZCBwb3RlbnRpYWwgZm9ybSBkYXRhKTpcclxuICAgICAgICAgICAgICAgIHRoYXQuX2luaXRYSFJEYXRhKG8pO1xyXG4gICAgICAgICAgICAgICAgLy8gQWRkIHByb2dyZXNzIGxpc3RlbmVycyBmb3IgdGhpcyBjaHVuayB1cGxvYWQ6XHJcbiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0UHJvZ3Jlc3NMaXN0ZW5lcihvKTtcclxuICAgICAgICAgICAgICAgIGpxWEhSID0gKCh0aGF0Ll90cmlnZ2VyKCdjaHVua3NlbmQnLCBudWxsLCBvKSAhPT0gZmFsc2UgJiYgJC5hamF4KG8pKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvLmNvbnRleHQpKVxyXG4gICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHViID0gdGhhdC5fZ2V0VXBsb2FkZWRCeXRlcyhqcVhIUikgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgbm8gZmluYWwgcHJvZ3Jlc3MgZXZlbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIGNodW5rOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExvYWRlZCArIG8uY2h1bmtTaXplIC0gby5fcHJvZ3Jlc3MubG9hZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vblByb2dyZXNzKCQuRXZlbnQoJ3Byb2dyZXNzJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB1YiAtIG8udXBsb2FkZWRCeXRlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogdWIgLSBvLnVwbG9hZGVkQnl0ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvLnVwbG9hZGVkQnl0ZXMgPSB1YjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgby5yZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG8udGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmtkb25lJywgbnVsbCwgbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rYWx3YXlzJywgbnVsbCwgbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YiA8IGZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIHVwbG9hZCBub3QgeWV0IGNvbXBsZXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCBjaHVuazpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUl1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgby5qcVhIUiA9IGpxWEhSO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvLmVycm9yVGhyb3duID0gZXJyb3JUaHJvd247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZmFpbCcsIG51bGwsIG8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd25dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpO1xyXG4gICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHVwbG9hZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfYmVmb3JlU2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IGNhbGxiYWNrIGlzIHRyaWdnZXJlZCB3aGVuIGFuIHVwbG9hZCBzdGFydHNcclxuICAgICAgICAgICAgICAgIC8vIGFuZCBubyBvdGhlciB1cGxvYWRzIGFyZSBjdXJyZW50bHkgcnVubmluZyxcclxuICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdzdGFydCcpO1xyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBnbG9iYWwgYml0cmF0ZSBwcm9ncmVzcyBjYWxjdWxhdGlvbjpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGlzLl9CaXRyYXRlVGltZXIoKTtcclxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkID0gdGhpcy5fcHJvZ3Jlc3MudG90YWwgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MuYml0cmF0ZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250YWluZXIgb2JqZWN0cyBmb3IgdGhlIC5yZXNwb25zZSgpIGFuZFxyXG4gICAgICAgICAgICAvLyAucHJvZ3Jlc3MoKSBtZXRob2RzIG9uIHRoZSBkYXRhIG9iamVjdCBhcmUgYXZhaWxhYmxlXHJcbiAgICAgICAgICAgIC8vIGFuZCByZXNldCB0byB0aGVpciBpbml0aWFsIHN0YXRlOlxyXG4gICAgICAgICAgICB0aGlzLl9pbml0UmVzcG9uc2VPYmplY3QoZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc09iamVjdChkYXRhKTtcclxuICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MubG9hZGVkID0gZGF0YS5sb2FkZWQgPSBkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMDtcclxuICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MudG90YWwgPSBkYXRhLnRvdGFsID0gdGhpcy5fZ2V0VG90YWwoZGF0YS5maWxlcykgfHwgMTtcclxuICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSArPSAxO1xyXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOlxyXG4gICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gZGF0YS5sb2FkZWQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLnRvdGFsICs9IGRhdGEudG90YWw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uRG9uZTogZnVuY3Rpb24gKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdmFyIHRvdGFsID0gb3B0aW9ucy5fcHJvZ3Jlc3MudG90YWwsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IG9wdGlvbnMuX3Jlc3BvbnNlO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5fcHJvZ3Jlc3MubG9hZGVkIDwgdG90YWwpIHtcclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50XHJcbiAgICAgICAgICAgICAgICAvLyB3aXRoIGxvYWRlZCBlcXVhbGluZyB0b3RhbCBoYXMgYmVlbiB0cmlnZ2VyZWQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vblByb2dyZXNzKCQuRXZlbnQoJ3Byb2dyZXNzJywge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogdG90YWxcclxuICAgICAgICAgICAgICAgIH0pLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNwb25zZS5yZXN1bHQgPSBvcHRpb25zLnJlc3VsdCA9IHJlc3VsdDtcclxuICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLmpxWEhSID0gb3B0aW9ucy5qcVhIUiA9IGpxWEhSO1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdkb25lJywgbnVsbCwgb3B0aW9ucyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uRmFpbDogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgb3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVjYWxjdWxhdGVQcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBmYWlsZWQgKGVycm9yIG9yIGFib3J0KSBmaWxlIHVwbG9hZCBmcm9tXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgZ2xvYmFsIHByb2dyZXNzIGNhbGN1bGF0aW9uOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkIC09IG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLnRvdGFsIC09IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLmpxWEhSID0gb3B0aW9ucy5qcVhIUiA9IGpxWEhSO1xyXG4gICAgICAgICAgICByZXNwb25zZS50ZXh0U3RhdHVzID0gb3B0aW9ucy50ZXh0U3RhdHVzID0gdGV4dFN0YXR1cztcclxuICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JUaHJvd24gPSBvcHRpb25zLmVycm9yVGhyb3duID0gZXJyb3JUaHJvd247XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBudWxsLCBvcHRpb25zKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25BbHdheXM6IGZ1bmN0aW9uIChqcVhIUm9yUmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUm9yRXJyb3IsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgLy8ganFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cyBhbmQganFYSFJvckVycm9yIGFyZSBhZGRlZCB0byB0aGVcclxuICAgICAgICAgICAgLy8gb3B0aW9ucyBvYmplY3QgdmlhIGRvbmUgYW5kIGZhaWwgY2FsbGJhY2tzXHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Fsd2F5cycsIG51bGwsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vblNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmICghZGF0YS5zdWJtaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZENvbnZlbmllbmNlTWV0aG9kcyhlLCBkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBqcVhIUixcclxuICAgICAgICAgICAgICAgIGFib3J0ZWQsXHJcbiAgICAgICAgICAgICAgICBzbG90LFxyXG4gICAgICAgICAgICAgICAgcGlwZSxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGF0Ll9nZXRBSkFYU2V0dGluZ3MoZGF0YSksXHJcbiAgICAgICAgICAgICAgICBzZW5kID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGltZXIgZm9yIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5fYml0cmF0ZVRpbWVyID0gbmV3IHRoYXQuX0JpdHJhdGVUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpxWEhSID0ganFYSFIgfHwgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoKGFib3J0ZWQgfHwgdGhhdC5fdHJpZ2dlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3NlbmQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSA9PT0gZmFsc2UpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UsIG9wdGlvbnMuY29udGV4dCwgYWJvcnRlZCkpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2NodW5rZWRVcGxvYWQob3B0aW9ucykgfHwgJC5hamF4KG9wdGlvbnMpXHJcbiAgICAgICAgICAgICAgICAgICAgKS5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRG9uZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25GYWlsKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uIChqcVhIUm9yUmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUm9yRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BbHdheXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yUmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSb3JFcnJvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fc2VuZGluZyAtPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hY3RpdmUgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IHRoYXQuX3NlbmRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXh0IHF1ZXVlZCB1cGxvYWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBub3QgYmVlbiBhYm9ydGVkOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0U2xvdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKG5leHRTbG90KSA9PT0gJ3BlbmRpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTbG90LnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fYWN0aXZlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3RvcCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbGwgdXBsb2FkcyBoYXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIGNvbXBsZXRlZCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdG9wIGV2ZW50OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5fYmVmb3JlU2VuZChlLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXF1ZW50aWFsVXBsb2FkcyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzIDw9IHRoaXMuX3NlbmRpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2xvdCA9ICQuRGVmZXJyZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zbG90cy5wdXNoKHNsb3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBpcGUgPSBzbG90LnBpcGUoc2VuZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fc2VxdWVuY2UucGlwZShzZW5kLCBzZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICBwaXBlID0gdGhpcy5fc2VxdWVuY2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHBpcGVkIFByb21pc2Ugb2JqZWN0LCBlbmhhbmNlZCB3aXRoIGFuIGFib3J0IG1ldGhvZCxcclxuICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGRlbGVnYXRlZCB0byB0aGUganFYSFIgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHVwbG9hZCxcclxuICAgICAgICAgICAgICAgIC8vIGFuZCBqcVhIUiBjYWxsYmFja3MgbWFwcGVkIHRvIHRoZSBlcXVpdmFsZW50IFByb21pc2UgbWV0aG9kczpcclxuICAgICAgICAgICAgICAgIHBpcGUuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IFt1bmRlZmluZWQsICdhYm9ydCcsICdhYm9ydCddO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghanFYSFIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsb3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QucmVqZWN0V2l0aChvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwaXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc2VuZCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbkFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKSxcclxuICAgICAgICAgICAgICAgIGZpbGVzID0gZGF0YS5maWxlcyxcclxuICAgICAgICAgICAgICAgIGZpbGVzTGVuZ3RoID0gZmlsZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgbGltaXQgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkcyxcclxuICAgICAgICAgICAgICAgIGxpbWl0U2l6ZSA9IG9wdGlvbnMubGltaXRNdWx0aUZpbGVVcGxvYWRTaXplLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmhlYWQgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZU92ZXJoZWFkLFxyXG4gICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMCxcclxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKSxcclxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCxcclxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlLFxyXG4gICAgICAgICAgICAgICAgZmlsZVNldCxcclxuICAgICAgICAgICAgICAgIGksXHJcbiAgICAgICAgICAgICAgICBqID0gMDtcclxuICAgICAgICAgICAgaWYgKGxpbWl0U2l6ZSAmJiAoIWZpbGVzTGVuZ3RoIHx8IGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgIGxpbWl0U2l6ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIShvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzIHx8IGxpbWl0IHx8IGxpbWl0U2l6ZSkgfHxcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIGZpbGVTZXQgPSBbZmlsZXNdO1xyXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW3BhcmFtTmFtZV07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIShvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzIHx8IGxpbWl0U2l6ZSkgJiYgbGltaXQpIHtcclxuICAgICAgICAgICAgICAgIGZpbGVTZXQgPSBbXTtcclxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGVzTGVuZ3RoOyBpICs9IGxpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZVNldC5wdXNoKGZpbGVzLnNsaWNlKGksIGkgKyBsaW1pdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lLnNsaWNlKGksIGkgKyBsaW1pdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWVTbGljZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldC5wdXNoKHBhcmFtTmFtZVNsaWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyAmJiBsaW1pdFNpemUpIHtcclxuICAgICAgICAgICAgICAgIGZpbGVTZXQgPSBbXTtcclxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGVzTGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBiYXRjaFNpemUgKz0gZmlsZXNbaV0uc2l6ZSArIG92ZXJoZWFkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gZmlsZXNMZW5ndGggfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmF0Y2hTaXplICsgZmlsZXNbaSArIDFdLnNpemUgKyBvdmVyaGVhZCkgPiBsaW1pdFNpemUpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGltaXQgJiYgaSArIDEgLSBqID49IGxpbWl0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaiwgaSArIDEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaiwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gcGFyYW1OYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGEub3JpZ2luYWxGaWxlcyA9IGZpbGVzO1xyXG4gICAgICAgICAgICAkLmVhY2goZmlsZVNldCB8fCBmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3RGF0YSA9ICQuZXh0ZW5kKHt9LCBkYXRhKTtcclxuICAgICAgICAgICAgICAgIG5ld0RhdGEuZmlsZXMgPSBmaWxlU2V0ID8gZWxlbWVudCA6IFtlbGVtZW50XTtcclxuICAgICAgICAgICAgICAgIG5ld0RhdGEucGFyYW1OYW1lID0gcGFyYW1OYW1lU2V0W2luZGV4XTtcclxuICAgICAgICAgICAgICAgIHRoYXQuX2luaXRSZXNwb25zZU9iamVjdChuZXdEYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoYXQuX2luaXRQcm9ncmVzc09iamVjdChuZXdEYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoYXQuX2FkZENvbnZlbmllbmNlTWV0aG9kcyhlLCBuZXdEYXRhKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoYXQuX3RyaWdnZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgJ2FkZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnYWRkJywge2RlbGVnYXRlZEV2ZW50OiBlfSksXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9yZXBsYWNlRmlsZUlucHV0OiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgdmFyIGlucHV0Q2xvbmUgPSBpbnB1dC5jbG9uZSh0cnVlKTtcclxuICAgICAgICAgICAgJCgnPGZvcm0+PC9mb3JtPicpLmFwcGVuZChpbnB1dENsb25lKVswXS5yZXNldCgpO1xyXG4gICAgICAgICAgICAvLyBEZXRhY2hpbmcgYWxsb3dzIHRvIGluc2VydCB0aGUgZmlsZUlucHV0IG9uIGFub3RoZXIgZm9ybVxyXG4gICAgICAgICAgICAvLyB3aXRob3V0IGxvb3NpbmcgdGhlIGZpbGUgaW5wdXQgdmFsdWU6XHJcbiAgICAgICAgICAgIGlucHV0LmFmdGVyKGlucHV0Q2xvbmUpLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAvLyBBdm9pZCBtZW1vcnkgbGVha3Mgd2l0aCB0aGUgZGV0YWNoZWQgZmlsZSBpbnB1dDpcclxuICAgICAgICAgICAgJC5jbGVhbkRhdGEoaW5wdXQudW5iaW5kKCdyZW1vdmUnKSk7XHJcbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG9yaWdpbmFsIGZpbGUgaW5wdXQgZWxlbWVudCBpbiB0aGUgZmlsZUlucHV0XHJcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzIHNldCB3aXRoIHRoZSBjbG9uZSwgd2hpY2ggaGFzIGJlZW4gY29waWVkIGluY2x1ZGluZ1xyXG4gICAgICAgICAgICAvLyBldmVudCBoYW5kbGVyczpcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZpbGVJbnB1dCA9IHRoaXMub3B0aW9ucy5maWxlSW5wdXQubWFwKGZ1bmN0aW9uIChpLCBlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsID09PSBpbnB1dFswXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dENsb25lWzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIHdpZGdldCBoYXMgYmVlbiBpbml0aWFsaXplZCBvbiB0aGUgZmlsZSBpbnB1dCBpdHNlbGYsXHJcbiAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoaXMuZWxlbWVudCB3aXRoIHRoZSBmaWxlIGlucHV0IGNsb25lOlxyXG4gICAgICAgICAgICBpZiAoaW5wdXRbMF0gPT09IHRoaXMuZWxlbWVudFswXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gaW5wdXRDbG9uZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJ5OiBmdW5jdGlvbiAoZW50cnksIHBhdGgpIHtcclxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLFxyXG4gICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiAhZS5lbnRyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLmVudHJ5ID0gZW50cnk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlICQud2hlbiByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIG9uZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIERlZmVycmVkIGlzIHJlamVjdGVkLCB3ZSB1c2UgcmVzb2x2ZSBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHZhbGlkIGZpbGVzIGFuZCBpbnZhbGlkIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgaW4gb25lIHNldDpcclxuICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShbZV0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGRpclJlYWRlcjtcclxuICAgICAgICAgICAgcGF0aCA9IHBhdGggfHwgJyc7XHJcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZpbGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5fZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNVxyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoZW50cnkuX2ZpbGUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucmVsYXRpdmVQYXRoID0gcGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoZmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0RpcmVjdG9yeSkge1xyXG4gICAgICAgICAgICAgICAgZGlyUmVhZGVyID0gZW50cnkuY3JlYXRlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBkaXJSZWFkZXIucmVhZEVudHJpZXMoZnVuY3Rpb24gKGVudHJpZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9oYW5kbGVGaWxlVHJlZUVudHJpZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggKyBlbnRyeS5uYW1lICsgJy8nXHJcbiAgICAgICAgICAgICAgICAgICAgKS5kb25lKGZ1bmN0aW9uIChmaWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShmaWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChlcnJvckhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgfSwgZXJyb3JIYW5kbGVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOlxyXG4gICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7XHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseShcclxuICAgICAgICAgICAgICAgICQsXHJcbiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApLnBpcGUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoXHJcbiAgICAgICAgICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7XHJcbiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTtcclxuICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zO1xyXG4gICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShcclxuICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcylcclxuICAgICAgICAgICAgKS5wcm9taXNlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7XHJcbiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTtcclxuICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSxcclxuICAgICAgICAgICAgICAgIGZpbGVzLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU7XHJcbiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpO1xyXG4gICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdFxyXG4gICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDpcclxuICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXFxcLywgJycpfV07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXNbMF0ubmFtZSA9PT0gdW5kZWZpbmVkICYmIGZpbGVzWzBdLmZpbGVOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGaWxlIG5vcm1hbGl6YXRpb24gZm9yIFNhZmFyaSA0IGFuZCBGaXJlZm94IDM6XHJcbiAgICAgICAgICAgICAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGUubmFtZSA9IGZpbGUuZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplID0gZmlsZS5maWxlU2l6ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShmaWxlcykucHJvbWlzZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9nZXRGaWxlSW5wdXRGaWxlczogZnVuY3Rpb24gKGZpbGVJbnB1dCkge1xyXG4gICAgICAgICAgICBpZiAoIShmaWxlSW5wdXQgaW5zdGFuY2VvZiAkKSB8fCBmaWxlSW5wdXQubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMoZmlsZUlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KFxyXG4gICAgICAgICAgICAgICAgJCxcclxuICAgICAgICAgICAgICAgICQubWFwKGZpbGVJbnB1dCwgdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMpXHJcbiAgICAgICAgICAgICkucGlwZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShcclxuICAgICAgICAgICAgICAgICAgICBbXSxcclxuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbkNoYW5nZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXQ6ICQoZS50YXJnZXQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm06ICQoZS50YXJnZXQuZm9ybSlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuX2dldEZpbGVJbnB1dEZpbGVzKGRhdGEuZmlsZUlucHV0KS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLnJlcGxhY2VGaWxlSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9yZXBsYWNlRmlsZUlucHV0KGRhdGEuZmlsZUlucHV0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFcclxuICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsXHJcbiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07XHJcbiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7XHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcclxuICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLFxyXG4gICAgICAgICAgICAgICAgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vbkRyYWdPdmVyOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLmRhdGFUcmFuc2ZlciA9IGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyO1xyXG4gICAgICAgICAgICB2YXIgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXI7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHJhbnNmZXIgJiYgJC5pbkFycmF5KCdGaWxlcycsIGRhdGFUcmFuc2Zlci50eXBlcykgIT09IC0xICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2RyYWdvdmVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJhZ292ZXInLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KVxyXG4gICAgICAgICAgICAgICAgICAgICkgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pbml0RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNYSFJVcGxvYWQodGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmRyb3Bab25lLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ292ZXI6IHRoaXMuX29uRHJhZ092ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcDogdGhpcy5fb25Ecm9wXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ292ZXIgZHJvcCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLnBhc3RlWm9uZSwgJ3Bhc3RlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMuZmlsZUlucHV0LCAnY2hhbmdlJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3NldE9wdGlvbjogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgdmFyIHJlaW5pdCA9ICQuaW5BcnJheShrZXksIHRoaXMuX3NwZWNpYWxPcHRpb25zKSAhPT0gLTE7XHJcbiAgICAgICAgICAgIGlmIChyZWluaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lFdmVudEhhbmRsZXJzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fc3VwZXIoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIGlmIChyZWluaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dCA9IHRoaXMuZWxlbWVudC5pcygnaW5wdXRbdHlwZT1cImZpbGVcIl0nKSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlSW5wdXQgaW5zdGFuY2VvZiAkKSkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIShvcHRpb25zLmRyb3Bab25lIGluc3RhbmNlb2YgJCkpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZHJvcFpvbmUgPSAkKG9wdGlvbnMuZHJvcFpvbmUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghKG9wdGlvbnMucGFzdGVab25lIGluc3RhbmNlb2YgJCkpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucGFzdGVab25lID0gJChvcHRpb25zLnBhc3RlWm9uZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0UmVnRXhwOiBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgnLycpLFxyXG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzID0gcGFydHMucG9wKCk7XHJcbiAgICAgICAgICAgIHBhcnRzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHBhcnRzLmpvaW4oJy8nKSwgbW9kaWZpZXJzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaXNSZWdFeHBPcHRpb246IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXkgIT09ICd1cmwnICYmICQudHlwZSh2YWx1ZSkgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICAgICAgICAvXlxcLy4qXFwvW2lnbV17MCwzfSQvLnRlc3QodmFsdWUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pbml0RGF0YUF0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcclxuICAgICAgICAgICAgICAgIGNsb25lID0gJCh0aGlzLmVsZW1lbnRbMF0uY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczpcclxuICAgICAgICAgICAgJC5lYWNoKFxyXG4gICAgICAgICAgICAgICAgY2xvbmUuZGF0YSgpLFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUF0dHJpYnV0ZU5hbWUgPSAnZGF0YS0nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBjYW1lbENhc2UgdG8gaHlwaGVuLWF0ZWQga2V5OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xvbmUuYXR0cihkYXRhQXR0cmlidXRlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpO1xyXG4gICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5XHJcbiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczpcclxuICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnlcclxuICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy5cclxuICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllc1xyXG4gICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOlxyXG4gICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzcztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzXHJcbiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2hcclxuICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOlxyXG4gICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pO1xyXG4gICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xyXG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlcztcclxuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlc1xyXG4gICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoXHJcbiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6XHJcbiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pO1xyXG4gICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC5cclxuICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb25TZW5kKG51bGwsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKGZhbHNlLCBkYXRhICYmIGRhdGEuY29udGV4dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxufSkpO1xyXG4iXSwiZmlsZSI6ImpxdWVyeS5maWxldXBsb2FkLmpzIiwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0= \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jstree.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jstree.js index adf38767c..4ec0a3423 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jstree.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/jstree.js @@ -5797,4 +5797,4 @@ // $.jstree.defaults.plugins.push("wholerow"); })); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqc3RyZWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypnbG9iYWxzIGpRdWVyeSwgZGVmaW5lLCBleHBvcnRzLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcblx0XHRmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKTtcblx0fVxuXHRlbHNlIHtcblx0XHRmYWN0b3J5KGpRdWVyeSk7XG5cdH1cbn0oZnVuY3Rpb24gKCQsIHVuZGVmaW5lZCkge1xuXHRcInVzZSBzdHJpY3RcIjtcbi8qIVxuICoganNUcmVlIDMuMC4wXG4gKiBodHRwOi8vanN0cmVlLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMgSXZhbiBCb3poYW5vdiAoaHR0cDovL3Zha2F0YS5jb20pXG4gKlxuICogTGljZW5zZWQgc2FtZSBhcyBqcXVlcnkgLSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVCBMaWNlbnNlXG4gKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gKi9cbi8qIVxuICogaWYgdXNpbmcganNsaW50IHBsZWFzZSBhbGxvdyBmb3IgdGhlIGpRdWVyeSBnbG9iYWwgYW5kIHVzZSBmb2xsb3dpbmcgb3B0aW9uczogXG4gKiBqc2xpbnQ6IGJyb3dzZXI6IHRydWUsIGFzczogdHJ1ZSwgYml0d2lzZTogdHJ1ZSwgY29udGludWU6IHRydWUsIG5vbWVuOiB0cnVlLCBwbHVzcGx1czogdHJ1ZSwgcmVnZXhwOiB0cnVlLCB1bnBhcmFtOiB0cnVlLCB0b2RvOiB0cnVlLCB3aGl0ZTogdHJ1ZVxuICovXG5cblx0Ly8gcHJldmVudCBhbm90aGVyIGxvYWQ/IG1heWJlIHRoZXJlIGlzIGEgYmV0dGVyIHdheT9cblx0aWYoJC5qc3RyZWUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogIyMjIGpzVHJlZSBjb3JlIGZ1bmN0aW9uYWxpdHlcblx0ICovXG5cblx0Ly8gaW50ZXJuYWwgdmFyaWFibGVzXG5cdHZhciBpbnN0YW5jZV9jb3VudGVyID0gMCxcblx0XHRjY3Bfbm9kZSA9IGZhbHNlLFxuXHRcdGNjcF9tb2RlID0gZmFsc2UsXG5cdFx0Y2NwX2luc3QgPSBmYWxzZSxcblx0XHR0aGVtZXNfbG9hZGVkID0gW10sXG5cdFx0c3JjID0gJCgnc2NyaXB0Omxhc3QnKS5hdHRyKCdzcmMnKSxcblx0XHRfZCA9IGRvY3VtZW50LCBfbm9kZSA9IF9kLmNyZWF0ZUVsZW1lbnQoJ0xJJyksIF90ZW1wMSwgX3RlbXAyO1xuXG5cdF9ub2RlLnNldEF0dHJpYnV0ZSgncm9sZScsICd0cmVlaXRlbScpO1xuXHRfdGVtcDEgPSBfZC5jcmVhdGVFbGVtZW50KCdJJyk7XG5cdF90ZW1wMS5jbGFzc05hbWUgPSAnanN0cmVlLWljb24ganN0cmVlLW9jbCc7XG5cdF9ub2RlLmFwcGVuZENoaWxkKF90ZW1wMSk7XG5cdF90ZW1wMSA9IF9kLmNyZWF0ZUVsZW1lbnQoJ0EnKTtcblx0X3RlbXAxLmNsYXNzTmFtZSA9ICdqc3RyZWUtYW5jaG9yJztcblx0X3RlbXAxLnNldEF0dHJpYnV0ZSgnaHJlZicsJyMnKTtcblx0X3RlbXAyID0gX2QuY3JlYXRlRWxlbWVudCgnSScpO1xuXHRfdGVtcDIuY2xhc3NOYW1lID0gJ2pzdHJlZS1pY29uIGpzdHJlZS10aGVtZWljb24nO1xuXHRfdGVtcDEuYXBwZW5kQ2hpbGQoX3RlbXAyKTtcblx0X25vZGUuYXBwZW5kQ2hpbGQoX3RlbXAxKTtcblx0X3RlbXAxID0gX3RlbXAyID0gbnVsbDtcblxuXG5cdC8qKlxuXHQgKiBob2xkcyBhbGwganN0cmVlIHJlbGF0ZWQgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGNsYXNzIGFuZCBtZXRob2RzIHRvIGNyZWF0ZSwgYWNjZXNzIGFuZCBtYW5pcHVsYXRlIGluc3RhbmNlcy5cblx0ICogQG5hbWUgJC5qc3RyZWVcblx0ICovXG5cdCQuanN0cmVlID0ge1xuXHRcdC8qKiBcblx0XHQgKiBzcGVjaWZpZXMgdGhlIGpzdHJlZSB2ZXJzaW9uIGluIHVzZVxuXHRcdCAqIEBuYW1lICQuanN0cmVlLnZlcnNpb25cblx0XHQgKi9cblx0XHR2ZXJzaW9uIDogJzMuMC4wLWJldGE5Jyxcblx0XHQvKipcblx0XHQgKiBob2xkcyBhbGwgdGhlIGRlZmF1bHQgb3B0aW9ucyB1c2VkIHdoZW4gY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzXG5cdFx0ICovXG5cdFx0ZGVmYXVsdHMgOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIGNvbmZpZ3VyZSB3aGljaCBwbHVnaW5zIHdpbGwgYmUgYWN0aXZlIG9uIGFuIGluc3RhbmNlLiBTaG91bGQgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncywgd2hlcmUgZWFjaCBlbGVtZW50IGlzIGEgcGx1Z2luIG5hbWUuIFRoZSBkZWZhdWx0IGlzIGBbXWBcblx0XHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnBsdWdpbnNcblx0XHRcdCAqL1xuXHRcdFx0cGx1Z2lucyA6IFtdXG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBzdG9yZXMgYWxsIGxvYWRlZCBqc3RyZWUgcGx1Z2lucyAodXNlZCBpbnRlcm5hbGx5KVxuXHRcdCAqIEBuYW1lICQuanN0cmVlLnBsdWdpbnNcblx0XHQgKi9cblx0XHRwbHVnaW5zIDoge30sXG5cdFx0cGF0aCA6IHNyYyAmJiBzcmMuaW5kZXhPZignLycpICE9PSAtMSA/IHNyYy5yZXBsYWNlKC9cXC9bXlxcL10rJC8sJycpIDogJydcblx0fTtcblx0LyoqXG5cdCAqIGNyZWF0ZXMgYSBqc3RyZWUgaW5zdGFuY2Vcblx0ICogQG5hbWUgJC5qc3RyZWUuY3JlYXRlKGVsIFssIG9wdGlvbnNdKVxuXHQgKiBAcGFyYW0ge0RPTUVsZW1lbnR8alF1ZXJ5fFN0cmluZ30gZWwgdGhlIGVsZW1lbnQgdG8gY3JlYXRlIHRoZSBpbnN0YW5jZSBvbiwgY2FuIGJlIGpRdWVyeSBleHRlbmRlZCBvciBhIHNlbGVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG9wdGlvbnMgZm9yIHRoaXMgaW5zdGFuY2UgKGV4dGVuZHMgYCQuanN0cmVlLmRlZmF1bHRzYClcblx0ICogQHJldHVybiB7anNUcmVlfSB0aGUgbmV3IGluc3RhbmNlXG5cdCAqL1xuXHQkLmpzdHJlZS5jcmVhdGUgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHtcblx0XHR2YXIgdG1wID0gbmV3ICQuanN0cmVlLmNvcmUoKytpbnN0YW5jZV9jb3VudGVyKSxcblx0XHRcdG9wdCA9IG9wdGlvbnM7XG5cdFx0b3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLmpzdHJlZS5kZWZhdWx0cywgb3B0aW9ucyk7XG5cdFx0aWYob3B0ICYmIG9wdC5wbHVnaW5zKSB7XG5cdFx0XHRvcHRpb25zLnBsdWdpbnMgPSBvcHQucGx1Z2lucztcblx0XHR9XG5cdFx0JC5lYWNoKG9wdGlvbnMucGx1Z2lucywgZnVuY3Rpb24gKGksIGspIHtcblx0XHRcdGlmKGkgIT09ICdjb3JlJykge1xuXHRcdFx0XHR0bXAgPSB0bXAucGx1Z2luKGssIG9wdGlvbnNba10pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRtcC5pbml0KGVsLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gdG1wO1xuXHR9O1xuXHQvKipcblx0ICogdGhlIGpzdHJlZSBjbGFzcyBjb25zdHJ1Y3RvciwgdXNlZCBvbmx5IGludGVybmFsbHlcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgJC5qc3RyZWUuY29yZShpZClcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGlkIHRoaXMgaW5zdGFuY2UncyBpbmRleFxuXHQgKi9cblx0JC5qc3RyZWUuY29yZSA9IGZ1bmN0aW9uIChpZCkge1xuXHRcdHRoaXMuX2lkID0gaWQ7XG5cdFx0dGhpcy5fY250ID0gMDtcblx0XHR0aGlzLl9kYXRhID0ge1xuXHRcdFx0Y29yZSA6IHtcblx0XHRcdFx0dGhlbWVzIDoge1xuXHRcdFx0XHRcdG5hbWUgOiBmYWxzZSxcblx0XHRcdFx0XHRkb3RzIDogZmFsc2UsXG5cdFx0XHRcdFx0aWNvbnMgOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZWxlY3RlZCA6IFtdLFxuXHRcdFx0XHRsYXN0X2Vycm9yIDoge31cblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXHQvKipcblx0ICogZ2V0IGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIGluc3RhbmNlXG5cdCAqXG5cdCAqIF9fRXhhbXBsZXNfX1xuXHQgKlxuXHQgKlx0Ly8gcHJvdmlkZWQgYSBjb250YWluZXIgd2l0aCBhbiBJRCBvZiBcInRyZWVcIiwgYW5kIGEgbmVzdGVkIG5vZGUgd2l0aCBhbiBJRCBvZiBcImJyYW5jaFwiXG5cdCAqXHQvLyBhbGwgb2YgdGhlcmUgd2lsbCByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2Vcblx0ICpcdCQuanN0cmVlLnJlZmVyZW5jZSgndHJlZScpO1xuXHQgKlx0JC5qc3RyZWUucmVmZXJlbmNlKCcjdHJlZScpO1xuXHQgKlx0JC5qc3RyZWUucmVmZXJlbmNlKCQoJyN0cmVlJykpO1xuXHQgKlx0JC5qc3RyZWUucmVmZXJlbmNlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlEKCd0cmVlJykpO1xuXHQgKlx0JC5qc3RyZWUucmVmZXJlbmNlKCdicmFuY2gnKTtcblx0ICpcdCQuanN0cmVlLnJlZmVyZW5jZSgnI2JyYW5jaCcpO1xuXHQgKlx0JC5qc3RyZWUucmVmZXJlbmNlKCQoJyNicmFuY2gnKSk7XG5cdCAqXHQkLmpzdHJlZS5yZWZlcmVuY2UoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SUQoJ2JyYW5jaCcpKTtcblx0ICpcblx0ICogQG5hbWUgJC5qc3RyZWUucmVmZXJlbmNlKG5lZWRsZSlcblx0ICogQHBhcmFtIHtET01FbGVtZW50fGpRdWVyeXxTdHJpbmd9IG5lZWRsZVxuXHQgKiBAcmV0dXJuIHtqc1RyZWV8bnVsbH0gdGhlIGluc3RhbmNlIG9yIGBudWxsYCBpZiBub3QgZm91bmRcblx0ICovXG5cdCQuanN0cmVlLnJlZmVyZW5jZSA9IGZ1bmN0aW9uIChuZWVkbGUpIHtcblx0XHRpZihuZWVkbGUgJiYgISQobmVlZGxlKS5sZW5ndGgpIHtcblx0XHRcdGlmKG5lZWRsZS5pZCkge1xuXHRcdFx0XHRuZWVkbGUgPSBuZWVkbGUuaWQ7XG5cdFx0XHR9XG5cdFx0XHR2YXIgdG1wID0gbnVsbDtcblx0XHRcdCQoJy5qc3RyZWUnKS5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGluc3QgPSAkKHRoaXMpLmRhdGEoJ2pzdHJlZScpO1xuXHRcdFx0XHRpZihpbnN0ICYmIGluc3QuX21vZGVsLmRhdGFbbmVlZGxlXSkge1xuXHRcdFx0XHRcdHRtcCA9IGluc3Q7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0bXA7XG5cdFx0fVxuXHRcdHJldHVybiAkKG5lZWRsZSkuY2xvc2VzdCgnLmpzdHJlZScpLmRhdGEoJ2pzdHJlZScpO1xuXHR9O1xuXHQvKipcblx0ICogQ3JlYXRlIGFuIGluc3RhbmNlLCBnZXQgYW4gaW5zdGFuY2Ugb3IgaW52b2tlIGEgY29tbWFuZCBvbiBhIGluc3RhbmNlLiBcblx0ICogXG5cdCAqIElmIHRoZXJlIGlzIG5vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCBgYXJnYCBpcyB1c2VkIHRvIGV4dGVuZCBgJC5qc3RyZWUuZGVmYXVsdHNgIGZvciB0aGlzIG5ldyBpbnN0YW5jZS4gVGhlcmUgd291bGQgYmUgbm8gcmV0dXJuIHZhbHVlIChjaGFpbmluZyBpcyBub3QgYnJva2VuKS5cblx0ICogXG5cdCAqIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGluc3RhbmNlIGFuZCBgYXJnYCBpcyBhIHN0cmluZyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgYnkgYGFyZ2AgaXMgZXhlY3V0ZWQgb24gdGhlIGluc3RhbmNlLCB3aXRoIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHZhbHVlIGl0IHdpbGwgYmUgcmV0dXJuZWQgKGNoYWluaW5nIGNvdWxkIGJyZWFrIGRlcGVuZGluZyBvbiBmdW5jdGlvbikuXG5cdCAqIFxuXHQgKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBpbnN0YW5jZSBhbmQgYGFyZ2AgaXMgbm90IGEgc3RyaW5nIHRoZSBpbnN0YW5jZSBpdHNlbGYgaXMgcmV0dXJuZWQgKHNpbWlsYXIgdG8gYCQuanN0cmVlLnJlZmVyZW5jZWApLlxuXHQgKiBcblx0ICogSW4gYW55IG90aGVyIGNhc2UgLSBub3RoaW5nIGlzIHJldHVybmVkIGFuZCBjaGFpbmluZyBpcyBub3QgYnJva2VuLlxuXHQgKlxuXHQgKiBfX0V4YW1wbGVzX19cblx0ICpcblx0ICpcdCQoJyN0cmVlMScpLmpzdHJlZSgpOyAvLyBjcmVhdGVzIGFuIGluc3RhbmNlXG5cdCAqXHQkKCcjdHJlZTInKS5qc3RyZWUoeyBwbHVnaW5zIDogW10gfSk7IC8vIGNyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIHNvbWUgb3B0aW9uc1xuXHQgKlx0JCgnI3RyZWUxJykuanN0cmVlKCdvcGVuX25vZGUnLCAnI2JyYW5jaF8xJyk7IC8vIGNhbGwgYSBtZXRob2Qgb24gYW4gZXhpc3RpbmcgaW5zdGFuY2UsIHBhc3NpbmcgYWRkaXRpb25hbCBhcmd1bWVudHNcblx0ICpcdCQoJyN0cmVlMicpLmpzdHJlZSgpOyAvLyBnZXQgYW4gZXhpc3RpbmcgaW5zdGFuY2UgKG9yIGNyZWF0ZSBhbiBpbnN0YW5jZSlcblx0ICpcdCQoJyN0cmVlMicpLmpzdHJlZSh0cnVlKTsgLy8gZ2V0IGFuIGV4aXN0aW5nIGluc3RhbmNlICh3aWxsIG5vdCBjcmVhdGUgbmV3IGluc3RhbmNlKVxuXHQgKlx0JCgnI2JyYW5jaF8xJykuanN0cmVlKCkuc2VsZWN0X25vZGUoJyNicmFuY2hfMScpOyAvLyBnZXQgYW4gaW5zdGFuY2UgKHVzaW5nIGEgbmVzdGVkIGVsZW1lbnQgYW5kIGNhbGwgYSBtZXRob2QpXG5cdCAqXG5cdCAqIEBuYW1lICQoKS5qc3RyZWUoW2FyZ10pXG5cdCAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gYXJnXG5cdCAqIEByZXR1cm4ge01peGVkfVxuXHQgKi9cblx0JC5mbi5qc3RyZWUgPSBmdW5jdGlvbiAoYXJnKSB7XG5cdFx0Ly8gY2hlY2sgZm9yIHN0cmluZyBhcmd1bWVudFxuXHRcdHZhciBpc19tZXRob2RcdD0gKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSxcblx0XHRcdGFyZ3NcdFx0PSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxuXHRcdFx0cmVzdWx0XHRcdD0gbnVsbDtcblx0XHR0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gZ2V0IHRoZSBpbnN0YW5jZSAoaWYgdGhlcmUgaXMgb25lKSBhbmQgbWV0aG9kIChpZiBpdCBleGlzdHMpXG5cdFx0XHR2YXIgaW5zdGFuY2UgPSAkLmpzdHJlZS5yZWZlcmVuY2UodGhpcyksXG5cdFx0XHRcdG1ldGhvZCA9IGlzX21ldGhvZCAmJiBpbnN0YW5jZSA/IGluc3RhbmNlW2FyZ10gOiBudWxsO1xuXHRcdFx0Ly8gaWYgY2FsbGluZyBhIG1ldGhvZCwgYW5kIG1ldGhvZCBpcyBhdmFpbGFibGUgLSBleGVjdXRlIG9uIHRoZSBpbnN0YW5jZVxuXHRcdFx0cmVzdWx0ID0gaXNfbWV0aG9kICYmIG1ldGhvZCA/XG5cdFx0XHRcdG1ldGhvZC5hcHBseShpbnN0YW5jZSwgYXJncykgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0Ly8gaWYgdGhlcmUgaXMgbm8gaW5zdGFuY2UgYW5kIG5vIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgLSBjcmVhdGUgb25lXG5cdFx0XHRpZighaW5zdGFuY2UgJiYgIWlzX21ldGhvZCAmJiAoYXJnID09PSB1bmRlZmluZWQgfHwgJC5pc1BsYWluT2JqZWN0KGFyZykpKSB7XG5cdFx0XHRcdCQodGhpcykuZGF0YSgnanN0cmVlJywgbmV3ICQuanN0cmVlLmNyZWF0ZSh0aGlzLCBhcmcpKTtcblx0XHRcdH1cblx0XHRcdC8vIGlmIHRoZXJlIGlzIGFuIGluc3RhbmNlIGFuZCBubyBtZXRob2QgaXMgY2FsbGVkIC0gcmV0dXJuIHRoZSBpbnN0YW5jZVxuXHRcdFx0aWYoaW5zdGFuY2UgJiYgIWlzX21ldGhvZCkge1xuXHRcdFx0XHRyZXN1bHQgPSBpbnN0YW5jZTtcblx0XHRcdH1cblx0XHRcdC8vIGlmIHRoZXJlIHdhcyBhIG1ldGhvZCBjYWxsIHdoaWNoIHJldHVybmVkIGEgcmVzdWx0IC0gYnJlYWsgYW5kIHJldHVybiB0aGUgdmFsdWVcblx0XHRcdGlmKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Ly8gaWYgdGhlcmUgd2FzIGEgbWV0aG9kIGNhbGwgd2l0aCBhIHZhbGlkIHJldHVybiB2YWx1ZSAtIHJldHVybiB0aGF0LCBvdGhlcndpc2UgY29udGludWUgdGhlIGNoYWluXG5cdFx0cmV0dXJuIHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRyZXN1bHQgOiB0aGlzO1xuXHR9O1xuXHQvKipcblx0ICogdXNlZCB0byBmaW5kIGVsZW1lbnRzIGNvbnRhaW5pbmcgYW4gaW5zdGFuY2Vcblx0ICpcblx0ICogX19FeGFtcGxlc19fXG5cdCAqXG5cdCAqXHQkKCdkaXY6anN0cmVlJykuZWFjaChmdW5jdGlvbiAoKSB7XG5cdCAqXHRcdCQodGhpcykuanN0cmVlKCdkZXN0cm95Jyk7XG5cdCAqXHR9KTtcblx0ICpcblx0ICogQG5hbWUgJCgnOmpzdHJlZScpXG5cdCAqIEByZXR1cm4ge2pRdWVyeX1cblx0ICovXG5cdCQuZXhwclsnOiddLmpzdHJlZSA9ICQuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24oc2VhcmNoKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGEpIHtcblx0XHRcdHJldHVybiAkKGEpLmhhc0NsYXNzKCdqc3RyZWUnKSAmJlxuXHRcdFx0XHQkKGEpLmRhdGEoJ2pzdHJlZScpICE9PSB1bmRlZmluZWQ7XG5cdFx0fTtcblx0fSk7XG5cblx0LyoqXG5cdCAqIHN0b3JlcyBhbGwgZGVmYXVsdHMgZm9yIHRoZSBjb3JlXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmVcblx0ICovXG5cdCQuanN0cmVlLmRlZmF1bHRzLmNvcmUgPSB7XG5cdFx0LyoqXG5cdFx0ICogZGF0YSBjb25maWd1cmF0aW9uXG5cdFx0ICogXG5cdFx0ICogSWYgbGVmdCBhcyBgZmFsc2VgIHRoZSBIVE1MIGluc2lkZSB0aGUganN0cmVlIGNvbnRhaW5lciBlbGVtZW50IGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHRyZWUgKHRoYXQgc2hvdWxkIGJlIGFuIHVub3JkZXJlZCBsaXN0IHdpdGggbGlzdCBpdGVtcykuXG5cdFx0ICpcblx0XHQgKiBZb3UgY2FuIGFsc28gcGFzcyBpbiBhIEhUTUwgc3RyaW5nIG9yIGEgSlNPTiBhcnJheSBoZXJlLlxuXHRcdCAqIFxuXHRcdCAqIEl0IGlzIHBvc3NpYmxlIHRvIHBhc3MgaW4gYSBzdGFuZGFyZCBqUXVlcnktbGlrZSBBSkFYIGNvbmZpZyBhbmQganN0cmVlIHdpbGwgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgaWYgdGhlIHJlc3BvbnNlIGlzIEpTT04gb3IgSFRNTCBhbmQgdXNlIHRoYXQgdG8gcG9wdWxhdGUgdGhlIHRyZWUuIFxuXHRcdCAqIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBqUXVlcnkgYWpheCBvcHRpb25zIGhlcmUgeW91IGNhbiBzdXBweSBmdW5jdGlvbnMgZm9yIGBkYXRhYCBhbmQgYHVybGAsIHRoZSBmdW5jdGlvbnMgd2lsbCBiZSBydW4gaW4gdGhlIGN1cnJlbnQgaW5zdGFuY2UncyBzY29wZSBhbmQgYSBwYXJhbSB3aWxsIGJlIHBhc3NlZCBpbmRpY2F0aW5nIHdoaWNoIG5vZGUgaXMgYmVpbmcgbG9hZGVkLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRob3NlIGZ1bmN0aW9ucyB3aWxsIGJlIHVzZWQuXG5cdFx0ICogXG5cdFx0ICogVGhlIGxhc3Qgb3B0aW9uIGlzIHRvIHNwZWNpZnkgYSBmdW5jdGlvbiwgdGhhdCBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgdGhlIG5vZGUgYmVpbmcgbG9hZGVkIGFzIGFyZ3VtZW50IGFuZCBhIHNlY29uZCBwYXJhbSB3aGljaCBpcyBhIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVzdWx0LlxuXHRcdCAqXG5cdFx0ICogX19FeGFtcGxlc19fXG5cdFx0ICpcblx0XHQgKlx0Ly8gQUpBWFxuXHRcdCAqXHQkKCcjdHJlZScpLmpzdHJlZSh7XG5cdFx0ICpcdFx0J2NvcmUnIDoge1xuXHRcdCAqXHRcdFx0J2RhdGEnIDoge1xuXHRcdCAqXHRcdFx0XHQndXJsJyA6ICcvZ2V0L2NoaWxkcmVuLycsXG5cdFx0ICpcdFx0XHRcdCdkYXRhJyA6IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0ICpcdFx0XHRcdFx0cmV0dXJuIHsgJ2lkJyA6IG5vZGUuaWQgfTtcblx0XHQgKlx0XHRcdFx0fVxuXHRcdCAqXHRcdFx0fVxuXHRcdCAqXHRcdH0pO1xuXHRcdCAqXG5cdFx0ICpcdC8vIGRpcmVjdCBkYXRhXG5cdFx0ICpcdCQoJyN0cmVlJykuanN0cmVlKHtcblx0XHQgKlx0XHQnY29yZScgOiB7XG5cdFx0ICpcdFx0XHQnZGF0YScgOiBbXG5cdFx0ICpcdFx0XHRcdCdTaW1wbGUgcm9vdCBub2RlJyxcblx0XHQgKlx0XHRcdFx0e1xuXHRcdCAqXHRcdFx0XHRcdCdpZCcgOiAnbm9kZV8yJyxcblx0XHQgKlx0XHRcdFx0XHQndGV4dCcgOiAnUm9vdCBub2RlIHdpdGggb3B0aW9ucycsXG5cdFx0ICpcdFx0XHRcdFx0J3N0YXRlJyA6IHsgJ29wZW5lZCcgOiB0cnVlLCAnc2VsZWN0ZWQnIDogdHJ1ZSB9LFxuXHRcdCAqXHRcdFx0XHRcdCdjaGlsZHJlbicgOiBbIHsgJ3RleHQnIDogJ0NoaWxkIDEnIH0sICdDaGlsZCAyJ11cblx0XHQgKlx0XHRcdFx0fVxuXHRcdCAqXHRcdFx0XVxuXHRcdCAqXHRcdH0pO1xuXHRcdCAqXHRcblx0XHQgKlx0Ly8gZnVuY3Rpb25cblx0XHQgKlx0JCgnI3RyZWUnKS5qc3RyZWUoe1xuXHRcdCAqXHRcdCdjb3JlJyA6IHtcblx0XHQgKlx0XHRcdCdkYXRhJyA6IGZ1bmN0aW9uIChvYmosIGNhbGxiYWNrKSB7XG5cdFx0ICpcdFx0XHRcdGNhbGxiYWNrLmNhbGwodGhpcywgWydSb290IDEnLCAnUm9vdCAyJ10pO1xuXHRcdCAqXHRcdFx0fVxuXHRcdCAqXHRcdH0pO1xuXHRcdCAqIFxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUuZGF0YVxuXHRcdCAqL1xuXHRcdGRhdGFcdFx0XHQ6IGZhbHNlLFxuXHRcdC8qKlxuXHRcdCAqIGNvbmZpZ3VyZSB0aGUgdmFyaW91cyBzdHJpbmdzIHVzZWQgdGhyb3VnaG91dCB0aGUgdHJlZVxuXHRcdCAqXG5cdFx0ICogWW91IGNhbiB1c2UgYW4gb2JqZWN0IHdoZXJlIHRoZSBrZXkgaXMgdGhlIHN0cmluZyB5b3UgbmVlZCB0byByZXBsYWNlIGFuZCB0aGUgdmFsdWUgaXMgeW91ciByZXBsYWNlbWVudC5cblx0XHQgKiBBbm90aGVyIG9wdGlvbiBpcyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBvZiB0aGUgbmVlZGVkIHN0cmluZyBhbmQgc2hvdWxkIHJldHVybiB0aGUgcmVwbGFjZW1lbnQuXG5cdFx0ICogSWYgbGVmdCBhcyBgZmFsc2VgIG5vIHJlcGxhY2VtZW50IGlzIG1hZGUuXG5cdFx0ICpcblx0XHQgKiBfX0V4YW1wbGVzX19cblx0XHQgKlxuXHRcdCAqXHQkKCcjdHJlZScpLmpzdHJlZSh7XG5cdFx0ICpcdFx0J2NvcmUnIDoge1xuXHRcdCAqXHRcdFx0J3N0cmluZ3MnIDoge1xuXHRcdCAqXHRcdFx0XHQnTG9hZGluZy4uLicgOiAnUGxlYXNlIHdhaXQgLi4uJ1xuXHRcdCAqXHRcdFx0fVxuXHRcdCAqXHRcdH1cblx0XHQgKlx0fSk7XG5cdFx0ICpcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb3JlLnN0cmluZ3Ncblx0XHQgKi9cblx0XHRzdHJpbmdzXHRcdFx0OiBmYWxzZSxcblx0XHQvKipcblx0XHQgKiBkZXRlcm1pbmVzIHdoYXQgaGFwcGVucyB3aGVuIGEgdXNlciB0cmllcyB0byBtb2RpZnkgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdHJlZVxuXHRcdCAqIElmIGxlZnQgYXMgYGZhbHNlYCBhbGwgb3BlcmF0aW9ucyBsaWtlIGNyZWF0ZSwgcmVuYW1lLCBkZWxldGUsIG1vdmUgb3IgY29weSBhcmUgcHJldmVudGVkLlxuXHRcdCAqIFlvdSBjYW4gc2V0IHRoaXMgdG8gYHRydWVgIHRvIGFsbG93IGFsbCBpbnRlcmFjdGlvbnMgb3IgdXNlIGEgZnVuY3Rpb24gdG8gaGF2ZSBiZXR0ZXIgY29udHJvbC5cblx0XHQgKlxuXHRcdCAqIF9fRXhhbXBsZXNfX1xuXHRcdCAqXG5cdFx0ICpcdCQoJyN0cmVlJykuanN0cmVlKHtcblx0XHQgKlx0XHQnY29yZScgOiB7XG5cdFx0ICpcdFx0XHQnY2hlY2tfY2FsbGJhY2snIDogZnVuY3Rpb24gKG9wZXJhdGlvbiwgbm9kZSwgbm9kZV9wYXJlbnQsIG5vZGVfcG9zaXRpb24pIHtcblx0XHQgKlx0XHRcdFx0Ly8gb3BlcmF0aW9uIGNhbiBiZSAnY3JlYXRlX25vZGUnLCAncmVuYW1lX25vZGUnLCAnZGVsZXRlX25vZGUnLCAnbW92ZV9ub2RlJyBvciAnY29weV9ub2RlJ1xuXHRcdCAqXHRcdFx0XHQvLyBpbiBjYXNlIG9mICdyZW5hbWVfbm9kZScgbm9kZV9wb3NpdGlvbiBpcyBmaWxsZWQgd2l0aCB0aGUgbmV3IG5vZGUgbmFtZVxuXHRcdCAqXHRcdFx0XHRyZXR1cm4gb3BlcmF0aW9uID09PSAncmVuYW1lX25vZGUnID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdCAqXHRcdFx0fVxuXHRcdCAqXHRcdH1cblx0XHQgKlx0fSk7XG5cdFx0ICogXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS5jaGVja19jYWxsYmFja1xuXHRcdCAqL1xuXHRcdGNoZWNrX2NhbGxiYWNrXHQ6IGZhbHNlLFxuXHRcdC8qKlxuXHRcdCAqIGEgY2FsbGJhY2sgY2FsbGVkIHdpdGggYSBzaW5nbGUgb2JqZWN0IHBhcmFtZXRlciBpbiB0aGUgaW5zdGFuY2UncyBzY29wZSB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nIChvcGVyYXRpb24gcHJldmVudGVkLCBhamF4IGZhaWxlZCwgZXRjKVxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUuZXJyb3Jcblx0XHQgKi9cblx0XHRlcnJvclx0XHRcdDogJC5ub29wLFxuXHRcdC8qKlxuXHRcdCAqIHRoZSBvcGVuIC8gY2xvc2UgYW5pbWF0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAtIHNldCB0aGlzIHRvIGBmYWxzZWAgdG8gZGlzYWJsZSB0aGUgYW5pbWF0aW9uIChkZWZhdWx0IGlzIGAyMDBgKVxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUuYW5pbWF0aW9uXG5cdFx0ICovXG5cdFx0YW5pbWF0aW9uXHRcdDogMjAwLFxuXHRcdC8qKlxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIG11bHRpcGxlIG5vZGVzIGNhbiBiZSBzZWxlY3RlZFxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUubXVsdGlwbGVcblx0XHQgKi9cblx0XHRtdWx0aXBsZVx0XHQ6IHRydWUsXG5cdFx0LyoqXG5cdFx0ICogdGhlbWUgY29uZmlndXJhdGlvbiBvYmplY3Rcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb3JlLnRoZW1lc1xuXHRcdCAqL1xuXHRcdHRoZW1lc1x0XHRcdDoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0aGUgbmFtZSBvZiB0aGUgdGhlbWUgdG8gdXNlIChpZiBsZWZ0IGFzIGBmYWxzZWAgdGhlIGRlZmF1bHQgdGhlbWUgaXMgdXNlZClcblx0XHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUudGhlbWVzLm5hbWVcblx0XHRcdCAqL1xuXHRcdFx0bmFtZVx0XHRcdDogZmFsc2UsXG5cdFx0XHQvKipcblx0XHRcdCAqIHRoZSBVUkwgb2YgdGhlIHRoZW1lJ3MgQ1NTIGZpbGUsIGxlYXZlIHRoaXMgYXMgYGZhbHNlYCBpZiB5b3UgaGF2ZSBtYW51YWxseSBpbmNsdWRlZCB0aGUgdGhlbWUgQ1NTIChyZWNvbW1lbmRlZCkuIFlvdSBjYW4gc2V0IHRoaXMgdG8gYHRydWVgIHRvbyB3aGljaCB3aWxsIHRyeSB0byBhdXRvbG9hZCB0aGUgdGhlbWUuXG5cdFx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb3JlLnRoZW1lcy51cmxcblx0XHRcdCAqL1xuXHRcdFx0dXJsXHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0LyoqXG5cdFx0XHQgKiB0aGUgbG9jYXRpb24gb2YgYWxsIGpzdHJlZSB0aGVtZXMgLSBvbmx5IHVzZWQgaWYgYHVybGAgaXMgc2V0IHRvIGB0cnVlYFxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMuZGlyXG5cdFx0XHQgKi9cblx0XHRcdGRpclx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdC8qKlxuXHRcdFx0ICogYSBib29sZWFuIGluZGljYXRpbmcgaWYgY29ubmVjdGluZyBkb3RzIGFyZSBzaG93blxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMuZG90c1xuXHRcdFx0ICovXG5cdFx0XHRkb3RzXHRcdFx0OiB0cnVlLFxuXHRcdFx0LyoqXG5cdFx0XHQgKiBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBub2RlIGljb25zIGFyZSBzaG93blxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMuaWNvbnNcblx0XHRcdCAqL1xuXHRcdFx0aWNvbnNcdFx0XHQ6IHRydWUsXG5cdFx0XHQvKipcblx0XHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB0cmVlIGJhY2tncm91bmQgaXMgc3RyaXBlZFxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMuc3RyaXBlc1xuXHRcdFx0ICovXG5cdFx0XHRzdHJpcGVzXHRcdFx0OiBmYWxzZSxcblx0XHRcdC8qKlxuXHRcdFx0ICogYSBzdHJpbmcgKG9yIGJvb2xlYW4gYGZhbHNlYCkgc3BlY2lmeWluZyB0aGUgdGhlbWUgdmFyaWFudCB0byB1c2UgKGlmIHRoZSB0aGVtZSBzdXBwb3J0cyB2YXJpYW50cylcblx0XHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUudGhlbWVzLnZhcmlhbnRcblx0XHRcdCAqL1xuXHRcdFx0dmFyaWFudFx0XHRcdDogZmFsc2UsXG5cdFx0XHQvKipcblx0XHRcdCAqIGEgYm9vbGVhbiBzcGVjaWZ5aW5nIGlmIGEgcmVwb25zaXZlIHZlcnNpb24gb2YgdGhlIHRoZW1lIHNob3VsZCBraWNrIGluIG9uIHNtYWxsZXIgc2NyZWVucyAoaWYgdGhlIHRoZW1lIHN1cHBvcnRzIGl0KS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMucmVzcG9uc2l2ZVxuXHRcdFx0ICovXG5cdFx0XHRyZXNwb25zaXZlXHRcdDogdHJ1ZVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogaWYgbGVmdCBhcyBgdHJ1ZWAgYWxsIHBhcmVudHMgb2YgYWxsIHNlbGVjdGVkIG5vZGVzIHdpbGwgYmUgb3BlbmVkIG9uY2UgdGhlIHRyZWUgbG9hZHMgKHNvIHRoYXQgYWxsIHNlbGVjdGVkIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSB1c2VyKVxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUuZXhwYW5kX3NlbGVjdGVkX29ubG9hZFxuXHRcdCAqL1xuXHRcdGV4cGFuZF9zZWxlY3RlZF9vbmxvYWQgOiB0cnVlXG5cdH07XG5cdCQuanN0cmVlLmNvcmUucHJvdG90eXBlID0ge1xuXHRcdC8qKlxuXHRcdCAqIHVzZWQgdG8gZGVjb3JhdGUgYW4gaW5zdGFuY2Ugd2l0aCBhIHBsdWdpbi4gVXNlZCBpbnRlcm5hbGx5LlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQG5hbWUgcGx1Z2luKGRlY28gWywgb3B0c10pXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBkZWNvIHRoZSBwbHVnaW4gdG8gZGVjb3JhdGUgd2l0aFxuXHRcdCAqIEBwYXJhbSAge09iamVjdH0gb3B0cyBvcHRpb25zIGZvciB0aGUgcGx1Z2luXG5cdFx0ICogQHJldHVybiB7anNUcmVlfVxuXHRcdCAqL1xuXHRcdHBsdWdpbiA6IGZ1bmN0aW9uIChkZWNvLCBvcHRzKSB7XG5cdFx0XHR2YXIgQ2hpbGQgPSAkLmpzdHJlZS5wbHVnaW5zW2RlY29dO1xuXHRcdFx0aWYoQ2hpbGQpIHtcblx0XHRcdFx0dGhpcy5fZGF0YVtkZWNvXSA9IHt9O1xuXHRcdFx0XHRDaGlsZC5wcm90b3R5cGUgPSB0aGlzO1xuXHRcdFx0XHRyZXR1cm4gbmV3IENoaWxkKG9wdHMsIHRoaXMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiB1c2VkIHRvIGRlY29yYXRlIGFuIGluc3RhbmNlIHdpdGggYSBwbHVnaW4uIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIGluaXQoZWwsIG9wdG9ucylcblx0XHQgKiBAcGFyYW0ge0RPTUVsZW1lbnR8alF1ZXJ5fFN0cmluZ30gZWwgdGhlIGVsZW1lbnQgd2UgYXJlIHRyYW5zZm9ybWluZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG9wdGlvbnMgZm9yIHRoaXMgaW5zdGFuY2Vcblx0XHQgKiBAdHJpZ2dlciBpbml0LmpzdHJlZSwgbG9hZGluZy5qc3RyZWUsIGxvYWRlZC5qc3RyZWUsIHJlYWR5LmpzdHJlZSwgY2hhbmdlZC5qc3RyZWVcblx0XHQgKi9cblx0XHRpbml0IDogZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7XG5cdFx0XHR0aGlzLl9tb2RlbCA9IHtcblx0XHRcdFx0ZGF0YSA6IHtcblx0XHRcdFx0XHQnIycgOiB7XG5cdFx0XHRcdFx0XHRpZCA6ICcjJyxcblx0XHRcdFx0XHRcdHBhcmVudCA6IG51bGwsXG5cdFx0XHRcdFx0XHRwYXJlbnRzIDogW10sXG5cdFx0XHRcdFx0XHRjaGlsZHJlbiA6IFtdLFxuXHRcdFx0XHRcdFx0Y2hpbGRyZW5fZCA6IFtdLFxuXHRcdFx0XHRcdFx0c3RhdGUgOiB7IGxvYWRlZCA6IGZhbHNlIH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNoYW5nZWQgOiBbXSxcblx0XHRcdFx0Zm9yY2VfZnVsbF9yZWRyYXcgOiBmYWxzZSxcblx0XHRcdFx0cmVkcmF3X3RpbWVvdXQgOiBmYWxzZSxcblx0XHRcdFx0ZGVmYXVsdF9zdGF0ZSA6IHtcblx0XHRcdFx0XHRsb2FkZWQgOiB0cnVlLFxuXHRcdFx0XHRcdG9wZW5lZCA6IGZhbHNlLFxuXHRcdFx0XHRcdHNlbGVjdGVkIDogZmFsc2UsXG5cdFx0XHRcdFx0ZGlzYWJsZWQgOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLmVsZW1lbnQgPSAkKGVsKS5hZGRDbGFzcygnanN0cmVlIGpzdHJlZS0nICsgdGhpcy5faWQpO1xuXHRcdFx0dGhpcy5zZXR0aW5ncyA9IG9wdGlvbnM7XG5cdFx0XHR0aGlzLmVsZW1lbnQuYmluZChcImRlc3Ryb3llZFwiLCAkLnByb3h5KHRoaXMudGVhcmRvd24sIHRoaXMpKTtcblxuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLnJlYWR5ID0gZmFsc2U7XG5cdFx0XHR0aGlzLl9kYXRhLmNvcmUubG9hZGVkID0gZmFsc2U7XG5cdFx0XHR0aGlzLl9kYXRhLmNvcmUucnRsID0gKHRoaXMuZWxlbWVudC5jc3MoXCJkaXJlY3Rpb25cIikgPT09IFwicnRsXCIpO1xuXHRcdFx0dGhpcy5lbGVtZW50W3RoaXMuX2RhdGEuY29yZS5ydGwgPyAnYWRkQ2xhc3MnIDogJ3JlbW92ZUNsYXNzJ10oXCJqc3RyZWUtcnRsXCIpO1xuXHRcdFx0dGhpcy5lbGVtZW50LmF0dHIoJ3JvbGUnLCd0cmVlJyk7XG5cblx0XHRcdHRoaXMuYmluZCgpO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgYWZ0ZXIgYWxsIGV2ZW50cyBhcmUgYm91bmRcblx0XHRcdCAqIEBldmVudFxuXHRcdFx0ICogQG5hbWUgaW5pdC5qc3RyZWVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKFwiaW5pdFwiKTtcblxuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLm9yaWdpbmFsX2NvbnRhaW5lcl9odG1sID0gdGhpcy5lbGVtZW50LmZpbmQoXCIgPiB1bCA+IGxpXCIpLmNsb25lKHRydWUpO1xuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLm9yaWdpbmFsX2NvbnRhaW5lcl9odG1sXG5cdFx0XHRcdC5maW5kKFwibGlcIikuYWRkQmFjaygpXG5cdFx0XHRcdC5jb250ZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ub2RlVHlwZSA9PT0gMyAmJiAoIXRoaXMubm9kZVZhbHVlIHx8IC9eXFxzKyQvLnRlc3QodGhpcy5ub2RlVmFsdWUpKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnJlbW92ZSgpO1xuXHRcdFx0dGhpcy5lbGVtZW50Lmh0bWwoXCI8XCIrXCJ1bCBjbGFzcz0nanN0cmVlLWNvbnRhaW5lci11bCc+PFwiK1wibGkgY2xhc3M9J2pzdHJlZS1pbml0aWFsLW5vZGUganN0cmVlLWxvYWRpbmcganN0cmVlLWxlYWYganN0cmVlLWxhc3QnPjxpIGNsYXNzPSdqc3RyZWUtaWNvbiBqc3RyZWUtb2NsJz48L2k+PFwiK1wiYSBjbGFzcz0nanN0cmVlLWFuY2hvcicgaHJlZj0nIyc+PGkgY2xhc3M9J2pzdHJlZS1pY29uIGpzdHJlZS10aGVtZWljb24taGlkZGVuJz48L2k+XCIgKyB0aGlzLmdldF9zdHJpbmcoXCJMb2FkaW5nIC4uLlwiKSArIFwiPC9hPjwvbGk+PC91bD5cIik7XG5cdFx0XHR0aGlzLl9kYXRhLmNvcmUubGlfaGVpZ2h0ID0gdGhpcy5nZXRfY29udGFpbmVyX3VsKCkuY2hpbGRyZW4oXCJsaTplcSgwKVwiKS5oZWlnaHQoKSB8fCAxODtcblx0XHRcdC8qKlxuXHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIHRoZSBsb2FkaW5nIHRleHQgaXMgc2hvd24gYW5kIGJlZm9yZSBsb2FkaW5nIHN0YXJ0c1xuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBsb2FkaW5nLmpzdHJlZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJsb2FkaW5nXCIpO1xuXHRcdFx0dGhpcy5sb2FkX25vZGUoJyMnKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGRlc3Ryb3kgYW4gaW5zdGFuY2Vcblx0XHQgKiBAbmFtZSBkZXN0cm95KClcblx0XHQgKi9cblx0XHRkZXN0cm95IDogZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy5lbGVtZW50LnVuYmluZChcImRlc3Ryb3llZFwiLCB0aGlzLnRlYXJkb3duKTtcblx0XHRcdHRoaXMudGVhcmRvd24oKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIHBhcnQgb2YgdGhlIGRlc3Ryb3lpbmcgb2YgYW4gaW5zdGFuY2UuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIHRlYXJkb3duKClcblx0XHQgKi9cblx0XHR0ZWFyZG93biA6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMudW5iaW5kKCk7XG5cdFx0XHR0aGlzLmVsZW1lbnRcblx0XHRcdFx0LnJlbW92ZUNsYXNzKCdqc3RyZWUnKVxuXHRcdFx0XHQucmVtb3ZlRGF0YSgnanN0cmVlJylcblx0XHRcdFx0LmZpbmQoXCJbY2xhc3NePSdqc3RyZWUnXVwiKVxuXHRcdFx0XHRcdC5hZGRCYWNrKClcblx0XHRcdFx0XHQuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpOyB9KTtcblx0XHRcdHRoaXMuZWxlbWVudCA9IG51bGw7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBiaW5kIGFsbCBldmVudHMuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIGJpbmQoKVxuXHRcdCAqL1xuXHRcdGJpbmQgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLmVsZW1lbnRcblx0XHRcdFx0Lm9uKFwiZGJsY2xpY2suanN0cmVlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkpIHtcblx0XHRcdFx0XHRcdFx0ZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0aWYod2luZG93LmdldFNlbGVjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdHNlbC5jb2xsYXBzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGlnbm9yZSkgeyB9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQub24oXCJjbGljay5qc3RyZWVcIiwgXCIuanN0cmVlLW9jbFwiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRvZ2dsZV9ub2RlKGUudGFyZ2V0KTtcblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKFwiY2xpY2suanN0cmVlXCIsIFwiLmpzdHJlZS1hbmNob3JcIiwgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0JChlLmN1cnJlbnRUYXJnZXQpLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmFjdGl2YXRlX25vZGUoZS5jdXJyZW50VGFyZ2V0LCBlKTtcblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKCdrZXlkb3duLmpzdHJlZScsICcuanN0cmVlLWFuY2hvcicsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdHZhciBvID0gbnVsbDtcblx0XHRcdFx0XHRcdHN3aXRjaChlLndoaWNoKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgMTM6XG5cdFx0XHRcdFx0XHRcdGNhc2UgMzI6XG5cdFx0XHRcdFx0XHRcdFx0ZS50eXBlID0gXCJjbGlja1wiO1xuXHRcdFx0XHRcdFx0XHRcdCQoZS5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKGUpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlIDM3OlxuXHRcdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZih0aGlzLmlzX29wZW4oZS5jdXJyZW50VGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5jbG9zZV9ub2RlKGUuY3VycmVudFRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0byA9IHRoaXMuZ2V0X3ByZXZfZG9tKGUuY3VycmVudFRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZihvICYmIG8ubGVuZ3RoKSB7IG8uY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykuZm9jdXMoKTsgfVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAzODpcblx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0byA9IHRoaXMuZ2V0X3ByZXZfZG9tKGUuY3VycmVudFRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYobyAmJiBvLmxlbmd0aCkgeyBvLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmZvY3VzKCk7IH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAzOTpcblx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYodGhpcy5pc19jbG9zZWQoZS5jdXJyZW50VGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5vcGVuX25vZGUoZS5jdXJyZW50VGFyZ2V0LCBmdW5jdGlvbiAobykgeyB0aGlzLmdldF9ub2RlKG8sIHRydWUpLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmZvY3VzKCk7IH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG8gPSB0aGlzLmdldF9uZXh0X2RvbShlLmN1cnJlbnRUYXJnZXQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYobyAmJiBvLmxlbmd0aCkgeyBvLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmZvY3VzKCk7IH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgNDA6XG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRcdG8gPSB0aGlzLmdldF9uZXh0X2RvbShlLmN1cnJlbnRUYXJnZXQpO1xuXHRcdFx0XHRcdFx0XHRcdGlmKG8gJiYgby5sZW5ndGgpIHsgby5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5mb2N1cygpOyB9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdC8vIGRlbGV0ZVxuXHRcdFx0XHRcdFx0XHRjYXNlIDQ2OlxuXHRcdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0XHRvID0gdGhpcy5nZXRfbm9kZShlLmN1cnJlbnRUYXJnZXQpO1xuXHRcdFx0XHRcdFx0XHRcdGlmKG8gJiYgby5pZCAmJiBvLmlkICE9PSAnIycpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG8gPSB0aGlzLmlzX3NlbGVjdGVkKG8pID8gdGhpcy5nZXRfc2VsZWN0ZWQoKSA6IG87XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0aGlzLmRlbGV0ZV9ub2RlKG8pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Ly8gZjJcblx0XHRcdFx0XHRcdFx0Y2FzZSAxMTM6XG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRcdG8gPSB0aGlzLmdldF9ub2RlKGUuY3VycmVudFRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdFx0LyohXG5cdFx0XHRcdFx0XHRcdFx0aWYobyAmJiBvLmlkICYmIG8uaWQgIT09ICcjJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gdGhpcy5lZGl0KG8pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQqL1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGUud2hpY2gpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIHRoaXMpKVxuXHRcdFx0XHQub24oXCJsb2FkX25vZGUuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0XHRcdGlmKGRhdGEuc3RhdHVzKSB7XG5cdFx0XHRcdFx0XHRcdGlmKGRhdGEubm9kZS5pZCA9PT0gJyMnICYmICF0aGlzLl9kYXRhLmNvcmUubG9hZGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLmxvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0XHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIHRoZSByb290IG5vZGUgaXMgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZVxuXHRcdFx0XHRcdFx0XHRcdCAqIEBldmVudFxuXHRcdFx0XHRcdFx0XHRcdCAqIEBuYW1lIGxvYWRlZC5qc3RyZWVcblx0XHRcdFx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyaWdnZXIoXCJsb2FkZWRcIik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYoIXRoaXMuX2RhdGEuY29yZS5yZWFkeSAmJiAhdGhpcy5nZXRfY29udGFpbmVyX3VsKCkuZmluZCgnLmpzdHJlZS1sb2FkaW5nOmVxKDApJykubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnJlYWR5ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRpZih0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZih0aGlzLnNldHRpbmdzLmNvcmUuZXhwYW5kX3NlbGVjdGVkX29ubG9hZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgdG1wID0gW10sIGksIGo7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAgPSB0bXAuY29uY2F0KHRoaXMuX21vZGVsLmRhdGFbdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldXS5wYXJlbnRzKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAgPSAkLnZha2F0YS5hcnJheV91bmlxdWUodG1wKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gdG1wLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMub3Blbl9ub2RlKHRtcFtpXSwgZmFsc2UsIDApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyaWdnZXIoJ2NoYW5nZWQnLCB7ICdhY3Rpb24nIDogJ3JlYWR5JywgJ3NlbGVjdGVkJyA6IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCB9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0XHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIGFsbCBub2RlcyBhcmUgZmluaXNoZWQgbG9hZGluZ1xuXHRcdFx0XHRcdFx0XHRcdCAqIEBldmVudFxuXHRcdFx0XHRcdFx0XHRcdCAqIEBuYW1lIHJlYWR5LmpzdHJlZVxuXHRcdFx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoJC5wcm94eShmdW5jdGlvbiAoKSB7IHRoaXMudHJpZ2dlcihcInJlYWR5XCIpOyB9LCB0aGlzKSwgMCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Ly8gVEhFTUUgUkVMQVRFRFxuXHRcdFx0XHQub24oXCJpbml0LmpzdHJlZVwiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHZhciBzID0gdGhpcy5zZXR0aW5ncy5jb3JlLnRoZW1lcztcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS50aGVtZXMuZG90c1x0XHRcdD0gcy5kb3RzO1xuXHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5zdHJpcGVzXHRcdD0gcy5zdHJpcGVzO1xuXHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5pY29uc1x0XHQ9IHMuaWNvbnM7XG5cdFx0XHRcdFx0XHR0aGlzLnNldF90aGVtZShzLm5hbWUgfHwgXCJkZWZhdWx0XCIsIHMudXJsKTtcblx0XHRcdFx0XHRcdHRoaXMuc2V0X3RoZW1lX3ZhcmlhbnQocy52YXJpYW50KTtcblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKFwibG9hZGluZy5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR0aGlzWyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmRvdHMgPyBcInNob3dfZG90c1wiIDogXCJoaWRlX2RvdHNcIiBdKCk7XG5cdFx0XHRcdFx0XHR0aGlzWyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmljb25zID8gXCJzaG93X2ljb25zXCIgOiBcImhpZGVfaWNvbnNcIiBdKCk7XG5cdFx0XHRcdFx0XHR0aGlzWyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLnN0cmlwZXMgPyBcInNob3dfc3RyaXBlc1wiIDogXCJoaWRlX3N0cmlwZXNcIiBdKCk7XG5cdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdC5vbignZm9jdXMuanN0cmVlJywgJy5qc3RyZWUtYW5jaG9yJywgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5lbGVtZW50LmZpbmQoJy5qc3RyZWUtaG92ZXJlZCcpLm5vdChlLmN1cnJlbnRUYXJnZXQpLm1vdXNlbGVhdmUoKTtcblx0XHRcdFx0XHRcdCQoZS5jdXJyZW50VGFyZ2V0KS5tb3VzZWVudGVyKCk7XG5cdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdC5vbignbW91c2VlbnRlci5qc3RyZWUnLCAnLmpzdHJlZS1hbmNob3InLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmhvdmVyX25vZGUoZS5jdXJyZW50VGFyZ2V0KTtcblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKCdtb3VzZWxlYXZlLmpzdHJlZScsICcuanN0cmVlLWFuY2hvcicsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdHRoaXMuZGVob3Zlcl9ub2RlKGUuY3VycmVudFRhcmdldCk7XG5cdFx0XHRcdFx0fSwgdGhpcykpO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogcGFydCBvZiB0aGUgZGVzdHJveWluZyBvZiBhbiBpbnN0YW5jZS4gVXNlZCBpbnRlcm5hbGx5LlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQG5hbWUgdW5iaW5kKClcblx0XHQgKi9cblx0XHR1bmJpbmQgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLmVsZW1lbnQub2ZmKCcuanN0cmVlJyk7XG5cdFx0XHQkKGRvY3VtZW50KS5vZmYoJy5qc3RyZWUtJyArIHRoaXMuX2lkKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIHRyaWdnZXIgYW4gZXZlbnQuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIHRyaWdnZXIoZXYgWywgZGF0YV0pXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBldiB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuXHRcdCAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBhZGRpdGlvbmFsIGRhdGEgdG8gcGFzcyB3aXRoIHRoZSBldmVudFxuXHRcdCAqL1xuXHRcdHRyaWdnZXIgOiBmdW5jdGlvbiAoZXYsIGRhdGEpIHtcblx0XHRcdGlmKCFkYXRhKSB7XG5cdFx0XHRcdGRhdGEgPSB7fTtcblx0XHRcdH1cblx0XHRcdGRhdGEuaW5zdGFuY2UgPSB0aGlzO1xuXHRcdFx0dGhpcy5lbGVtZW50LnRyaWdnZXJIYW5kbGVyKGV2LnJlcGxhY2UoJy5qc3RyZWUnLCcnKSArICcuanN0cmVlJywgZGF0YSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHRoZSBqUXVlcnkgZXh0ZW5kZWQgaW5zdGFuY2UgY29udGFpbmVyXG5cdFx0ICogQG5hbWUgZ2V0X2NvbnRhaW5lcigpXG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdGdldF9jb250YWluZXIgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lbGVtZW50O1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0aGUgalF1ZXJ5IGV4dGVuZGVkIG1haW4gVUwgbm9kZSBpbnNpZGUgdGhlIGluc3RhbmNlIGNvbnRhaW5lci4gVXNlZCBpbnRlcm5hbGx5LlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQG5hbWUgZ2V0X2NvbnRhaW5lcl91bCgpXG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdGdldF9jb250YWluZXJfdWwgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lbGVtZW50LmNoaWxkcmVuKFwidWw6ZXEoMClcIik7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXRzIHN0cmluZyByZXBsYWNlbWVudHMgKGxvY2FsaXphdGlvbikuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIGdldF9zdHJpbmcoa2V5KVxuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30ga2V5XG5cdFx0ICogQHJldHVybiB7U3RyaW5nfVxuXHRcdCAqL1xuXHRcdGdldF9zdHJpbmcgOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHR2YXIgYSA9IHRoaXMuc2V0dGluZ3MuY29yZS5zdHJpbmdzO1xuXHRcdFx0aWYoJC5pc0Z1bmN0aW9uKGEpKSB7IHJldHVybiBhLmNhbGwodGhpcywga2V5KTsgfVxuXHRcdFx0aWYoYSAmJiBhW2tleV0pIHsgcmV0dXJuIGFba2V5XTsgfVxuXHRcdFx0cmV0dXJuIGtleTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGdldHMgdGhlIGZpcnN0IGNoaWxkIG9mIGEgRE9NIG5vZGUuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIF9maXJzdENoaWxkKGRvbSlcblx0XHQgKiBAcGFyYW0gIHtET01FbGVtZW50fSBkb21cblx0XHQgKiBAcmV0dXJuIHtET01FbGVtZW50fVxuXHRcdCAqL1xuXHRcdF9maXJzdENoaWxkIDogZnVuY3Rpb24gKGRvbSkge1xuXHRcdFx0ZG9tID0gZG9tID8gZG9tLmZpcnN0Q2hpbGQgOiBudWxsO1xuXHRcdFx0d2hpbGUoZG9tICE9PSBudWxsICYmIGRvbS5ub2RlVHlwZSAhPT0gMSkge1xuXHRcdFx0XHRkb20gPSBkb20ubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZG9tO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogZ2V0cyB0aGUgbmV4dCBzaWJsaW5nIG9mIGEgRE9NIG5vZGUuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIF9uZXh0U2libGluZyhkb20pXG5cdFx0ICogQHBhcmFtICB7RE9NRWxlbWVudH0gZG9tXG5cdFx0ICogQHJldHVybiB7RE9NRWxlbWVudH1cblx0XHQgKi9cblx0XHRfbmV4dFNpYmxpbmcgOiBmdW5jdGlvbiAoZG9tKSB7XG5cdFx0XHRkb20gPSBkb20gPyBkb20ubmV4dFNpYmxpbmcgOiBudWxsO1xuXHRcdFx0d2hpbGUoZG9tICE9PSBudWxsICYmIGRvbS5ub2RlVHlwZSAhPT0gMSkge1xuXHRcdFx0XHRkb20gPSBkb20ubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZG9tO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogZ2V0cyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhIERPTSBub2RlLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBfcHJldmlvdXNTaWJsaW5nKGRvbSlcblx0XHQgKiBAcGFyYW0gIHtET01FbGVtZW50fSBkb21cblx0XHQgKiBAcmV0dXJuIHtET01FbGVtZW50fVxuXHRcdCAqL1xuXHRcdF9wcmV2aW91c1NpYmxpbmcgOiBmdW5jdGlvbiAoZG9tKSB7XG5cdFx0XHRkb20gPSBkb20gPyBkb20ucHJldmlvdXNTaWJsaW5nIDogbnVsbDtcblx0XHRcdHdoaWxlKGRvbSAhPT0gbnVsbCAmJiBkb20ubm9kZVR5cGUgIT09IDEpIHtcblx0XHRcdFx0ZG9tID0gZG9tLnByZXZpb3VzU2libGluZztcblx0XHRcdH1cblx0XHRcdHJldHVybiBkb207XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXQgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBub2RlIChvciB0aGUgYWN0dWFsIGpRdWVyeSBleHRlbmRlZCBET00gbm9kZSkgYnkgdXNpbmcgYW55IGlucHV0IChjaGlsZCBET00gZWxlbWVudCwgSUQgc3RyaW5nLCBzZWxlY3RvciwgZXRjKVxuXHRcdCAqIEBuYW1lIGdldF9ub2RlKG9iaiBbLCBhc19kb21dKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBhc19kb21cblx0XHQgKiBAcmV0dXJuIHtPYmplY3R8alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdGdldF9ub2RlIDogZnVuY3Rpb24gKG9iaiwgYXNfZG9tKSB7XG5cdFx0XHRpZihvYmogJiYgb2JqLmlkKSB7XG5cdFx0XHRcdG9iaiA9IG9iai5pZDtcblx0XHRcdH1cblx0XHRcdHZhciBkb207XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZih0aGlzLl9tb2RlbC5kYXRhW29ial0pIHtcblx0XHRcdFx0XHRvYmogPSB0aGlzLl9tb2RlbC5kYXRhW29ial07XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZigoKGRvbSA9ICQob2JqLCB0aGlzLmVsZW1lbnQpKS5sZW5ndGggfHwgKGRvbSA9ICQoJyMnICsgb2JqLCB0aGlzLmVsZW1lbnQpKS5sZW5ndGgpICYmIHRoaXMuX21vZGVsLmRhdGFbZG9tLmNsb3Nlc3QoJ2xpJykuYXR0cignaWQnKV0pIHtcblx0XHRcdFx0XHRvYmogPSB0aGlzLl9tb2RlbC5kYXRhW2RvbS5jbG9zZXN0KCdsaScpLmF0dHIoJ2lkJyldO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYoKGRvbSA9ICQob2JqLCB0aGlzLmVsZW1lbnQpKS5sZW5ndGggJiYgZG9tLmhhc0NsYXNzKCdqc3RyZWUnKSkge1xuXHRcdFx0XHRcdG9iaiA9IHRoaXMuX21vZGVsLmRhdGFbJyMnXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihhc19kb20pIHtcblx0XHRcdFx0XHRvYmogPSBvYmouaWQgPT09ICcjJyA/IHRoaXMuZWxlbWVudCA6ICQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqLmlkKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9iajtcblx0XHRcdH0gY2F0Y2ggKGV4KSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogZ2V0IHRoZSBwYXRoIHRvIGEgbm9kZSwgZWl0aGVyIGNvbnNpc3Rpbmcgb2Ygbm9kZSB0ZXh0cywgb3Igb2Ygbm9kZSBJRHMsIG9wdGlvbmFsbHkgZ2x1ZWQgdG9nZXRoZXIgKG90aGVyd2lzZSBhbiBhcnJheSlcblx0XHQgKiBAbmFtZSBnZXRfcGF0aChvYmogWywgZ2x1ZSwgaWRzXSlcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqIHRoZSBub2RlXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBnbHVlIGlmIHlvdSB3YW50IHRoZSBwYXRoIGFzIGEgc3RyaW5nIC0gcGFzcyB0aGUgZ2x1ZSBoZXJlIChmb3IgZXhhbXBsZSAnLycpLCBpZiBhIGZhbHN5IHZhbHVlIGlzIHN1cHBsaWVkIGhlcmUsIGFuIGFycmF5IGlzIHJldHVybmVkXG5cdFx0ICogQHBhcmFtICB7Qm9vbGVhbn0gaWRzIGlmIHNldCB0byB0cnVlIGJ1aWxkIHRoZSBwYXRoIHVzaW5nIElELCBvdGhlcndpc2Ugbm9kZSB0ZXh0IGlzIHVzZWRcblx0XHQgKiBAcmV0dXJuIHttaXhlZH1cblx0XHQgKi9cblx0XHRnZXRfcGF0aCA6IGZ1bmN0aW9uIChvYmosIGdsdWUsIGlkcykge1xuXHRcdFx0b2JqID0gb2JqLnBhcmVudHMgPyBvYmogOiB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnIHx8ICFvYmoucGFyZW50cykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgaSwgaiwgcCA9IFtdO1xuXHRcdFx0cC5wdXNoKGlkcyA/IG9iai5pZCA6IG9iai50ZXh0KTtcblx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5wYXJlbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRwLnB1c2goaWRzID8gb2JqLnBhcmVudHNbaV0gOiB0aGlzLmdldF90ZXh0KG9iai5wYXJlbnRzW2ldKSk7XG5cdFx0XHR9XG5cdFx0XHRwID0gcC5yZXZlcnNlKCkuc2xpY2UoMSk7XG5cdFx0XHRyZXR1cm4gZ2x1ZSA/IHAuam9pbihnbHVlKSA6IHA7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXQgdGhlIG5leHQgdmlzaWJsZSBub2RlIHRoYXQgaXMgYmVsb3cgdGhlIGBvYmpgIG5vZGUuIElmIGBzdHJpY3RgIGlzIHNldCB0byBgdHJ1ZWAgb25seSBzaWJsaW5nIG5vZGVzIGFyZSByZXR1cm5lZC5cblx0XHQgKiBAbmFtZSBnZXRfbmV4dF9kb20ob2JqIFssIHN0cmljdF0pXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxuXHRcdCAqIEBwYXJhbSAge0Jvb2xlYW59IHN0cmljdFxuXHRcdCAqIEByZXR1cm4ge2pRdWVyeX1cblx0XHQgKi9cblx0XHRnZXRfbmV4dF9kb20gOiBmdW5jdGlvbiAob2JqLCBzdHJpY3QpIHtcblx0XHRcdHZhciB0bXA7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XG5cdFx0XHRpZihvYmpbMF0gPT09IHRoaXMuZWxlbWVudFswXSkge1xuXHRcdFx0XHR0bXAgPSB0aGlzLl9maXJzdENoaWxkKHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpWzBdKTtcblx0XHRcdFx0cmV0dXJuIHRtcCA/ICQodG1wKSA6IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYoIW9iaiB8fCAhb2JqLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZihzdHJpY3QpIHtcblx0XHRcdFx0dG1wID0gdGhpcy5fbmV4dFNpYmxpbmcob2JqWzBdKTtcblx0XHRcdFx0cmV0dXJuIHRtcCA/ICQodG1wKSA6IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYob2JqLmhhc0NsYXNzKFwianN0cmVlLW9wZW5cIikpIHtcblx0XHRcdFx0dG1wID0gdGhpcy5fZmlyc3RDaGlsZChvYmouY2hpbGRyZW4oJ3VsJylbMF0pO1xuXHRcdFx0XHRyZXR1cm4gdG1wID8gJCh0bXApIDogZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZigodG1wID0gdGhpcy5fbmV4dFNpYmxpbmcob2JqWzBdKSkgIT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuICQodG1wKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmoucGFyZW50c1VudGlsKFwiLmpzdHJlZVwiLFwibGlcIikubmV4dChcImxpXCIpLmVxKDApO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogZ2V0IHRoZSBwcmV2aW91cyB2aXNpYmxlIG5vZGUgdGhhdCBpcyBhYm92ZSB0aGUgYG9iamAgbm9kZS4gSWYgYHN0cmljdGAgaXMgc2V0IHRvIGB0cnVlYCBvbmx5IHNpYmxpbmcgbm9kZXMgYXJlIHJldHVybmVkLlxuXHRcdCAqIEBuYW1lIGdldF9wcmV2X2RvbShvYmogWywgc3RyaWN0XSlcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXG5cdFx0ICogQHBhcmFtICB7Qm9vbGVhbn0gc3RyaWN0XG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdGdldF9wcmV2X2RvbSA6IGZ1bmN0aW9uIChvYmosIHN0cmljdCkge1xuXHRcdFx0dmFyIHRtcDtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcblx0XHRcdGlmKG9ialswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7XG5cdFx0XHRcdHRtcCA9IHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpWzBdLmxhc3RDaGlsZDtcblx0XHRcdFx0cmV0dXJuIHRtcCA/ICQodG1wKSA6IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYoIW9iaiB8fCAhb2JqLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZihzdHJpY3QpIHtcblx0XHRcdFx0dG1wID0gdGhpcy5fcHJldmlvdXNTaWJsaW5nKG9ialswXSk7XG5cdFx0XHRcdHJldHVybiB0bXAgPyAkKHRtcCkgOiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmKCh0bXAgPSB0aGlzLl9wcmV2aW91c1NpYmxpbmcob2JqWzBdKSkgIT09IG51bGwpIHtcblx0XHRcdFx0b2JqID0gJCh0bXApO1xuXHRcdFx0XHR3aGlsZShvYmouaGFzQ2xhc3MoXCJqc3RyZWUtb3BlblwiKSkge1xuXHRcdFx0XHRcdG9iaiA9IG9iai5jaGlsZHJlbihcInVsOmVxKDApXCIpLmNoaWxkcmVuKFwibGk6bGFzdFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb2JqO1xuXHRcdFx0fVxuXHRcdFx0dG1wID0gb2JqWzBdLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiB0bXAgJiYgdG1wLnRhZ05hbWUgPT09ICdMSScgPyAkKHRtcCkgOiBmYWxzZTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGdldCB0aGUgcGFyZW50IElEIG9mIGEgbm9kZVxuXHRcdCAqIEBuYW1lIGdldF9wYXJlbnQob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdFx0ICovXG5cdFx0Z2V0X3BhcmVudCA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9iai5wYXJlbnQ7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXQgYSBqUXVlcnkgY29sbGVjdGlvbiBvZiBhbGwgdGhlIGNoaWxkcmVuIG9mIGEgbm9kZSAobm9kZSBtdXN0IGJlIHJlbmRlcmVkKVxuXHRcdCAqIEBuYW1lIGdldF9jaGlsZHJlbl9kb20ob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcmV0dXJuIHtqUXVlcnl9XG5cdFx0ICovXG5cdFx0Z2V0X2NoaWxkcmVuX2RvbSA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcblx0XHRcdGlmKG9ialswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldF9jb250YWluZXJfdWwoKS5jaGlsZHJlbihcImxpXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYoIW9iaiB8fCAhb2JqLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb2JqLmNoaWxkcmVuKFwidWxcIikuY2hpbGRyZW4oXCJsaVwiKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGNoZWNrcyBpZiBhIG5vZGUgaGFzIGNoaWxkcmVuXG5cdFx0ICogQG5hbWUgaXNfcGFyZW50KG9iailcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRpc19wYXJlbnQgOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRyZXR1cm4gb2JqICYmIChvYmouc3RhdGUubG9hZGVkID09PSBmYWxzZSB8fCBvYmouY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBjaGVja3MgaWYgYSBub2RlIGlzIGxvYWRlZCAoaXRzIGNoaWxkcmVuIGFyZSBhdmFpbGFibGUpXG5cdFx0ICogQG5hbWUgaXNfbG9hZGVkKG9iailcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRpc19sb2FkZWQgOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRyZXR1cm4gb2JqICYmIG9iai5zdGF0ZS5sb2FkZWQ7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBjaGVjayBpZiBhIG5vZGUgaXMgY3VycmVudGx5IGxvYWRpbmcgKGZldGNoaW5nIGNoaWxkcmVuKVxuXHRcdCAqIEBuYW1lIGlzX2xvYWRpbmcob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdGlzX2xvYWRpbmcgOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XG5cdFx0XHRyZXR1cm4gb2JqICYmIG9iai5oYXNDbGFzcyhcImpzdHJlZS1sb2FkaW5nXCIpO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogY2hlY2sgaWYgYSBub2RlIGlzIG9wZW5lZFxuXHRcdCAqIEBuYW1lIGlzX29wZW4ob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdGlzX29wZW4gOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRyZXR1cm4gb2JqICYmIG9iai5zdGF0ZS5vcGVuZWQ7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBjaGVjayBpZiBhIG5vZGUgaXMgaW4gYSBjbG9zZWQgc3RhdGVcblx0XHQgKiBAbmFtZSBpc19jbG9zZWQob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdGlzX2Nsb3NlZCA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdHJldHVybiBvYmogJiYgdGhpcy5pc19wYXJlbnQob2JqKSAmJiAhb2JqLnN0YXRlLm9wZW5lZDtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGNoZWNrIGlmIGEgbm9kZSBoYXMgbm8gY2hpbGRyZW5cblx0XHQgKiBAbmFtZSBpc19sZWFmKG9iailcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRpc19sZWFmIDogZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0cmV0dXJuICF0aGlzLmlzX3BhcmVudChvYmopO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogbG9hZHMgYSBub2RlIChmZXRjaGVzIGl0cyBjaGlsZHJlbiB1c2luZyB0aGUgYGNvcmUuZGF0YWAgc2V0dGluZykuIE11bHRpcGxlIG5vZGVzIGNhbiBiZSBwYXNzZWQgdG8gYnkgdXNpbmcgYW4gYXJyYXkuXG5cdFx0ICogQG5hbWUgbG9hZF9ub2RlKG9iaiBbLCBjYWxsYmFja10pXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxuXHRcdCAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uY2UgbG9hZGluZyBpcyBjb25wbGV0ZSwgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGluIHRoZSBpbnN0YW5jZSdzIHNjb3BlIGFuZCByZWNlaXZlcyB0d28gYXJndW1lbnRzIC0gdGhlIG5vZGUgYW5kIGEgYm9vbGVhbiBzdGF0dXNcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqIEB0cmlnZ2VyIGxvYWRfbm9kZS5qc3RyZWVcblx0XHQgKi9cblx0XHRsb2FkX25vZGUgOiBmdW5jdGlvbiAob2JqLCBjYWxsYmFjaykge1xuXHRcdFx0dmFyIHQxLCB0Mjtcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0XHR0aGlzLmxvYWRfbm9kZShvYmpbdDFdLCBjYWxsYmFjayk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRpZighb2JqKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwodGhpcywgb2JqLCBmYWxzZSk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKS5hZGRDbGFzcyhcImpzdHJlZS1sb2FkaW5nXCIpO1xuXHRcdFx0dGhpcy5fbG9hZF9ub2RlKG9iaiwgJC5wcm94eShmdW5jdGlvbiAoc3RhdHVzKSB7XG5cdFx0XHRcdG9iai5zdGF0ZS5sb2FkZWQgPSBzdGF0dXM7XG5cdFx0XHRcdHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKS5yZW1vdmVDbGFzcyhcImpzdHJlZS1sb2FkaW5nXCIpO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIGEgbm9kZSBpcyBsb2FkZWRcblx0XHRcdFx0ICogQGV2ZW50XG5cdFx0XHRcdCAqIEBuYW1lIGxvYWRfbm9kZS5qc3RyZWVcblx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgdGhlIG5vZGUgdGhhdCB3YXMgbG9hZGluZ1xuXHRcdFx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXR1cyB3YXMgdGhlIG5vZGUgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdsb2FkX25vZGUnLCB7IFwibm9kZVwiIDogb2JqLCBcInN0YXR1c1wiIDogc3RhdHVzIH0pO1xuXHRcdFx0XHRpZihjYWxsYmFjaykge1xuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwodGhpcywgb2JqLCBzdGF0dXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGhhbmRsZXMgdGhlIGFjdHVhbCBsb2FkaW5nIG9mIGEgbm9kZS4gVXNlZCBvbmx5IGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBfbG9hZF9ub2RlKG9iaiBbLCBjYWxsYmFja10pXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxuXHRcdCAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uY2UgbG9hZGluZyBpcyBjb25wbGV0ZSwgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGluIHRoZSBpbnN0YW5jZSdzIHNjb3BlIGFuZCByZWNlaXZlcyBvbmUgYXJndW1lbnQgLSBhIGJvb2xlYW4gc3RhdHVzXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRfbG9hZF9ub2RlIDogZnVuY3Rpb24gKG9iaiwgY2FsbGJhY2spIHtcblx0XHRcdHZhciBzID0gdGhpcy5zZXR0aW5ncy5jb3JlLmRhdGEsIHQ7XG5cdFx0XHQvLyB1c2Ugb3JpZ2luYWwgSFRNTFxuXHRcdFx0aWYoIXMpIHtcblx0XHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgb2JqLmlkID09PSAnIycgPyB0aGlzLl9hcHBlbmRfaHRtbF9kYXRhKG9iaiwgdGhpcy5fZGF0YS5jb3JlLm9yaWdpbmFsX2NvbnRhaW5lcl9odG1sLmNsb25lKHRydWUpKSA6IGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdGlmKCQuaXNGdW5jdGlvbihzKSkge1xuXHRcdFx0XHRyZXR1cm4gcy5jYWxsKHRoaXMsIG9iaiwgJC5wcm94eShmdW5jdGlvbiAoZCkge1xuXHRcdFx0XHRcdHJldHVybiBkID09PSBmYWxzZSA/IGNhbGxiYWNrLmNhbGwodGhpcywgZmFsc2UpIDogY2FsbGJhY2suY2FsbCh0aGlzLCB0aGlzW3R5cGVvZiBkID09PSAnc3RyaW5nJyA/ICdfYXBwZW5kX2h0bWxfZGF0YScgOiAnX2FwcGVuZF9qc29uX2RhdGEnXShvYmosIHR5cGVvZiBkID09PSAnc3RyaW5nJyA/ICQoZCkgOiBkKSk7XG5cdFx0XHRcdH0sIHRoaXMpKTtcblx0XHRcdH1cblx0XHRcdGlmKHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRpZihzLnVybCkge1xuXHRcdFx0XHRcdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgcyk7XG5cdFx0XHRcdFx0aWYoJC5pc0Z1bmN0aW9uKHMudXJsKSkge1xuXHRcdFx0XHRcdFx0cy51cmwgPSBzLnVybC5jYWxsKHRoaXMsIG9iaik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmKCQuaXNGdW5jdGlvbihzLmRhdGEpKSB7XG5cdFx0XHRcdFx0XHRzLmRhdGEgPSBzLmRhdGEuY2FsbCh0aGlzLCBvYmopO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gJC5hamF4KHMpXG5cdFx0XHRcdFx0XHQuZG9uZSgkLnByb3h5KGZ1bmN0aW9uIChkLHQseCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciB0eXBlID0geC5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1UeXBlJyk7XG5cdFx0XHRcdFx0XHRcdFx0aWYodHlwZS5pbmRleE9mKCdqc29uJykgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzLCB0aGlzLl9hcHBlbmRfanNvbl9kYXRhKG9iaiwgZCkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZih0eXBlLmluZGV4T2YoJ2h0bWwnKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIHRoaXMuX2FwcGVuZF9odG1sX2RhdGEob2JqLCAkKGQpKSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0XHRcdC5mYWlsKCQucHJveHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwodGhpcywgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2FqYXgnLCAncGx1Z2luJyA6ICdjb3JlJywgJ2lkJyA6ICdjb3JlXzA0JywgJ3JlYXNvbicgOiAnQ291bGQgbm90IGxvYWQgbm9kZScsICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHMpIH07XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXR0aW5ncy5jb3JlLmVycm9yLmNhbGwodGhpcywgdGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9LCB0aGlzKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dCA9ICgkLmlzQXJyYXkocykgfHwgJC5pc1BsYWluT2JqZWN0KHMpKSA/IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocykpIDogcztcblx0XHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgdGhpcy5fYXBwZW5kX2pzb25fZGF0YShvYmosIHQpKTtcblx0XHRcdH1cblx0XHRcdGlmKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzLCB0aGlzLl9hcHBlbmRfaHRtbF9kYXRhKG9iaiwgcykpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgZmFsc2UpO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogYWRkcyBhIG5vZGUgdG8gdGhlIGxpc3Qgb2Ygbm9kZXMgdG8gcmVkcmF3LiBVc2VkIG9ubHkgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIF9ub2RlX2NoYW5nZWQob2JqIFssIGNhbGxiYWNrXSlcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXG5cdFx0ICovXG5cdFx0X25vZGVfY2hhbmdlZCA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKG9iaikge1xuXHRcdFx0XHR0aGlzLl9tb2RlbC5jaGFuZ2VkLnB1c2gob2JqLmlkKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGFwcGVuZHMgSFRNTCBjb250ZW50IHRvIHRoZSB0cmVlLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBfYXBwZW5kX2h0bWxfZGF0YShvYmosIGRhdGEpXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBhcHBlbmQgdG9cblx0XHQgKiBAcGFyYW0gIHtTdHJpbmd9IGRhdGEgdGhlIEhUTUwgc3RyaW5nIHRvIHBhcnNlIGFuZCBhcHBlbmRcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqIEB0cmlnZ2VyIG1vZGVsLmpzdHJlZSwgY2hhbmdlZC5qc3RyZWVcblx0XHQgKi9cblx0XHRfYXBwZW5kX2h0bWxfZGF0YSA6IGZ1bmN0aW9uIChkb20sIGRhdGEpIHtcblx0XHRcdGRvbSA9IHRoaXMuZ2V0X25vZGUoZG9tKTtcblx0XHRcdGRvbS5jaGlsZHJlbiA9IFtdO1xuXHRcdFx0ZG9tLmNoaWxkcmVuX2QgPSBbXTtcblx0XHRcdHZhciBkYXQgPSBkYXRhLmlzKCd1bCcpID8gZGF0YS5jaGlsZHJlbigpIDogZGF0YSxcblx0XHRcdFx0cGFyID0gZG9tLmlkLFxuXHRcdFx0XHRjaGQgPSBbXSxcblx0XHRcdFx0ZHBjID0gW10sXG5cdFx0XHRcdG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxuXHRcdFx0XHRwID0gbVtwYXJdLFxuXHRcdFx0XHRzID0gdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmxlbmd0aCxcblx0XHRcdFx0dG1wLCBpLCBqO1xuXHRcdFx0ZGF0LmVhY2goJC5wcm94eShmdW5jdGlvbiAoaSwgdikge1xuXHRcdFx0XHR0bXAgPSB0aGlzLl9wYXJzZV9tb2RlbF9mcm9tX2h0bWwoJCh2KSwgcGFyLCBwLnBhcmVudHMuY29uY2F0KCkpO1xuXHRcdFx0XHRpZih0bXApIHtcblx0XHRcdFx0XHRjaGQucHVzaCh0bXApO1xuXHRcdFx0XHRcdGRwYy5wdXNoKHRtcCk7XG5cdFx0XHRcdFx0aWYobVt0bXBdLmNoaWxkcmVuX2QubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRkcGMgPSBkcGMuY29uY2F0KG1bdG1wXS5jaGlsZHJlbl9kKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpKTtcblx0XHRcdHAuY2hpbGRyZW4gPSBjaGQ7XG5cdFx0XHRwLmNoaWxkcmVuX2QgPSBkcGM7XG5cdFx0XHRmb3IoaSA9IDAsIGogPSBwLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdG1bcC5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kID0gbVtwLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QuY29uY2F0KGRwYyk7XG5cdFx0XHR9XG5cdFx0XHQvKipcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIG5ldyBkYXRhIGlzIGluc2VydGVkIHRvIHRoZSB0cmVlIG1vZGVsXG5cdFx0XHQgKiBAZXZlbnRcblx0XHRcdCAqIEBuYW1lIG1vZGVsLmpzdHJlZVxuXHRcdFx0ICogQHBhcmFtIHtBcnJheX0gbm9kZXMgYW4gYXJyYXkgb2Ygbm9kZSBJRHNcblx0XHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBwYXJlbnQgdGhlIHBhcmVudCBJRCBvZiB0aGUgbm9kZXNcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdtb2RlbCcsIHsgXCJub2Rlc1wiIDogZHBjLCAncGFyZW50JyA6IHBhciB9KTtcblx0XHRcdGlmKHBhciAhPT0gJyMnKSB7XG5cdFx0XHRcdHRoaXMuX25vZGVfY2hhbmdlZChwYXIpO1xuXHRcdFx0XHR0aGlzLnJlZHJhdygpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpLmNoaWxkcmVuKCcuanN0cmVlLWluaXRpYWwtbm9kZScpLnJlbW92ZSgpO1xuXHRcdFx0XHR0aGlzLnJlZHJhdyh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGlmKHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5sZW5ndGggIT09IHMpIHtcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyAnYWN0aW9uJyA6ICdtb2RlbCcsICdzZWxlY3RlZCcgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgfSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGFwcGVuZHMgSlNPTiBjb250ZW50IHRvIHRoZSB0cmVlLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBfYXBwZW5kX2pzb25fZGF0YShvYmosIGRhdGEpXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBhcHBlbmQgdG9cblx0XHQgKiBAcGFyYW0gIHtTdHJpbmd9IGRhdGEgdGhlIEpTT04gb2JqZWN0IHRvIHBhcnNlIGFuZCBhcHBlbmRcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdF9hcHBlbmRfanNvbl9kYXRhIDogZnVuY3Rpb24gKGRvbSwgZGF0YSkge1xuXHRcdFx0ZG9tID0gdGhpcy5nZXRfbm9kZShkb20pO1xuXHRcdFx0ZG9tLmNoaWxkcmVuID0gW107XG5cdFx0XHRkb20uY2hpbGRyZW5fZCA9IFtdO1xuXHRcdFx0dmFyIGRhdCA9IGRhdGEsXG5cdFx0XHRcdHBhciA9IGRvbS5pZCxcblx0XHRcdFx0Y2hkID0gW10sXG5cdFx0XHRcdGRwYyA9IFtdLFxuXHRcdFx0XHRtID0gdGhpcy5fbW9kZWwuZGF0YSxcblx0XHRcdFx0cCA9IG1bcGFyXSxcblx0XHRcdFx0cyA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5sZW5ndGgsXG5cdFx0XHRcdHRtcCwgaSwgajtcblx0XHRcdC8vIColJEAhISFcblx0XHRcdGlmKGRhdC5kKSB7XG5cdFx0XHRcdGRhdCA9IGRhdC5kO1xuXHRcdFx0XHRpZih0eXBlb2YgZGF0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0ZGF0ID0gSlNPTi5wYXJzZShkYXQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZighJC5pc0FycmF5KGRhdCkpIHsgZGF0ID0gW2RhdF07IH1cblx0XHRcdGlmKGRhdC5sZW5ndGggJiYgZGF0WzBdLmlkICE9PSB1bmRlZmluZWQgJiYgZGF0WzBdLnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIEZsYXQgSlNPTiBzdXBwb3J0IChmb3IgZWFzeSBpbXBvcnQgZnJvbSBEQik6XG5cdFx0XHRcdC8vIDEpIGNvbnZlcnQgdG8gb2JqZWN0IChmb3JlYWNoKVxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkYXQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0aWYoIWRhdFtpXS5jaGlsZHJlbikge1xuXHRcdFx0XHRcdFx0ZGF0W2ldLmNoaWxkcmVuID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1bZGF0W2ldLmlkXSA9IGRhdFtpXTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyAyKSBwb3B1bGF0ZSBjaGlsZHJlbiAoZm9yZWFjaClcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gZGF0Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdG1bZGF0W2ldLnBhcmVudF0uY2hpbGRyZW4ucHVzaChkYXRbaV0uaWQpO1xuXHRcdFx0XHRcdC8vIHBvcHVsYXRlIHBhcmVudC5jaGlsZHJlbl9kXG5cdFx0XHRcdFx0cC5jaGlsZHJlbl9kLnB1c2goZGF0W2ldLmlkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyAzKSBub3JtYWxpemUgJiYgcG9wdWxhdGUgcGFyZW50cyBhbmQgY2hpbGRyZW5fZCB3aXRoIHJlY3Vyc2lvblxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBwLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdHRtcCA9IHRoaXMuX3BhcnNlX21vZGVsX2Zyb21fZmxhdF9qc29uKG1bcC5jaGlsZHJlbltpXV0sIHBhciwgcC5wYXJlbnRzLmNvbmNhdCgpKTtcblx0XHRcdFx0XHRkcGMucHVzaCh0bXApO1xuXHRcdFx0XHRcdGlmKG1bdG1wXS5jaGlsZHJlbl9kLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0ZHBjID0gZHBjLmNvbmNhdChtW3RtcF0uY2hpbGRyZW5fZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vID8pIHRocmVlX3N0YXRlIHNlbGVjdGlvbiAtIHAuc3RhdGUuc2VsZWN0ZWQgJiYgdCAtIChpZiB0aHJlZV9zdGF0ZSBmb3JlYWNoKGRhdCA9PiBjaCkgLT4gZm9yZWFjaChwYXJlbnRzKSBpZihwYXJlbnQuc2VsZWN0ZWQpIGNoaWxkLnNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkYXQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0dG1wID0gdGhpcy5fcGFyc2VfbW9kZWxfZnJvbV9qc29uKGRhdFtpXSwgcGFyLCBwLnBhcmVudHMuY29uY2F0KCkpO1xuXHRcdFx0XHRcdGlmKHRtcCkge1xuXHRcdFx0XHRcdFx0Y2hkLnB1c2godG1wKTtcblx0XHRcdFx0XHRcdGRwYy5wdXNoKHRtcCk7XG5cdFx0XHRcdFx0XHRpZihtW3RtcF0uY2hpbGRyZW5fZC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0ZHBjID0gZHBjLmNvbmNhdChtW3RtcF0uY2hpbGRyZW5fZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHAuY2hpbGRyZW4gPSBjaGQ7XG5cdFx0XHRcdHAuY2hpbGRyZW5fZCA9IGRwYztcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gcC5wYXJlbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdG1bcC5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kID0gbVtwLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QuY29uY2F0KGRwYyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMudHJpZ2dlcignbW9kZWwnLCB7IFwibm9kZXNcIiA6IGRwYywgJ3BhcmVudCcgOiBwYXIgfSk7XG5cblx0XHRcdGlmKHBhciAhPT0gJyMnKSB7XG5cdFx0XHRcdHRoaXMuX25vZGVfY2hhbmdlZChwYXIpO1xuXHRcdFx0XHR0aGlzLnJlZHJhdygpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdC8vIHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpLmNoaWxkcmVuKCcuanN0cmVlLWluaXRpYWwtbm9kZScpLnJlbW92ZSgpO1xuXHRcdFx0XHR0aGlzLnJlZHJhdyh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGlmKHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5sZW5ndGggIT09IHMpIHtcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyAnYWN0aW9uJyA6ICdtb2RlbCcsICdzZWxlY3RlZCcgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgfSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIHBhcnNlcyBhIG5vZGUgZnJvbSBhIGpRdWVyeSBvYmplY3QgYW5kIGFwcGVuZHMgdGhlbSB0byB0aGUgaW4gbWVtb3J5IHRyZWUgbW9kZWwuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIF9wYXJzZV9tb2RlbF9mcm9tX2h0bWwoZCBbLCBwLCBwc10pXG5cdFx0ICogQHBhcmFtICB7alF1ZXJ5fSBkIHRoZSBqUXVlcnkgb2JqZWN0IHRvIHBhcnNlXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBwIHRoZSBwYXJlbnQgSURcblx0XHQgKiBAcGFyYW0gIHtBcnJheX0gcHMgbGlzdCBvZiBhbGwgcGFyZW50c1xuXHRcdCAqIEByZXR1cm4ge1N0cmluZ30gdGhlIElEIG9mIHRoZSBvYmplY3QgYWRkZWQgdG8gdGhlIG1vZGVsXG5cdFx0ICovXG5cdFx0X3BhcnNlX21vZGVsX2Zyb21faHRtbCA6IGZ1bmN0aW9uIChkLCBwLCBwcykge1xuXHRcdFx0aWYoIXBzKSB7IHBzID0gW107IH1cblx0XHRcdGVsc2UgeyBwcyA9IFtdLmNvbmNhdChwcyk7IH1cblx0XHRcdGlmKHApIHsgcHMudW5zaGlmdChwKTsgfVxuXHRcdFx0dmFyIGMsIGUsIG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxuXHRcdFx0XHRkYXRhID0ge1xuXHRcdFx0XHRcdGlkXHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHR0ZXh0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0aWNvblx0XHQ6IHRydWUsXG5cdFx0XHRcdFx0cGFyZW50XHRcdDogcCxcblx0XHRcdFx0XHRwYXJlbnRzXHRcdDogcHMsXG5cdFx0XHRcdFx0Y2hpbGRyZW5cdDogW10sXG5cdFx0XHRcdFx0Y2hpbGRyZW5fZFx0OiBbXSxcblx0XHRcdFx0XHRkYXRhXHRcdDogbnVsbCxcblx0XHRcdFx0XHRzdGF0ZVx0XHQ6IHsgfSxcblx0XHRcdFx0XHRsaV9hdHRyXHRcdDogeyBpZCA6IGZhbHNlIH0sXG5cdFx0XHRcdFx0YV9hdHRyXHRcdDogeyBocmVmIDogJyMnIH0sXG5cdFx0XHRcdFx0b3JpZ2luYWxcdDogZmFsc2Vcblx0XHRcdFx0fSwgaSwgdG1wLCB0aWQ7XG5cdFx0XHRmb3IoaSBpbiB0aGlzLl9tb2RlbC5kZWZhdWx0X3N0YXRlKSB7XG5cdFx0XHRcdGlmKHRoaXMuX21vZGVsLmRlZmF1bHRfc3RhdGUuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRkYXRhLnN0YXRlW2ldID0gdGhpcy5fbW9kZWwuZGVmYXVsdF9zdGF0ZVtpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dG1wID0gJC52YWthdGEuYXR0cmlidXRlcyhkLCB0cnVlKTtcblx0XHRcdCQuZWFjaCh0bXAsIGZ1bmN0aW9uIChpLCB2KSB7XG5cdFx0XHRcdHYgPSAkLnRyaW0odik7XG5cdFx0XHRcdGlmKCF2Lmxlbmd0aCkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdFx0XHRkYXRhLmxpX2F0dHJbaV0gPSB2O1xuXHRcdFx0XHRpZihpID09PSAnaWQnKSB7XG5cdFx0XHRcdFx0ZGF0YS5pZCA9IHY7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0dG1wID0gZC5jaGlsZHJlbignYScpLmVxKDApO1xuXHRcdFx0aWYodG1wLmxlbmd0aCkge1xuXHRcdFx0XHR0bXAgPSAkLnZha2F0YS5hdHRyaWJ1dGVzKHRtcCwgdHJ1ZSk7XG5cdFx0XHRcdCQuZWFjaCh0bXAsIGZ1bmN0aW9uIChpLCB2KSB7XG5cdFx0XHRcdFx0diA9ICQudHJpbSh2KTtcblx0XHRcdFx0XHRpZih2Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0ZGF0YS5hX2F0dHJbaV0gPSB2O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHR0bXAgPSBkLmNoaWxkcmVuKFwiYTplcSgwKVwiKS5sZW5ndGggPyBkLmNoaWxkcmVuKFwiYTplcSgwKVwiKS5jbG9uZSgpIDogZC5jbG9uZSgpO1xuXHRcdFx0dG1wLmNoaWxkcmVuKFwiaW5zLCBpLCB1bFwiKS5yZW1vdmUoKTtcblx0XHRcdHRtcCA9IHRtcC5odG1sKCk7XG5cdFx0XHR0bXAgPSAkKCc8ZGl2IC8+JykuaHRtbCh0bXApO1xuXHRcdFx0ZGF0YS50ZXh0ID0gdG1wLmh0bWwoKTtcblx0XHRcdHRtcCA9IGQuZGF0YSgpO1xuXHRcdFx0ZGF0YS5kYXRhID0gdG1wID8gJC5leHRlbmQodHJ1ZSwge30sIHRtcCkgOiBudWxsO1xuXHRcdFx0ZGF0YS5zdGF0ZS5vcGVuZWQgPSBkLmhhc0NsYXNzKCdqc3RyZWUtb3BlbicpO1xuXHRcdFx0ZGF0YS5zdGF0ZS5zZWxlY3RlZCA9IGQuY2hpbGRyZW4oJ2EnKS5oYXNDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcblx0XHRcdGRhdGEuc3RhdGUuZGlzYWJsZWQgPSBkLmNoaWxkcmVuKCdhJykuaGFzQ2xhc3MoJ2pzdHJlZS1kaXNhYmxlZCcpO1xuXHRcdFx0aWYoZGF0YS5kYXRhICYmIGRhdGEuZGF0YS5qc3RyZWUpIHtcblx0XHRcdFx0Zm9yKGkgaW4gZGF0YS5kYXRhLmpzdHJlZSkge1xuXHRcdFx0XHRcdGlmKGRhdGEuZGF0YS5qc3RyZWUuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRcdGRhdGEuc3RhdGVbaV0gPSBkYXRhLmRhdGEuanN0cmVlW2ldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dG1wID0gZC5jaGlsZHJlbihcImFcIikuY2hpbGRyZW4oXCIuanN0cmVlLXRoZW1laWNvblwiKTtcblx0XHRcdGlmKHRtcC5sZW5ndGgpIHtcblx0XHRcdFx0ZGF0YS5pY29uID0gdG1wLmhhc0NsYXNzKCdqc3RyZWUtdGhlbWVpY29uLWhpZGRlbicpID8gZmFsc2UgOiB0bXAuYXR0cigncmVsJyk7XG5cdFx0XHR9XG5cdFx0XHRpZihkYXRhLnN0YXRlLmljb24pIHtcblx0XHRcdFx0ZGF0YS5pY29uID0gZGF0YS5zdGF0ZS5pY29uO1xuXHRcdFx0fVxuXHRcdFx0dG1wID0gZC5jaGlsZHJlbihcInVsXCIpLmNoaWxkcmVuKFwibGlcIik7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdHRpZCA9ICdqJyArIHRoaXMuX2lkICsgJ18nICsgKCsrdGhpcy5fY250KTtcblx0XHRcdH0gd2hpbGUobVt0aWRdKTtcblx0XHRcdGRhdGEuaWQgPSBkYXRhLmxpX2F0dHIuaWQgfHwgdGlkO1xuXHRcdFx0aWYodG1wLmxlbmd0aCkge1xuXHRcdFx0XHR0bXAuZWFjaCgkLnByb3h5KGZ1bmN0aW9uIChpLCB2KSB7XG5cdFx0XHRcdFx0YyA9IHRoaXMuX3BhcnNlX21vZGVsX2Zyb21faHRtbCgkKHYpLCBkYXRhLmlkLCBwcyk7XG5cdFx0XHRcdFx0ZSA9IHRoaXMuX21vZGVsLmRhdGFbY107XG5cdFx0XHRcdFx0ZGF0YS5jaGlsZHJlbi5wdXNoKGMpO1xuXHRcdFx0XHRcdGlmKGUuY2hpbGRyZW5fZC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGRhdGEuY2hpbGRyZW5fZCA9IGRhdGEuY2hpbGRyZW5fZC5jb25jYXQoZS5jaGlsZHJlbl9kKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIHRoaXMpKTtcblx0XHRcdFx0ZGF0YS5jaGlsZHJlbl9kID0gZGF0YS5jaGlsZHJlbl9kLmNvbmNhdChkYXRhLmNoaWxkcmVuKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZihkLmhhc0NsYXNzKCdqc3RyZWUtY2xvc2VkJykpIHtcblx0XHRcdFx0XHRkYXRhLnN0YXRlLmxvYWRlZCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihkYXRhLmxpX2F0dHJbJ2NsYXNzJ10pIHtcblx0XHRcdFx0ZGF0YS5saV9hdHRyWydjbGFzcyddID0gZGF0YS5saV9hdHRyWydjbGFzcyddLnJlcGxhY2UoJ2pzdHJlZS1jbG9zZWQnLCcnKS5yZXBsYWNlKCdqc3RyZWUtb3BlbicsJycpO1xuXHRcdFx0fVxuXHRcdFx0aWYoZGF0YS5hX2F0dHJbJ2NsYXNzJ10pIHtcblx0XHRcdFx0ZGF0YS5hX2F0dHJbJ2NsYXNzJ10gPSBkYXRhLmFfYXR0clsnY2xhc3MnXS5yZXBsYWNlKCdqc3RyZWUtY2xpY2tlZCcsJycpLnJlcGxhY2UoJ2pzdHJlZS1kaXNhYmxlZCcsJycpO1xuXHRcdFx0fVxuXHRcdFx0bVtkYXRhLmlkXSA9IGRhdGE7XG5cdFx0XHRpZihkYXRhLnN0YXRlLnNlbGVjdGVkKSB7XG5cdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5wdXNoKGRhdGEuaWQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGRhdGEuaWQ7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBwYXJzZXMgYSBub2RlIGZyb20gYSBKU09OIG9iamVjdCAodXNlZCB3aGVuIGRlYWxpbmcgd2l0aCBmbGF0IGRhdGEsIHdoaWNoIGhhcyBubyBuZXN0aW5nIG9mIGNoaWxkcmVuLCBidXQgaGFzIGlkIGFuZCBwYXJlbnQgcHJvcGVydGllcykgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGluIG1lbW9yeSB0cmVlIG1vZGVsLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBfcGFyc2VfbW9kZWxfZnJvbV9mbGF0X2pzb24oZCBbLCBwLCBwc10pXG5cdFx0ICogQHBhcmFtICB7T2JqZWN0fSBkIHRoZSBKU09OIG9iamVjdCB0byBwYXJzZVxuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30gcCB0aGUgcGFyZW50IElEXG5cdFx0ICogQHBhcmFtICB7QXJyYXl9IHBzIGxpc3Qgb2YgYWxsIHBhcmVudHNcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBJRCBvZiB0aGUgb2JqZWN0IGFkZGVkIHRvIHRoZSBtb2RlbFxuXHRcdCAqL1xuXHRcdF9wYXJzZV9tb2RlbF9mcm9tX2ZsYXRfanNvbiA6IGZ1bmN0aW9uIChkLCBwLCBwcykge1xuXHRcdFx0aWYoIXBzKSB7IHBzID0gW107IH1cblx0XHRcdGVsc2UgeyBwcyA9IHBzLmNvbmNhdCgpOyB9XG5cdFx0XHRpZihwKSB7IHBzLnVuc2hpZnQocCk7IH1cblx0XHRcdHZhciB0aWQgPSBkLmlkLFxuXHRcdFx0XHRtID0gdGhpcy5fbW9kZWwuZGF0YSxcblx0XHRcdFx0ZGYgPSB0aGlzLl9tb2RlbC5kZWZhdWx0X3N0YXRlLFxuXHRcdFx0XHRpLCBqLCBjLCBlLFxuXHRcdFx0XHR0bXAgPSB7XG5cdFx0XHRcdFx0aWRcdFx0XHQ6IHRpZCxcblx0XHRcdFx0XHR0ZXh0XHRcdDogZC50ZXh0IHx8ICcnLFxuXHRcdFx0XHRcdGljb25cdFx0OiBkLmljb24gIT09IHVuZGVmaW5lZCA/IGQuaWNvbiA6IHRydWUsXG5cdFx0XHRcdFx0cGFyZW50XHRcdDogcCxcblx0XHRcdFx0XHRwYXJlbnRzXHRcdDogcHMsXG5cdFx0XHRcdFx0Y2hpbGRyZW5cdDogZC5jaGlsZHJlbiB8fCBbXSxcblx0XHRcdFx0XHRjaGlsZHJlbl9kXHQ6IGQuY2hpbGRyZW5fZCB8fCBbXSxcblx0XHRcdFx0XHRkYXRhXHRcdDogZC5kYXRhLFxuXHRcdFx0XHRcdHN0YXRlXHRcdDogeyB9LFxuXHRcdFx0XHRcdGxpX2F0dHJcdFx0OiB7IGlkIDogZmFsc2UgfSxcblx0XHRcdFx0XHRhX2F0dHJcdFx0OiB7IGhyZWYgOiAnIycgfSxcblx0XHRcdFx0XHRvcmlnaW5hbFx0OiBmYWxzZVxuXHRcdFx0XHR9O1xuXHRcdFx0Zm9yKGkgaW4gZGYpIHtcblx0XHRcdFx0aWYoZGYuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHR0bXAuc3RhdGVbaV0gPSBkZltpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYoZCAmJiBkLmRhdGEgJiYgZC5kYXRhLmpzdHJlZSAmJiBkLmRhdGEuanN0cmVlLmljb24pIHtcblx0XHRcdFx0dG1wLmljb24gPSBkLmRhdGEuanN0cmVlLmljb247XG5cdFx0XHR9XG5cdFx0XHRpZihkICYmIGQuZGF0YSkge1xuXHRcdFx0XHR0bXAuZGF0YSA9IGQuZGF0YTtcblx0XHRcdFx0aWYoZC5kYXRhLmpzdHJlZSkge1xuXHRcdFx0XHRcdGZvcihpIGluIGQuZGF0YS5qc3RyZWUpIHtcblx0XHRcdFx0XHRcdGlmKGQuZGF0YS5qc3RyZWUuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRcdFx0dG1wLnN0YXRlW2ldID0gZC5kYXRhLmpzdHJlZVtpXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmKGQgJiYgdHlwZW9mIGQuc3RhdGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdGZvciAoaSBpbiBkLnN0YXRlKSB7XG5cdFx0XHRcdFx0aWYoZC5zdGF0ZS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHRcdFx0dG1wLnN0YXRlW2ldID0gZC5zdGF0ZVtpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmKGQgJiYgdHlwZW9mIGQubGlfYXR0ciA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0Zm9yIChpIGluIGQubGlfYXR0cikge1xuXHRcdFx0XHRcdGlmKGQubGlfYXR0ci5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHRcdFx0dG1wLmxpX2F0dHJbaV0gPSBkLmxpX2F0dHJbaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZighdG1wLmxpX2F0dHIuaWQpIHtcblx0XHRcdFx0dG1wLmxpX2F0dHIuaWQgPSB0aWQ7XG5cdFx0XHR9XG5cdFx0XHRpZihkICYmIHR5cGVvZiBkLmFfYXR0ciA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0Zm9yIChpIGluIGQuYV9hdHRyKSB7XG5cdFx0XHRcdFx0aWYoZC5hX2F0dHIuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRcdHRtcC5hX2F0dHJbaV0gPSBkLmFfYXR0cltpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmKGQgJiYgZC5jaGlsZHJlbiAmJiBkLmNoaWxkcmVuID09PSB0cnVlKSB7XG5cdFx0XHRcdHRtcC5zdGF0ZS5sb2FkZWQgPSBmYWxzZTtcblx0XHRcdFx0dG1wLmNoaWxkcmVuID0gW107XG5cdFx0XHRcdHRtcC5jaGlsZHJlbl9kID0gW107XG5cdFx0XHR9XG5cdFx0XHRtW3RtcC5pZF0gPSB0bXA7XG5cdFx0XHRmb3IoaSA9IDAsIGogPSB0bXAuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdGMgPSB0aGlzLl9wYXJzZV9tb2RlbF9mcm9tX2ZsYXRfanNvbihtW3RtcC5jaGlsZHJlbltpXV0sIHRtcC5pZCwgcHMpO1xuXHRcdFx0XHRlID0gbVtjXTtcblx0XHRcdFx0dG1wLmNoaWxkcmVuX2QucHVzaChjKTtcblx0XHRcdFx0aWYoZS5jaGlsZHJlbl9kLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRtcC5jaGlsZHJlbl9kID0gdG1wLmNoaWxkcmVuX2QuY29uY2F0KGUuY2hpbGRyZW5fZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRlbGV0ZSBkLmRhdGE7XG5cdFx0XHRkZWxldGUgZC5jaGlsZHJlbjtcblx0XHRcdG1bdG1wLmlkXS5vcmlnaW5hbCA9IGQ7XG5cdFx0XHRpZih0bXAuc3RhdGUuc2VsZWN0ZWQpIHtcblx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLnB1c2godG1wLmlkKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0bXAuaWQ7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBwYXJzZXMgYSBub2RlIGZyb20gYSBKU09OIG9iamVjdCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgaW4gbWVtb3J5IHRyZWUgbW9kZWwuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIF9wYXJzZV9tb2RlbF9mcm9tX2pzb24oZCBbLCBwLCBwc10pXG5cdFx0ICogQHBhcmFtICB7T2JqZWN0fSBkIHRoZSBKU09OIG9iamVjdCB0byBwYXJzZVxuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30gcCB0aGUgcGFyZW50IElEXG5cdFx0ICogQHBhcmFtICB7QXJyYXl9IHBzIGxpc3Qgb2YgYWxsIHBhcmVudHNcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBJRCBvZiB0aGUgb2JqZWN0IGFkZGVkIHRvIHRoZSBtb2RlbFxuXHRcdCAqL1xuXHRcdF9wYXJzZV9tb2RlbF9mcm9tX2pzb24gOiBmdW5jdGlvbiAoZCwgcCwgcHMpIHtcblx0XHRcdGlmKCFwcykgeyBwcyA9IFtdOyB9XG5cdFx0XHRlbHNlIHsgcHMgPSBwcy5jb25jYXQoKTsgfVxuXHRcdFx0aWYocCkgeyBwcy51bnNoaWZ0KHApOyB9XG5cdFx0XHR2YXIgdGlkID0gZmFsc2UsIGksIGosIGMsIGUsIG0gPSB0aGlzLl9tb2RlbC5kYXRhLCBkZiA9IHRoaXMuX21vZGVsLmRlZmF1bHRfc3RhdGUsIHRtcDtcblx0XHRcdGRvIHtcblx0XHRcdFx0dGlkID0gJ2onICsgdGhpcy5faWQgKyAnXycgKyAoKyt0aGlzLl9jbnQpO1xuXHRcdFx0fSB3aGlsZShtW3RpZF0pO1xuXG5cdFx0XHR0bXAgPSB7XG5cdFx0XHRcdGlkXHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0dGV4dFx0XHQ6IHR5cGVvZiBkID09PSAnc3RyaW5nJyA/IGQgOiAnJyxcblx0XHRcdFx0aWNvblx0XHQ6IHR5cGVvZiBkID09PSAnb2JqZWN0JyAmJiBkLmljb24gIT09IHVuZGVmaW5lZCA/IGQuaWNvbiA6IHRydWUsXG5cdFx0XHRcdHBhcmVudFx0XHQ6IHAsXG5cdFx0XHRcdHBhcmVudHNcdFx0OiBwcyxcblx0XHRcdFx0Y2hpbGRyZW5cdDogW10sXG5cdFx0XHRcdGNoaWxkcmVuX2RcdDogW10sXG5cdFx0XHRcdGRhdGFcdFx0OiBudWxsLFxuXHRcdFx0XHRzdGF0ZVx0XHQ6IHsgfSxcblx0XHRcdFx0bGlfYXR0clx0XHQ6IHsgaWQgOiBmYWxzZSB9LFxuXHRcdFx0XHRhX2F0dHJcdFx0OiB7IGhyZWYgOiAnIycgfSxcblx0XHRcdFx0b3JpZ2luYWxcdDogZmFsc2Vcblx0XHRcdH07XG5cdFx0XHRmb3IoaSBpbiBkZikge1xuXHRcdFx0XHRpZihkZi5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHRcdHRtcC5zdGF0ZVtpXSA9IGRmW2ldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihkICYmIGQuaWQpIHsgdG1wLmlkID0gZC5pZDsgfVxuXHRcdFx0aWYoZCAmJiBkLnRleHQpIHsgdG1wLnRleHQgPSBkLnRleHQ7IH1cblx0XHRcdGlmKGQgJiYgZC5kYXRhICYmIGQuZGF0YS5qc3RyZWUgJiYgZC5kYXRhLmpzdHJlZS5pY29uKSB7XG5cdFx0XHRcdHRtcC5pY29uID0gZC5kYXRhLmpzdHJlZS5pY29uO1xuXHRcdFx0fVxuXHRcdFx0aWYoZCAmJiBkLmRhdGEpIHtcblx0XHRcdFx0dG1wLmRhdGEgPSBkLmRhdGE7XG5cdFx0XHRcdGlmKGQuZGF0YS5qc3RyZWUpIHtcblx0XHRcdFx0XHRmb3IoaSBpbiBkLmRhdGEuanN0cmVlKSB7XG5cdFx0XHRcdFx0XHRpZihkLmRhdGEuanN0cmVlLmhhc093blByb3BlcnR5KGkpKSB7XG5cdFx0XHRcdFx0XHRcdHRtcC5zdGF0ZVtpXSA9IGQuZGF0YS5qc3RyZWVbaV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihkICYmIHR5cGVvZiBkLnN0YXRlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRmb3IgKGkgaW4gZC5zdGF0ZSkge1xuXHRcdFx0XHRcdGlmKGQuc3RhdGUuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRcdHRtcC5zdGF0ZVtpXSA9IGQuc3RhdGVbaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihkICYmIHR5cGVvZiBkLmxpX2F0dHIgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdGZvciAoaSBpbiBkLmxpX2F0dHIpIHtcblx0XHRcdFx0XHRpZihkLmxpX2F0dHIuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRcdHRtcC5saV9hdHRyW2ldID0gZC5saV9hdHRyW2ldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYodG1wLmxpX2F0dHIuaWQgJiYgIXRtcC5pZCkge1xuXHRcdFx0XHR0bXAuaWQgPSB0bXAubGlfYXR0ci5pZDtcblx0XHRcdH1cblx0XHRcdGlmKCF0bXAuaWQpIHtcblx0XHRcdFx0dG1wLmlkID0gdGlkO1xuXHRcdFx0fVxuXHRcdFx0aWYoIXRtcC5saV9hdHRyLmlkKSB7XG5cdFx0XHRcdHRtcC5saV9hdHRyLmlkID0gdG1wLmlkO1xuXHRcdFx0fVxuXHRcdFx0aWYoZCAmJiB0eXBlb2YgZC5hX2F0dHIgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdGZvciAoaSBpbiBkLmFfYXR0cikge1xuXHRcdFx0XHRcdGlmKGQuYV9hdHRyLmhhc093blByb3BlcnR5KGkpKSB7XG5cdFx0XHRcdFx0XHR0bXAuYV9hdHRyW2ldID0gZC5hX2F0dHJbaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihkICYmIGQuY2hpbGRyZW4gJiYgZC5jaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gZC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRjID0gdGhpcy5fcGFyc2VfbW9kZWxfZnJvbV9qc29uKGQuY2hpbGRyZW5baV0sIHRtcC5pZCwgcHMpO1xuXHRcdFx0XHRcdGUgPSBtW2NdO1xuXHRcdFx0XHRcdHRtcC5jaGlsZHJlbi5wdXNoKGMpO1xuXHRcdFx0XHRcdGlmKGUuY2hpbGRyZW5fZC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRtcC5jaGlsZHJlbl9kID0gdG1wLmNoaWxkcmVuX2QuY29uY2F0KGUuY2hpbGRyZW5fZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRtcC5jaGlsZHJlbl9kID0gdG1wLmNoaWxkcmVuX2QuY29uY2F0KHRtcC5jaGlsZHJlbik7XG5cdFx0XHR9XG5cdFx0XHRpZihkICYmIGQuY2hpbGRyZW4gJiYgZC5jaGlsZHJlbiA9PT0gdHJ1ZSkge1xuXHRcdFx0XHR0bXAuc3RhdGUubG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdHRtcC5jaGlsZHJlbiA9IFtdO1xuXHRcdFx0XHR0bXAuY2hpbGRyZW5fZCA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIGQuZGF0YTtcblx0XHRcdGRlbGV0ZSBkLmNoaWxkcmVuO1xuXHRcdFx0dG1wLm9yaWdpbmFsID0gZDtcblx0XHRcdG1bdG1wLmlkXSA9IHRtcDtcblx0XHRcdGlmKHRtcC5zdGF0ZS5zZWxlY3RlZCkge1xuXHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQucHVzaCh0bXAuaWQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRtcC5pZDtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIHJlZHJhd3MgYWxsIG5vZGVzIHRoYXQgbmVlZCB0byBiZSByZWRyYXduLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBfcmVkcmF3KClcblx0XHQgKiBAdHJpZ2dlciByZWRyYXcuanN0cmVlXG5cdFx0ICovXG5cdFx0X3JlZHJhdyA6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBub2RlcyA9IHRoaXMuX21vZGVsLmZvcmNlX2Z1bGxfcmVkcmF3ID8gdGhpcy5fbW9kZWwuZGF0YVsnIyddLmNoaWxkcmVuLmNvbmNhdChbXSkgOiB0aGlzLl9tb2RlbC5jaGFuZ2VkLmNvbmNhdChbXSksXG5cdFx0XHRcdGYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdVTCcpLCB0bXAsIGksIGo7XG5cdFx0XHRmb3IoaSA9IDAsIGogPSBub2Rlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0dG1wID0gdGhpcy5yZWRyYXdfbm9kZShub2Rlc1tpXSwgdHJ1ZSwgdGhpcy5fbW9kZWwuZm9yY2VfZnVsbF9yZWRyYXcpO1xuXHRcdFx0XHRpZih0bXAgJiYgdGhpcy5fbW9kZWwuZm9yY2VfZnVsbF9yZWRyYXcpIHtcblx0XHRcdFx0XHRmLmFwcGVuZENoaWxkKHRtcCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmKHRoaXMuX21vZGVsLmZvcmNlX2Z1bGxfcmVkcmF3KSB7XG5cdFx0XHRcdGYuY2xhc3NOYW1lID0gdGhpcy5nZXRfY29udGFpbmVyX3VsKClbMF0uY2xhc3NOYW1lO1xuXHRcdFx0XHR0aGlzLmVsZW1lbnQuZW1wdHkoKS5hcHBlbmQoZik7XG5cdFx0XHRcdC8vdGhpcy5nZXRfY29udGFpbmVyX3VsKClbMF0uYXBwZW5kQ2hpbGQoZik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9tb2RlbC5mb3JjZV9mdWxsX3JlZHJhdyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5fbW9kZWwuY2hhbmdlZCA9IFtdO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgYWZ0ZXIgbm9kZXMgYXJlIHJlZHJhd25cblx0XHRcdCAqIEBldmVudFxuXHRcdFx0ICogQG5hbWUgcmVkcmF3LmpzdHJlZVxuXHRcdFx0ICogQHBhcmFtIHthcnJheX0gbm9kZXMgdGhlIHJlZHJhd24gbm9kZXNcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdyZWRyYXcnLCB7IFwibm9kZXNcIiA6IG5vZGVzIH0pO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogcmVkcmF3cyBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlZHJhd24gb3Igb3B0aW9uYWxseSAtIHRoZSB3aG9sZSB0cmVlXG5cdFx0ICogQG5hbWUgcmVkcmF3KFtmdWxsXSlcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGZ1bGwgaWYgc2V0IHRvIGB0cnVlYCBhbGwgbm9kZXMgYXJlIHJlZHJhd24uXG5cdFx0ICovXG5cdFx0cmVkcmF3IDogZnVuY3Rpb24gKGZ1bGwpIHtcblx0XHRcdGlmKGZ1bGwpIHtcblx0XHRcdFx0dGhpcy5fbW9kZWwuZm9yY2VfZnVsbF9yZWRyYXcgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0Ly9pZih0aGlzLl9tb2RlbC5yZWRyYXdfdGltZW91dCkge1xuXHRcdFx0Ly9cdGNsZWFyVGltZW91dCh0aGlzLl9tb2RlbC5yZWRyYXdfdGltZW91dCk7XG5cdFx0XHQvL31cblx0XHRcdC8vdGhpcy5fbW9kZWwucmVkcmF3X3RpbWVvdXQgPSBzZXRUaW1lb3V0KCQucHJveHkodGhpcy5fcmVkcmF3LCB0aGlzKSwwKTtcblx0XHRcdHRoaXMuX3JlZHJhdygpO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogcmVkcmF3cyBhIHNpbmdsZSBub2RlLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSByZWRyYXdfbm9kZShub2RlLCBkZWVwLCBpc19jYWxsYmFjaylcblx0XHQgKiBAcGFyYW0ge21peGVkfSBub2RlIHRoZSBub2RlIHRvIHJlZHJhd1xuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcCBzaG91bGQgY2hpbGQgbm9kZXMgYmUgcmVkcmF3biB0b29cblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzX2NhbGxiYWNrIGlzIHRoaXMgYSByZWN1cnNpb24gY2FsbFxuXHRcdCAqL1xuXHRcdHJlZHJhd19ub2RlIDogZnVuY3Rpb24gKG5vZGUsIGRlZXAsIGlzX2NhbGxiYWNrKSB7XG5cdFx0XHR2YXIgb2JqID0gdGhpcy5nZXRfbm9kZShub2RlKSxcblx0XHRcdFx0cGFyID0gZmFsc2UsXG5cdFx0XHRcdGluZCA9IGZhbHNlLFxuXHRcdFx0XHRvbGQgPSBmYWxzZSxcblx0XHRcdFx0aSA9IGZhbHNlLFxuXHRcdFx0XHRqID0gZmFsc2UsXG5cdFx0XHRcdGsgPSBmYWxzZSxcblx0XHRcdFx0YyA9ICcnLFxuXHRcdFx0XHRkID0gZG9jdW1lbnQsXG5cdFx0XHRcdG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxuXHRcdFx0XHRmID0gZmFsc2UsXG5cdFx0XHRcdHMgPSBmYWxzZTtcblx0XHRcdGlmKCFvYmopIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRpZihvYmouaWQgPT09ICcjJykgeyAgcmV0dXJuIHRoaXMucmVkcmF3KHRydWUpOyB9XG5cdFx0XHRkZWVwID0gZGVlcCB8fCBvYmouY2hpbGRyZW4ubGVuZ3RoID09PSAwO1xuXHRcdFx0bm9kZSA9IGQuZ2V0RWxlbWVudEJ5SWQob2JqLmlkKTsgLy8sIHRoaXMuZWxlbWVudCk7XG5cdFx0XHRpZighbm9kZSkge1xuXHRcdFx0XHRkZWVwID0gdHJ1ZTtcblx0XHRcdFx0Ly9ub2RlID0gZC5jcmVhdGVFbGVtZW50KCdMSScpO1xuXHRcdFx0XHRpZighaXNfY2FsbGJhY2spIHtcblx0XHRcdFx0XHRwYXIgPSBvYmoucGFyZW50ICE9PSAnIycgPyAkKCcjJyArIG9iai5wYXJlbnQsIHRoaXMuZWxlbWVudClbMF0gOiBudWxsO1xuXHRcdFx0XHRcdGlmKHBhciAhPT0gbnVsbCAmJiAoIXBhciB8fCAhbVtvYmoucGFyZW50XS5zdGF0ZS5vcGVuZWQpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGluZCA9ICQuaW5BcnJheShvYmouaWQsIHBhciA9PT0gbnVsbCA/IG1bJyMnXS5jaGlsZHJlbiA6IG1bb2JqLnBhcmVudF0uY2hpbGRyZW4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bm9kZSA9ICQobm9kZSk7XG5cdFx0XHRcdGlmKCFpc19jYWxsYmFjaykge1xuXHRcdFx0XHRcdHBhciA9IG5vZGUucGFyZW50KCkucGFyZW50KClbMF07XG5cdFx0XHRcdFx0aWYocGFyID09PSB0aGlzLmVsZW1lbnRbMF0pIHtcblx0XHRcdFx0XHRcdHBhciA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGluZCA9IG5vZGUuaW5kZXgoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBtW29iai5pZF0uZGF0YSA9IG5vZGUuZGF0YSgpOyAvLyB1c2Ugb25seSBub2RlJ3MgZGF0YSwgbm8gbmVlZCB0byB0b3VjaCBqcXVlcnkgc3RvcmFnZVxuXHRcdFx0XHRpZighZGVlcCAmJiBvYmouY2hpbGRyZW4ubGVuZ3RoICYmICFub2RlLmNoaWxkcmVuKCd1bCcpLmxlbmd0aCkge1xuXHRcdFx0XHRcdGRlZXAgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCFkZWVwKSB7XG5cdFx0XHRcdFx0b2xkID0gbm9kZS5jaGlsZHJlbignVUwnKVswXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzID0gbm9kZS5hdHRyKCdhcmlhLXNlbGVjdGVkJyk7XG5cdFx0XHRcdGYgPSBub2RlLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpWzBdID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHRcdFx0XHRub2RlLnJlbW92ZSgpO1xuXHRcdFx0XHQvL25vZGUgPSBkLmNyZWF0ZUVsZW1lbnQoJ0xJJyk7XG5cdFx0XHRcdC8vbm9kZSA9IG5vZGVbMF07XG5cdFx0XHR9XG5cdFx0XHRub2RlID0gX25vZGUuY2xvbmVOb2RlKHRydWUpO1xuXHRcdFx0Ly8gbm9kZSBpcyBET00sIGRlZXAgaXMgYm9vbGVhblxuXG5cdFx0XHRjID0gJ2pzdHJlZS1ub2RlICc7XG5cdFx0XHRmb3IoaSBpbiBvYmoubGlfYXR0cikge1xuXHRcdFx0XHRpZihvYmoubGlfYXR0ci5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHRcdGlmKGkgPT09ICdpZCcpIHsgY29udGludWU7IH1cblx0XHRcdFx0XHRpZihpICE9PSAnY2xhc3MnKSB7XG5cdFx0XHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZShpLCBvYmoubGlfYXR0cltpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0YyArPSBvYmoubGlfYXR0cltpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmKHMgJiYgcyAhPT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRpZighb2JqLmNoaWxkcmVuLmxlbmd0aCAmJiBvYmouc3RhdGUubG9hZGVkKSB7XG5cdFx0XHRcdGMgKz0gJyBqc3RyZWUtbGVhZic7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0YyArPSBvYmouc3RhdGUub3BlbmVkID8gJyBqc3RyZWUtb3BlbicgOiAnIGpzdHJlZS1jbG9zZWQnO1xuXHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIG9iai5zdGF0ZS5vcGVuZWQpO1xuXHRcdFx0fVxuXHRcdFx0aWYob2JqLnBhcmVudCAhPT0gbnVsbCAmJiBtW29iai5wYXJlbnRdLmNoaWxkcmVuW21bb2JqLnBhcmVudF0uY2hpbGRyZW4ubGVuZ3RoIC0gMV0gPT09IG9iai5pZCkge1xuXHRcdFx0XHRjICs9ICcganN0cmVlLWxhc3QnO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5pZCA9IG9iai5pZDtcblx0XHRcdG5vZGUuY2xhc3NOYW1lID0gYztcblx0XHRcdGMgPSAoIG9iai5zdGF0ZS5zZWxlY3RlZCA/ICcganN0cmVlLWNsaWNrZWQnIDogJycpICsgKCBvYmouc3RhdGUuZGlzYWJsZWQgPyAnIGpzdHJlZS1kaXNhYmxlZCcgOiAnJyk7XG5cdFx0XHRmb3IoaiBpbiBvYmouYV9hdHRyKSB7XG5cdFx0XHRcdGlmKG9iai5hX2F0dHIuaGFzT3duUHJvcGVydHkoaikpIHtcblx0XHRcdFx0XHRpZihqID09PSAnaHJlZicgJiYgb2JqLmFfYXR0cltqXSA9PT0gJyMnKSB7IGNvbnRpbnVlOyB9XG5cdFx0XHRcdFx0aWYoaiAhPT0gJ2NsYXNzJykge1xuXHRcdFx0XHRcdFx0bm9kZS5jaGlsZE5vZGVzWzFdLnNldEF0dHJpYnV0ZShqLCBvYmouYV9hdHRyW2pdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRjICs9ICcgJyArIG9iai5hX2F0dHJbal07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihjLmxlbmd0aCkge1xuXHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2xhc3NOYW1lID0gJ2pzdHJlZS1hbmNob3IgJyArIGM7XG5cdFx0XHR9XG5cdFx0XHRpZigob2JqLmljb24gJiYgb2JqLmljb24gIT09IHRydWUpIHx8IG9iai5pY29uID09PSBmYWxzZSkge1xuXHRcdFx0XHRpZihvYmouaWNvbiA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jbGFzc05hbWUgKz0gJyBqc3RyZWUtdGhlbWVpY29uLWhpZGRlbic7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZihvYmouaWNvbi5pbmRleE9mKCcvJykgPT09IC0xICYmIG9iai5pY29uLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jbGFzc05hbWUgKz0gJyAnICsgb2JqLmljb24gKyAnIGpzdHJlZS10aGVtZWljb24tY3VzdG9tJztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCcrb2JqLmljb24rJyknO1xuXHRcdFx0XHRcdG5vZGUuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9ICdjZW50ZXIgY2VudGVyJztcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9ICdhdXRvJztcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jbGFzc05hbWUgKz0gJyBqc3RyZWUtdGhlbWVpY29uLWN1c3RvbSc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vbm9kZS5jaGlsZE5vZGVzWzFdLmFwcGVuZENoaWxkKGQuY3JlYXRlVGV4dE5vZGUob2JqLnRleHQpKTtcblx0XHRcdG5vZGUuY2hpbGROb2Rlc1sxXS5pbm5lckhUTUwgKz0gb2JqLnRleHQ7XG5cdFx0XHQvLyBpZihvYmouZGF0YSkgeyAkLmRhdGEobm9kZSwgb2JqLmRhdGEpOyB9IC8vIGFsd2F5cyB3b3JrIHdpdGggbm9kZSdzIGRhdGEsIG5vIG5lZWQgdG8gdG91Y2gganF1ZXJ5IHN0b3JlXG5cblx0XHRcdGlmKGRlZXAgJiYgb2JqLmNoaWxkcmVuLmxlbmd0aCAmJiBvYmouc3RhdGUub3BlbmVkKSB7XG5cdFx0XHRcdGsgPSBkLmNyZWF0ZUVsZW1lbnQoJ1VMJyk7XG5cdFx0XHRcdGsuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2dyb3VwJyk7XG5cdFx0XHRcdGsuY2xhc3NOYW1lID0gJ2pzdHJlZS1jaGlsZHJlbic7XG5cdFx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRrLmFwcGVuZENoaWxkKHRoaXMucmVkcmF3X25vZGUob2JqLmNoaWxkcmVuW2ldLCBkZWVwLCB0cnVlKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bm9kZS5hcHBlbmRDaGlsZChrKTtcblx0XHRcdH1cblx0XHRcdGlmKG9sZCkge1xuXHRcdFx0XHRub2RlLmFwcGVuZENoaWxkKG9sZCk7XG5cdFx0XHR9XG5cdFx0XHRpZighaXNfY2FsbGJhY2spIHtcblx0XHRcdFx0Ly8gYXBwZW5kIGJhY2sgdXNpbmcgcGFyIC8gaW5kXG5cdFx0XHRcdGlmKCFwYXIpIHtcblx0XHRcdFx0XHRwYXIgPSB0aGlzLmVsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoIXBhci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnVUwnKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRpID0gZC5jcmVhdGVFbGVtZW50KCdVTCcpO1xuXHRcdFx0XHRcdGkuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2dyb3VwJyk7XG5cdFx0XHRcdFx0aS5jbGFzc05hbWUgPSAnanN0cmVlLWNoaWxkcmVuJztcblx0XHRcdFx0XHRwYXIuYXBwZW5kQ2hpbGQoaSk7XG5cdFx0XHRcdFx0cGFyID0gaTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRwYXIgPSBwYXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ1VMJylbMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihpbmQgPCBwYXIuY2hpbGROb2Rlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRwYXIuaW5zZXJ0QmVmb3JlKG5vZGUsIHBhci5jaGlsZE5vZGVzW2luZF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHBhci5hcHBlbmRDaGlsZChub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihmKSB7XG5cdFx0XHRcdFx0bm9kZS5jaGlsZE5vZGVzWzFdLmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBub2RlO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogb3BlbnMgYSBub2RlLCByZXZhbGluZyBpdHMgY2hpbGRyZW4uIElmIHRoZSBub2RlIGlzIG5vdCBsb2FkZWQgaXQgd2lsbCBiZSBsb2FkZWQgYW5kIG9wZW5lZCBvbmNlIHJlYWR5LlxuXHRcdCAqIEBuYW1lIG9wZW5fbm9kZShvYmogWywgY2FsbGJhY2ssIGFuaW1hdGlvbl0pXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIG9wZW5cblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb25jZSB0aGUgbm9kZSBpcyBvcGVuZWRcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gYW5pbWF0aW9uIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHdoZW4gb3BlbmluZyB0aGUgbm9kZSAob3ZlcnJpZGVzIHRoZSBgY29yZS5hbmltYXRpb25gIHNldHRpbmcpLiBVc2UgYGZhbHNlYCBmb3Igbm8gYW5pbWF0aW9uLlxuXHRcdCAqIEB0cmlnZ2VyIG9wZW5fbm9kZS5qc3RyZWUsIGFmdGVyX29wZW4uanN0cmVlXG5cdFx0ICovXG5cdFx0b3Blbl9ub2RlIDogZnVuY3Rpb24gKG9iaiwgY2FsbGJhY2ssIGFuaW1hdGlvbikge1xuXHRcdFx0dmFyIHQxLCB0MiwgZCwgdDtcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0XHR0aGlzLm9wZW5fbm9kZShvYmpbdDFdLCBjYWxsYmFjaywgYW5pbWF0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0YW5pbWF0aW9uID0gYW5pbWF0aW9uID09PSB1bmRlZmluZWQgPyB0aGlzLnNldHRpbmdzLmNvcmUuYW5pbWF0aW9uIDogYW5pbWF0aW9uO1xuXHRcdFx0aWYoIXRoaXMuaXNfY2xvc2VkKG9iaikpIHtcblx0XHRcdFx0aWYoY2FsbGJhY2spIHtcblx0XHRcdFx0XHRjYWxsYmFjay5jYWxsKHRoaXMsIG9iaiwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmKCF0aGlzLmlzX2xvYWRlZChvYmopKSB7XG5cdFx0XHRcdGlmKHRoaXMuaXNfbG9hZGluZyhvYmopKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoJC5wcm94eShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLm9wZW5fbm9kZShvYmosIGNhbGxiYWNrLCBhbmltYXRpb24pO1xuXHRcdFx0XHRcdH0sIHRoaXMpLCA1MDApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMubG9hZF9ub2RlKG9iaiwgZnVuY3Rpb24gKG8sIG9rKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9rID8gdGhpcy5vcGVuX25vZGUobywgY2FsbGJhY2ssIGFuaW1hdGlvbikgOiAoY2FsbGJhY2sgPyBjYWxsYmFjay5jYWxsKHRoaXMsIG8sIGZhbHNlKSA6IGZhbHNlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0ZCA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcblx0XHRcdFx0dCA9IHRoaXM7XG5cdFx0XHRcdGlmKGQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0aWYob2JqLmNoaWxkcmVuLmxlbmd0aCAmJiAhdGhpcy5fZmlyc3RDaGlsZChkLmNoaWxkcmVuKCd1bCcpWzBdKSkge1xuXHRcdFx0XHRcdFx0b2JqLnN0YXRlLm9wZW5lZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLnJlZHJhd19ub2RlKG9iaiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRkID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZighYW5pbWF0aW9uKSB7XG5cdFx0XHRcdFx0XHRkWzBdLmNsYXNzTmFtZSA9IGRbMF0uY2xhc3NOYW1lLnJlcGxhY2UoJ2pzdHJlZS1jbG9zZWQnLCAnanN0cmVlLW9wZW4nKTtcblx0XHRcdFx0XHRcdGRbMF0uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRkXG5cdFx0XHRcdFx0XHRcdC5jaGlsZHJlbihcInVsXCIpLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIikuZW5kKClcblx0XHRcdFx0XHRcdFx0LnJlbW92ZUNsYXNzKFwianN0cmVlLWNsb3NlZFwiKS5hZGRDbGFzcyhcImpzdHJlZS1vcGVuXCIpLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsIHRydWUpXG5cdFx0XHRcdFx0XHRcdC5jaGlsZHJlbihcInVsXCIpLnN0b3AodHJ1ZSwgdHJ1ZSlcblx0XHRcdFx0XHRcdFx0XHQuc2xpZGVEb3duKGFuaW1hdGlvbiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0XHRcdHQudHJpZ2dlcihcImFmdGVyX29wZW5cIiwgeyBcIm5vZGVcIiA6IG9iaiB9KTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b2JqLnN0YXRlLm9wZW5lZCA9IHRydWU7XG5cdFx0XHRcdGlmKGNhbGxiYWNrKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2suY2FsbCh0aGlzLCBvYmosIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgaXMgb3BlbmVkIChpZiB0aGVyZSBpcyBhbiBhbmltYXRpb24gaXQgd2lsbCBub3QgYmUgY29tcGxldGVkIHlldClcblx0XHRcdFx0ICogQGV2ZW50XG5cdFx0XHRcdCAqIEBuYW1lIG9wZW5fbm9kZS5qc3RyZWVcblx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgdGhlIG9wZW5lZCBub2RlXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ29wZW5fbm9kZScsIHsgXCJub2RlXCIgOiBvYmogfSk7XG5cdFx0XHRcdGlmKCFhbmltYXRpb24gfHwgIWQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYSBub2RlIGlzIG9wZW5lZCBhbmQgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuXHRcdFx0XHRcdCAqIEBldmVudFxuXHRcdFx0XHRcdCAqIEBuYW1lIGFmdGVyX29wZW4uanN0cmVlXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgdGhlIG9wZW5lZCBub2RlXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0dGhpcy50cmlnZ2VyKFwiYWZ0ZXJfb3BlblwiLCB7IFwibm9kZVwiIDogb2JqIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBvcGVucyBldmVyeSBwYXJlbnQgb2YgYSBub2RlIChub2RlIHNob3VsZCBiZSBsb2FkZWQpXG5cdFx0ICogQG5hbWUgX29wZW5fdG8ob2JqKVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byByZXZlYWxcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdF9vcGVuX3RvIDogZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xuXHRcdFx0aWYoIW9iaiB8fCBvYmouaWQgPT09ICcjJykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgaSwgaiwgcCA9IG9iai5wYXJlbnRzO1xuXHRcdFx0Zm9yKGkgPSAwLCBqID0gcC5sZW5ndGg7IGkgPCBqOyBpKz0xKSB7XG5cdFx0XHRcdGlmKGkgIT09ICcjJykge1xuXHRcdFx0XHRcdHRoaXMub3Blbl9ub2RlKHBbaV0sIGZhbHNlLCAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqLmlkKSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBjbG9zZXMgYSBub2RlLCBoaWRpbmcgaXRzIGNoaWxkcmVuXG5cdFx0ICogQG5hbWUgY2xvc2Vfbm9kZShvYmogWywgYW5pbWF0aW9uXSlcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogdGhlIG5vZGUgdG8gY2xvc2Vcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gYW5pbWF0aW9uIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHdoZW4gY2xvc2luZyB0aGUgbm9kZSAob3ZlcnJpZGVzIHRoZSBgY29yZS5hbmltYXRpb25gIHNldHRpbmcpLiBVc2UgYGZhbHNlYCBmb3Igbm8gYW5pbWF0aW9uLlxuXHRcdCAqIEB0cmlnZ2VyIGNsb3NlX25vZGUuanN0cmVlLCBhZnRlcl9jbG9zZS5qc3RyZWVcblx0XHQgKi9cblx0XHRjbG9zZV9ub2RlIDogZnVuY3Rpb24gKG9iaiwgYW5pbWF0aW9uKSB7XG5cdFx0XHR2YXIgdDEsIHQyLCB0LCBkO1xuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRcdHRoaXMuY2xvc2Vfbm9kZShvYmpbdDFdLCBhbmltYXRpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xuXHRcdFx0aWYoIW9iaiB8fCBvYmouaWQgPT09ICcjJykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRhbmltYXRpb24gPSBhbmltYXRpb24gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2V0dGluZ3MuY29yZS5hbmltYXRpb24gOiBhbmltYXRpb247XG5cdFx0XHR0ID0gdGhpcztcblx0XHRcdGQgPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XG5cdFx0XHRpZihkLmxlbmd0aCkge1xuXHRcdFx0XHRpZighYW5pbWF0aW9uKSB7XG5cdFx0XHRcdFx0ZFswXS5jbGFzc05hbWUgPSBkWzBdLmNsYXNzTmFtZS5yZXBsYWNlKCdqc3RyZWUtb3BlbicsICdqc3RyZWUtY2xvc2VkJyk7XG5cdFx0XHRcdFx0ZC5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCBmYWxzZSkuY2hpbGRyZW4oJ3VsJykucmVtb3ZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0ZFxuXHRcdFx0XHRcdFx0LmNoaWxkcmVuKFwidWxcIikuYXR0cihcInN0eWxlXCIsXCJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnRcIikuZW5kKClcblx0XHRcdFx0XHRcdC5yZW1vdmVDbGFzcyhcImpzdHJlZS1vcGVuXCIpLmFkZENsYXNzKFwianN0cmVlLWNsb3NlZFwiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCBmYWxzZSlcblx0XHRcdFx0XHRcdC5jaGlsZHJlbihcInVsXCIpLnN0b3AodHJ1ZSwgdHJ1ZSkuc2xpZGVVcChhbmltYXRpb24sIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0ZC5jaGlsZHJlbigndWwnKS5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdFx0dC50cmlnZ2VyKFwiYWZ0ZXJfY2xvc2VcIiwgeyBcIm5vZGVcIiA6IG9iaiB9KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvYmouc3RhdGUub3BlbmVkID0gZmFsc2U7XG5cdFx0XHQvKipcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgbm9kZSBpcyBjbG9zZWQgKGlmIHRoZXJlIGlzIGFuIGFuaW1hdGlvbiBpdCB3aWxsIG5vdCBiZSBjb21wbGV0ZSB5ZXQpXG5cdFx0XHQgKiBAZXZlbnRcblx0XHRcdCAqIEBuYW1lIGNsb3NlX25vZGUuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgY2xvc2VkIG5vZGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdjbG9zZV9ub2RlJyx7IFwibm9kZVwiIDogb2JqIH0pO1xuXHRcdFx0aWYoIWFuaW1hdGlvbiB8fCAhZC5sZW5ndGgpIHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgbm9kZSBpcyBjbG9zZWQgYW5kIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGVcblx0XHRcdFx0ICogQGV2ZW50XG5cdFx0XHRcdCAqIEBuYW1lIGFmdGVyX2Nsb3NlLmpzdHJlZVxuXHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgY2xvc2VkIG5vZGVcblx0XHRcdFx0ICovXG5cdFx0XHRcdHRoaXMudHJpZ2dlcihcImFmdGVyX2Nsb3NlXCIsIHsgXCJub2RlXCIgOiBvYmogfSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiB0b2dnbGVzIGEgbm9kZSAtIGNsb3NpbmcgaXQgaWYgaXQgaXMgb3Blbiwgb3BlbmluZyBpdCBpZiBpdCBpcyBjbG9zZWRcblx0XHQgKiBAbmFtZSB0b2dnbGVfbm9kZShvYmopXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIHRvZ2dsZVxuXHRcdCAqL1xuXHRcdHRvZ2dsZV9ub2RlIDogZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0dmFyIHQxLCB0Mjtcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZV9ub2RlKG9ialt0MV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYodGhpcy5pc19jbG9zZWQob2JqKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5vcGVuX25vZGUob2JqKTtcblx0XHRcdH1cblx0XHRcdGlmKHRoaXMuaXNfb3BlbihvYmopKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNsb3NlX25vZGUob2JqKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIG9wZW5zIGFsbCBub2RlcyB3aXRoaW4gYSBub2RlIChvciB0aGUgdHJlZSksIHJldmFsaW5nIHRoZWlyIGNoaWxkcmVuLiBJZiB0aGUgbm9kZSBpcyBub3QgbG9hZGVkIGl0IHdpbGwgYmUgbG9hZGVkIGFuZCBvcGVuZWQgb25jZSByZWFkeS5cblx0XHQgKiBAbmFtZSBvcGVuX2FsbChbb2JqLCBhbmltYXRpb24sIG9yaWdpbmFsX29ial0pXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIG9wZW4gcmVjdXJzaXZlbHksIG9taXQgdG8gb3BlbiBhbGwgbm9kZXMgaW4gdGhlIHRyZWVcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gYW5pbWF0aW9uIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHdoZW4gb3BlbmluZyB0aGUgbm9kZXMsIHRoZSBkZWZhdWx0IGlzIG5vIGFuaW1hdGlvblxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSByZWZlcmVuY2UgdG8gdGhlIG5vZGUgdGhhdCBzdGFydGVkIHRoZSBwcm9jZXNzIChpbnRlcm5hbCB1c2UpXG5cdFx0ICogQHRyaWdnZXIgb3Blbl9hbGwuanN0cmVlXG5cdFx0ICovXG5cdFx0b3Blbl9hbGwgOiBmdW5jdGlvbiAob2JqLCBhbmltYXRpb24sIG9yaWdpbmFsX29iaikge1xuXHRcdFx0aWYoIW9iaikgeyBvYmogPSAnIyc7IH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmopIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHR2YXIgZG9tID0gb2JqLmlkID09PSAnIycgPyB0aGlzLmdldF9jb250YWluZXJfdWwoKSA6IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKSwgaSwgaiwgX3RoaXM7XG5cdFx0XHRpZighZG9tLmxlbmd0aCkge1xuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRpZih0aGlzLmlzX2Nsb3NlZCh0aGlzLl9tb2RlbC5kYXRhW29iai5jaGlsZHJlbl9kW2ldXSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbb2JqLmNoaWxkcmVuX2RbaV1dLnN0YXRlLm9wZW5lZCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzLnRyaWdnZXIoJ29wZW5fYWxsJywgeyBcIm5vZGVcIiA6IG9iaiB9KTtcblx0XHRcdH1cblx0XHRcdG9yaWdpbmFsX29iaiA9IG9yaWdpbmFsX29iaiB8fCBkb207XG5cdFx0XHRfdGhpcyA9IHRoaXM7XG5cdFx0XHRkb20gPSB0aGlzLmlzX2Nsb3NlZChvYmopID8gZG9tLmZpbmQoJ2xpLmpzdHJlZS1jbG9zZWQnKS5hZGRCYWNrKCkgOiBkb20uZmluZCgnbGkuanN0cmVlLWNsb3NlZCcpO1xuXHRcdFx0ZG9tLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRfdGhpcy5vcGVuX25vZGUoXG5cdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRmdW5jdGlvbihub2RlLCBzdGF0dXMpIHsgaWYoc3RhdHVzICYmIHRoaXMuaXNfcGFyZW50KG5vZGUpKSB7IHRoaXMub3Blbl9hbGwobm9kZSwgYW5pbWF0aW9uLCBvcmlnaW5hbF9vYmopOyB9IH0sXG5cdFx0XHRcdFx0YW5pbWF0aW9uIHx8IDBcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXHRcdFx0aWYob3JpZ2luYWxfb2JqLmZpbmQoJ2xpLmpzdHJlZS1jbG9zZWQnKS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGFuIGBvcGVuX2FsbGAgY2FsbCBjb21wbGV0ZXNcblx0XHRcdFx0ICogQGV2ZW50XG5cdFx0XHRcdCAqIEBuYW1lIG9wZW5fYWxsLmpzdHJlZVxuXHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgb3BlbmVkIG5vZGVcblx0XHRcdFx0ICovXG5cdFx0XHRcdHRoaXMudHJpZ2dlcignb3Blbl9hbGwnLCB7IFwibm9kZVwiIDogdGhpcy5nZXRfbm9kZShvcmlnaW5hbF9vYmopIH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogY2xvc2VzIGFsbCBub2RlcyB3aXRoaW4gYSBub2RlIChvciB0aGUgdHJlZSksIHJldmFsaW5nIHRoZWlyIGNoaWxkcmVuXG5cdFx0ICogQG5hbWUgY2xvc2VfYWxsKFtvYmosIGFuaW1hdGlvbl0pXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIGNsb3NlIHJlY3Vyc2l2ZWx5LCBvbWl0IHRvIGNsb3NlIGFsbCBub2RlcyBpbiB0aGUgdHJlZVxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBhbmltYXRpb24gdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgd2hlbiBjbG9zaW5nIHRoZSBub2RlcywgdGhlIGRlZmF1bHQgaXMgbm8gYW5pbWF0aW9uXG5cdFx0ICogQHRyaWdnZXIgY2xvc2VfYWxsLmpzdHJlZVxuXHRcdCAqL1xuXHRcdGNsb3NlX2FsbCA6IGZ1bmN0aW9uIChvYmosIGFuaW1hdGlvbikge1xuXHRcdFx0aWYoIW9iaikgeyBvYmogPSAnIyc7IH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmopIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHR2YXIgZG9tID0gb2JqLmlkID09PSAnIycgPyB0aGlzLmdldF9jb250YWluZXJfdWwoKSA6IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKSxcblx0XHRcdFx0X3RoaXMgPSB0aGlzLCBpLCBqO1xuXHRcdFx0aWYoIWRvbS5sZW5ndGgpIHtcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLmNoaWxkcmVuX2QubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0dGhpcy5fbW9kZWwuZGF0YVtvYmouY2hpbGRyZW5fZFtpXV0uc3RhdGUub3BlbmVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXMudHJpZ2dlcignY2xvc2VfYWxsJywgeyBcIm5vZGVcIiA6IG9iaiB9KTtcblx0XHRcdH1cblx0XHRcdGRvbSA9IHRoaXMuaXNfb3BlbihvYmopID8gZG9tLmZpbmQoJ2xpLmpzdHJlZS1vcGVuJykuYWRkQmFjaygpIDogZG9tLmZpbmQoJ2xpLmpzdHJlZS1vcGVuJyk7XG5cdFx0XHRkb20udmFrYXRhX3JldmVyc2UoKS5lYWNoKGZ1bmN0aW9uICgpIHsgX3RoaXMuY2xvc2Vfbm9kZSh0aGlzLCBhbmltYXRpb24gfHwgMCk7IH0pO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhbiBgY2xvc2VfYWxsYCBjYWxsIGNvbXBsZXRlc1xuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBjbG9zZV9hbGwuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgY2xvc2VkIG5vZGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdjbG9zZV9hbGwnLCB7IFwibm9kZVwiIDogb2JqIH0pO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogY2hlY2tzIGlmIGEgbm9kZSBpcyBkaXNhYmxlZCAobm90IHNlbGVjdGFibGUpXG5cdFx0ICogQG5hbWUgaXNfZGlzYWJsZWQob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdGlzX2Rpc2FibGVkIDogZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xuXHRcdFx0cmV0dXJuIG9iaiAmJiBvYmouc3RhdGUgJiYgb2JqLnN0YXRlLmRpc2FibGVkO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogZW5hYmxlcyBhIG5vZGUgLSBzbyB0aGF0IGl0IGNhbiBiZSBzZWxlY3RlZFxuXHRcdCAqIEBuYW1lIGVuYWJsZV9ub2RlKG9iailcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogdGhlIG5vZGUgdG8gZW5hYmxlXG5cdFx0ICogQHRyaWdnZXIgZW5hYmxlX25vZGUuanN0cmVlXG5cdFx0ICovXG5cdFx0ZW5hYmxlX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHR2YXIgdDEsIHQyO1xuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRcdHRoaXMuZW5hYmxlX25vZGUob2JqW3QxXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdG9iai5zdGF0ZS5kaXNhYmxlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5nZXRfbm9kZShvYmosdHJ1ZSkuY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykucmVtb3ZlQ2xhc3MoJ2pzdHJlZS1kaXNhYmxlZCcpO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhbiBub2RlIGlzIGVuYWJsZWRcblx0XHRcdCAqIEBldmVudFxuXHRcdFx0ICogQG5hbWUgZW5hYmxlX25vZGUuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgZW5hYmxlZCBub2RlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudHJpZ2dlcignZW5hYmxlX25vZGUnLCB7ICdub2RlJyA6IG9iaiB9KTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGRpc2FibGVzIGEgbm9kZSAtIHNvIHRoYXQgaXQgY2FuIG5vdCBiZSBzZWxlY3RlZFxuXHRcdCAqIEBuYW1lIGRpc2FibGVfbm9kZShvYmopXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIGRpc2FibGVcblx0XHQgKiBAdHJpZ2dlciBkaXNhYmxlX25vZGUuanN0cmVlXG5cdFx0ICovXG5cdFx0ZGlzYWJsZV9ub2RlIDogZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0dmFyIHQxLCB0Mjtcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0XHR0aGlzLmRpc2FibGVfbm9kZShvYmpbdDFdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0b2JqLnN0YXRlLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdHRoaXMuZ2V0X25vZGUob2JqLHRydWUpLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmFkZENsYXNzKCdqc3RyZWUtZGlzYWJsZWQnKTtcblx0XHRcdC8qKlxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYW4gbm9kZSBpcyBkaXNhYmxlZFxuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBkaXNhYmxlX25vZGUuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgZGlzYWJsZWQgbm9kZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2Rpc2FibGVfbm9kZScsIHsgJ25vZGUnIDogb2JqIH0pO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogY2FsbGVkIHdoZW4gYSBub2RlIGlzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBhY3RpdmF0ZV9ub2RlKG9iaiwgZSlcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogdGhlIG5vZGVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZSB0aGUgcmVsYXRlZCBldmVudFxuXHRcdCAqIEB0cmlnZ2VyIGFjdGl2YXRlX25vZGUuanN0cmVlXG5cdFx0ICovXG5cdFx0YWN0aXZhdGVfbm9kZSA6IGZ1bmN0aW9uIChvYmosIGUpIHtcblx0XHRcdGlmKHRoaXMuaXNfZGlzYWJsZWQob2JqKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZighdGhpcy5zZXR0aW5ncy5jb3JlLm11bHRpcGxlIHx8ICghZS5tZXRhS2V5ICYmICFlLmN0cmxLZXkgJiYgIWUuc2hpZnRLZXkpIHx8IChlLnNoaWZ0S2V5ICYmICghdGhpcy5fZGF0YS5jb3JlLmxhc3RfY2xpY2tlZCB8fCAhdGhpcy5nZXRfcGFyZW50KG9iaikgfHwgdGhpcy5nZXRfcGFyZW50KG9iaikgIT09IHRoaXMuX2RhdGEuY29yZS5sYXN0X2NsaWNrZWQucGFyZW50ICkgKSkge1xuXHRcdFx0XHRpZighdGhpcy5zZXR0aW5ncy5jb3JlLm11bHRpcGxlICYmIChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkpICYmIHRoaXMuaXNfc2VsZWN0ZWQob2JqKSkge1xuXHRcdFx0XHRcdHRoaXMuZGVzZWxlY3Rfbm9kZShvYmosIGZhbHNlLCBmYWxzZSwgZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5kZXNlbGVjdF9hbGwodHJ1ZSk7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3Rfbm9kZShvYmosIGZhbHNlLCBmYWxzZSwgZSk7XG5cdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLmxhc3RfY2xpY2tlZCA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGlmKGUuc2hpZnRLZXkpIHtcblx0XHRcdFx0XHR2YXIgbyA9IHRoaXMuZ2V0X25vZGUob2JqKS5pZCxcblx0XHRcdFx0XHRcdGwgPSB0aGlzLl9kYXRhLmNvcmUubGFzdF9jbGlja2VkLmlkLFxuXHRcdFx0XHRcdFx0cCA9IHRoaXMuZ2V0X25vZGUodGhpcy5fZGF0YS5jb3JlLmxhc3RfY2xpY2tlZC5wYXJlbnQpLmNoaWxkcmVuLFxuXHRcdFx0XHRcdFx0YyA9IGZhbHNlLFxuXHRcdFx0XHRcdFx0aSwgajtcblx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBwLmxlbmd0aDsgaSA8IGo7IGkgKz0gMSkge1xuXHRcdFx0XHRcdFx0Ly8gc2VwYXJhdGUgSUZzIHdvcmsgd2hlbSBvIGFuZCBsIGFyZSB0aGUgc2FtZVxuXHRcdFx0XHRcdFx0aWYocFtpXSA9PT0gbykge1xuXHRcdFx0XHRcdFx0XHRjID0gIWM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZihwW2ldID09PSBsKSB7XG5cdFx0XHRcdFx0XHRcdGMgPSAhYztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmKGMgfHwgcFtpXSA9PT0gbyB8fCBwW2ldID09PSBsKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0X25vZGUocFtpXSwgZmFsc2UsIGZhbHNlLCBlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmRlc2VsZWN0X25vZGUocFtpXSwgZmFsc2UsIGZhbHNlLCBlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0aWYoIXRoaXMuaXNfc2VsZWN0ZWQob2JqKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3Rfbm9kZShvYmosIGZhbHNlLCBmYWxzZSwgZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5kZXNlbGVjdF9ub2RlKG9iaiwgZmFsc2UsIGZhbHNlLCBlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8qKlxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYW4gbm9kZSBpcyBjbGlja2VkIG9yIGludGVyY2F0ZWQgd2l0aCBieSB0aGUgdXNlclxuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBhY3RpdmF0ZV9ub2RlLmpzdHJlZVxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdhY3RpdmF0ZV9ub2RlJywgeyAnbm9kZScgOiB0aGlzLmdldF9ub2RlKG9iaikgfSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBhcHBsaWVzIHRoZSBob3ZlciBzdGF0ZSBvbiBhIG5vZGUsIGNhbGxlZCB3aGVuIGEgbm9kZSBpcyBob3ZlcmVkIGJ5IHRoZSB1c2VyLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBob3Zlcl9ub2RlKG9iailcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmpcblx0XHQgKiBAdHJpZ2dlciBob3Zlcl9ub2RlLmpzdHJlZVxuXHRcdCAqL1xuXHRcdGhvdmVyX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XG5cdFx0XHRpZighb2JqIHx8ICFvYmoubGVuZ3RoIHx8IG9iai5jaGlsZHJlbignLmpzdHJlZS1ob3ZlcmVkJykubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBvID0gdGhpcy5lbGVtZW50LmZpbmQoJy5qc3RyZWUtaG92ZXJlZCcpLCB0ID0gdGhpcy5lbGVtZW50O1xuXHRcdFx0aWYobyAmJiBvLmxlbmd0aCkgeyB0aGlzLmRlaG92ZXJfbm9kZShvKTsgfVxuXG5cdFx0XHRvYmouY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykuYWRkQ2xhc3MoJ2pzdHJlZS1ob3ZlcmVkJyk7XG5cdFx0XHQvKipcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGFuIG5vZGUgaXMgaG92ZXJlZFxuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBob3Zlcl9ub2RlLmpzdHJlZVxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdob3Zlcl9ub2RlJywgeyAnbm9kZScgOiB0aGlzLmdldF9ub2RlKG9iaikgfSk7XG5cdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgdC5hdHRyKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLCBvYmpbMF0uaWQpOyBvYmouYXR0cignYXJpYS1zZWxlY3RlZCcsIHRydWUpOyB9LCAwKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIHJlbW92ZXMgdGhlIGhvdmVyIHN0YXRlIGZyb20gYSBub2RlY2FsbGVkIHdoZW4gYSBub2RlIGlzIG5vIGxvbmdlciBob3ZlcmVkIGJ5IHRoZSB1c2VyLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAbmFtZSBkZWhvdmVyX25vZGUob2JqKVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9ialxuXHRcdCAqIEB0cmlnZ2VyIGRlaG92ZXJfbm9kZS5qc3RyZWVcblx0XHQgKi9cblx0XHRkZWhvdmVyX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XG5cdFx0XHRpZighb2JqIHx8ICFvYmoubGVuZ3RoIHx8ICFvYmouY2hpbGRyZW4oJy5qc3RyZWUtaG92ZXJlZCcpLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRvYmouYXR0cignYXJpYS1zZWxlY3RlZCcsIGZhbHNlKS5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5yZW1vdmVDbGFzcygnanN0cmVlLWhvdmVyZWQnKTtcblx0XHRcdC8qKlxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYW4gbm9kZSBpcyBubyBsb25nZXIgaG92ZXJlZFxuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBkZWhvdmVyX25vZGUuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2RlaG92ZXJfbm9kZScsIHsgJ25vZGUnIDogdGhpcy5nZXRfbm9kZShvYmopIH0pO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogc2VsZWN0IGEgbm9kZVxuXHRcdCAqIEBuYW1lIHNlbGVjdF9ub2RlKG9iaiBbLCBzdXByZXNzX2V2ZW50LCBwcmV2ZW50X29wZW5dKVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiBhbiBhcnJheSBjYW4gYmUgdXNlZCB0byBzZWxlY3QgbXVsdGlwbGUgbm9kZXNcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IHN1cHJlc3NfZXZlbnQgaWYgc2V0IHRvIGB0cnVlYCB0aGUgYGNoYW5nZWQuanN0cmVlYCBldmVudCB3b24ndCBiZSB0cmlnZ2VyZWRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IHByZXZlbnRfb3BlbiBpZiBzZXQgdG8gYHRydWVgIHBhcmVudHMgb2YgdGhlIHNlbGVjdGVkIG5vZGUgd29uJ3QgYmUgb3BlbmVkXG5cdFx0ICogQHRyaWdnZXIgc2VsZWN0X25vZGUuanN0cmVlLCBjaGFuZ2VkLmpzdHJlZVxuXHRcdCAqL1xuXHRcdHNlbGVjdF9ub2RlIDogZnVuY3Rpb24gKG9iaiwgc3VwcmVzc19ldmVudCwgcHJldmVudF9vcGVuLCBlKSB7XG5cdFx0XHR2YXIgZG9tLCB0MSwgdDIsIHRoO1xuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRcdHRoaXMuc2VsZWN0X25vZGUob2JqW3QxXSwgc3VwcmVzc19ldmVudCwgcHJldmVudF9vcGVuLCBlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0ZG9tID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpO1xuXHRcdFx0aWYoIW9iai5zdGF0ZS5zZWxlY3RlZCkge1xuXHRcdFx0XHRvYmouc3RhdGUuc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQucHVzaChvYmouaWQpO1xuXHRcdFx0XHRpZighcHJldmVudF9vcGVuKSB7XG5cdFx0XHRcdFx0ZG9tID0gdGhpcy5fb3Blbl90byhvYmopO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGRvbSAmJiBkb20ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0ZG9tLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmFkZENsYXNzKCdqc3RyZWUtY2xpY2tlZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhbiBub2RlIGlzIHNlbGVjdGVkXG5cdFx0XHRcdCAqIEBldmVudFxuXHRcdFx0XHQgKiBAbmFtZSBzZWxlY3Rfbm9kZS5qc3RyZWVcblx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcblx0XHRcdFx0ICogQHBhcmFtIHtBcnJheX0gc2VsZWN0ZWQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG5cdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCB0aGUgZXZlbnQgKGlmIGFueSkgdGhhdCB0cmlnZ2VyZWQgdGhpcyBzZWxlY3Rfbm9kZVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdzZWxlY3Rfbm9kZScsIHsgJ25vZGUnIDogb2JqLCAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCAnZXZlbnQnIDogZSB9KTtcblx0XHRcdFx0aWYoIXN1cHJlc3NfZXZlbnQpIHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlc1xuXHRcdFx0XHRcdCAqIEBldmVudFxuXHRcdFx0XHRcdCAqIEBuYW1lIGNoYW5nZWQuanN0cmVlXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcblx0XHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBjYXVzZWQgdGhlIHNlbGVjdGlvbiB0byBjaGFuZ2Vcblx0XHRcdFx0XHQgKiBAcGFyYW0ge0FycmF5fSBzZWxlY3RlZCB0aGUgY3VycmVudCBzZWxlY3Rpb25cblx0XHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgdGhlIGV2ZW50IChpZiBhbnkpIHRoYXQgdHJpZ2dlcmVkIHRoaXMgY2hhbmdlZCBldmVudFxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHRoaXMudHJpZ2dlcignY2hhbmdlZCcsIHsgJ2FjdGlvbicgOiAnc2VsZWN0X25vZGUnLCAnbm9kZScgOiBvYmosICdzZWxlY3RlZCcgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsICdldmVudCcgOiBlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBkZXNlbGVjdCBhIG5vZGVcblx0XHQgKiBAbmFtZSBkZXNlbGVjdF9ub2RlKG9iaiBbLCBzdXByZXNzX2V2ZW50XSlcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogYW4gYXJyYXkgY2FuIGJlIHVzZWQgdG8gZGVzZWxlY3QgbXVsdGlwbGUgbm9kZXNcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IHN1cHJlc3NfZXZlbnQgaWYgc2V0IHRvIGB0cnVlYCB0aGUgYGNoYW5nZWQuanN0cmVlYCBldmVudCB3b24ndCBiZSB0cmlnZ2VyZWRcblx0XHQgKiBAdHJpZ2dlciBkZXNlbGVjdF9ub2RlLmpzdHJlZSwgY2hhbmdlZC5qc3RyZWVcblx0XHQgKi9cblx0XHRkZXNlbGVjdF9ub2RlIDogZnVuY3Rpb24gKG9iaiwgc3VwcmVzc19ldmVudCwgZSkge1xuXHRcdFx0dmFyIHQxLCB0MiwgZG9tO1xuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRcdHRoaXMuZGVzZWxlY3Rfbm9kZShvYmpbdDFdLCBzdXByZXNzX2V2ZW50LCBlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0ZG9tID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpO1xuXHRcdFx0aWYob2JqLnN0YXRlLnNlbGVjdGVkKSB7XG5cdFx0XHRcdG9iai5zdGF0ZS5zZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSAkLnZha2F0YS5hcnJheV9yZW1vdmVfaXRlbSh0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsIG9iai5pZCk7XG5cdFx0XHRcdGlmKGRvbS5sZW5ndGgpIHtcblx0XHRcdFx0XHRkb20uY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykucmVtb3ZlQ2xhc3MoJ2pzdHJlZS1jbGlja2VkJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGFuIG5vZGUgaXMgZGVzZWxlY3RlZFxuXHRcdFx0XHQgKiBAZXZlbnRcblx0XHRcdFx0ICogQG5hbWUgZGVzZWxlY3Rfbm9kZS5qc3RyZWVcblx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcblx0XHRcdFx0ICogQHBhcmFtIHtBcnJheX0gc2VsZWN0ZWQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG5cdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCB0aGUgZXZlbnQgKGlmIGFueSkgdGhhdCB0cmlnZ2VyZWQgdGhpcyBkZXNlbGVjdF9ub2RlXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ2Rlc2VsZWN0X25vZGUnLCB7ICdub2RlJyA6IG9iaiwgJ3NlbGVjdGVkJyA6IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCwgJ2V2ZW50JyA6IGUgfSk7XG5cdFx0XHRcdGlmKCFzdXByZXNzX2V2ZW50KSB7XG5cdFx0XHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyAnYWN0aW9uJyA6ICdkZXNlbGVjdF9ub2RlJywgJ25vZGUnIDogb2JqLCAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCAnZXZlbnQnIDogZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogc2VsZWN0IGFsbCBub2RlcyBpbiB0aGUgdHJlZVxuXHRcdCAqIEBuYW1lIHNlbGVjdF9hbGwoW3N1cHJlc3NfZXZlbnRdKVxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VwcmVzc19ldmVudCBpZiBzZXQgdG8gYHRydWVgIHRoZSBgY2hhbmdlZC5qc3RyZWVgIGV2ZW50IHdvbid0IGJlIHRyaWdnZXJlZFxuXHRcdCAqIEB0cmlnZ2VyIHNlbGVjdF9hbGwuanN0cmVlLCBjaGFuZ2VkLmpzdHJlZVxuXHRcdCAqL1xuXHRcdHNlbGVjdF9hbGwgOiBmdW5jdGlvbiAoc3VwcmVzc19ldmVudCkge1xuXHRcdFx0dmFyIHRtcCA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5jb25jYXQoW10pLCBpLCBqO1xuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkID0gdGhpcy5fbW9kZWwuZGF0YVsnIyddLmNoaWxkcmVuX2QuY29uY2F0KCk7XG5cdFx0XHRmb3IoaSA9IDAsIGogPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdGlmKHRoaXMuX21vZGVsLmRhdGFbdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldXSkge1xuXHRcdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldXS5zdGF0ZS5zZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMucmVkcmF3KHRydWUpO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhbGwgbm9kZXMgYXJlIHNlbGVjdGVkXG5cdFx0XHQgKiBAZXZlbnRcblx0XHRcdCAqIEBuYW1lIHNlbGVjdF9hbGwuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge0FycmF5fSBzZWxlY3RlZCB0aGUgY3VycmVudCBzZWxlY3Rpb25cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdzZWxlY3RfYWxsJywgeyAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkIH0pO1xuXHRcdFx0aWYoIXN1cHJlc3NfZXZlbnQpIHtcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyAnYWN0aW9uJyA6ICdzZWxlY3RfYWxsJywgJ3NlbGVjdGVkJyA6IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCwgJ29sZF9zZWxlY3Rpb24nIDogdG1wIH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogZGVzZWxlY3QgYWxsIHNlbGVjdGVkIG5vZGVzXG5cdFx0ICogQG5hbWUgZGVzZWxlY3RfYWxsKFtzdXByZXNzX2V2ZW50XSlcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IHN1cHJlc3NfZXZlbnQgaWYgc2V0IHRvIGB0cnVlYCB0aGUgYGNoYW5nZWQuanN0cmVlYCBldmVudCB3b24ndCBiZSB0cmlnZ2VyZWRcblx0XHQgKiBAdHJpZ2dlciBkZXNlbGVjdF9hbGwuanN0cmVlLCBjaGFuZ2VkLmpzdHJlZVxuXHRcdCAqL1xuXHRcdGRlc2VsZWN0X2FsbCA6IGZ1bmN0aW9uIChzdXByZXNzX2V2ZW50KSB7XG5cdFx0XHR2YXIgdG1wID0gdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmNvbmNhdChbXSksIGksIGo7XG5cdFx0XHRmb3IoaSA9IDAsIGogPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdGlmKHRoaXMuX21vZGVsLmRhdGFbdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldXSkge1xuXHRcdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldXS5zdGF0ZS5zZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSBbXTtcblx0XHRcdHRoaXMuZWxlbWVudC5maW5kKCcuanN0cmVlLWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcblx0XHRcdC8qKlxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYWxsIG5vZGVzIGFyZSBkZXNlbGVjdGVkXG5cdFx0XHQgKiBAZXZlbnRcblx0XHRcdCAqIEBuYW1lIGRlc2VsZWN0X2FsbC5qc3RyZWVcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb25cblx0XHRcdCAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdGVkIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2Rlc2VsZWN0X2FsbCcsIHsgJ3NlbGVjdGVkJyA6IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCwgJ25vZGUnIDogdG1wIH0pO1xuXHRcdFx0aWYoIXN1cHJlc3NfZXZlbnQpIHtcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyAnYWN0aW9uJyA6ICdkZXNlbGVjdF9hbGwnLCAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCAnb2xkX3NlbGVjdGlvbicgOiB0bXAgfSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBjaGVja3MgaWYgYSBub2RlIGlzIHNlbGVjdGVkXG5cdFx0ICogQG5hbWUgaXNfc2VsZWN0ZWQob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSAgb2JqXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRpc19zZWxlY3RlZCA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9iai5zdGF0ZS5zZWxlY3RlZDtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGdldCBhbiBhcnJheSBvZiBhbGwgc2VsZWN0ZWQgbm9kZSBJRHNcblx0XHQgKiBAbmFtZSBnZXRfc2VsZWN0ZWQoW2Z1bGxdKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSAgZnVsbCBpZiBzZXQgdG8gYHRydWVgIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnNpc3Qgb2YgdGhlIGZ1bGwgbm9kZSBvYmplY3RzLCBvdGhlcndpc2UgLSBvbmx5IElEcyB3aWxsIGJlIHJldHVybmVkXG5cdFx0ICogQHJldHVybiB7QXJyYXl9XG5cdFx0ICovXG5cdFx0Z2V0X3NlbGVjdGVkIDogZnVuY3Rpb24gKGZ1bGwpIHtcblx0XHRcdHJldHVybiBmdWxsID8gJC5tYXAodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCAkLnByb3h5KGZ1bmN0aW9uIChpKSB7IHJldHVybiB0aGlzLmdldF9ub2RlKGkpOyB9LCB0aGlzKSkgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQ7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB0cmVlIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyIHdpdGggYHNldF9zdGF0ZShzdGF0ZSlgLiBVc2VkIGludGVybmFsbHkuXG5cdFx0ICogQG5hbWUgZ2V0X3N0YXRlKClcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHRnZXRfc3RhdGUgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc3RhdGVcdD0ge1xuXHRcdFx0XHQnY29yZScgOiB7XG5cdFx0XHRcdFx0J29wZW4nIDogW10sXG5cdFx0XHRcdFx0J3Njcm9sbCcgOiB7XG5cdFx0XHRcdFx0XHQnbGVmdCcgOiB0aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdCgpLFxuXHRcdFx0XHRcdFx0J3RvcCcgOiB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wKClcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8qIVxuXHRcdFx0XHRcdCd0aGVtZXMnIDoge1xuXHRcdFx0XHRcdFx0J25hbWUnIDogdGhpcy5nZXRfdGhlbWUoKSxcblx0XHRcdFx0XHRcdCdpY29ucycgOiB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmljb25zLFxuXHRcdFx0XHRcdFx0J2RvdHMnIDogdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5kb3RzXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQqL1xuXHRcdFx0XHRcdCdzZWxlY3RlZCcgOiBbXVxuXHRcdFx0XHR9XG5cdFx0XHR9LCBpO1xuXHRcdFx0Zm9yKGkgaW4gdGhpcy5fbW9kZWwuZGF0YSkge1xuXHRcdFx0XHRpZih0aGlzLl9tb2RlbC5kYXRhLmhhc093blByb3BlcnR5KGkpKSB7XG5cdFx0XHRcdFx0aWYoaSAhPT0gJyMnKSB7XG5cdFx0XHRcdFx0XHRpZih0aGlzLl9tb2RlbC5kYXRhW2ldLnN0YXRlLm9wZW5lZCkge1xuXHRcdFx0XHRcdFx0XHRzdGF0ZS5jb3JlLm9wZW4ucHVzaChpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmKHRoaXMuX21vZGVsLmRhdGFbaV0uc3RhdGUuc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0c3RhdGUuY29yZS5zZWxlY3RlZC5wdXNoKGkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogc2V0cyB0aGUgc3RhdGUgb2YgdGhlIHRyZWUuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAbmFtZSBzZXRfc3RhdGUoc3RhdGUgWywgY2FsbGJhY2tdKVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIHRoZSBzdGF0ZSB0byByZXN0b3JlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbmNlIHRoZSBzdGF0ZSBpcyByZXN0b3JlZC5cblx0XHQgKiBAdHJpZ2dlciBzZXRfc3RhdGUuanN0cmVlXG5cdFx0ICovXG5cdFx0c2V0X3N0YXRlIDogZnVuY3Rpb24gKHN0YXRlLCBjYWxsYmFjaykge1xuXHRcdFx0aWYoc3RhdGUpIHtcblx0XHRcdFx0aWYoc3RhdGUuY29yZSkge1xuXHRcdFx0XHRcdHZhciByZXMsIG4sIHQsIF90aGlzO1xuXHRcdFx0XHRcdGlmKHN0YXRlLmNvcmUub3Blbikge1xuXHRcdFx0XHRcdFx0aWYoISQuaXNBcnJheShzdGF0ZS5jb3JlLm9wZW4pKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBzdGF0ZS5jb3JlLm9wZW47XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0X3N0YXRlKHN0YXRlLCBjYWxsYmFjayk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJlcyA9IHRydWU7XG5cdFx0XHRcdFx0XHRuID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR0ID0gdGhpcztcblx0XHRcdFx0XHRcdCQuZWFjaChzdGF0ZS5jb3JlLm9wZW4uY29uY2F0KFtdKSwgZnVuY3Rpb24gKGksIHYpIHtcblx0XHRcdFx0XHRcdFx0biA9IHQuZ2V0X25vZGUodik7XG5cdFx0XHRcdFx0XHRcdGlmKG4pIHtcblx0XHRcdFx0XHRcdFx0XHRpZih0LmlzX2xvYWRlZCh2KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYodC5pc19jbG9zZWQodikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dC5vcGVuX25vZGUodiwgZmFsc2UsIDApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYoc3RhdGUgJiYgc3RhdGUuY29yZSAmJiBzdGF0ZS5jb3JlLm9wZW4pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0JC52YWthdGEuYXJyYXlfcmVtb3ZlX2l0ZW0oc3RhdGUuY29yZS5vcGVuLCB2KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZighdC5pc19sb2FkaW5nKHYpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHQub3Blbl9ub2RlKHYsICQucHJveHkoZnVuY3Rpb24gKCkgeyB0aGlzLnNldF9zdGF0ZShzdGF0ZSwgY2FsbGJhY2spOyB9LCB0KSwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0aGVyZSB3aWxsIGJlIHNvbWUgYXN5bmMgYWN0aXZpdHkgLSBzbyB3YWl0IGZvciBpdFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGlmKHJlcykge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgc3RhdGUuY29yZS5vcGVuO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNldF9zdGF0ZShzdGF0ZSwgY2FsbGJhY2spO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZihzdGF0ZS5jb3JlLnNjcm9sbCkge1xuXHRcdFx0XHRcdFx0aWYoc3RhdGUuY29yZS5zY3JvbGwgJiYgc3RhdGUuY29yZS5zY3JvbGwubGVmdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZWxlbWVudC5zY3JvbGxMZWZ0KHN0YXRlLmNvcmUuc2Nyb2xsLmxlZnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYoc3RhdGUuY29yZS5zY3JvbGwgJiYgc3RhdGUuY29yZS5zY3JvbGwudG9wICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5lbGVtZW50LnNjcm9sbFRvcChzdGF0ZS5jb3JlLnNjcm9sbC50b3ApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZGVsZXRlIHN0YXRlLmNvcmUuc2Nyb2xsO1xuXHRcdFx0XHRcdFx0dGhpcy5zZXRfc3RhdGUoc3RhdGUsIGNhbGxiYWNrKTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LyohXG5cdFx0XHRcdFx0aWYoc3RhdGUuY29yZS50aGVtZXMpIHtcblx0XHRcdFx0XHRcdGlmKHN0YXRlLmNvcmUudGhlbWVzLm5hbWUpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5zZXRfdGhlbWUoc3RhdGUuY29yZS50aGVtZXMubmFtZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZih0eXBlb2Ygc3RhdGUuY29yZS50aGVtZXMuZG90cyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdFx0dGhpc1sgc3RhdGUuY29yZS50aGVtZXMuZG90cyA/IFwic2hvd19kb3RzXCIgOiBcImhpZGVfZG90c1wiIF0oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmKHR5cGVvZiBzdGF0ZS5jb3JlLnRoZW1lcy5pY29ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdFx0dGhpc1sgc3RhdGUuY29yZS50aGVtZXMuaWNvbnMgPyBcInNob3dfaWNvbnNcIiA6IFwiaGlkZV9pY29uc1wiIF0oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGRlbGV0ZSBzdGF0ZS5jb3JlLnRoZW1lcztcblx0XHRcdFx0XHRcdGRlbGV0ZSBzdGF0ZS5jb3JlLm9wZW47XG5cdFx0XHRcdFx0XHR0aGlzLnNldF9zdGF0ZShzdGF0ZSwgY2FsbGJhY2spO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQqL1xuXHRcdFx0XHRcdGlmKHN0YXRlLmNvcmUuc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdF90aGlzID0gdGhpcztcblx0XHRcdFx0XHRcdHRoaXMuZGVzZWxlY3RfYWxsKCk7XG5cdFx0XHRcdFx0XHQkLmVhY2goc3RhdGUuY29yZS5zZWxlY3RlZCwgZnVuY3Rpb24gKGksIHYpIHtcblx0XHRcdFx0XHRcdFx0X3RoaXMuc2VsZWN0X25vZGUodik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGRlbGV0ZSBzdGF0ZS5jb3JlLnNlbGVjdGVkO1xuXHRcdFx0XHRcdFx0dGhpcy5zZXRfc3RhdGUoc3RhdGUsIGNhbGxiYWNrKTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoJC5pc0VtcHR5T2JqZWN0KHN0YXRlLmNvcmUpKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgc3RhdGUuY29yZTtcblx0XHRcdFx0XHRcdHRoaXMuc2V0X3N0YXRlKHN0YXRlLCBjYWxsYmFjayk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCQuaXNFbXB0eU9iamVjdChzdGF0ZSkpIHtcblx0XHRcdFx0XHRzdGF0ZSA9IG51bGw7XG5cdFx0XHRcdFx0aWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCh0aGlzKTsgfVxuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgYHNldF9zdGF0ZWAgY2FsbCBjb21wbGV0ZXNcblx0XHRcdFx0XHQgKiBAZXZlbnRcblx0XHRcdFx0XHQgKiBAbmFtZSBzZXRfc3RhdGUuanN0cmVlXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0dGhpcy50cmlnZ2VyKCdzZXRfc3RhdGUnKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiByZWZyZXNoZXMgdGhlIHRyZWUgLSBhbGwgbm9kZXMgYXJlIHJlbG9hZGVkIHdpdGggY2FsbHMgdG8gYGxvYWRfbm9kZWAuXG5cdFx0ICogQG5hbWUgcmVmcmVzaCgpXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBza2lwX2xvYWRpbmcgYW4gb3B0aW9uIHRvIHNraXAgc2hvd2luZyB0aGUgbG9hZGluZyBpbmRpY2F0b3Jcblx0XHQgKiBAdHJpZ2dlciByZWZyZXNoLmpzdHJlZVxuXHRcdCAqL1xuXHRcdHJlZnJlc2ggOiBmdW5jdGlvbiAoc2tpcF9sb2FkaW5nKSB7XG5cdFx0XHR0aGlzLl9kYXRhLmNvcmUuc3RhdGUgPSB0aGlzLmdldF9zdGF0ZSgpO1xuXHRcdFx0dGhpcy5fY250ID0gMDtcblx0XHRcdHRoaXMuX21vZGVsLmRhdGEgPSB7XG5cdFx0XHRcdCcjJyA6IHtcblx0XHRcdFx0XHRpZCA6ICcjJyxcblx0XHRcdFx0XHRwYXJlbnQgOiBudWxsLFxuXHRcdFx0XHRcdHBhcmVudHMgOiBbXSxcblx0XHRcdFx0XHRjaGlsZHJlbiA6IFtdLFxuXHRcdFx0XHRcdGNoaWxkcmVuX2QgOiBbXSxcblx0XHRcdFx0XHRzdGF0ZSA6IHsgbG9hZGVkIDogZmFsc2UgfVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dmFyIGMgPSB0aGlzLmdldF9jb250YWluZXJfdWwoKVswXS5jbGFzc05hbWU7XG5cdFx0XHRpZighc2tpcF9sb2FkaW5nKSB7XG5cdFx0XHRcdHRoaXMuZWxlbWVudC5odG1sKFwiPFwiK1widWwgY2xhc3M9J2pzdHJlZS1jb250YWluZXItdWwnPjxcIitcImxpIGNsYXNzPSdqc3RyZWUtaW5pdGlhbC1ub2RlIGpzdHJlZS1sb2FkaW5nIGpzdHJlZS1sZWFmIGpzdHJlZS1sYXN0Jz48aSBjbGFzcz0nanN0cmVlLWljb24ganN0cmVlLW9jbCc+PC9pPjxcIitcImEgY2xhc3M9J2pzdHJlZS1hbmNob3InIGhyZWY9JyMnPjxpIGNsYXNzPSdqc3RyZWUtaWNvbiBqc3RyZWUtdGhlbWVpY29uLWhpZGRlbic+PC9pPlwiICsgdGhpcy5nZXRfc3RyaW5nKFwiTG9hZGluZyAuLi5cIikgKyBcIjwvYT48L2xpPjwvdWw+XCIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5sb2FkX25vZGUoJyMnLCBmdW5jdGlvbiAobywgcykge1xuXHRcdFx0XHRpZihzKSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRfY29udGFpbmVyX3VsKClbMF0uY2xhc3NOYW1lID0gYztcblx0XHRcdFx0XHR0aGlzLnNldF9zdGF0ZSgkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5fZGF0YS5jb3JlLnN0YXRlKSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIGByZWZyZXNoYCBjYWxsIGNvbXBsZXRlc1xuXHRcdFx0XHRcdFx0ICogQGV2ZW50XG5cdFx0XHRcdFx0XHQgKiBAbmFtZSByZWZyZXNoLmpzdHJlZVxuXHRcdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0XHR0aGlzLnRyaWdnZXIoJ3JlZnJlc2gnKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc3RhdGUgPSBudWxsO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBzZXQgKGNoYW5nZSkgdGhlIElEIG9mIGEgbm9kZVxuXHRcdCAqIEBuYW1lIHNldF9pZChvYmosIGlkKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmogdGhlIG5vZGVcblx0XHQgKiBAcGFyYW0gIHtTdHJpbmd9IGlkIHRoZSBuZXcgSURcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHNldF9pZCA6IGZ1bmN0aW9uIChvYmosIGlkKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0dmFyIGksIGosIG0gPSB0aGlzLl9tb2RlbC5kYXRhO1xuXHRcdFx0Ly8gdXBkYXRlIHBhcmVudHMgKHJlcGxhY2UgY3VycmVudCBJRCB3aXRoIG5ldyBvbmUgaW4gY2hpbGRyZW4gYW5kIGNoaWxkcmVuX2QpXG5cdFx0XHRtW29iai5wYXJlbnRdLmNoaWxkcmVuWyQuaW5BcnJheShvYmouaWQsIG1bb2JqLnBhcmVudF0uY2hpbGRyZW4pXSA9IGlkO1xuXHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdG1bb2JqLnBhcmVudHNbaV1dLmNoaWxkcmVuX2RbJC5pbkFycmF5KG9iai5pZCwgbVtvYmoucGFyZW50c1tpXV0uY2hpbGRyZW5fZCldID0gaWQ7XG5cdFx0XHR9XG5cdFx0XHQvLyB1cGRhdGUgY2hpbGRyZW4gKHJlcGxhY2UgY3VycmVudCBJRCB3aXRoIG5ldyBvbmUgaW4gcGFyZW50IGFuZCBwYXJlbnRzKVxuXHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRtW29iai5jaGlsZHJlbltpXV0ucGFyZW50ID0gaWQ7XG5cdFx0XHR9XG5cdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0bVtvYmouY2hpbGRyZW5fZFtpXV0ucGFyZW50c1skLmluQXJyYXkob2JqLmlkLCBtW29iai5jaGlsZHJlbl9kW2ldXS5wYXJlbnRzKV0gPSBpZDtcblx0XHRcdH1cblx0XHRcdGkgPSAkLmluQXJyYXkob2JqLmlkLCB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQpO1xuXHRcdFx0aWYoaSAhPT0gLTEpIHsgdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldID0gaWQ7IH1cblx0XHRcdC8vIHVwZGF0ZSBtb2RlbCBhbmQgb2JqIGl0c2VsZiAob2JqLmlkLCB0aGlzLl9tb2RlbC5kYXRhW0tFWV0pXG5cdFx0XHRpID0gdGhpcy5nZXRfbm9kZShvYmouaWQsIHRydWUpO1xuXHRcdFx0aWYoaSkge1xuXHRcdFx0XHRpLmF0dHIoJ2lkJywgaWQpO1xuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIG1bb2JqLmlkXTtcblx0XHRcdG9iai5pZCA9IGlkO1xuXHRcdFx0bVtpZF0gPSBvYmo7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGdldCB0aGUgdGV4dCB2YWx1ZSBvZiBhIG5vZGVcblx0XHQgKiBAbmFtZSBnZXRfdGV4dChvYmopXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZVxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ31cblx0XHQgKi9cblx0XHRnZXRfdGV4dCA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdHJldHVybiAoIW9iaiB8fCBvYmouaWQgPT09ICcjJykgPyBmYWxzZSA6IG9iai50ZXh0O1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogc2V0IHRoZSB0ZXh0IHZhbHVlIG9mIGEgbm9kZS4gVXNlZCBpbnRlcm5hbGx5LCBwbGVhc2UgdXNlIGByZW5hbWVfbm9kZShvYmosIHZhbClgLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQG5hbWUgc2V0X3RleHQob2JqLCB2YWwpXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZSwgeW91IGNhbiBwYXNzIGFuIGFycmF5IHRvIHNldCB0aGUgdGV4dCBvbiBtdWx0aXBsZSBub2Rlc1xuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30gdmFsIHRoZSBuZXcgdGV4dCB2YWx1ZVxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICogQHRyaWdnZXIgc2V0X3RleHQuanN0cmVlXG5cdFx0ICovXG5cdFx0c2V0X3RleHQgOiBmdW5jdGlvbiAob2JqLCB2YWwpIHtcblx0XHRcdHZhciB0MSwgdDIsIGRvbSwgdG1wO1xuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRcdHRoaXMuc2V0X3RleHQob2JqW3QxXSwgdmFsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRvYmoudGV4dCA9IHZhbDtcblx0XHRcdGRvbSA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcblx0XHRcdGlmKGRvbS5sZW5ndGgpIHtcblx0XHRcdFx0ZG9tID0gZG9tLmNoaWxkcmVuKFwiLmpzdHJlZS1hbmNob3I6ZXEoMClcIik7XG5cdFx0XHRcdHRtcCA9IGRvbS5jaGlsZHJlbihcIklcIikuY2xvbmUoKTtcblx0XHRcdFx0ZG9tLmh0bWwodmFsKS5wcmVwZW5kKHRtcCk7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgdGV4dCB2YWx1ZSBpcyBjaGFuZ2VkXG5cdFx0XHRcdCAqIEBldmVudFxuXHRcdFx0XHQgKiBAbmFtZSBzZXRfdGV4dC5qc3RyZWVcblx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG9ialxuXHRcdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCB0aGUgbmV3IHZhbHVlXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ3NldF90ZXh0Jyx7IFwib2JqXCIgOiBvYmosIFwidGV4dFwiIDogdmFsIH0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXRzIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIG5vZGUgKG9yIHRoZSB3aG9sZSB0cmVlKVxuXHRcdCAqIEBuYW1lIGdldF9qc29uKFtvYmosIG9wdGlvbnNdKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBvcHRpb25zLm5vX3N0YXRlIGRvIG5vdCByZXR1cm4gc3RhdGUgaW5mb3JtYXRpb25cblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBvcHRpb25zLm5vX2lkIGRvIG5vdCByZXR1cm4gSURcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBvcHRpb25zLm5vX2NoaWxkcmVuIGRvIG5vdCBpbmNsdWRlIGNoaWxkcmVuXG5cdFx0ICogQHBhcmFtICB7Qm9vbGVhbn0gb3B0aW9ucy5ub19kYXRhIGRvIG5vdCBpbmNsdWRlIG5vZGUgZGF0YVxuXHRcdCAqIEBwYXJhbSAge0Jvb2xlYW59IG9wdGlvbnMuZmxhdCByZXR1cm4gZmxhdCBKU09OIGluc3RlYWQgb2YgbmVzdGVkXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdGdldF9qc29uIDogZnVuY3Rpb24gKG9iaiwgb3B0aW9ucywgZmxhdCkge1xuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmogfHwgJyMnKTtcblx0XHRcdGlmKCFvYmopIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMuZmxhdCAmJiAhZmxhdCkgeyBmbGF0ID0gW107IH1cblx0XHRcdHZhciB0bXAgPSB7XG5cdFx0XHRcdCdpZCcgOiBvYmouaWQsXG5cdFx0XHRcdCd0ZXh0JyA6IG9iai50ZXh0LFxuXHRcdFx0XHQnaWNvbicgOiB0aGlzLmdldF9pY29uKG9iaiksXG5cdFx0XHRcdCdsaV9hdHRyJyA6IG9iai5saV9hdHRyLFxuXHRcdFx0XHQnYV9hdHRyJyA6IG9iai5hX2F0dHIsXG5cdFx0XHRcdCdzdGF0ZScgOiB7fSxcblx0XHRcdFx0J2RhdGEnIDogb3B0aW9ucyAmJiBvcHRpb25zLm5vX2RhdGEgPyBmYWxzZSA6IG9iai5kYXRhXG5cdFx0XHRcdC8vKCB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSkubGVuZ3RoID8gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpLmRhdGEoKSA6IG9iai5kYXRhICksXG5cdFx0XHR9LCBpLCBqO1xuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLmZsYXQpIHtcblx0XHRcdFx0dG1wLnBhcmVudCA9IG9iai5wYXJlbnQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dG1wLmNoaWxkcmVuID0gW107XG5cdFx0XHR9XG5cdFx0XHRpZighb3B0aW9ucyB8fCAhb3B0aW9ucy5ub19zdGF0ZSkge1xuXHRcdFx0XHRmb3IoaSBpbiBvYmouc3RhdGUpIHtcblx0XHRcdFx0XHRpZihvYmouc3RhdGUuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRcdHRtcC5zdGF0ZVtpXSA9IG9iai5zdGF0ZVtpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5ub19pZCkge1xuXHRcdFx0XHRkZWxldGUgdG1wLmlkO1xuXHRcdFx0XHRpZih0bXAubGlfYXR0ciAmJiB0bXAubGlfYXR0ci5pZCkge1xuXHRcdFx0XHRcdGRlbGV0ZSB0bXAubGlfYXR0ci5pZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLmZsYXQgJiYgb2JqLmlkICE9PSAnIycpIHtcblx0XHRcdFx0ZmxhdC5wdXNoKHRtcCk7XG5cdFx0XHR9XG5cdFx0XHRpZighb3B0aW9ucyB8fCAhb3B0aW9ucy5ub19jaGlsZHJlbikge1xuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLmZsYXQpIHtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0X2pzb24ob2JqLmNoaWxkcmVuW2ldLCBvcHRpb25zLCBmbGF0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHR0bXAuY2hpbGRyZW4ucHVzaCh0aGlzLmdldF9qc29uKG9iai5jaGlsZHJlbltpXSwgb3B0aW9ucykpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5mbGF0ID8gZmxhdCA6IChvYmouaWQgPT09ICcjJyA/IHRtcC5jaGlsZHJlbiA6IHRtcCk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBjcmVhdGUgYSBuZXcgbm9kZSAoZG8gbm90IGNvbmZ1c2Ugd2l0aCBsb2FkX25vZGUpXG5cdFx0ICogQG5hbWUgY3JlYXRlX25vZGUoW29iaiwgbm9kZSwgcG9zLCBjYWxsYmFjaywgaXNfbG9hZGVkXSlcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gICBwYXIgICAgICAgdGhlIHBhcmVudCBub2RlXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9ICAgbm9kZSAgICAgIHRoZSBkYXRhIGZvciB0aGUgbmV3IG5vZGUgKGEgdmFsaWQgSlNPTiBvYmplY3QsIG9yIGEgc2ltcGxlIHN0cmluZyB3aXRoIHRoZSBuYW1lKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSAgIHBvcyAgICAgICB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBub2RlLCBcImZpcnN0XCIgYW5kIFwibGFzdFwiIGFyZSBhbHNvIHN1cHBvcnRlZCwgZGVmYXVsdCBpcyBcImxhc3RcIlxuXHRcdCAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIHRoZSBub2RlIGlzIGNyZWF0ZWRcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBpc19sb2FkZWQgaW50ZXJuYWwgYXJndW1lbnQgaW5kaWNhdGluZyBpZiB0aGUgcGFyZW50IG5vZGUgd2FzIHN1Y2Nlc2Z1bGx5IGxvYWRlZFxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICAgICB0aGUgSUQgb2YgdGhlIG5ld2x5IGNyZWF0ZSBub2RlXG5cdFx0ICogQHRyaWdnZXIgbW9kZWwuanN0cmVlLCBjcmVhdGVfbm9kZS5qc3RyZWVcblx0XHQgKi9cblx0XHRjcmVhdGVfbm9kZSA6IGZ1bmN0aW9uIChwYXIsIG5vZGUsIHBvcywgY2FsbGJhY2ssIGlzX2xvYWRlZCkge1xuXHRcdFx0cGFyID0gdGhpcy5nZXRfbm9kZShwYXIpO1xuXHRcdFx0aWYoIXBhcikgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdHBvcyA9IHBvcyA9PT0gdW5kZWZpbmVkID8gXCJsYXN0XCIgOiBwb3M7XG5cdFx0XHRpZighcG9zLnRvU3RyaW5nKCkubWF0Y2goL14oYmVmb3JlfGFmdGVyKSQvKSAmJiAhaXNfbG9hZGVkICYmICF0aGlzLmlzX2xvYWRlZChwYXIpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmxvYWRfbm9kZShwYXIsIGZ1bmN0aW9uICgpIHsgdGhpcy5jcmVhdGVfbm9kZShwYXIsIG5vZGUsIHBvcywgY2FsbGJhY2ssIHRydWUpOyB9KTtcblx0XHRcdH1cblx0XHRcdGlmKCFub2RlKSB7IG5vZGUgPSB7IFwidGV4dFwiIDogdGhpcy5nZXRfc3RyaW5nKCdOZXcgbm9kZScpIH07IH1cblx0XHRcdGlmKG5vZGUudGV4dCA9PT0gdW5kZWZpbmVkKSB7IG5vZGUudGV4dCA9IHRoaXMuZ2V0X3N0cmluZygnTmV3IG5vZGUnKTsgfVxuXHRcdFx0dmFyIHRtcCwgZHBjLCBpLCBqO1xuXG5cdFx0XHRpZihwYXIuaWQgPT09ICcjJykge1xuXHRcdFx0XHRpZihwb3MgPT09IFwiYmVmb3JlXCIpIHsgcG9zID0gXCJmaXJzdFwiOyB9XG5cdFx0XHRcdGlmKHBvcyA9PT0gXCJhZnRlclwiKSB7IHBvcyA9IFwibGFzdFwiOyB9XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2gocG9zKSB7XG5cdFx0XHRcdGNhc2UgXCJiZWZvcmVcIjpcblx0XHRcdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKHBhci5wYXJlbnQpO1xuXHRcdFx0XHRcdHBvcyA9ICQuaW5BcnJheShwYXIuaWQsIHRtcC5jaGlsZHJlbik7XG5cdFx0XHRcdFx0cGFyID0gdG1wO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiYWZ0ZXJcIiA6XG5cdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShwYXIucGFyZW50KTtcblx0XHRcdFx0XHRwb3MgPSAkLmluQXJyYXkocGFyLmlkLCB0bXAuY2hpbGRyZW4pICsgMTtcblx0XHRcdFx0XHRwYXIgPSB0bXA7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJpbnNpZGVcIjpcblx0XHRcdFx0Y2FzZSBcImZpcnN0XCI6XG5cdFx0XHRcdFx0cG9zID0gMDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImxhc3RcIjpcblx0XHRcdFx0XHRwb3MgPSBwYXIuY2hpbGRyZW4ubGVuZ3RoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGlmKCFwb3MpIHsgcG9zID0gMDsgfVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYocG9zID4gcGFyLmNoaWxkcmVuLmxlbmd0aCkgeyBwb3MgPSBwYXIuY2hpbGRyZW4ubGVuZ3RoOyB9XG5cdFx0XHRpZighbm9kZS5pZCkgeyBub2RlLmlkID0gdHJ1ZTsgfVxuXHRcdFx0aWYoIXRoaXMuY2hlY2soXCJjcmVhdGVfbm9kZVwiLCBub2RlLCBwYXIsIHBvcykpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5jb3JlLmVycm9yLmNhbGwodGhpcywgdGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3IpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZihub2RlLmlkID09PSB0cnVlKSB7IGRlbGV0ZSBub2RlLmlkOyB9XG5cdFx0XHRub2RlID0gdGhpcy5fcGFyc2VfbW9kZWxfZnJvbV9qc29uKG5vZGUsIHBhci5pZCwgcGFyLnBhcmVudHMuY29uY2F0KCkpO1xuXHRcdFx0aWYoIW5vZGUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKG5vZGUpO1xuXHRcdFx0ZHBjID0gW107XG5cdFx0XHRkcGMucHVzaChub2RlKTtcblx0XHRcdGRwYyA9IGRwYy5jb25jYXQodG1wLmNoaWxkcmVuX2QpO1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdtb2RlbCcsIHsgXCJub2Rlc1wiIDogZHBjLCBcInBhcmVudFwiIDogcGFyLmlkIH0pO1xuXG5cdFx0XHRwYXIuY2hpbGRyZW5fZCA9IHBhci5jaGlsZHJlbl9kLmNvbmNhdChkcGMpO1xuXHRcdFx0Zm9yKGkgPSAwLCBqID0gcGFyLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbcGFyLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QgPSB0aGlzLl9tb2RlbC5kYXRhW3Bhci5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kLmNvbmNhdChkcGMpO1xuXHRcdFx0fVxuXHRcdFx0bm9kZSA9IHRtcDtcblx0XHRcdHRtcCA9IFtdO1xuXHRcdFx0Zm9yKGkgPSAwLCBqID0gcGFyLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHR0bXBbaSA+PSBwb3MgPyBpKzEgOiBpXSA9IHBhci5jaGlsZHJlbltpXTtcblx0XHRcdH1cblx0XHRcdHRtcFtwb3NdID0gbm9kZS5pZDtcblx0XHRcdHBhci5jaGlsZHJlbiA9IHRtcDtcblxuXHRcdFx0dGhpcy5yZWRyYXdfbm9kZShwYXIsIHRydWUpO1xuXHRcdFx0aWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCh0aGlzLCB0aGlzLmdldF9ub2RlKG5vZGUpKTsgfVxuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgaXMgY3JlYXRlZFxuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBjcmVhdGVfbm9kZS5qc3RyZWVcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBub2RlXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gcGFyZW50IHRoZSBwYXJlbnQncyBJRFxuXHRcdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IG5vZGUgYW1vbmcgdGhlIHBhcmVudCdzIGNoaWxkcmVuXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudHJpZ2dlcignY3JlYXRlX25vZGUnLCB7IFwibm9kZVwiIDogdGhpcy5nZXRfbm9kZShub2RlKSwgXCJwYXJlbnRcIiA6IHBhci5pZCwgXCJwb3NpdGlvblwiIDogcG9zIH0pO1xuXHRcdFx0cmV0dXJuIG5vZGUuaWQ7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBzZXQgdGhlIHRleHQgdmFsdWUgb2YgYSBub2RlXG5cdFx0ICogQG5hbWUgcmVuYW1lX25vZGUob2JqLCB2YWwpXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZSwgeW91IGNhbiBwYXNzIGFuIGFycmF5IHRvIHJlbmFtZSBtdWx0aXBsZSBub2RlcyB0byB0aGUgc2FtZSBuYW1lXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSB2YWwgdGhlIG5ldyB0ZXh0IHZhbHVlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKiBAdHJpZ2dlciByZW5hbWVfbm9kZS5qc3RyZWVcblx0XHQgKi9cblx0XHRyZW5hbWVfbm9kZSA6IGZ1bmN0aW9uIChvYmosIHZhbCkge1xuXHRcdFx0dmFyIHQxLCB0Miwgb2xkO1xuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRcdHRoaXMucmVuYW1lX25vZGUob2JqW3QxXSwgdmFsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRvbGQgPSBvYmoudGV4dDtcblx0XHRcdGlmKCF0aGlzLmNoZWNrKFwicmVuYW1lX25vZGVcIiwgb2JqLCB0aGlzLmdldF9wYXJlbnQob2JqKSwgdmFsKSkge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmNvcmUuZXJyb3IuY2FsbCh0aGlzLCB0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvcik7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2V0X3RleHQob2JqLCB2YWwpOyAvLyAuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSlcblx0XHRcdC8qKlxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYSBub2RlIGlzIHJlbmFtZWRcblx0XHRcdCAqIEBldmVudFxuXHRcdFx0ICogQG5hbWUgcmVuYW1lX25vZGUuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIG5ldyB2YWx1ZVxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IG9sZCB0aGUgb2xkIHZhbHVlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudHJpZ2dlcigncmVuYW1lX25vZGUnLCB7IFwibm9kZVwiIDogb2JqLCBcInRleHRcIiA6IHZhbCwgXCJvbGRcIiA6IG9sZCB9KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogcmVtb3ZlIGEgbm9kZVxuXHRcdCAqIEBuYW1lIGRlbGV0ZV9ub2RlKG9iailcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqIHRoZSBub2RlLCB5b3UgY2FuIHBhc3MgYW4gYXJyYXkgdG8gZGVsZXRlIG11bHRpcGxlIG5vZGVzXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKiBAdHJpZ2dlciBkZWxldGVfbm9kZS5qc3RyZWUsIGNoYW5nZWQuanN0cmVlXG5cdFx0ICovXG5cdFx0ZGVsZXRlX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHR2YXIgdDEsIHQyLCBwYXIsIHBvcywgdG1wLCBpLCBqLCBrLCBsLCBjO1xuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRcdHRoaXMuZGVsZXRlX25vZGUob2JqW3QxXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0cGFyID0gdGhpcy5nZXRfbm9kZShvYmoucGFyZW50KTtcblx0XHRcdHBvcyA9ICQuaW5BcnJheShvYmouaWQsIHBhci5jaGlsZHJlbik7XG5cdFx0XHRjID0gZmFsc2U7XG5cdFx0XHRpZighdGhpcy5jaGVjayhcImRlbGV0ZV9ub2RlXCIsIG9iaiwgcGFyLCBwb3MpKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuY29yZS5lcnJvci5jYWxsKHRoaXMsIHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYocG9zICE9PSAtMSkge1xuXHRcdFx0XHRwYXIuY2hpbGRyZW4gPSAkLnZha2F0YS5hcnJheV9yZW1vdmUocGFyLmNoaWxkcmVuLCBwb3MpO1xuXHRcdFx0fVxuXHRcdFx0dG1wID0gb2JqLmNoaWxkcmVuX2QuY29uY2F0KFtdKTtcblx0XHRcdHRtcC5wdXNoKG9iai5pZCk7XG5cdFx0XHRmb3IoayA9IDAsIGwgPSB0bXAubGVuZ3RoOyBrIDwgbDsgaysrKSB7XG5cdFx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5wYXJlbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdHBvcyA9ICQuaW5BcnJheSh0bXBba10sIHRoaXMuX21vZGVsLmRhdGFbb2JqLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QpO1xuXHRcdFx0XHRcdGlmKHBvcyAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbb2JqLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QgPSAkLnZha2F0YS5hcnJheV9yZW1vdmUodGhpcy5fbW9kZWwuZGF0YVtvYmoucGFyZW50c1tpXV0uY2hpbGRyZW5fZCwgcG9zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYodGhpcy5fbW9kZWwuZGF0YVt0bXBba11dLnN0YXRlLnNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0YyA9IHRydWU7XG5cdFx0XHRcdFx0cG9zID0gJC5pbkFycmF5KHRtcFtrXSwgdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkKTtcblx0XHRcdFx0XHRpZihwb3MgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSAkLnZha2F0YS5hcnJheV9yZW1vdmUodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCBwb3MpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgaXMgZGVsZXRlZFxuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBkZWxldGVfbm9kZS5qc3RyZWVcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBub2RlXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gcGFyZW50IHRoZSBwYXJlbnQncyBJRFxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2RlbGV0ZV9ub2RlJywgeyBcIm5vZGVcIiA6IG9iaiwgXCJwYXJlbnRcIiA6IHBhci5pZCB9KTtcblx0XHRcdGlmKGMpIHtcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyAnYWN0aW9uJyA6ICdkZWxldGVfbm9kZScsICdub2RlJyA6IG9iaiwgJ3NlbGVjdGVkJyA6IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCwgJ3BhcmVudCcgOiBwYXIuaWQgfSk7XG5cdFx0XHR9XG5cdFx0XHRmb3IoayA9IDAsIGwgPSB0bXAubGVuZ3RoOyBrIDwgbDsgaysrKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9tb2RlbC5kYXRhW3RtcFtrXV07XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnJlZHJhd19ub2RlKHBhciwgdHJ1ZSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGNoZWNrIGlmIGFuIG9wZXJhdGlvbiBpcyBwcmVtaXR0ZWQgb24gdGhlIHRyZWUuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIGNoZWNrKGNoaywgb2JqLCBwYXIsIHBvcylcblx0XHQgKiBAcGFyYW0gIHtTdHJpbmd9IGNoayB0aGUgb3BlcmF0aW9uIHRvIGNoZWNrLCBjYW4gYmUgXCJjcmVhdGVfbm9kZVwiLCBcInJlbmFtZV9ub2RlXCIsIFwiZGVsZXRlX25vZGVcIiwgXCJjb3B5X25vZGVcIiBvciBcIm1vdmVfbm9kZVwiXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBwYXIgdGhlIHBhcmVudFxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBwb3MgdGhlIHBvc2l0aW9uIHRvIGluc2VydCBhdCwgb3IgaWYgXCJyZW5hbWVfbm9kZVwiIC0gdGhlIG5ldyBuYW1lXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRjaGVjayA6IGZ1bmN0aW9uIChjaGssIG9iaiwgcGFyLCBwb3MpIHtcblx0XHRcdG9iaiA9IG9iaiAmJiBvYmouaWQgPyBvYmogOiB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRwYXIgPSBwYXIgJiYgcGFyLmlkID8gcGFyIDogdGhpcy5nZXRfbm9kZShwYXIpO1xuXHRcdFx0dmFyIHRtcCA9IGNoay5tYXRjaCgvXm1vdmVfbm9kZXxjb3B5X25vZGV8Y3JlYXRlX25vZGUkL2kpID8gcGFyIDogb2JqLFxuXHRcdFx0XHRjaGMgPSB0aGlzLnNldHRpbmdzLmNvcmUuY2hlY2tfY2FsbGJhY2s7XG5cdFx0XHRpZihjaGsgPT09IFwibW92ZV9ub2RlXCIpIHtcblx0XHRcdFx0aWYob2JqLmlkID09PSBwYXIuaWQgfHwgJC5pbkFycmF5KG9iai5pZCwgcGFyLmNoaWxkcmVuKSA9PT0gcG9zIHx8ICQuaW5BcnJheShwYXIuaWQsIG9iai5jaGlsZHJlbl9kKSAhPT0gLTEpIHtcblx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvciA9IHsgJ2Vycm9yJyA6ICdjaGVjaycsICdwbHVnaW4nIDogJ2NvcmUnLCAnaWQnIDogJ2NvcmVfMDEnLCAncmVhc29uJyA6ICdNb3ZpbmcgcGFyZW50IGluc2lkZSBjaGlsZCcsICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHsgJ2NoaycgOiBjaGssICdwb3MnIDogcG9zLCAnb2JqJyA6IG9iaiAmJiBvYmouaWQgPyBvYmouaWQgOiBmYWxzZSwgJ3BhcicgOiBwYXIgJiYgcGFyLmlkID8gcGFyLmlkIDogZmFsc2UgfSkgfTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRtcCA9IHRoaXMuZ2V0X25vZGUodG1wLCB0cnVlKTtcblx0XHRcdGlmKHRtcC5sZW5ndGgpIHsgdG1wID0gdG1wLmRhdGEoJ2pzdHJlZScpOyB9XG5cdFx0XHRpZih0bXAgJiYgdG1wLmZ1bmN0aW9ucyAmJiAodG1wLmZ1bmN0aW9uc1tjaGtdID09PSBmYWxzZSB8fCB0bXAuZnVuY3Rpb25zW2Noa10gPT09IHRydWUpKSB7XG5cdFx0XHRcdGlmKHRtcC5mdW5jdGlvbnNbY2hrXSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvciA9IHsgJ2Vycm9yJyA6ICdjaGVjaycsICdwbHVnaW4nIDogJ2NvcmUnLCAnaWQnIDogJ2NvcmVfMDInLCAncmVhc29uJyA6ICdOb2RlIGRhdGEgcHJldmVudHMgZnVuY3Rpb246ICcgKyBjaGssICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHsgJ2NoaycgOiBjaGssICdwb3MnIDogcG9zLCAnb2JqJyA6IG9iaiAmJiBvYmouaWQgPyBvYmouaWQgOiBmYWxzZSwgJ3BhcicgOiBwYXIgJiYgcGFyLmlkID8gcGFyLmlkIDogZmFsc2UgfSkgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdG1wLmZ1bmN0aW9uc1tjaGtdO1xuXHRcdFx0fVxuXHRcdFx0aWYoY2hjID09PSBmYWxzZSB8fCAoJC5pc0Z1bmN0aW9uKGNoYykgJiYgY2hjLmNhbGwodGhpcywgY2hrLCBvYmosIHBhciwgcG9zKSA9PT0gZmFsc2UpIHx8IChjaGMgJiYgY2hjW2Noa10gPT09IGZhbHNlKSkge1xuXHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvciA9IHsgJ2Vycm9yJyA6ICdjaGVjaycsICdwbHVnaW4nIDogJ2NvcmUnLCAnaWQnIDogJ2NvcmVfMDMnLCAncmVhc29uJyA6ICdVc2VyIGNvbmZpZyBmb3IgY29yZS5jaGVja19jYWxsYmFjayBwcmV2ZW50cyBmdW5jdGlvbjogJyArIGNoaywgJ2RhdGEnIDogSlNPTi5zdHJpbmdpZnkoeyAnY2hrJyA6IGNoaywgJ3BvcycgOiBwb3MsICdvYmonIDogb2JqICYmIG9iai5pZCA/IG9iai5pZCA6IGZhbHNlLCAncGFyJyA6IHBhciAmJiBwYXIuaWQgPyBwYXIuaWQgOiBmYWxzZSB9KSB9O1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGdldCB0aGUgbGFzdCBlcnJvclxuXHRcdCAqIEBuYW1lIGxhc3RfZXJyb3IoKVxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHRsYXN0X2Vycm9yIDogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogbW92ZSBhIG5vZGUgdG8gYSBuZXcgcGFyZW50XG5cdFx0ICogQG5hbWUgbW92ZV9ub2RlKG9iaiwgcGFyIFssIHBvcywgY2FsbGJhY2ssIGlzX2xvYWRlZF0pXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBtb3ZlLCBwYXNzIGFuIGFycmF5IHRvIG1vdmUgbXVsdGlwbGUgbm9kZXNcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gcGFyIHRoZSBuZXcgcGFyZW50XG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IHBvcyB0aGUgcG9zaXRpb24gdG8gaW5zZXJ0IGF0IChcImZpcnN0XCIgYW5kIFwibGFzdFwiIGFyZSBzdXBwb3J0ZWQsIGFzIHdlbGwgYXMgXCJiZWZvcmVcIiBhbmQgXCJhZnRlclwiKSwgZGVmYXVsdHMgdG8gYDBgXG5cdFx0ICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIGEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBtb3ZlIGlzIGNvbXBsZXRlZCwgcmVjZWl2ZXMgMyBhcmd1bWVudHMgLSB0aGUgbm9kZSwgdGhlIG5ldyBwYXJlbnQgYW5kIHRoZSBwb3NpdGlvblxuXHRcdCAqIEBwYXJhbSAge0Jvb2xlYW59IGludGVybmFsIHBhcmFtZXRlciBpbmRpY2F0aW5nIGlmIHRoZSBwYXJlbnQgbm9kZSBoYXMgYmVlbiBsb2FkZWRcblx0XHQgKiBAdHJpZ2dlciBtb3ZlX25vZGUuanN0cmVlXG5cdFx0ICovXG5cdFx0bW92ZV9ub2RlIDogZnVuY3Rpb24gKG9iaiwgcGFyLCBwb3MsIGNhbGxiYWNrLCBpc19sb2FkZWQpIHtcblx0XHRcdHZhciB0MSwgdDIsIG9sZF9wYXIsIG5ld19wYXIsIG9sZF9pbnMsIGlzX211bHRpLCBkcGMsIHRtcCwgaSwgaiwgaywgbCwgcDtcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdG9iaiA9IG9iai5yZXZlcnNlKCkuc2xpY2UoKTtcblx0XHRcdFx0Zm9yKHQxID0gMCwgdDIgPSBvYmoubGVuZ3RoOyB0MSA8IHQyOyB0MSsrKSB7XG5cdFx0XHRcdFx0dGhpcy5tb3ZlX25vZGUob2JqW3QxXSwgcGFyLCBwb3MsIGNhbGxiYWNrLCBpc19sb2FkZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0b2JqID0gb2JqICYmIG9iai5pZCA/IG9iaiA6IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdHBhciA9IHRoaXMuZ2V0X25vZGUocGFyKTtcblx0XHRcdHBvcyA9IHBvcyA9PT0gdW5kZWZpbmVkID8gMCA6IHBvcztcblxuXHRcdFx0aWYoIXBhciB8fCAhb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0aWYoIXBvcy50b1N0cmluZygpLm1hdGNoKC9eKGJlZm9yZXxhZnRlcikkLykgJiYgIWlzX2xvYWRlZCAmJiAhdGhpcy5pc19sb2FkZWQocGFyKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5sb2FkX25vZGUocGFyLCBmdW5jdGlvbiAoKSB7IHRoaXMubW92ZV9ub2RlKG9iaiwgcGFyLCBwb3MsIGNhbGxiYWNrLCB0cnVlKTsgfSk7XG5cdFx0XHR9XG5cblx0XHRcdG9sZF9wYXIgPSAob2JqLnBhcmVudCB8fCAnIycpLnRvU3RyaW5nKCk7XG5cdFx0XHRuZXdfcGFyID0gKCFwb3MudG9TdHJpbmcoKS5tYXRjaCgvXihiZWZvcmV8YWZ0ZXIpJC8pIHx8IHBhci5pZCA9PT0gJyMnKSA/IHBhciA6IHRoaXMuZ2V0X25vZGUocGFyLnBhcmVudCk7XG5cdFx0XHRvbGRfaW5zID0gdGhpcy5fbW9kZWwuZGF0YVtvYmouaWRdID8gdGhpcyA6ICQuanN0cmVlLnJlZmVyZW5jZShvYmouaWQpO1xuXHRcdFx0aXNfbXVsdGkgPSAhb2xkX2lucyB8fCAhb2xkX2lucy5faWQgfHwgKHRoaXMuX2lkICE9PSBvbGRfaW5zLl9pZCk7XG5cdFx0XHRpZihpc19tdWx0aSkge1xuXHRcdFx0XHRpZih0aGlzLmNvcHlfbm9kZShvYmosIHBhciwgcG9zLCBjYWxsYmFjaywgaXNfbG9hZGVkKSkge1xuXHRcdFx0XHRcdGlmKG9sZF9pbnMpIHsgb2xkX2lucy5kZWxldGVfbm9kZShvYmopOyB9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Ly92YXIgbSA9IHRoaXMuX21vZGVsLmRhdGE7XG5cdFx0XHRpZihuZXdfcGFyLmlkID09PSAnIycpIHtcblx0XHRcdFx0aWYocG9zID09PSBcImJlZm9yZVwiKSB7IHBvcyA9IFwiZmlyc3RcIjsgfVxuXHRcdFx0XHRpZihwb3MgPT09IFwiYWZ0ZXJcIikgeyBwb3MgPSBcImxhc3RcIjsgfVxuXHRcdFx0fVxuXHRcdFx0c3dpdGNoKHBvcykge1xuXHRcdFx0XHRjYXNlIFwiYmVmb3JlXCI6XG5cdFx0XHRcdFx0cG9zID0gJC5pbkFycmF5KHBhci5pZCwgbmV3X3Bhci5jaGlsZHJlbik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJhZnRlclwiIDpcblx0XHRcdFx0XHRwb3MgPSAkLmluQXJyYXkocGFyLmlkLCBuZXdfcGFyLmNoaWxkcmVuKSArIDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJpbnNpZGVcIjpcblx0XHRcdFx0Y2FzZSBcImZpcnN0XCI6XG5cdFx0XHRcdFx0cG9zID0gMDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImxhc3RcIjpcblx0XHRcdFx0XHRwb3MgPSBuZXdfcGFyLmNoaWxkcmVuLmxlbmd0aDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRpZighcG9zKSB7IHBvcyA9IDA7IH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmKHBvcyA+IG5ld19wYXIuY2hpbGRyZW4ubGVuZ3RoKSB7IHBvcyA9IG5ld19wYXIuY2hpbGRyZW4ubGVuZ3RoOyB9XG5cdFx0XHRpZighdGhpcy5jaGVjayhcIm1vdmVfbm9kZVwiLCBvYmosIG5ld19wYXIsIHBvcykpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5jb3JlLmVycm9yLmNhbGwodGhpcywgdGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3IpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZihvYmoucGFyZW50ID09PSBuZXdfcGFyLmlkKSB7XG5cdFx0XHRcdGRwYyA9IG5ld19wYXIuY2hpbGRyZW4uY29uY2F0KCk7XG5cdFx0XHRcdHRtcCA9ICQuaW5BcnJheShvYmouaWQsIGRwYyk7XG5cdFx0XHRcdGlmKHRtcCAhPT0gLTEpIHtcblx0XHRcdFx0XHRkcGMgPSAkLnZha2F0YS5hcnJheV9yZW1vdmUoZHBjLCB0bXApO1xuXHRcdFx0XHRcdGlmKHBvcyA+IHRtcCkgeyBwb3MtLTsgfVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRtcCA9IFtdO1xuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkcGMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0dG1wW2kgPj0gcG9zID8gaSsxIDogaV0gPSBkcGNbaV07XG5cdFx0XHRcdH1cblx0XHRcdFx0dG1wW3Bvc10gPSBvYmouaWQ7XG5cdFx0XHRcdG5ld19wYXIuY2hpbGRyZW4gPSB0bXA7XG5cdFx0XHRcdHRoaXMuX25vZGVfY2hhbmdlZChuZXdfcGFyLmlkKTtcblx0XHRcdFx0dGhpcy5yZWRyYXcobmV3X3Bhci5pZCA9PT0gJyMnKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHQvLyBjbGVhbiBvbGQgcGFyZW50IGFuZCB1cFxuXHRcdFx0XHR0bXAgPSBvYmouY2hpbGRyZW5fZC5jb25jYXQoKTtcblx0XHRcdFx0dG1wLnB1c2gob2JqLmlkKTtcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0ZHBjID0gW107XG5cdFx0XHRcdFx0cCA9IG9sZF9pbnMuX21vZGVsLmRhdGFbb2JqLnBhcmVudHNbaV1dLmNoaWxkcmVuX2Q7XG5cdFx0XHRcdFx0Zm9yKGsgPSAwLCBsID0gcC5sZW5ndGg7IGsgPCBsOyBrKyspIHtcblx0XHRcdFx0XHRcdGlmKCQuaW5BcnJheShwW2tdLCB0bXApID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRkcGMucHVzaChwW2tdKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2xkX2lucy5fbW9kZWwuZGF0YVtvYmoucGFyZW50c1tpXV0uY2hpbGRyZW5fZCA9IGRwYztcblx0XHRcdFx0fVxuXHRcdFx0XHRvbGRfaW5zLl9tb2RlbC5kYXRhW29sZF9wYXJdLmNoaWxkcmVuID0gJC52YWthdGEuYXJyYXlfcmVtb3ZlX2l0ZW0ob2xkX2lucy5fbW9kZWwuZGF0YVtvbGRfcGFyXS5jaGlsZHJlbiwgb2JqLmlkKTtcblxuXHRcdFx0XHQvLyBpbnNlcnQgaW50byBuZXcgcGFyZW50IGFuZCB1cFxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBuZXdfcGFyLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0dGhpcy5fbW9kZWwuZGF0YVtuZXdfcGFyLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QgPSB0aGlzLl9tb2RlbC5kYXRhW25ld19wYXIucGFyZW50c1tpXV0uY2hpbGRyZW5fZC5jb25jYXQodG1wKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkcGMgPSBbXTtcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gbmV3X3Bhci5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRkcGNbaSA+PSBwb3MgPyBpKzEgOiBpXSA9IG5ld19wYXIuY2hpbGRyZW5baV07XG5cdFx0XHRcdH1cblx0XHRcdFx0ZHBjW3Bvc10gPSBvYmouaWQ7XG5cdFx0XHRcdG5ld19wYXIuY2hpbGRyZW4gPSBkcGM7XG5cdFx0XHRcdG5ld19wYXIuY2hpbGRyZW5fZC5wdXNoKG9iai5pZCk7XG5cdFx0XHRcdG5ld19wYXIuY2hpbGRyZW5fZCA9IG5ld19wYXIuY2hpbGRyZW5fZC5jb25jYXQob2JqLmNoaWxkcmVuX2QpO1xuXG5cdFx0XHRcdC8vIHVwZGF0ZSBvYmplY3Rcblx0XHRcdFx0b2JqLnBhcmVudCA9IG5ld19wYXIuaWQ7XG5cdFx0XHRcdHRtcCA9IG5ld19wYXIucGFyZW50cy5jb25jYXQoKTtcblx0XHRcdFx0dG1wLnVuc2hpZnQobmV3X3Bhci5pZCk7XG5cdFx0XHRcdHAgPSBvYmoucGFyZW50cy5sZW5ndGg7XG5cdFx0XHRcdG9iai5wYXJlbnRzID0gdG1wO1xuXG5cdFx0XHRcdC8vIHVwZGF0ZSBvYmplY3QgY2hpbGRyZW5cblx0XHRcdFx0dG1wID0gdG1wLmNvbmNhdCgpO1xuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHR0aGlzLl9tb2RlbC5kYXRhW29iai5jaGlsZHJlbl9kW2ldXS5wYXJlbnRzID0gdGhpcy5fbW9kZWwuZGF0YVtvYmouY2hpbGRyZW5fZFtpXV0ucGFyZW50cy5zbGljZSgwLHAqLTEpO1xuXHRcdFx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuX21vZGVsLmRhdGFbb2JqLmNoaWxkcmVuX2RbaV1dLnBhcmVudHMsIHRtcCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9ub2RlX2NoYW5nZWQob2xkX3Bhcik7XG5cdFx0XHRcdHRoaXMuX25vZGVfY2hhbmdlZChuZXdfcGFyLmlkKTtcblx0XHRcdFx0dGhpcy5yZWRyYXcob2xkX3BhciA9PT0gJyMnIHx8IG5ld19wYXIuaWQgPT09ICcjJyk7XG5cdFx0XHR9XG5cdFx0XHRpZihjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMsIG9iaiwgbmV3X3BhciwgcG9zKTsgfVxuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgaXMgbW92ZWRcblx0XHRcdCAqIEBldmVudFxuXHRcdFx0ICogQG5hbWUgbW92ZV9ub2RlLmpzdHJlZVxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcblx0XHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBwYXJlbnQgdGhlIHBhcmVudCdzIElEXG5cdFx0XHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGFtb25nIHRoZSBwYXJlbnQncyBjaGlsZHJlblxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IG9sZF9wYXJlbnQgdGhlIG9sZCBwYXJlbnQgb2YgdGhlIG5vZGVcblx0XHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNfbXVsdGkgZG8gdGhlIG5vZGUgYW5kIG5ldyBwYXJlbnQgYmVsb25nIHRvIGRpZmZlcmVudCBpbnN0YW5jZXNcblx0XHRcdCAqIEBwYXJhbSB7anNUcmVlfSBvbGRfaW5zdGFuY2UgdGhlIGluc3RhbmNlIHRoZSBub2RlIGNhbWUgZnJvbVxuXHRcdFx0ICogQHBhcmFtIHtqc1RyZWV9IG5ld19pbnN0YW5jZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIG5ldyBwYXJlbnRcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdtb3ZlX25vZGUnLCB7IFwibm9kZVwiIDogb2JqLCBcInBhcmVudFwiIDogbmV3X3Bhci5pZCwgXCJwb3NpdGlvblwiIDogcG9zLCBcIm9sZF9wYXJlbnRcIiA6IG9sZF9wYXIsIFwiaXNfbXVsdGlcIiA6IGlzX211bHRpLCAnb2xkX2luc3RhbmNlJyA6IG9sZF9pbnMsICduZXdfaW5zdGFuY2UnIDogdGhpcyB9KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogY29weSBhIG5vZGUgdG8gYSBuZXcgcGFyZW50XG5cdFx0ICogQG5hbWUgY29weV9ub2RlKG9iaiwgcGFyIFssIHBvcywgY2FsbGJhY2ssIGlzX2xvYWRlZF0pXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBjb3B5LCBwYXNzIGFuIGFycmF5IHRvIGNvcHkgbXVsdGlwbGUgbm9kZXNcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gcGFyIHRoZSBuZXcgcGFyZW50XG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IHBvcyB0aGUgcG9zaXRpb24gdG8gaW5zZXJ0IGF0IChcImZpcnN0XCIgYW5kIFwibGFzdFwiIGFyZSBzdXBwb3J0ZWQsIGFzIHdlbGwgYXMgXCJiZWZvcmVcIiBhbmQgXCJhZnRlclwiKSwgZGVmYXVsdHMgdG8gYDBgXG5cdFx0ICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIGEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBtb3ZlIGlzIGNvbXBsZXRlZCwgcmVjZWl2ZXMgMyBhcmd1bWVudHMgLSB0aGUgbm9kZSwgdGhlIG5ldyBwYXJlbnQgYW5kIHRoZSBwb3NpdGlvblxuXHRcdCAqIEBwYXJhbSAge0Jvb2xlYW59IGludGVybmFsIHBhcmFtZXRlciBpbmRpY2F0aW5nIGlmIHRoZSBwYXJlbnQgbm9kZSBoYXMgYmVlbiBsb2FkZWRcblx0XHQgKiBAdHJpZ2dlciBtb2RlbC5qc3RyZWUgY29weV9ub2RlLmpzdHJlZVxuXHRcdCAqL1xuXHRcdGNvcHlfbm9kZSA6IGZ1bmN0aW9uIChvYmosIHBhciwgcG9zLCBjYWxsYmFjaywgaXNfbG9hZGVkKSB7XG5cdFx0XHR2YXIgdDEsIHQyLCBkcGMsIHRtcCwgaSwgaiwgbm9kZSwgb2xkX3BhciwgbmV3X3Bhciwgb2xkX2lucywgaXNfbXVsdGk7XG5cdFx0XHRpZigkLmlzQXJyYXkob2JqKSkge1xuXHRcdFx0XHRvYmogPSBvYmoucmV2ZXJzZSgpLnNsaWNlKCk7XG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRcdHRoaXMuY29weV9ub2RlKG9ialt0MV0sIHBhciwgcG9zLCBjYWxsYmFjaywgaXNfbG9hZGVkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IG9iaiAmJiBvYmouaWQgPyBvYmogOiB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRwYXIgPSB0aGlzLmdldF9ub2RlKHBhcik7XG5cdFx0XHRwb3MgPSBwb3MgPT09IHVuZGVmaW5lZCA/IDAgOiBwb3M7XG5cblx0XHRcdGlmKCFwYXIgfHwgIW9iaiB8fCBvYmouaWQgPT09ICcjJykgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdGlmKCFwb3MudG9TdHJpbmcoKS5tYXRjaCgvXihiZWZvcmV8YWZ0ZXIpJC8pICYmICFpc19sb2FkZWQgJiYgIXRoaXMuaXNfbG9hZGVkKHBhcikpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMubG9hZF9ub2RlKHBhciwgZnVuY3Rpb24gKCkgeyB0aGlzLmNvcHlfbm9kZShvYmosIHBhciwgcG9zLCBjYWxsYmFjaywgdHJ1ZSk7IH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRvbGRfcGFyID0gKG9iai5wYXJlbnQgfHwgJyMnKS50b1N0cmluZygpO1xuXHRcdFx0bmV3X3BhciA9ICghcG9zLnRvU3RyaW5nKCkubWF0Y2goL14oYmVmb3JlfGFmdGVyKSQvKSB8fCBwYXIuaWQgPT09ICcjJykgPyBwYXIgOiB0aGlzLmdldF9ub2RlKHBhci5wYXJlbnQpO1xuXHRcdFx0b2xkX2lucyA9IHRoaXMuX21vZGVsLmRhdGFbb2JqLmlkXSA/IHRoaXMgOiAkLmpzdHJlZS5yZWZlcmVuY2Uob2JqLmlkKTtcblx0XHRcdGlzX211bHRpID0gIW9sZF9pbnMgfHwgIW9sZF9pbnMuX2lkIHx8ICh0aGlzLl9pZCAhPT0gb2xkX2lucy5faWQpO1xuXHRcdFx0aWYobmV3X3Bhci5pZCA9PT0gJyMnKSB7XG5cdFx0XHRcdGlmKHBvcyA9PT0gXCJiZWZvcmVcIikgeyBwb3MgPSBcImZpcnN0XCI7IH1cblx0XHRcdFx0aWYocG9zID09PSBcImFmdGVyXCIpIHsgcG9zID0gXCJsYXN0XCI7IH1cblx0XHRcdH1cblx0XHRcdHN3aXRjaChwb3MpIHtcblx0XHRcdFx0Y2FzZSBcImJlZm9yZVwiOlxuXHRcdFx0XHRcdHBvcyA9ICQuaW5BcnJheShwYXIuaWQsIG5ld19wYXIuY2hpbGRyZW4pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiYWZ0ZXJcIiA6XG5cdFx0XHRcdFx0cG9zID0gJC5pbkFycmF5KHBhci5pZCwgbmV3X3Bhci5jaGlsZHJlbikgKyAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiaW5zaWRlXCI6XG5cdFx0XHRcdGNhc2UgXCJmaXJzdFwiOlxuXHRcdFx0XHRcdHBvcyA9IDA7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJsYXN0XCI6XG5cdFx0XHRcdFx0cG9zID0gbmV3X3Bhci5jaGlsZHJlbi5sZW5ndGg7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0aWYoIXBvcykgeyBwb3MgPSAwOyB9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZihwb3MgPiBuZXdfcGFyLmNoaWxkcmVuLmxlbmd0aCkgeyBwb3MgPSBuZXdfcGFyLmNoaWxkcmVuLmxlbmd0aDsgfVxuXHRcdFx0aWYoIXRoaXMuY2hlY2soXCJjb3B5X25vZGVcIiwgb2JqLCBuZXdfcGFyLCBwb3MpKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuY29yZS5lcnJvci5jYWxsKHRoaXMsIHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0bm9kZSA9IG9sZF9pbnMgPyBvbGRfaW5zLmdldF9qc29uKG9iaiwgeyBub19pZCA6IHRydWUsIG5vX2RhdGEgOiB0cnVlLCBub19zdGF0ZSA6IHRydWUgfSkgOiBvYmo7XG5cdFx0XHRpZighbm9kZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdGlmKG5vZGUuaWQgPT09IHRydWUpIHsgZGVsZXRlIG5vZGUuaWQ7IH1cblx0XHRcdG5vZGUgPSB0aGlzLl9wYXJzZV9tb2RlbF9mcm9tX2pzb24obm9kZSwgbmV3X3Bhci5pZCwgbmV3X3Bhci5wYXJlbnRzLmNvbmNhdCgpKTtcblx0XHRcdGlmKCFub2RlKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShub2RlKTtcblx0XHRcdGRwYyA9IFtdO1xuXHRcdFx0ZHBjLnB1c2gobm9kZSk7XG5cdFx0XHRkcGMgPSBkcGMuY29uY2F0KHRtcC5jaGlsZHJlbl9kKTtcblx0XHRcdHRoaXMudHJpZ2dlcignbW9kZWwnLCB7IFwibm9kZXNcIiA6IGRwYywgXCJwYXJlbnRcIiA6IG5ld19wYXIuaWQgfSk7XG5cblx0XHRcdC8vIGluc2VydCBpbnRvIG5ldyBwYXJlbnQgYW5kIHVwXG5cdFx0XHRmb3IoaSA9IDAsIGogPSBuZXdfcGFyLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbbmV3X3Bhci5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kID0gdGhpcy5fbW9kZWwuZGF0YVtuZXdfcGFyLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QuY29uY2F0KGRwYyk7XG5cdFx0XHR9XG5cdFx0XHRkcGMgPSBbXTtcblx0XHRcdGZvcihpID0gMCwgaiA9IG5ld19wYXIuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdGRwY1tpID49IHBvcyA/IGkrMSA6IGldID0gbmV3X3Bhci5jaGlsZHJlbltpXTtcblx0XHRcdH1cblx0XHRcdGRwY1twb3NdID0gdG1wLmlkO1xuXHRcdFx0bmV3X3Bhci5jaGlsZHJlbiA9IGRwYztcblx0XHRcdG5ld19wYXIuY2hpbGRyZW5fZC5wdXNoKHRtcC5pZCk7XG5cdFx0XHRuZXdfcGFyLmNoaWxkcmVuX2QgPSBuZXdfcGFyLmNoaWxkcmVuX2QuY29uY2F0KHRtcC5jaGlsZHJlbl9kKTtcblxuXHRcdFx0dGhpcy5fbm9kZV9jaGFuZ2VkKG5ld19wYXIuaWQpO1xuXHRcdFx0dGhpcy5yZWRyYXcobmV3X3Bhci5pZCA9PT0gJyMnKTtcblx0XHRcdGlmKGNhbGxiYWNrKSB7IGNhbGxiYWNrLmNhbGwodGhpcywgdG1wLCBuZXdfcGFyLCBwb3MpOyB9XG5cdFx0XHQvKipcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgbm9kZSBpcyBjb3BpZWRcblx0XHRcdCAqIEBldmVudFxuXHRcdFx0ICogQG5hbWUgY29weV9ub2RlLmpzdHJlZVxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgdGhlIGNvcGllZCBub2RlXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3JpZ2luYWwgdGhlIG9yaWdpbmFsIG5vZGVcblx0XHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBwYXJlbnQgdGhlIHBhcmVudCdzIElEXG5cdFx0XHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGFtb25nIHRoZSBwYXJlbnQncyBjaGlsZHJlblxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IG9sZF9wYXJlbnQgdGhlIG9sZCBwYXJlbnQgb2YgdGhlIG5vZGVcblx0XHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNfbXVsdGkgZG8gdGhlIG5vZGUgYW5kIG5ldyBwYXJlbnQgYmVsb25nIHRvIGRpZmZlcmVudCBpbnN0YW5jZXNcblx0XHRcdCAqIEBwYXJhbSB7anNUcmVlfSBvbGRfaW5zdGFuY2UgdGhlIGluc3RhbmNlIHRoZSBub2RlIGNhbWUgZnJvbVxuXHRcdFx0ICogQHBhcmFtIHtqc1RyZWV9IG5ld19pbnN0YW5jZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIG5ldyBwYXJlbnRcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdjb3B5X25vZGUnLCB7IFwibm9kZVwiIDogdG1wLCBcIm9yaWdpbmFsXCIgOiBvYmosIFwicGFyZW50XCIgOiBuZXdfcGFyLmlkLCBcInBvc2l0aW9uXCIgOiBwb3MsIFwib2xkX3BhcmVudFwiIDogb2xkX3BhciwgXCJpc19tdWx0aVwiIDogaXNfbXVsdGksICdvbGRfaW5zdGFuY2UnIDogb2xkX2lucywgJ25ld19pbnN0YW5jZScgOiB0aGlzIH0pO1xuXHRcdFx0cmV0dXJuIHRtcC5pZDtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGN1dCBhIG5vZGUgKGEgbGF0ZXIgY2FsbCB0byBgcGFzdGUob2JqKWAgd291bGQgbW92ZSB0aGUgbm9kZSlcblx0XHQgKiBAbmFtZSBjdXQob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmogbXVsdGlwbGUgb2JqZWN0cyBjYW4gYmUgcGFzc2VkIHVzaW5nIGFuIGFycmF5XG5cdFx0ICogQHRyaWdnZXIgY3V0LmpzdHJlZVxuXHRcdCAqL1xuXHRcdGN1dCA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdGlmKCFvYmopIHsgb2JqID0gdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmNvbmNhdCgpOyB9XG5cdFx0XHRpZighJC5pc0FycmF5KG9iaikpIHsgb2JqID0gW29ial07IH1cblx0XHRcdGlmKCFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0dmFyIHRtcCA9IFtdLCBvLCB0MSwgdDI7XG5cdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0byA9IHRoaXMuZ2V0X25vZGUob2JqW3QxXSk7XG5cdFx0XHRcdGlmKG8gJiYgby5pZCAmJiBvLmlkICE9PSAnIycpIHsgdG1wLnB1c2gobyk7IH1cblx0XHRcdH1cblx0XHRcdGlmKCF0bXAubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0Y2NwX25vZGUgPSB0bXA7XG5cdFx0XHRjY3BfaW5zdCA9IHRoaXM7XG5cdFx0XHRjY3BfbW9kZSA9ICdtb3ZlX25vZGUnO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBub2RlcyBhcmUgYWRkZWQgdG8gdGhlIGJ1ZmZlciBmb3IgbW92aW5nXG5cdFx0XHQgKiBAZXZlbnRcblx0XHRcdCAqIEBuYW1lIGN1dC5qc3RyZWVcblx0XHRcdCAqIEBwYXJhbSB7QXJyYXl9IG5vZGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdjdXQnLCB7IFwibm9kZVwiIDogb2JqIH0pO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogY29weSBhIG5vZGUgKGEgbGF0ZXIgY2FsbCB0byBgcGFzdGUob2JqKWAgd291bGQgY29weSB0aGUgbm9kZSlcblx0XHQgKiBAbmFtZSBjb3B5KG9iailcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqIG11bHRpcGxlIG9iamVjdHMgY2FuIGJlIHBhc3NlZCB1c2luZyBhbiBhcnJheVxuXHRcdCAqIEB0cmlnZ2VyIGNvcHkuanN0cmVcblx0XHQgKi9cblx0XHRjb3B5IDogZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0aWYoIW9iaikgeyBvYmogPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQuY29uY2F0KCk7IH1cblx0XHRcdGlmKCEkLmlzQXJyYXkob2JqKSkgeyBvYmogPSBbb2JqXTsgfVxuXHRcdFx0aWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHR2YXIgdG1wID0gW10sIG8sIHQxLCB0Mjtcblx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xuXHRcdFx0XHRvID0gdGhpcy5nZXRfbm9kZShvYmpbdDFdKTtcblx0XHRcdFx0aWYobyAmJiBvLmlkICYmIG8uaWQgIT09ICcjJykgeyB0bXAucHVzaChvKTsgfVxuXHRcdFx0fVxuXHRcdFx0aWYoIXRtcC5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRjY3Bfbm9kZSA9IHRtcDtcblx0XHRcdGNjcF9pbnN0ID0gdGhpcztcblx0XHRcdGNjcF9tb2RlID0gJ2NvcHlfbm9kZSc7XG5cdFx0XHQvKipcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIG5vZGVzIGFyZSBhZGRlZCB0byB0aGUgYnVmZmVyIGZvciBjb3B5aW5nXG5cdFx0XHQgKiBAZXZlbnRcblx0XHRcdCAqIEBuYW1lIGNvcHkuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge0FycmF5fSBub2RlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudHJpZ2dlcignY29weScsIHsgXCJub2RlXCIgOiBvYmogfSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXQgdGhlIGN1cnJlbnQgYnVmZmVyIChhbnkgbm9kZXMgdGhhdCBhcmUgd2FpdGluZyBmb3IgYSBwYXN0ZSBvcGVyYXRpb24pXG5cdFx0ICogQG5hbWUgZ2V0X2J1ZmZlcigpXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSBhbiBvYmplY3QgY29uc2lzdGluZyBvZiBgbW9kZWAgKFwiY29weV9ub2RlXCIgb3IgXCJtb3ZlX25vZGVcIiksIGBub2RlYCAoYW4gYXJyYXkgb2Ygb2JqZWN0cykgYW5kIGBpbnN0YCAodGhlIGluc3RhbmNlKVxuXHRcdCAqL1xuXHRcdGdldF9idWZmZXIgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4geyAnbW9kZScgOiBjY3BfbW9kZSwgJ25vZGUnIDogY2NwX25vZGUsICdpbnN0JyA6IGNjcF9pbnN0IH07XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBjaGVjayBpZiB0aGVyZSBpcyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB0byBwYXN0ZVxuXHRcdCAqIEBuYW1lIGNhbl9wYXN0ZSgpXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRjYW5fcGFzdGUgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gY2NwX21vZGUgIT09IGZhbHNlICYmIGNjcF9ub2RlICE9PSBmYWxzZTsgLy8gJiYgY2NwX2luc3QuX21vZGVsLmRhdGFbY2NwX25vZGVdO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogY29weSBvciBtb3ZlIHRoZSBwcmV2aW91c2x5IGN1dCBvciBjb3BpZWQgbm9kZXMgdG8gYSBuZXcgcGFyZW50XG5cdFx0ICogQG5hbWUgcGFzdGUob2JqKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmogdGhlIG5ldyBwYXJlbnRcblx0XHQgKiBAdHJpZ2dlciBwYXN0ZS5qc3RyZWVcblx0XHQgKi9cblx0XHRwYXN0ZSA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgIWNjcF9tb2RlIHx8ICFjY3BfbW9kZS5tYXRjaCgvXihjb3B5X25vZGV8bW92ZV9ub2RlKSQvKSB8fCAhY2NwX25vZGUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRpZih0aGlzW2NjcF9tb2RlXShjY3Bfbm9kZSwgb2JqKSkge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gcGFzdGUgaXMgaW52b2tlZFxuXHRcdFx0XHQgKiBAZXZlbnRcblx0XHRcdFx0ICogQG5hbWUgcGFzdGUuanN0cmVlXG5cdFx0XHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBwYXJlbnQgdGhlIElEIG9mIHRoZSByZWNlaXZpbmcgbm9kZVxuXHRcdFx0XHQgKiBAcGFyYW0ge0FycmF5fSBub2RlIHRoZSBub2RlcyBpbiB0aGUgYnVmZmVyXG5cdFx0XHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBtb2RlIHRoZSBwZXJmb3JtZWQgb3BlcmF0aW9uIC0gXCJjb3B5X25vZGVcIiBvciBcIm1vdmVfbm9kZVwiXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ3Bhc3RlJywgeyBcInBhcmVudFwiIDogb2JqLmlkLCBcIm5vZGVcIiA6IGNjcF9ub2RlLCBcIm1vZGVcIiA6IGNjcF9tb2RlIH0pO1xuXHRcdFx0fVxuXHRcdFx0Y2NwX25vZGUgPSBmYWxzZTtcblx0XHRcdGNjcF9tb2RlID0gZmFsc2U7XG5cdFx0XHRjY3BfaW5zdCA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogcHV0IGEgbm9kZSBpbiBlZGl0IG1vZGUgKGlucHV0IGZpZWxkIHRvIHJlbmFtZSB0aGUgbm9kZSlcblx0XHQgKiBAbmFtZSBlZGl0KG9iaiBbLCBkZWZhdWx0X3RleHRdKVxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcblx0XHQgKiBAcGFyYW0gIHtTdHJpbmd9IGRlZmF1bHRfdGV4dCB0aGUgdGV4dCB0byBwb3B1bGF0ZSB0aGUgaW5wdXQgd2l0aCAoaWYgb21pdHRlZCB0aGUgbm9kZSB0ZXh0IHZhbHVlIGlzIHVzZWQpXG5cdFx0ICovXG5cdFx0ZWRpdCA6IGZ1bmN0aW9uIChvYmosIGRlZmF1bHRfdGV4dCkge1xuXHRcdFx0b2JqID0gdGhpcy5fb3Blbl90byhvYmopO1xuXHRcdFx0aWYoIW9iaiB8fCAhb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdHZhciBydGwgPSB0aGlzLl9kYXRhLmNvcmUucnRsLFxuXHRcdFx0XHR3ICA9IHRoaXMuZWxlbWVudC53aWR0aCgpLFxuXHRcdFx0XHRhICA9IG9iai5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKSxcblx0XHRcdFx0cyAgPSAkKCc8c3Bhbj4nKSxcblx0XHRcdFx0LyohXG5cdFx0XHRcdG9pID0gb2JqLmNoaWxkcmVuKFwiaTp2aXNpYmxlXCIpLFxuXHRcdFx0XHRhaSA9IGEuY2hpbGRyZW4oXCJpOnZpc2libGVcIiksXG5cdFx0XHRcdHcxID0gb2kud2lkdGgoKSAqIG9pLmxlbmd0aCxcblx0XHRcdFx0dzIgPSBhaS53aWR0aCgpICogYWkubGVuZ3RoLFxuXHRcdFx0XHQqL1xuXHRcdFx0XHR0ICA9IHR5cGVvZiBkZWZhdWx0X3RleHQgPT09ICdzdHJpbmcnID8gZGVmYXVsdF90ZXh0IDogdGhpcy5nZXRfdGV4dChvYmopLFxuXHRcdFx0XHRoMSA9ICQoXCI8XCIrXCJkaXYgLz5cIiwgeyBjc3MgOiB7IFwicG9zaXRpb25cIiA6IFwiYWJzb2x1dGVcIiwgXCJ0b3BcIiA6IFwiLTIwMHB4XCIsIFwibGVmdFwiIDogKHJ0bCA/IFwiMHB4XCIgOiBcIi0xMDAwcHhcIiksIFwidmlzaWJpbGl0eVwiIDogXCJoaWRkZW5cIiB9IH0pLmFwcGVuZFRvKFwiYm9keVwiKSxcblx0XHRcdFx0aDIgPSAkKFwiPFwiK1wiaW5wdXQgLz5cIiwge1xuXHRcdFx0XHRcdFx0XCJ2YWx1ZVwiIDogdCxcblx0XHRcdFx0XHRcdFwiY2xhc3NcIiA6IFwianN0cmVlLXJlbmFtZS1pbnB1dFwiLFxuXHRcdFx0XHRcdFx0Ly8gXCJzaXplXCIgOiB0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdFwiY3NzXCIgOiB7XG5cdFx0XHRcdFx0XHRcdFwicGFkZGluZ1wiIDogXCIwXCIsXG5cdFx0XHRcdFx0XHRcdFwiYm9yZGVyXCIgOiBcIjFweCBzb2xpZCBzaWx2ZXJcIixcblx0XHRcdFx0XHRcdFx0XCJib3gtc2l6aW5nXCIgOiBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0XHRcdFx0XCJkaXNwbGF5XCIgOiBcImlubGluZS1ibG9ja1wiLFxuXHRcdFx0XHRcdFx0XHRcImhlaWdodFwiIDogKHRoaXMuX2RhdGEuY29yZS5saV9oZWlnaHQpICsgXCJweFwiLFxuXHRcdFx0XHRcdFx0XHRcImxpbmVIZWlnaHRcIiA6ICh0aGlzLl9kYXRhLmNvcmUubGlfaGVpZ2h0KSArIFwicHhcIixcblx0XHRcdFx0XHRcdFx0XCJ3aWR0aFwiIDogXCIxNTBweFwiIC8vIHdpbGwgYmUgc2V0IGEgYml0IGZ1cnRoZXIgZG93blxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwiYmx1clwiIDogJC5wcm94eShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBpID0gcy5jaGlsZHJlbihcIi5qc3RyZWUtcmVuYW1lLWlucHV0XCIpLFxuXHRcdFx0XHRcdFx0XHRcdHYgPSBpLnZhbCgpO1xuXHRcdFx0XHRcdFx0XHRpZih2ID09PSBcIlwiKSB7IHYgPSB0OyB9XG5cdFx0XHRcdFx0XHRcdGgxLnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0XHRzLnJlcGxhY2VXaXRoKGEpO1xuXHRcdFx0XHRcdFx0XHRzLnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNldF90ZXh0KG9iaiwgdCk7XG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMucmVuYW1lX25vZGUob2JqLCB2KSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNldF90ZXh0KG9iaiwgdCk7IC8vIG1vdmUgdGhpcyB1cD8gYW5kIGZpeCAjNDgzXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0XHRcdFx0XCJrZXlkb3duXCIgOiBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0XHRcdFx0dmFyIGtleSA9IGV2ZW50LndoaWNoO1xuXHRcdFx0XHRcdFx0XHRpZihrZXkgPT09IDI3KSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy52YWx1ZSA9IHQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYoa2V5ID09PSAyNyB8fCBrZXkgPT09IDEzIHx8IGtleSA9PT0gMzcgfHwga2V5ID09PSAzOCB8fCBrZXkgPT09IDM5IHx8IGtleSA9PT0gNDAgfHwga2V5ID09PSAzMikge1xuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmKGtleSA9PT0gMjcgfHwga2V5ID09PSAxMykge1xuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ibHVyKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcImNsaWNrXCIgOiBmdW5jdGlvbiAoZSkgeyBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyB9LFxuXHRcdFx0XHRcdFx0XCJtb3VzZWRvd25cIiA6IGZ1bmN0aW9uIChlKSB7IGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IH0sXG5cdFx0XHRcdFx0XHRcImtleXVwXCIgOiBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0XHRcdFx0aDIud2lkdGgoTWF0aC5taW4oaDEudGV4dChcInBXXCIgKyB0aGlzLnZhbHVlKS53aWR0aCgpLHcpKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcImtleXByZXNzXCIgOiBmdW5jdGlvbihldmVudCkge1xuXHRcdFx0XHRcdFx0XHRpZihldmVudC53aGljaCA9PT0gMTMpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdGZuID0ge1xuXHRcdFx0XHRcdFx0Zm9udEZhbWlseVx0XHQ6IGEuY3NzKCdmb250RmFtaWx5JylcdFx0fHwgJycsXG5cdFx0XHRcdFx0XHRmb250U2l6ZVx0XHQ6IGEuY3NzKCdmb250U2l6ZScpXHRcdFx0fHwgJycsXG5cdFx0XHRcdFx0XHRmb250V2VpZ2h0XHRcdDogYS5jc3MoJ2ZvbnRXZWlnaHQnKVx0XHR8fCAnJyxcblx0XHRcdFx0XHRcdGZvbnRTdHlsZVx0XHQ6IGEuY3NzKCdmb250U3R5bGUnKVx0XHR8fCAnJyxcblx0XHRcdFx0XHRcdGZvbnRTdHJldGNoXHRcdDogYS5jc3MoJ2ZvbnRTdHJldGNoJylcdFx0fHwgJycsXG5cdFx0XHRcdFx0XHRmb250VmFyaWFudFx0XHQ6IGEuY3NzKCdmb250VmFyaWFudCcpXHRcdHx8ICcnLFxuXHRcdFx0XHRcdFx0bGV0dGVyU3BhY2luZ1x0OiBhLmNzcygnbGV0dGVyU3BhY2luZycpXHR8fCAnJyxcblx0XHRcdFx0XHRcdHdvcmRTcGFjaW5nXHRcdDogYS5jc3MoJ3dvcmRTcGFjaW5nJylcdFx0fHwgJydcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMuc2V0X3RleHQob2JqLCBcIlwiKTtcblx0XHRcdHMuYXR0cignY2xhc3MnLCBhLmF0dHIoJ2NsYXNzJykpLmFwcGVuZChhLmNvbnRlbnRzKCkuY2xvbmUoKSkuYXBwZW5kKGgyKTtcblx0XHRcdGEucmVwbGFjZVdpdGgocyk7XG5cdFx0XHRoMS5jc3MoZm4pO1xuXHRcdFx0aDIuY3NzKGZuKS53aWR0aChNYXRoLm1pbihoMS50ZXh0KFwicFdcIiArIGgyWzBdLnZhbHVlKS53aWR0aCgpLHcpKVswXS5zZWxlY3QoKTtcblx0XHR9LFxuXG5cblx0XHQvKipcblx0XHQgKiBjaGFuZ2VzIHRoZSB0aGVtZVxuXHRcdCAqIEBuYW1lIHNldF90aGVtZSh0aGVtZV9uYW1lIFssIHRoZW1lX3VybF0pXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRoZW1lX25hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyB0aGVtZSB0byBhcHBseVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IHRoZW1lX3VybCAgdGhlIGxvY2F0aW9uIG9mIHRoZSBDU1MgZmlsZSBmb3IgdGhpcyB0aGVtZS4gT21pdCBvciBzZXQgdG8gYGZhbHNlYCBpZiB5b3UgbWFudWFsbHkgaW5jbHVkZWQgdGhlIGZpbGUuIFNldCB0byBgdHJ1ZWAgdG8gYXV0b2xvYWQgZnJvbSB0aGUgYGNvcmUudGhlbWVzLmRpcmAgZGlyZWN0b3J5LlxuXHRcdCAqIEB0cmlnZ2VyIHNldF90aGVtZS5qc3RyZWVcblx0XHQgKi9cblx0XHRzZXRfdGhlbWUgOiBmdW5jdGlvbiAodGhlbWVfbmFtZSwgdGhlbWVfdXJsKSB7XG5cdFx0XHRpZighdGhlbWVfbmFtZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdGlmKHRoZW1lX3VybCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHR2YXIgZGlyID0gdGhpcy5zZXR0aW5ncy5jb3JlLnRoZW1lcy5kaXI7XG5cdFx0XHRcdGlmKCFkaXIpIHsgZGlyID0gJC5qc3RyZWUucGF0aCArICcvdGhlbWVzJzsgfVxuXHRcdFx0XHR0aGVtZV91cmwgPSBkaXIgKyAnLycgKyB0aGVtZV9uYW1lICsgJy9zdHlsZS5jc3MnO1xuXHRcdFx0fVxuXHRcdFx0aWYodGhlbWVfdXJsICYmICQuaW5BcnJheSh0aGVtZV91cmwsIHRoZW1lc19sb2FkZWQpID09PSAtMSkge1xuXHRcdFx0XHQkKCdoZWFkJykuYXBwZW5kKCc8JysnbGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIicgKyB0aGVtZV91cmwgKyAnXCIgdHlwZT1cInRleHQvY3NzXCIgLz4nKTtcblx0XHRcdFx0dGhlbWVzX2xvYWRlZC5wdXNoKHRoZW1lX3VybCk7XG5cdFx0XHR9XG5cdFx0XHRpZih0aGlzLl9kYXRhLmNvcmUudGhlbWVzLm5hbWUpIHtcblx0XHRcdFx0dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCdqc3RyZWUtJyArIHRoaXMuX2RhdGEuY29yZS50aGVtZXMubmFtZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9kYXRhLmNvcmUudGhlbWVzLm5hbWUgPSB0aGVtZV9uYW1lO1xuXHRcdFx0dGhpcy5lbGVtZW50LmFkZENsYXNzKCdqc3RyZWUtJyArIHRoZW1lX25hbWUpO1xuXHRcdFx0dGhpcy5lbGVtZW50W3RoaXMuc2V0dGluZ3MuY29yZS50aGVtZXMucmVzcG9uc2l2ZSA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnIF0oJ2pzdHJlZS0nICsgdGhlbWVfbmFtZSArICctcmVzcG9uc2l2ZScpO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIHRoZW1lIGlzIHNldFxuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBzZXRfdGhlbWUuanN0cmVlXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdGhlbWUgdGhlIG5ldyB0aGVtZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ3NldF90aGVtZScsIHsgJ3RoZW1lJyA6IHRoZW1lX25hbWUgfSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXRzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgYXBwbGllZCB0aGVtZSBuYW1lXG5cdFx0ICogQG5hbWUgZ2V0X3RoZW1lKClcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdFx0ICovXG5cdFx0Z2V0X3RoZW1lIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5uYW1lOyB9LFxuXHRcdC8qKlxuXHRcdCAqIGNoYW5nZXMgdGhlIHRoZW1lIHZhcmlhbnQgKGlmIHRoZSB0aGVtZSBoYXMgdmFyaWFudHMpXG5cdFx0ICogQG5hbWUgc2V0X3RoZW1lX3ZhcmlhbnQodmFyaWFudF9uYW1lKVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfEJvb2xlYW59IHZhcmlhbnRfbmFtZSB0aGUgdmFyaWFudCB0byBhcHBseSAoaWYgYGZhbHNlYCBpcyB1c2VkIHRoZSBjdXJyZW50IHZhcmlhbnQgaXMgcmVtb3ZlZClcblx0XHQgKi9cblx0XHRzZXRfdGhlbWVfdmFyaWFudCA6IGZ1bmN0aW9uICh2YXJpYW50X25hbWUpIHtcblx0XHRcdGlmKHRoaXMuX2RhdGEuY29yZS50aGVtZXMudmFyaWFudCkge1xuXHRcdFx0XHR0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2pzdHJlZS0nICsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5uYW1lICsgJy0nICsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy52YXJpYW50KTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2RhdGEuY29yZS50aGVtZXMudmFyaWFudCA9IHZhcmlhbnRfbmFtZTtcblx0XHRcdGlmKHZhcmlhbnRfbmFtZSkge1xuXHRcdFx0XHR0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoJ2pzdHJlZS0nICsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5uYW1lICsgJy0nICsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy52YXJpYW50KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIGdldHMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhcHBsaWVkIHRoZW1lIHZhcmlhbnRcblx0XHQgKiBAbmFtZSBnZXRfdGhlbWUoKVxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ31cblx0XHQgKi9cblx0XHRnZXRfdGhlbWVfdmFyaWFudCA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RhdGEuY29yZS50aGVtZXMudmFyaWFudDsgfSxcblx0XHQvKipcblx0XHQgKiBzaG93cyBhIHN0cmlwZWQgYmFja2dyb3VuZCBvbiB0aGUgY29udGFpbmVyIChpZiB0aGUgdGhlbWUgc3VwcG9ydHMgaXQpXG5cdFx0ICogQG5hbWUgc2hvd19zdHJpcGVzKClcblx0XHQgKi9cblx0XHRzaG93X3N0cmlwZXMgOiBmdW5jdGlvbiAoKSB7IHRoaXMuX2RhdGEuY29yZS50aGVtZXMuc3RyaXBlcyA9IHRydWU7IHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpLmFkZENsYXNzKFwianN0cmVlLXN0cmlwZWRcIik7IH0sXG5cdFx0LyoqXG5cdFx0ICogaGlkZXMgdGhlIHN0cmlwZWQgYmFja2dyb3VuZCBvbiB0aGUgY29udGFpbmVyXG5cdFx0ICogQG5hbWUgaGlkZV9zdHJpcGVzKClcblx0XHQgKi9cblx0XHRoaWRlX3N0cmlwZXMgOiBmdW5jdGlvbiAoKSB7IHRoaXMuX2RhdGEuY29yZS50aGVtZXMuc3RyaXBlcyA9IGZhbHNlOyB0aGlzLmdldF9jb250YWluZXJfdWwoKS5yZW1vdmVDbGFzcyhcImpzdHJlZS1zdHJpcGVkXCIpOyB9LFxuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZXMgdGhlIHN0cmlwZWQgYmFja2dyb3VuZCBvbiB0aGUgY29udGFpbmVyXG5cdFx0ICogQG5hbWUgdG9nZ2xlX3N0cmlwZXMoKVxuXHRcdCAqL1xuXHRcdHRvZ2dsZV9zdHJpcGVzIDogZnVuY3Rpb24gKCkgeyBpZih0aGlzLl9kYXRhLmNvcmUudGhlbWVzLnN0cmlwZXMpIHsgdGhpcy5oaWRlX3N0cmlwZXMoKTsgfSBlbHNlIHsgdGhpcy5zaG93X3N0cmlwZXMoKTsgfSB9LFxuXHRcdC8qKlxuXHRcdCAqIHNob3dzIHRoZSBjb25uZWN0aW5nIGRvdHMgKGlmIHRoZSB0aGVtZSBzdXBwb3J0cyBpdClcblx0XHQgKiBAbmFtZSBzaG93X2RvdHMoKVxuXHRcdCAqL1xuXHRcdHNob3dfZG90cyA6IGZ1bmN0aW9uICgpIHsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5kb3RzID0gdHJ1ZTsgdGhpcy5nZXRfY29udGFpbmVyX3VsKCkucmVtb3ZlQ2xhc3MoXCJqc3RyZWUtbm8tZG90c1wiKTsgfSxcblx0XHQvKipcblx0XHQgKiBoaWRlcyB0aGUgY29ubmVjdGluZyBkb3RzXG5cdFx0ICogQG5hbWUgaGlkZV9kb3RzKClcblx0XHQgKi9cblx0XHRoaWRlX2RvdHMgOiBmdW5jdGlvbiAoKSB7IHRoaXMuX2RhdGEuY29yZS50aGVtZXMuZG90cyA9IGZhbHNlOyB0aGlzLmdldF9jb250YWluZXJfdWwoKS5hZGRDbGFzcyhcImpzdHJlZS1uby1kb3RzXCIpOyB9LFxuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZXMgdGhlIGNvbm5lY3RpbmcgZG90c1xuXHRcdCAqIEBuYW1lIHRvZ2dsZV9kb3RzKClcblx0XHQgKi9cblx0XHR0b2dnbGVfZG90cyA6IGZ1bmN0aW9uICgpIHsgaWYodGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5kb3RzKSB7IHRoaXMuaGlkZV9kb3RzKCk7IH0gZWxzZSB7IHRoaXMuc2hvd19kb3RzKCk7IH0gfSxcblx0XHQvKipcblx0XHQgKiBzaG93IHRoZSBub2RlIGljb25zXG5cdFx0ICogQG5hbWUgc2hvd19pY29ucygpXG5cdFx0ICovXG5cdFx0c2hvd19pY29ucyA6IGZ1bmN0aW9uICgpIHsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5pY29ucyA9IHRydWU7IHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpLnJlbW92ZUNsYXNzKFwianN0cmVlLW5vLWljb25zXCIpOyB9LFxuXHRcdC8qKlxuXHRcdCAqIGhpZGUgdGhlIG5vZGUgaWNvbnNcblx0XHQgKiBAbmFtZSBoaWRlX2ljb25zKClcblx0XHQgKi9cblx0XHRoaWRlX2ljb25zIDogZnVuY3Rpb24gKCkgeyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmljb25zID0gZmFsc2U7IHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpLmFkZENsYXNzKFwianN0cmVlLW5vLWljb25zXCIpOyB9LFxuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZSB0aGUgbm9kZSBpY29uc1xuXHRcdCAqIEBuYW1lIHRvZ2dsZV9pY29ucygpXG5cdFx0ICovXG5cdFx0dG9nZ2xlX2ljb25zIDogZnVuY3Rpb24gKCkgeyBpZih0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmljb25zKSB7IHRoaXMuaGlkZV9pY29ucygpOyB9IGVsc2UgeyB0aGlzLnNob3dfaWNvbnMoKTsgfSB9LFxuXHRcdC8qKlxuXHRcdCAqIHNldCB0aGUgbm9kZSBpY29uIGZvciBhIG5vZGVcblx0XHQgKiBAbmFtZSBzZXRfaWNvbihvYmosIGljb24pXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGljb24gdGhlIG5ldyBpY29uIC0gY2FuIGJlIGEgcGF0aCB0byBhbiBpY29uIG9yIGEgY2xhc3NOYW1lLCBpZiB1c2luZyBhbiBpbWFnZSB0aGF0IGlzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1c2UgYSBgLi9gIHByZWZpeCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGV0ZWN0ZWQgYXMgYSBjbGFzc1xuXHRcdCAqL1xuXHRcdHNldF9pY29uIDogZnVuY3Rpb24gKG9iaiwgaWNvbikge1xuXHRcdFx0dmFyIHQxLCB0MiwgZG9tLCBvbGQ7XG5cdFx0XHRpZigkLmlzQXJyYXkob2JqKSkge1xuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcblx0XHRcdFx0Zm9yKHQxID0gMCwgdDIgPSBvYmoubGVuZ3RoOyB0MSA8IHQyOyB0MSsrKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRfaWNvbihvYmpbdDFdLCBpY29uKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRvbGQgPSBvYmouaWNvbjtcblx0XHRcdG9iai5pY29uID0gaWNvbjtcblx0XHRcdGRvbSA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKS5jaGlsZHJlbihcIi5qc3RyZWUtYW5jaG9yXCIpLmNoaWxkcmVuKFwiLmpzdHJlZS10aGVtZWljb25cIik7XG5cdFx0XHRpZihpY29uID09PSBmYWxzZSkge1xuXHRcdFx0XHR0aGlzLmhpZGVfaWNvbihvYmopO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZihpY29uID09PSB0cnVlKSB7XG5cdFx0XHRcdGRvbS5yZW1vdmVDbGFzcygnanN0cmVlLXRoZW1laWNvbi1jdXN0b20gJyArIG9sZCkuY3NzKFwiYmFja2dyb3VuZFwiLFwiXCIpLnJlbW92ZUF0dHIoXCJyZWxcIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKGljb24uaW5kZXhPZihcIi9cIikgPT09IC0xICYmIGljb24uaW5kZXhPZihcIi5cIikgPT09IC0xKSB7XG5cdFx0XHRcdGRvbS5yZW1vdmVDbGFzcyhvbGQpLmNzcyhcImJhY2tncm91bmRcIixcIlwiKTtcblx0XHRcdFx0ZG9tLmFkZENsYXNzKGljb24gKyAnIGpzdHJlZS10aGVtZWljb24tY3VzdG9tJykuYXR0cihcInJlbFwiLGljb24pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGRvbS5yZW1vdmVDbGFzcyhvbGQpLmNzcyhcImJhY2tncm91bmRcIixcIlwiKTtcblx0XHRcdFx0ZG9tLmFkZENsYXNzKCdqc3RyZWUtdGhlbWVpY29uLWN1c3RvbScpLmNzcyhcImJhY2tncm91bmRcIiwgXCJ1cmwoJ1wiICsgaWNvbiArIFwiJykgY2VudGVyIGNlbnRlciBuby1yZXBlYXRcIikuYXR0cihcInJlbFwiLGljb24pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBnZXQgdGhlIG5vZGUgaWNvbiBmb3IgYSBub2RlXG5cdFx0ICogQG5hbWUgZ2V0X2ljb24ob2JqKVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9ialxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ31cblx0XHQgKi9cblx0XHRnZXRfaWNvbiA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdHJldHVybiAoIW9iaiB8fCBvYmouaWQgPT09ICcjJykgPyBmYWxzZSA6IG9iai5pY29uO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogaGlkZSB0aGUgaWNvbiBvbiBhbiBpbmRpdmlkdWFsIG5vZGVcblx0XHQgKiBAbmFtZSBoaWRlX2ljb24ob2JqKVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9ialxuXHRcdCAqL1xuXHRcdGhpZGVfaWNvbiA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdHZhciB0MSwgdDI7XG5cdFx0XHRpZigkLmlzQXJyYXkob2JqKSkge1xuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcblx0XHRcdFx0Zm9yKHQxID0gMCwgdDIgPSBvYmoubGVuZ3RoOyB0MSA8IHQyOyB0MSsrKSB7XG5cdFx0XHRcdFx0dGhpcy5oaWRlX2ljb24ob2JqW3QxXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRpZighb2JqIHx8IG9iaiA9PT0gJyMnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0b2JqLmljb24gPSBmYWxzZTtcblx0XHRcdHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKS5jaGlsZHJlbihcImFcIikuY2hpbGRyZW4oXCIuanN0cmVlLXRoZW1laWNvblwiKS5hZGRDbGFzcygnanN0cmVlLXRoZW1laWNvbi1oaWRkZW4nKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogc2hvdyB0aGUgaWNvbiBvbiBhbiBpbmRpdmlkdWFsIG5vZGVcblx0XHQgKiBAbmFtZSBzaG93X2ljb24ob2JqKVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9ialxuXHRcdCAqL1xuXHRcdHNob3dfaWNvbiA6IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdHZhciB0MSwgdDIsIGRvbTtcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0XHR0aGlzLnNob3dfaWNvbihvYmpbdDFdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRkb20gPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XG5cdFx0XHRvYmouaWNvbiA9IGRvbS5sZW5ndGggPyBkb20uY2hpbGRyZW4oXCJhXCIpLmNoaWxkcmVuKFwiLmpzdHJlZS10aGVtZWljb25cIikuYXR0cigncmVsJykgOiB0cnVlO1xuXHRcdFx0aWYoIW9iai5pY29uKSB7IG9iai5pY29uID0gdHJ1ZTsgfVxuXHRcdFx0ZG9tLmNoaWxkcmVuKFwiYVwiKS5jaGlsZHJlbihcIi5qc3RyZWUtdGhlbWVpY29uXCIpLnJlbW92ZUNsYXNzKCdqc3RyZWUtdGhlbWVpY29uLWhpZGRlbicpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIGhlbHBlcnNcblx0JC52YWthdGEgPSB7fTtcblx0Ly8gcmV2ZXJzZVxuXHQkLmZuLnZha2F0YV9yZXZlcnNlID0gW10ucmV2ZXJzZTtcblx0Ly8gY29sbGVjdCBhdHRyaWJ1dGVzXG5cdCQudmFrYXRhLmF0dHJpYnV0ZXMgPSBmdW5jdGlvbihub2RlLCB3aXRoX3ZhbHVlcykge1xuXHRcdG5vZGUgPSAkKG5vZGUpWzBdO1xuXHRcdHZhciBhdHRyID0gd2l0aF92YWx1ZXMgPyB7fSA6IFtdO1xuXHRcdGlmKG5vZGUgJiYgbm9kZS5hdHRyaWJ1dGVzKSB7XG5cdFx0XHQkLmVhY2gobm9kZS5hdHRyaWJ1dGVzLCBmdW5jdGlvbiAoaSwgdikge1xuXHRcdFx0XHRpZigkLmluQXJyYXkodi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFsnc3R5bGUnLCdjb250ZW50ZWRpdGFibGUnLCdoYXNmb2N1cycsJ3RhYmluZGV4J10pICE9PSAtMSkgeyByZXR1cm47IH1cblx0XHRcdFx0aWYodi5ub2RlVmFsdWUgIT09IG51bGwgJiYgJC50cmltKHYubm9kZVZhbHVlKSAhPT0gJycpIHtcblx0XHRcdFx0XHRpZih3aXRoX3ZhbHVlcykgeyBhdHRyW3Yubm9kZU5hbWVdID0gdi5ub2RlVmFsdWU7IH1cblx0XHRcdFx0XHRlbHNlIHsgYXR0ci5wdXNoKHYubm9kZU5hbWUpOyB9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gYXR0cjtcblx0fTtcblx0JC52YWthdGEuYXJyYXlfdW5pcXVlID0gZnVuY3Rpb24oYXJyYXkpIHtcblx0XHR2YXIgYSA9IFtdLCBpLCBqLCBsO1xuXHRcdGZvcihpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Zm9yKGogPSAwOyBqIDw9IGk7IGorKykge1xuXHRcdFx0XHRpZihhcnJheVtpXSA9PT0gYXJyYXlbal0pIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYoaiA9PT0gaSkgeyBhLnB1c2goYXJyYXlbaV0pOyB9XG5cdFx0fVxuXHRcdHJldHVybiBhO1xuXHR9O1xuXHQvLyByZW1vdmUgaXRlbSBmcm9tIGFycmF5XG5cdCQudmFrYXRhLmFycmF5X3JlbW92ZSA9IGZ1bmN0aW9uKGFycmF5LCBmcm9tLCB0bykge1xuXHRcdHZhciByZXN0ID0gYXJyYXkuc2xpY2UoKHRvIHx8IGZyb20pICsgMSB8fCBhcnJheS5sZW5ndGgpO1xuXHRcdGFycmF5Lmxlbmd0aCA9IGZyb20gPCAwID8gYXJyYXkubGVuZ3RoICsgZnJvbSA6IGZyb207XG5cdFx0YXJyYXkucHVzaC5hcHBseShhcnJheSwgcmVzdCk7XG5cdFx0cmV0dXJuIGFycmF5O1xuXHR9O1xuXHQvLyByZW1vdmUgaXRlbSBmcm9tIGFycmF5XG5cdCQudmFrYXRhLmFycmF5X3JlbW92ZV9pdGVtID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0pIHtcblx0XHR2YXIgdG1wID0gJC5pbkFycmF5KGl0ZW0sIGFycmF5KTtcblx0XHRyZXR1cm4gdG1wICE9PSAtMSA/ICQudmFrYXRhLmFycmF5X3JlbW92ZShhcnJheSwgdG1wKSA6IGFycmF5O1xuXHR9O1xuXHQvLyBicm93c2VyIHNuaWZmaW5nXG5cdChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGJyb3dzZXIgPSB7fSxcblx0XHRcdGJfbWF0Y2ggPSBmdW5jdGlvbih1YSkge1xuXHRcdFx0dWEgPSB1YS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHR2YXIgbWF0Y2ggPVx0LyhjaHJvbWUpWyBcXC9dKFtcXHcuXSspLy5leGVjKCB1YSApIHx8XG5cdFx0XHRcdFx0XHQvKHdlYmtpdClbIFxcL10oW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcblx0XHRcdFx0XHRcdC8ob3BlcmEpKD86Lip2ZXJzaW9ufClbIFxcL10oW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcblx0XHRcdFx0XHRcdC8obXNpZSkgKFtcXHcuXSspLy5leGVjKCB1YSApIHx8XG5cdFx0XHRcdFx0XHQodWEuaW5kZXhPZihcImNvbXBhdGlibGVcIikgPCAwICYmIC8obW96aWxsYSkoPzouKj8gcnY6KFtcXHcuXSspfCkvLmV4ZWMoIHVhICkpIHx8XG5cdFx0XHRcdFx0XHRbXTtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRicm93c2VyOiBtYXRjaFsxXSB8fCBcIlwiLFxuXHRcdFx0XHRcdHZlcnNpb246IG1hdGNoWzJdIHx8IFwiMFwiXG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdFx0bWF0Y2hlZCA9IGJfbWF0Y2god2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuXHRcdGlmKG1hdGNoZWQuYnJvd3Nlcikge1xuXHRcdFx0YnJvd3NlclsgbWF0Y2hlZC5icm93c2VyIF0gPSB0cnVlO1xuXHRcdFx0YnJvd3Nlci52ZXJzaW9uID0gbWF0Y2hlZC52ZXJzaW9uO1xuXHRcdH1cblx0XHRpZihicm93c2VyLmNocm9tZSkge1xuXHRcdFx0YnJvd3Nlci53ZWJraXQgPSB0cnVlO1xuXHRcdH1cblx0XHRlbHNlIGlmKGJyb3dzZXIud2Via2l0KSB7XG5cdFx0XHRicm93c2VyLnNhZmFyaSA9IHRydWU7XG5cdFx0fVxuXHRcdCQudmFrYXRhLmJyb3dzZXIgPSBicm93c2VyO1xuXHR9KCkpO1xuXHRpZigkLnZha2F0YS5icm93c2VyLm1zaWUgJiYgJC52YWthdGEuYnJvd3Nlci52ZXJzaW9uIDwgOCkge1xuXHRcdCQuanN0cmVlLmRlZmF1bHRzLmNvcmUuYW5pbWF0aW9uID0gMDtcblx0fVxuXG4vKipcbiAqICMjIyBDaGVja2JveCBwbHVnaW5cbiAqXG4gKiBUaGlzIHBsdWdpbiByZW5kZXJzIGNoZWNrYm94IGljb25zIGluIGZyb250IG9mIGVhY2ggbm9kZSwgbWFraW5nIG11bHRpcGxlIHNlbGVjdGlvbiBtdWNoIGVhc2llci4gXG4gKiBJdCBhbHNvIHN1cHBvcnRzIHRyaS1zdGF0ZSBiZWhhdmlvciwgbWVhbmluZyB0aGF0IGlmIGEgbm9kZSBoYXMgYSBmZXcgb2YgaXRzIGNoaWxkcmVuIGNoZWNrZWQgaXQgd2lsbCBiZSByZW5kZXJlZCBhcyB1bmRldGVybWluZWQsIGFuZCBzdGF0ZSB3aWxsIGJlIHByb3BhZ2F0ZWQgdXAuXG4gKi9cblxuXHR2YXIgX2kgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdJJyk7XG5cdF9pLmNsYXNzTmFtZSA9ICdqc3RyZWUtaWNvbiBqc3RyZWUtY2hlY2tib3gnO1xuXHQvKipcblx0ICogc3RvcmVzIGFsbCBkZWZhdWx0cyBmb3IgdGhlIGNoZWNrYm94IHBsdWdpblxuXHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jaGVja2JveFxuXHQgKiBAcGx1Z2luIGNoZWNrYm94XG5cdCAqL1xuXHQkLmpzdHJlZS5kZWZhdWx0cy5jaGVja2JveCA9IHtcblx0XHQvKipcblx0XHQgKiBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBjaGVja2JveGVzIHNob3VsZCBiZSB2aXNpYmxlIChjYW4gYmUgY2hhbmdlZCBhdCBhIGxhdGVyIHRpbWUgdXNpbmcgYHNob3dfY2hlY2tib3hlcygpYCBhbmQgYGhpZGVfY2hlY2tib3hlc2ApLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY2hlY2tib3gudmlzaWJsZVxuXHRcdCAqIEBwbHVnaW4gY2hlY2tib3hcblx0XHQgKi9cblx0XHR2aXNpYmxlXHRcdFx0XHQ6IHRydWUsXG5cdFx0LyoqXG5cdFx0ICogYSBib29sZWFuIGluZGljYXRpbmcgaWYgY2hlY2tib3hlcyBzaG91bGQgY2FzY2FkZSBkb3duIGFuZCBoYXZlIGFuIHVuZGV0ZXJtaW5lZCBzdGF0ZS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNoZWNrYm94LnRocmVlX3N0YXRlXG5cdFx0ICogQHBsdWdpbiBjaGVja2JveFxuXHRcdCAqL1xuXHRcdHRocmVlX3N0YXRlXHRcdFx0OiB0cnVlLFxuXHRcdC8qKlxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNsaWNraW5nIGFueXdoZXJlIG9uIHRoZSBub2RlIHNob3VsZCBhY3QgYXMgY2xpY2tpbmcgb24gdGhlIGNoZWNrYm94LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY2hlY2tib3gud2hvbGVfbm9kZVxuXHRcdCAqIEBwbHVnaW4gY2hlY2tib3hcblx0XHQgKi9cblx0XHR3aG9sZV9ub2RlXHRcdFx0OiB0cnVlLFxuXHRcdC8qKlxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBzZWxlY3RlZCBzdHlsZSBvZiBhIG5vZGUgc2hvdWxkIGJlIGtlcHQsIG9yIHJlbW92ZWQuIERlZmF1bHRzIHRvIGB0cnVlYC5cblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jaGVja2JveC5rZWVwX3NlbGVjdGVkX3N0eWxlXG5cdFx0ICogQHBsdWdpbiBjaGVja2JveFxuXHRcdCAqL1xuXHRcdGtlZXBfc2VsZWN0ZWRfc3R5bGVcdDogdHJ1ZVxuXHR9O1xuXHQkLmpzdHJlZS5wbHVnaW5zLmNoZWNrYm94ID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmVudCkge1xuXHRcdHRoaXMuYmluZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHBhcmVudC5iaW5kLmNhbGwodGhpcyk7XG5cdFx0XHR0aGlzLl9kYXRhLmNoZWNrYm94LnV0byA9IGZhbHNlO1xuXHRcdFx0dGhpcy5lbGVtZW50XG5cdFx0XHRcdC5vbihcImluaXQuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jaGVja2JveC52aXNpYmxlID0gdGhpcy5zZXR0aW5ncy5jaGVja2JveC52aXNpYmxlO1xuXHRcdFx0XHRcdFx0aWYoIXRoaXMuc2V0dGluZ3MuY2hlY2tib3gua2VlcF9zZWxlY3RlZF9zdHlsZSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoJ2pzdHJlZS1jaGVja2JveC1uby1jbGlja2VkJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdC5vbihcImxvYWRpbmcuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dGhpc1sgdGhpcy5fZGF0YS5jaGVja2JveC52aXNpYmxlID8gJ3Nob3dfY2hlY2tib3hlcycgOiAnaGlkZV9jaGVja2JveGVzJyBdKCk7XG5cdFx0XHRcdFx0fSwgdGhpcykpO1xuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy5jaGVja2JveC50aHJlZV9zdGF0ZSkge1xuXHRcdFx0XHR0aGlzLmVsZW1lbnRcblx0XHRcdFx0XHQub24oJ2NoYW5nZWQuanN0cmVlIG1vdmVfbm9kZS5qc3RyZWUgY29weV9ub2RlLmpzdHJlZSByZWRyYXcuanN0cmVlIG9wZW5fbm9kZS5qc3RyZWUnLCAkLnByb3h5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0aWYodGhpcy5fZGF0YS5jaGVja2JveC51dG8pIHsgY2xlYXJUaW1lb3V0KHRoaXMuX2RhdGEuY2hlY2tib3gudXRvKTsgfVxuXHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNoZWNrYm94LnV0byA9IHNldFRpbWVvdXQoJC5wcm94eSh0aGlzLl91bmRldGVybWluZWQsIHRoaXMpLCA1MCk7XG5cdFx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0XHQub24oJ21vZGVsLmpzdHJlZScsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0XHRcdFx0dmFyIG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxuXHRcdFx0XHRcdFx0XHRcdHAgPSBtW2RhdGEucGFyZW50XSxcblx0XHRcdFx0XHRcdFx0XHRkcGMgPSBkYXRhLm5vZGVzLFxuXHRcdFx0XHRcdFx0XHRcdGNoZCA9IFtdLFxuXHRcdFx0XHRcdFx0XHRcdGMsIGksIGosIGssIGwsIHRtcDtcblxuXHRcdFx0XHRcdFx0XHQvLyBhcHBseSBkb3duXG5cdFx0XHRcdFx0XHRcdGlmKHAuc3RhdGUuc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkcGMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtW2RwY1tpXV0uc3RhdGUuc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQuY29uY2F0KGRwYyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gZHBjLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYobVtkcGNbaV1dLnN0YXRlLnNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvcihrID0gMCwgbCA9IG1bZHBjW2ldXS5jaGlsZHJlbl9kLmxlbmd0aDsgayA8IGw7IGsrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1bbVtkcGNbaV1dLmNoaWxkcmVuX2Rba11dLnN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQuY29uY2F0KG1bZHBjW2ldXS5jaGlsZHJlbl9kKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyBhcHBseSB1cFxuXHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBwLmNoaWxkcmVuX2QubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYoIW1bcC5jaGlsZHJlbl9kW2ldXS5jaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNoZC5wdXNoKG1bcC5jaGlsZHJlbl9kW2ldXS5wYXJlbnQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjaGQgPSAkLnZha2F0YS5hcnJheV91bmlxdWUoY2hkKTtcblx0XHRcdFx0XHRcdFx0Zm9yKGsgPSAwLCBsID0gY2hkLmxlbmd0aDsgayA8IGw7IGsrKykge1xuXHRcdFx0XHRcdFx0XHRcdHAgPSBtW2NoZFtrXV07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUocCAmJiBwLmlkICE9PSAnIycpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGMgPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gcC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YyArPSBtW3AuY2hpbGRyZW5baV1dLnN0YXRlLnNlbGVjdGVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYoYyA9PT0gaikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRwLnN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLnB1c2gocC5pZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRtcCA9IHRoaXMuZ2V0X25vZGUocCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmKHRtcCAmJiB0bXAubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dG1wLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmFkZENsYXNzKCdqc3RyZWUtY2xpY2tlZCcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRwID0gdGhpcy5nZXRfbm9kZShwLnBhcmVudCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCA9ICQudmFrYXRhLmFycmF5X3VuaXF1ZSh0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQpO1xuXHRcdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdFx0Lm9uKCdzZWxlY3Rfbm9kZS5qc3RyZWUnLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBvYmogPSBkYXRhLm5vZGUsXG5cdFx0XHRcdFx0XHRcdFx0bSA9IHRoaXMuX21vZGVsLmRhdGEsXG5cdFx0XHRcdFx0XHRcdFx0cGFyID0gdGhpcy5nZXRfbm9kZShvYmoucGFyZW50KSxcblx0XHRcdFx0XHRcdFx0XHRkb20gPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSksXG5cdFx0XHRcdFx0XHRcdFx0aSwgaiwgYywgdG1wO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSAkLnZha2F0YS5hcnJheV91bmlxdWUodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmNvbmNhdChvYmouY2hpbGRyZW5fZCkpO1xuXHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRtW29iai5jaGlsZHJlbl9kW2ldXS5zdGF0ZS5zZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0d2hpbGUocGFyICYmIHBhci5pZCAhPT0gJyMnKSB7XG5cdFx0XHRcdFx0XHRcdFx0YyA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gcGFyLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YyArPSBtW3Bhci5jaGlsZHJlbltpXV0uc3RhdGUuc2VsZWN0ZWQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmKGMgPT09IGopIHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhci5zdGF0ZS5zZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQucHVzaChwYXIuaWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShwYXIsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYodG1wICYmIHRtcC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG1wLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmFkZENsYXNzKCdqc3RyZWUtY2xpY2tlZCcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRwYXIgPSB0aGlzLmdldF9ub2RlKHBhci5wYXJlbnQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmKGRvbS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRkb20uZmluZCgnLmpzdHJlZS1hbmNob3InKS5hZGRDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdFx0Lm9uKCdkZXNlbGVjdF9ub2RlLmpzdHJlZScsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0XHRcdFx0dmFyIG9iaiA9IGRhdGEubm9kZSxcblx0XHRcdFx0XHRcdFx0XHRkb20gPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSksXG5cdFx0XHRcdFx0XHRcdFx0aSwgaiwgdG1wO1xuXHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tb2RlbC5kYXRhW29iai5jaGlsZHJlbl9kW2ldXS5zdGF0ZS5zZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5wYXJlbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbb2JqLnBhcmVudHNbaV1dLnN0YXRlLnNlbGVjdGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShvYmoucGFyZW50c1tpXSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0aWYodG1wICYmIHRtcC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRtcC5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5yZW1vdmVDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dG1wID0gW107XG5cdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRpZigkLmluQXJyYXkodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldLCBvYmouY2hpbGRyZW5fZCkgPT09IC0xICYmICQuaW5BcnJheSh0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWRbaV0sIG9iai5wYXJlbnRzKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRtcC5wdXNoKHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZFtpXSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCA9ICQudmFrYXRhLmFycmF5X3VuaXF1ZSh0bXApO1xuXHRcdFx0XHRcdFx0XHRpZihkb20ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZG9tLmZpbmQoJy5qc3RyZWUtYW5jaG9yJykucmVtb3ZlQ2xhc3MoJ2pzdHJlZS1jbGlja2VkJyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sIHRoaXMpKVxuXHRcdFx0XHRcdC5vbignZGVsZXRlX25vZGUuanN0cmVlJywgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xuXHRcdFx0XHRcdFx0XHR2YXIgcCA9IHRoaXMuZ2V0X25vZGUoZGF0YS5wYXJlbnQpLFxuXHRcdFx0XHRcdFx0XHRcdG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxuXHRcdFx0XHRcdFx0XHRcdGksIGosIGMsIHRtcDtcblx0XHRcdFx0XHRcdFx0d2hpbGUocCAmJiBwLmlkICE9PSAnIycpIHtcblx0XHRcdFx0XHRcdFx0XHRjID0gMDtcblx0XHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBwLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YyArPSBtW3AuY2hpbGRyZW5baV1dLnN0YXRlLnNlbGVjdGVkO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZihjID09PSBqKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwLnN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5wdXNoKHAuaWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShwLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKHRtcCAmJiB0bXAubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRtcC5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5hZGRDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cCA9IHRoaXMuZ2V0X25vZGUocC5wYXJlbnQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0XHQub24oJ21vdmVfbm9kZS5qc3RyZWUnLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBpc19tdWx0aSA9IGRhdGEuaXNfbXVsdGksXG5cdFx0XHRcdFx0XHRcdFx0b2xkX3BhciA9IGRhdGEub2xkX3BhcmVudCxcblx0XHRcdFx0XHRcdFx0XHRuZXdfcGFyID0gdGhpcy5nZXRfbm9kZShkYXRhLnBhcmVudCksXG5cdFx0XHRcdFx0XHRcdFx0bSA9IHRoaXMuX21vZGVsLmRhdGEsXG5cdFx0XHRcdFx0XHRcdFx0cCwgYywgaSwgaiwgdG1wO1xuXHRcdFx0XHRcdFx0XHRpZighaXNfbXVsdGkpIHtcblx0XHRcdFx0XHRcdFx0XHRwID0gdGhpcy5nZXRfbm9kZShvbGRfcGFyKTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZShwICYmIHAuaWQgIT09ICcjJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YyA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBwLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjICs9IG1bcC5jaGlsZHJlbltpXV0uc3RhdGUuc2VsZWN0ZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZihjID09PSBqKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHAuc3RhdGUuc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQucHVzaChwLmlkKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShwLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYodG1wICYmIHRtcC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAuY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykuYWRkQ2xhc3MoJ2pzdHJlZS1jbGlja2VkJyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdHAgPSB0aGlzLmdldF9ub2RlKHAucGFyZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cCA9IG5ld19wYXI7XG5cdFx0XHRcdFx0XHRcdHdoaWxlKHAgJiYgcC5pZCAhPT0gJyMnKSB7XG5cdFx0XHRcdFx0XHRcdFx0YyA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gcC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGMgKz0gbVtwLmNoaWxkcmVuW2ldXS5zdGF0ZS5zZWxlY3RlZDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYoYyA9PT0gaikge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYoIXAuc3RhdGUuc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cC5zdGF0ZS5zZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5wdXNoKHAuaWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKHAsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZih0bXAgJiYgdG1wLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRtcC5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5hZGRDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKHAuc3RhdGUuc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cC5zdGF0ZS5zZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSAkLnZha2F0YS5hcnJheV9yZW1vdmVfaXRlbSh0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsIHAuaWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKHAsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZih0bXAgJiYgdG1wLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRtcC5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5yZW1vdmVDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRwID0gdGhpcy5nZXRfbm9kZShwLnBhcmVudCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sIHRoaXMpKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIHNldCB0aGUgdW5kZXRlcm1pbmVkIHN0YXRlIHdoZXJlIGFuZCBpZiBuZWNlc3NhcnkuIFVzZWQgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIF91bmRldGVybWluZWQoKVxuXHRcdCAqIEBwbHVnaW4gY2hlY2tib3hcblx0XHQgKi9cblx0XHR0aGlzLl91bmRldGVybWluZWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgaSwgaiwgbSA9IHRoaXMuX21vZGVsLmRhdGEsIHMgPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsIHAgPSBbXSwgdCA9IHRoaXM7XG5cdFx0XHRmb3IoaSA9IDAsIGogPSBzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRpZihtW3NbaV1dICYmIG1bc1tpXV0ucGFyZW50cykge1xuXHRcdFx0XHRcdHAgPSBwLmNvbmNhdChtW3NbaV1dLnBhcmVudHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBhdHRlbXB0IGZvciBzZXJ2ZXIgc2lkZSB1bmRldGVybWluZWQgc3RhdGVcblx0XHRcdHRoaXMuZWxlbWVudC5maW5kKCcuanN0cmVlLWNsb3NlZCcpLm5vdCgnOmhhcyh1bCknKVxuXHRcdFx0XHQuZWFjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIHRtcCA9IHQuZ2V0X25vZGUodGhpcyk7XG5cdFx0XHRcdFx0aWYoIXRtcC5zdGF0ZS5sb2FkZWQgJiYgdG1wLm9yaWdpbmFsICYmIHRtcC5vcmlnaW5hbC5zdGF0ZSAmJiB0bXAub3JpZ2luYWwuc3RhdGUudW5kZXRlcm1pbmVkICYmIHRtcC5vcmlnaW5hbC5zdGF0ZS51bmRldGVybWluZWQgPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdHAucHVzaCh0bXAuaWQpO1xuXHRcdFx0XHRcdFx0cCA9IHAuY29uY2F0KHRtcC5wYXJlbnRzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0cCA9ICQudmFrYXRhLmFycmF5X3VuaXF1ZShwKTtcblx0XHRcdGkgPSAkLmluQXJyYXkoJyMnLCBwKTtcblx0XHRcdGlmKGkgIT09IC0xKSB7XG5cdFx0XHRcdHAgPSAkLnZha2F0YS5hcnJheV9yZW1vdmUocCwgaSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZWxlbWVudC5maW5kKCcuanN0cmVlLXVuZGV0ZXJtaW5lZCcpLnJlbW92ZUNsYXNzKCdqc3RyZWUtdW5kZXRlcm1pbmVkJyk7XG5cdFx0XHRmb3IoaSA9IDAsIGogPSBwLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRpZighbVtwW2ldXS5zdGF0ZS5zZWxlY3RlZCkge1xuXHRcdFx0XHRcdHMgPSB0aGlzLmdldF9ub2RlKHBbaV0sIHRydWUpO1xuXHRcdFx0XHRcdGlmKHMgJiYgcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHMuY2hpbGRyZW4oJ2EnKS5jaGlsZHJlbignLmpzdHJlZS1jaGVja2JveCcpLmFkZENsYXNzKCdqc3RyZWUtdW5kZXRlcm1pbmVkJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR0aGlzLnJlZHJhd19ub2RlID0gZnVuY3Rpb24ob2JqLCBkZWVwLCBpc19jYWxsYmFjaykge1xuXHRcdFx0b2JqID0gcGFyZW50LnJlZHJhd19ub2RlLmNhbGwodGhpcywgb2JqLCBkZWVwLCBpc19jYWxsYmFjayk7XG5cdFx0XHRpZihvYmopIHtcblx0XHRcdFx0dmFyIHRtcCA9IG9iai5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpWzBdO1xuXHRcdFx0XHR0bXAuaW5zZXJ0QmVmb3JlKF9pLmNsb25lTm9kZSgpLCB0bXAuY2hpbGROb2Rlc1swXSk7XG5cdFx0XHR9XG5cdFx0XHRpZighaXNfY2FsbGJhY2sgJiYgdGhpcy5zZXR0aW5ncy5jaGVja2JveC50aHJlZV9zdGF0ZSkge1xuXHRcdFx0XHRpZih0aGlzLl9kYXRhLmNoZWNrYm94LnV0bykgeyBjbGVhclRpbWVvdXQodGhpcy5fZGF0YS5jaGVja2JveC51dG8pOyB9XG5cdFx0XHRcdHRoaXMuX2RhdGEuY2hlY2tib3gudXRvID0gc2V0VGltZW91dCgkLnByb3h5KHRoaXMuX3VuZGV0ZXJtaW5lZCwgdGhpcyksIDUwKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmo7XG5cdFx0fTtcblx0XHR0aGlzLmFjdGl2YXRlX25vZGUgPSBmdW5jdGlvbiAob2JqLCBlKSB7XG5cdFx0XHRpZih0aGlzLnNldHRpbmdzLmNoZWNrYm94Lndob2xlX25vZGUgfHwgJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2pzdHJlZS1jaGVja2JveCcpKSB7XG5cdFx0XHRcdGUuY3RybEtleSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcGFyZW50LmFjdGl2YXRlX25vZGUuY2FsbCh0aGlzLCBvYmosIGUpO1xuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogc2hvdyB0aGUgbm9kZSBjaGVja2JveCBpY29uc1xuXHRcdCAqIEBuYW1lIHNob3dfY2hlY2tib3hlcygpXG5cdFx0ICogQHBsdWdpbiBjaGVja2JveFxuXHRcdCAqL1xuXHRcdHRoaXMuc2hvd19jaGVja2JveGVzID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmNoZWNrYm94ZXMgPSB0cnVlOyB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oXCJ1bFwiKS5yZW1vdmVDbGFzcyhcImpzdHJlZS1uby1jaGVja2JveGVzXCIpOyB9O1xuXHRcdC8qKlxuXHRcdCAqIGhpZGUgdGhlIG5vZGUgY2hlY2tib3ggaWNvbnNcblx0XHQgKiBAbmFtZSBoaWRlX2NoZWNrYm94ZXMoKVxuXHRcdCAqIEBwbHVnaW4gY2hlY2tib3hcblx0XHQgKi9cblx0XHR0aGlzLmhpZGVfY2hlY2tib3hlcyA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5jaGVja2JveGVzID0gZmFsc2U7IHRoaXMuZWxlbWVudC5jaGlsZHJlbihcInVsXCIpLmFkZENsYXNzKFwianN0cmVlLW5vLWNoZWNrYm94ZXNcIik7IH07XG5cdFx0LyoqXG5cdFx0ICogdG9nZ2xlIHRoZSBub2RlIGljb25zXG5cdFx0ICogQG5hbWUgdG9nZ2xlX2NoZWNrYm94ZXMoKVxuXHRcdCAqIEBwbHVnaW4gY2hlY2tib3hcblx0XHQgKi9cblx0XHR0aGlzLnRvZ2dsZV9jaGVja2JveGVzID0gZnVuY3Rpb24gKCkgeyBpZih0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmNoZWNrYm94ZXMpIHsgdGhpcy5oaWRlX2NoZWNrYm94ZXMoKTsgfSBlbHNlIHsgdGhpcy5zaG93X2NoZWNrYm94ZXMoKTsgfSB9O1xuXHR9O1xuXG5cdC8vIGluY2x1ZGUgdGhlIGNoZWNrYm94IHBsdWdpbiBieSBkZWZhdWx0XG5cdC8vICQuanN0cmVlLmRlZmF1bHRzLnBsdWdpbnMucHVzaChcImNoZWNrYm94XCIpO1xuXG4vKipcbiAqICMjIyBDb250ZXh0bWVudSBwbHVnaW5cbiAqXG4gKiBTaG93cyBhIGNvbnRleHQgbWVudSB3aGVuIGEgbm9kZSBpcyByaWdodC1jbGlja2VkLlxuICovXG4vLyBUT0RPOiBtb3ZlIGxvZ2ljIG91dHNpZGUgb2YgZnVuY3Rpb24gKyBjaGVjayBtdWx0aXBsZSBtb3ZlXG5cblx0LyoqXG5cdCAqIHN0b3JlcyBhbGwgZGVmYXVsdHMgZm9yIHRoZSBjb250ZXh0bWVudSBwbHVnaW5cblx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29udGV4dG1lbnVcblx0ICogQHBsdWdpbiBjb250ZXh0bWVudVxuXHQgKi9cblx0JC5qc3RyZWUuZGVmYXVsdHMuY29udGV4dG1lbnUgPSB7XG5cdFx0LyoqXG5cdFx0ICogYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGNvbnRleHQgbWVudSBpcyBpbnZva2VkIG9uIGl0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29udGV4dG1lbnUuc2VsZWN0X25vZGVcblx0XHQgKiBAcGx1Z2luIGNvbnRleHRtZW51XG5cdFx0ICovXG5cdFx0c2VsZWN0X25vZGUgOiB0cnVlLFxuXHRcdC8qKlxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBtZW51IHNob3VsZCBiZSBzaG93biBhbGlnbmVkIHdpdGggdGhlIG5vZGUuIERlZmF1bHRzIHRvIGB0cnVlYCwgb3RoZXJ3aXNlIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcmUgdXNlZC5cblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb250ZXh0bWVudS5zaG93X2F0X25vZGVcblx0XHQgKiBAcGx1Z2luIGNvbnRleHRtZW51XG5cdFx0ICovXG5cdFx0c2hvd19hdF9ub2RlIDogdHJ1ZSxcblx0XHQvKipcblx0XHQgKiBhbiBvYmplY3Qgb2YgYWN0aW9ucywgb3IgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBub2RlIGFuZCBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBjYWxscyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBhbiBvYmplY3Qgb2YgYWN0aW9ucyBhdmFpbGFibGUgZm9yIHRoYXQgbm9kZSAoeW91IGNhbiBhbHNvIHJldHVybiB0aGUgaXRlbXMgdG9vKS5cblx0XHQgKiBcblx0XHQgKiBFYWNoIGFjdGlvbiBjb25zaXN0cyBvZiBhIGtleSAoYSB1bmlxdWUgbmFtZSkgYW5kIGEgdmFsdWUgd2hpY2ggaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIChvbmx5IGxhYmVsIGFuZCBhY3Rpb24gYXJlIHJlcXVpcmVkKTpcblx0XHQgKiBcblx0XHQgKiAqIGBzZXBhcmF0b3JfYmVmb3JlYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZXJlIHNob3VsZCBiZSBhIHNlcGFyYXRvciBiZWZvcmUgdGhpcyBpdGVtXG5cdFx0ICogKiBgc2VwYXJhdG9yX2FmdGVyYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZXJlIHNob3VsZCBiZSBhIHNlcGFyYXRvciBhZnRlciB0aGlzIGl0ZW1cblx0XHQgKiAqIGBfZGlzYWJsZWRgIC0gYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkXG5cdFx0ICogKiBgbGFiZWxgIC0gYSBzdHJpbmcgLSB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdFx0ICogKiBgYWN0aW9uYCAtIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaWYgdGhpcyBpdGVtIGlzIGNob3NlblxuXHRcdCAqICogYGljb25gIC0gYSBzdHJpbmcsIGNhbiBiZSBhIHBhdGggdG8gYW4gaWNvbiBvciBhIGNsYXNzTmFtZSwgaWYgdXNpbmcgYW4gaW1hZ2UgdGhhdCBpcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdXNlIGEgYC4vYCBwcmVmaXgsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRldGVjdGVkIGFzIGEgY2xhc3Ncblx0XHQgKiAqIGBzaG9ydGN1dGAgLSBrZXlDb2RlIHdoaWNoIHdpbGwgdHJpZ2dlciB0aGUgYWN0aW9uIGlmIHRoZSBtZW51IGlzIG9wZW4gKGZvciBleGFtcGxlIGAxMTNgIGZvciByZW5hbWUsIHdoaWNoIGVxdWFscyBGMilcblx0XHQgKiAqIGBzaG9ydGN1dF9sYWJlbGAgLSBzaG9ydGN1dCBsYWJlbCAobGlrZSBmb3IgZXhhbXBsZSBgRjJgIGZvciByZW5hbWUpXG5cdFx0ICogXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29udGV4dG1lbnUuaXRlbXNcblx0XHQgKiBAcGx1Z2luIGNvbnRleHRtZW51XG5cdFx0ICovXG5cdFx0aXRlbXMgOiBmdW5jdGlvbiAobywgY2IpIHsgLy8gQ291bGQgYmUgYW4gb2JqZWN0IGRpcmVjdGx5XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImNyZWF0ZVwiIDoge1xuXHRcdFx0XHRcdFwic2VwYXJhdG9yX2JlZm9yZVwiXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFwic2VwYXJhdG9yX2FmdGVyXCJcdDogdHJ1ZSxcblx0XHRcdFx0XHRcIl9kaXNhYmxlZFwiXHRcdFx0OiBmYWxzZSwgLy8odGhpcy5jaGVjayhcImNyZWF0ZV9ub2RlXCIsIGRhdGEucmVmZXJlbmNlLCB7fSwgXCJsYXN0XCIpKSxcblx0XHRcdFx0XHRcImxhYmVsXCJcdFx0XHRcdDogXCJDcmVhdGVcIixcblx0XHRcdFx0XHRcImFjdGlvblwiXHRcdFx0OiBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0XHRcdFx0dmFyIGluc3QgPSAkLmpzdHJlZS5yZWZlcmVuY2UoZGF0YS5yZWZlcmVuY2UpLFxuXHRcdFx0XHRcdFx0XHRvYmogPSBpbnN0LmdldF9ub2RlKGRhdGEucmVmZXJlbmNlKTtcblx0XHRcdFx0XHRcdGluc3QuY3JlYXRlX25vZGUob2JqLCB7fSwgXCJsYXN0XCIsIGZ1bmN0aW9uIChuZXdfbm9kZSkge1xuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaW5zdC5lZGl0KG5ld19ub2RlKTsgfSwwKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0XCJyZW5hbWVcIiA6IHtcblx0XHRcdFx0XHRcInNlcGFyYXRvcl9iZWZvcmVcIlx0OiBmYWxzZSxcblx0XHRcdFx0XHRcInNlcGFyYXRvcl9hZnRlclwiXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFwiX2Rpc2FibGVkXCJcdFx0XHQ6IGZhbHNlLCAvLyh0aGlzLmNoZWNrKFwicmVuYW1lX25vZGVcIiwgZGF0YS5yZWZlcmVuY2UsIHRoaXMuZ2V0X3BhcmVudChkYXRhLnJlZmVyZW5jZSksIFwiXCIpKSxcblx0XHRcdFx0XHRcImxhYmVsXCJcdFx0XHRcdDogXCJSZW5hbWVcIixcblx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFwic2hvcnRjdXRcIlx0XHRcdDogMTEzLFxuXHRcdFx0XHRcdFwic2hvcnRjdXRfbGFiZWxcIlx0OiAnRjInLFxuXHRcdFx0XHRcdFwiaWNvblwiXHRcdFx0XHQ6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1sZWFmXCIsXG5cdFx0XHRcdFx0Ki9cblx0XHRcdFx0XHRcImFjdGlvblwiXHRcdFx0OiBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0XHRcdFx0dmFyIGluc3QgPSAkLmpzdHJlZS5yZWZlcmVuY2UoZGF0YS5yZWZlcmVuY2UpLFxuXHRcdFx0XHRcdFx0XHRvYmogPSBpbnN0LmdldF9ub2RlKGRhdGEucmVmZXJlbmNlKTtcblx0XHRcdFx0XHRcdGluc3QuZWRpdChvYmopO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0XCJyZW1vdmVcIiA6IHtcblx0XHRcdFx0XHRcInNlcGFyYXRvcl9iZWZvcmVcIlx0OiBmYWxzZSxcblx0XHRcdFx0XHRcImljb25cIlx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcInNlcGFyYXRvcl9hZnRlclwiXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFwiX2Rpc2FibGVkXCJcdFx0XHQ6IGZhbHNlLCAvLyh0aGlzLmNoZWNrKFwiZGVsZXRlX25vZGVcIiwgZGF0YS5yZWZlcmVuY2UsIHRoaXMuZ2V0X3BhcmVudChkYXRhLnJlZmVyZW5jZSksIFwiXCIpKSxcblx0XHRcdFx0XHRcImxhYmVsXCJcdFx0XHRcdDogXCJEZWxldGVcIixcblx0XHRcdFx0XHRcImFjdGlvblwiXHRcdFx0OiBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0XHRcdFx0dmFyIGluc3QgPSAkLmpzdHJlZS5yZWZlcmVuY2UoZGF0YS5yZWZlcmVuY2UpLFxuXHRcdFx0XHRcdFx0XHRvYmogPSBpbnN0LmdldF9ub2RlKGRhdGEucmVmZXJlbmNlKTtcblx0XHRcdFx0XHRcdGlmKGluc3QuaXNfc2VsZWN0ZWQob2JqKSkge1xuXHRcdFx0XHRcdFx0XHRpbnN0LmRlbGV0ZV9ub2RlKGluc3QuZ2V0X3NlbGVjdGVkKCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGluc3QuZGVsZXRlX25vZGUob2JqKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiY2NwXCIgOiB7XG5cdFx0XHRcdFx0XCJzZXBhcmF0b3JfYmVmb3JlXCJcdDogdHJ1ZSxcblx0XHRcdFx0XHRcImljb25cIlx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcInNlcGFyYXRvcl9hZnRlclwiXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFwibGFiZWxcIlx0XHRcdFx0OiBcIkVkaXRcIixcblx0XHRcdFx0XHRcImFjdGlvblwiXHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcInN1Ym1lbnVcIiA6IHtcblx0XHRcdFx0XHRcdFwiY3V0XCIgOiB7XG5cdFx0XHRcdFx0XHRcdFwic2VwYXJhdG9yX2JlZm9yZVwiXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcInNlcGFyYXRvcl9hZnRlclwiXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcImxhYmVsXCJcdFx0XHRcdDogXCJDdXRcIixcblx0XHRcdFx0XHRcdFx0XCJhY3Rpb25cIlx0XHRcdDogZnVuY3Rpb24gKGRhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgaW5zdCA9ICQuanN0cmVlLnJlZmVyZW5jZShkYXRhLnJlZmVyZW5jZSksXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmogPSBpbnN0LmdldF9ub2RlKGRhdGEucmVmZXJlbmNlKTtcblx0XHRcdFx0XHRcdFx0XHRpZihpbnN0LmlzX3NlbGVjdGVkKG9iaikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGluc3QuY3V0KGluc3QuZ2V0X3NlbGVjdGVkKCkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGluc3QuY3V0KG9iaik7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJjb3B5XCIgOiB7XG5cdFx0XHRcdFx0XHRcdFwic2VwYXJhdG9yX2JlZm9yZVwiXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcImljb25cIlx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XCJzZXBhcmF0b3JfYWZ0ZXJcIlx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XCJsYWJlbFwiXHRcdFx0XHQ6IFwiQ29weVwiLFxuXHRcdFx0XHRcdFx0XHRcImFjdGlvblwiXHRcdFx0OiBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBpbnN0ID0gJC5qc3RyZWUucmVmZXJlbmNlKGRhdGEucmVmZXJlbmNlKSxcblx0XHRcdFx0XHRcdFx0XHRcdG9iaiA9IGluc3QuZ2V0X25vZGUoZGF0YS5yZWZlcmVuY2UpO1xuXHRcdFx0XHRcdFx0XHRcdGlmKGluc3QuaXNfc2VsZWN0ZWQob2JqKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aW5zdC5jb3B5KGluc3QuZ2V0X3NlbGVjdGVkKCkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGluc3QuY29weShvYmopO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwicGFzdGVcIiA6IHtcblx0XHRcdFx0XHRcdFx0XCJzZXBhcmF0b3JfYmVmb3JlXCJcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFwiaWNvblwiXHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcIl9kaXNhYmxlZFwiXHRcdFx0OiBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAhJC5qc3RyZWUucmVmZXJlbmNlKGRhdGEucmVmZXJlbmNlKS5jYW5fcGFzdGUoKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XCJzZXBhcmF0b3JfYWZ0ZXJcIlx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XCJsYWJlbFwiXHRcdFx0XHQ6IFwiUGFzdGVcIixcblx0XHRcdFx0XHRcdFx0XCJhY3Rpb25cIlx0XHRcdDogZnVuY3Rpb24gKGRhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgaW5zdCA9ICQuanN0cmVlLnJlZmVyZW5jZShkYXRhLnJlZmVyZW5jZSksXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmogPSBpbnN0LmdldF9ub2RlKGRhdGEucmVmZXJlbmNlKTtcblx0XHRcdFx0XHRcdFx0XHRpbnN0LnBhc3RlKG9iaik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHR9O1xuXG5cdCQuanN0cmVlLnBsdWdpbnMuY29udGV4dG1lbnUgPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyZW50KSB7XG5cdFx0dGhpcy5iaW5kID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cGFyZW50LmJpbmQuY2FsbCh0aGlzKTtcblxuXHRcdFx0dGhpcy5lbGVtZW50XG5cdFx0XHRcdC5vbihcImNvbnRleHRtZW51LmpzdHJlZVwiLCBcIi5qc3RyZWUtYW5jaG9yXCIsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdGlmKCF0aGlzLmlzX2xvYWRpbmcoZS5jdXJyZW50VGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNob3dfY29udGV4dG1lbnUoZS5jdXJyZW50VGFyZ2V0LCBlLnBhZ2VYLCBlLnBhZ2VZLCBlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKFwiY2xpY2suanN0cmVlXCIsIFwiLmpzdHJlZS1hbmNob3JcIiwgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0aWYodGhpcy5fZGF0YS5jb250ZXh0bWVudS52aXNpYmxlKSB7XG5cdFx0XHRcdFx0XHRcdCQudmFrYXRhLmNvbnRleHQuaGlkZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIHRoaXMpKTtcblx0XHRcdC8qXG5cdFx0XHRpZighKCdvbmNvbnRleHRtZW51JyBpbiBkb2N1bWVudC5ib2R5KSAmJiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuYm9keSkpIHtcblx0XHRcdFx0dmFyIGVsID0gbnVsbCwgdG0gPSBudWxsO1xuXHRcdFx0XHR0aGlzLmVsZW1lbnRcblx0XHRcdFx0XHQub24oXCJ0b3VjaHN0YXJ0XCIsIFwiLmpzdHJlZS1hbmNob3JcIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdGVsID0gZS5jdXJyZW50VGFyZ2V0O1xuXHRcdFx0XHRcdFx0dG0gPSArbmV3IERhdGUoKTtcblx0XHRcdFx0XHRcdCQoZG9jdW1lbnQpLm9uZShcInRvdWNoZW5kXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdGUudGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLm9yaWdpbmFsRXZlbnQudGFyZ2V0VG91Y2hlc1swXS5wYWdlWCAtIHdpbmRvdy5wYWdlWE9mZnNldCwgZS5vcmlnaW5hbEV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpO1xuXHRcdFx0XHRcdFx0XHRlLmN1cnJlbnRUYXJnZXQgPSBlLnRhcmdldDtcblx0XHRcdFx0XHRcdFx0dG0gPSAoKCsobmV3IERhdGUoKSkpIC0gdG0pO1xuXHRcdFx0XHRcdFx0XHRpZihlLnRhcmdldCA9PT0gZWwgJiYgdG0gPiA2MDAgJiYgdG0gPCAxMDAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRcdCQoZWwpLnRyaWdnZXIoJ2NvbnRleHRtZW51JywgZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWwgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHR0bSA9IG51bGw7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdCovXG5cdFx0XHQkKGRvY3VtZW50KS5vbihcImNvbnRleHRfaGlkZS52YWthdGFcIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7IHRoaXMuX2RhdGEuY29udGV4dG1lbnUudmlzaWJsZSA9IGZhbHNlOyB9LCB0aGlzKSk7XG5cdFx0fTtcblx0XHR0aGlzLnRlYXJkb3duID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYodGhpcy5fZGF0YS5jb250ZXh0bWVudS52aXNpYmxlKSB7XG5cdFx0XHRcdCQudmFrYXRhLmNvbnRleHQuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdFx0cGFyZW50LnRlYXJkb3duLmNhbGwodGhpcyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHByZXBhcmUgYW5kIHNob3cgdGhlIGNvbnRleHQgbWVudSBmb3IgYSBub2RlXG5cdFx0ICogQG5hbWUgc2hvd19jb250ZXh0bWVudShvYmogWywgeCwgeV0pXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHggdGhlIHgtY29vcmRpbmF0ZSByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQgdG8gc2hvdyB0aGUgbWVudSBhdFxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGUgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50IHRvIHNob3cgdGhlIG1lbnUgYXRcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZSB0aGUgZXZlbnQgaWYgYXZhaWxhYmxlIHRoYXQgdHJpZ2dlcmVkIHRoZSBjb250ZXh0bWVudVxuXHRcdCAqIEBwbHVnaW4gY29udGV4dG1lbnVcblx0XHQgKiBAdHJpZ2dlciBzaG93X2NvbnRleHRtZW51LmpzdHJlZVxuXHRcdCAqL1xuXHRcdHRoaXMuc2hvd19jb250ZXh0bWVudSA9IGZ1bmN0aW9uIChvYmosIHgsIHksIGUpIHtcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHR2YXIgcyA9IHRoaXMuc2V0dGluZ3MuY29udGV4dG1lbnUsXG5cdFx0XHRcdGQgPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSksXG5cdFx0XHRcdGEgPSBkLmNoaWxkcmVuKFwiLmpzdHJlZS1hbmNob3JcIiksXG5cdFx0XHRcdG8gPSBmYWxzZSxcblx0XHRcdFx0aSA9IGZhbHNlO1xuXHRcdFx0aWYocy5zaG93X2F0X25vZGUgfHwgeCA9PT0gdW5kZWZpbmVkIHx8IHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvID0gYS5vZmZzZXQoKTtcblx0XHRcdFx0eCA9IG8ubGVmdDtcblx0XHRcdFx0eSA9IG8udG9wICsgdGhpcy5fZGF0YS5jb3JlLmxpX2hlaWdodDtcblx0XHRcdH1cblx0XHRcdGlmKHRoaXMuc2V0dGluZ3MuY29udGV4dG1lbnUuc2VsZWN0X25vZGUgJiYgIXRoaXMuaXNfc2VsZWN0ZWQob2JqKSkge1xuXHRcdFx0XHR0aGlzLmRlc2VsZWN0X2FsbCgpO1xuXHRcdFx0XHR0aGlzLnNlbGVjdF9ub2RlKG9iaiwgZmFsc2UsIGZhbHNlLCBlKTtcblx0XHRcdH1cblxuXHRcdFx0aSA9IHMuaXRlbXM7XG5cdFx0XHRpZigkLmlzRnVuY3Rpb24oaSkpIHtcblx0XHRcdFx0aSA9IGkuY2FsbCh0aGlzLCBvYmosICQucHJveHkoZnVuY3Rpb24gKGkpIHtcblx0XHRcdFx0XHR0aGlzLl9zaG93X2NvbnRleHRtZW51KG9iaiwgeCwgeSwgaSk7XG5cdFx0XHRcdH0sIHRoaXMpKTtcblx0XHRcdH1cblx0XHRcdGlmKCQuaXNQbGFpbk9iamVjdChpKSkge1xuXHRcdFx0XHR0aGlzLl9zaG93X2NvbnRleHRtZW51KG9iaiwgeCwgeSwgaSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBzaG93IHRoZSBwcmVwYXJlZCBjb250ZXh0IG1lbnUgZm9yIGEgbm9kZVxuXHRcdCAqIEBuYW1lIF9zaG93X2NvbnRleHRtZW51KG9iaiwgeCwgeSwgaSlcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogdGhlIG5vZGVcblx0XHQgKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCB0byBzaG93IHRoZSBtZW51IGF0XG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHkgdGhlIHktY29vcmRpbmF0ZSByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQgdG8gc2hvdyB0aGUgbWVudSBhdFxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBpIHRoZSBvYmplY3Qgb2YgaXRlbXMgdG8gc2hvd1xuXHRcdCAqIEBwbHVnaW4gY29udGV4dG1lbnVcblx0XHQgKiBAdHJpZ2dlciBzaG93X2NvbnRleHRtZW51LmpzdHJlZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dGhpcy5fc2hvd19jb250ZXh0bWVudSA9IGZ1bmN0aW9uIChvYmosIHgsIHksIGkpIHtcblx0XHRcdHZhciBkID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpLFxuXHRcdFx0XHRhID0gZC5jaGlsZHJlbihcIi5qc3RyZWUtYW5jaG9yXCIpO1xuXHRcdFx0JChkb2N1bWVudCkub25lKFwiY29udGV4dF9zaG93LnZha2F0YVwiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdHZhciBjbHMgPSAnanN0cmVlLWNvbnRleHRtZW51IGpzdHJlZS0nICsgdGhpcy5nZXRfdGhlbWUoKSArICctY29udGV4dG1lbnUnO1xuXHRcdFx0XHQkKGRhdGEuZWxlbWVudCkuYWRkQ2xhc3MoY2xzKTtcblx0XHRcdH0sIHRoaXMpKTtcblx0XHRcdHRoaXMuX2RhdGEuY29udGV4dG1lbnUudmlzaWJsZSA9IHRydWU7XG5cdFx0XHQkLnZha2F0YS5jb250ZXh0LnNob3coYSwgeyAneCcgOiB4LCAneScgOiB5IH0sIGkpO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiB0aGUgY29udGV4dG1lbnUgaXMgc2hvd24gZm9yIGEgbm9kZVxuXHRcdFx0ICogQGV2ZW50XG5cdFx0XHQgKiBAbmFtZSBzaG93X2NvbnRleHRtZW51LmpzdHJlZVxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgdGhlIG5vZGVcblx0XHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB4IHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50XG5cdFx0XHQgKiBAcGFyYW0ge051bWJlcn0geSB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudFxuXHRcdFx0ICogQHBsdWdpbiBjb250ZXh0bWVudVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ3Nob3dfY29udGV4dG1lbnUnLCB7IFwibm9kZVwiIDogb2JqLCBcInhcIiA6IHgsIFwieVwiIDogeSB9KTtcblx0XHR9O1xuXHR9O1xuXG5cdC8vIGNvbnRleHRtZW51IGhlbHBlclxuXHQoZnVuY3Rpb24gKCQpIHtcblx0XHR2YXIgcmlnaHRfdG9fbGVmdCA9IGZhbHNlLFxuXHRcdFx0dmFrYXRhX2NvbnRleHQgPSB7XG5cdFx0XHRcdGVsZW1lbnRcdFx0OiBmYWxzZSxcblx0XHRcdFx0cmVmZXJlbmNlXHQ6IGZhbHNlLFxuXHRcdFx0XHRwb3NpdGlvbl94XHQ6IDAsXG5cdFx0XHRcdHBvc2l0aW9uX3lcdDogMCxcblx0XHRcdFx0aXRlbXNcdFx0OiBbXSxcblx0XHRcdFx0aHRtbFx0XHQ6IFwiXCIsXG5cdFx0XHRcdGlzX3Zpc2libGVcdDogZmFsc2Vcblx0XHRcdH07XG5cblx0XHQkLnZha2F0YS5jb250ZXh0ID0ge1xuXHRcdFx0c2V0dGluZ3MgOiB7XG5cdFx0XHRcdGhpZGVfb25tb3VzZWxlYXZlXHQ6IDAsXG5cdFx0XHRcdGljb25zXHRcdFx0XHQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHRfdHJpZ2dlciA6IGZ1bmN0aW9uIChldmVudF9uYW1lKSB7XG5cdFx0XHRcdCQoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKFwiY29udGV4dF9cIiArIGV2ZW50X25hbWUgKyBcIi52YWthdGFcIiwge1xuXHRcdFx0XHRcdFwicmVmZXJlbmNlXCJcdDogdmFrYXRhX2NvbnRleHQucmVmZXJlbmNlLFxuXHRcdFx0XHRcdFwiZWxlbWVudFwiXHQ6IHZha2F0YV9jb250ZXh0LmVsZW1lbnQsXG5cdFx0XHRcdFx0XCJwb3NpdGlvblwiXHQ6IHtcblx0XHRcdFx0XHRcdFwieFwiIDogdmFrYXRhX2NvbnRleHQucG9zaXRpb25feCxcblx0XHRcdFx0XHRcdFwieVwiIDogdmFrYXRhX2NvbnRleHQucG9zaXRpb25feVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0X2V4ZWN1dGUgOiBmdW5jdGlvbiAoaSkge1xuXHRcdFx0XHRpID0gdmFrYXRhX2NvbnRleHQuaXRlbXNbaV07XG5cdFx0XHRcdHJldHVybiBpICYmICghaS5fZGlzYWJsZWQgfHwgKCQuaXNGdW5jdGlvbihpLl9kaXNhYmxlZCkgJiYgIWkuX2Rpc2FibGVkKHsgXCJpdGVtXCIgOiBpLCBcInJlZmVyZW5jZVwiIDogdmFrYXRhX2NvbnRleHQucmVmZXJlbmNlLCBcImVsZW1lbnRcIiA6IHZha2F0YV9jb250ZXh0LmVsZW1lbnQgfSkpKSAmJiBpLmFjdGlvbiA/IGkuYWN0aW9uLmNhbGwobnVsbCwge1xuXHRcdFx0XHRcdFx0XHRcIml0ZW1cIlx0XHQ6IGksXG5cdFx0XHRcdFx0XHRcdFwicmVmZXJlbmNlXCJcdDogdmFrYXRhX2NvbnRleHQucmVmZXJlbmNlLFxuXHRcdFx0XHRcdFx0XHRcImVsZW1lbnRcIlx0OiB2YWthdGFfY29udGV4dC5lbGVtZW50LFxuXHRcdFx0XHRcdFx0XHRcInBvc2l0aW9uXCJcdDoge1xuXHRcdFx0XHRcdFx0XHRcdFwieFwiIDogdmFrYXRhX2NvbnRleHQucG9zaXRpb25feCxcblx0XHRcdFx0XHRcdFx0XHRcInlcIiA6IHZha2F0YV9jb250ZXh0LnBvc2l0aW9uX3lcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSkgOiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRfcGFyc2UgOiBmdW5jdGlvbiAobywgaXNfY2FsbGJhY2spIHtcblx0XHRcdFx0aWYoIW8pIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XHRcdGlmKCFpc19jYWxsYmFjaykge1xuXHRcdFx0XHRcdHZha2F0YV9jb250ZXh0Lmh0bWxcdFx0PSBcIlwiO1xuXHRcdFx0XHRcdHZha2F0YV9jb250ZXh0Lml0ZW1zXHQ9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBzdHIgPSBcIlwiLFxuXHRcdFx0XHRcdHNlcCA9IGZhbHNlLFxuXHRcdFx0XHRcdHRtcDtcblxuXHRcdFx0XHRpZihpc19jYWxsYmFjaykgeyBzdHIgKz0gXCI8XCIrXCJ1bD5cIjsgfVxuXHRcdFx0XHQkLmVhY2gobywgZnVuY3Rpb24gKGksIHZhbCkge1xuXHRcdFx0XHRcdGlmKCF2YWwpIHsgcmV0dXJuIHRydWU7IH1cblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5pdGVtcy5wdXNoKHZhbCk7XG5cdFx0XHRcdFx0aWYoIXNlcCAmJiB2YWwuc2VwYXJhdG9yX2JlZm9yZSkge1xuXHRcdFx0XHRcdFx0c3RyICs9IFwiPFwiK1wibGkgY2xhc3M9J3Zha2F0YS1jb250ZXh0LXNlcGFyYXRvcic+PFwiK1wiYSBocmVmPScjJyBcIiArICgkLnZha2F0YS5jb250ZXh0LnNldHRpbmdzLmljb25zID8gJycgOiAnc3R5bGU9XCJtYXJnaW4tbGVmdDowcHg7XCInKSArIFwiPiYjMTYwOzxcIitcIi9hPjxcIitcIi9saT5cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VwID0gZmFsc2U7XG5cdFx0XHRcdFx0c3RyICs9IFwiPFwiK1wibGkgY2xhc3M9J1wiICsgKHZhbC5fY2xhc3MgfHwgXCJcIikgKyAodmFsLl9kaXNhYmxlZCA9PT0gdHJ1ZSB8fCAoJC5pc0Z1bmN0aW9uKHZhbC5fZGlzYWJsZWQpICYmIHZhbC5fZGlzYWJsZWQoeyBcIml0ZW1cIiA6IHZhbCwgXCJyZWZlcmVuY2VcIiA6IHZha2F0YV9jb250ZXh0LnJlZmVyZW5jZSwgXCJlbGVtZW50XCIgOiB2YWthdGFfY29udGV4dC5lbGVtZW50IH0pKSA/IFwiIHZha2F0YS1jb250ZXh0bWVudS1kaXNhYmxlZCBcIiA6IFwiXCIpICsgXCInIFwiKyh2YWwuc2hvcnRjdXQ/XCIgZGF0YS1zaG9ydGN1dD0nXCIrdmFsLnNob3J0Y3V0K1wiJyBcIjonJykrXCI+XCI7XG5cdFx0XHRcdFx0c3RyICs9IFwiPFwiK1wiYSBocmVmPScjJyByZWw9J1wiICsgKHZha2F0YV9jb250ZXh0Lml0ZW1zLmxlbmd0aCAtIDEpICsgXCInPlwiO1xuXHRcdFx0XHRcdGlmKCQudmFrYXRhLmNvbnRleHQuc2V0dGluZ3MuaWNvbnMpIHtcblx0XHRcdFx0XHRcdHN0ciArPSBcIjxcIitcImkgXCI7XG5cdFx0XHRcdFx0XHRpZih2YWwuaWNvbikge1xuXHRcdFx0XHRcdFx0XHRpZih2YWwuaWNvbi5pbmRleE9mKFwiL1wiKSAhPT0gLTEgfHwgdmFsLmljb24uaW5kZXhPZihcIi5cIikgIT09IC0xKSB7IHN0ciArPSBcIiBzdHlsZT0nYmFja2dyb3VuZDp1cmwoXFxcIlwiICsgdmFsLmljb24gKyBcIlxcXCIpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0JyBcIjsgfVxuXHRcdFx0XHRcdFx0XHRlbHNlIHsgc3RyICs9IFwiIGNsYXNzPSdcIiArIHZhbC5pY29uICsgXCInIFwiOyB9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzdHIgKz0gXCI+PFwiK1wiL2k+PFwiK1wic3BhbiBjbGFzcz0ndmFrYXRhLWNvbnRleHRtZW51LXNlcCc+JiMxNjA7PFwiK1wiL3NwYW4+XCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN0ciArPSB2YWwubGFiZWwgKyAodmFsLnNob3J0Y3V0PycgPHNwYW4gY2xhc3M9XCJ2YWthdGEtY29udGV4dG1lbnUtc2hvcnRjdXQgdmFrYXRhLWNvbnRleHRtZW51LXNob3J0Y3V0LScrdmFsLnNob3J0Y3V0KydcIj4nKyAodmFsLnNob3J0Y3V0X2xhYmVsIHx8ICcnKSArJzwvc3Bhbj4nOicnKSArIFwiPFwiK1wiL2E+XCI7XG5cdFx0XHRcdFx0aWYodmFsLnN1Ym1lbnUpIHtcblx0XHRcdFx0XHRcdHRtcCA9ICQudmFrYXRhLmNvbnRleHQuX3BhcnNlKHZhbC5zdWJtZW51LCB0cnVlKTtcblx0XHRcdFx0XHRcdGlmKHRtcCkgeyBzdHIgKz0gdG1wOyB9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN0ciArPSBcIjxcIitcIi9saT5cIjtcblx0XHRcdFx0XHRpZih2YWwuc2VwYXJhdG9yX2FmdGVyKSB7XG5cdFx0XHRcdFx0XHRzdHIgKz0gXCI8XCIrXCJsaSBjbGFzcz0ndmFrYXRhLWNvbnRleHQtc2VwYXJhdG9yJz48XCIrXCJhIGhyZWY9JyMnIFwiICsgKCQudmFrYXRhLmNvbnRleHQuc2V0dGluZ3MuaWNvbnMgPyAnJyA6ICdzdHlsZT1cIm1hcmdpbi1sZWZ0OjBweDtcIicpICsgXCI+JiMxNjA7PFwiK1wiL2E+PFwiK1wiL2xpPlwiO1xuXHRcdFx0XHRcdFx0c2VwID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzdHIgID0gc3RyLnJlcGxhY2UoLzxsaSBjbGFzc1xcPSd2YWthdGEtY29udGV4dC1zZXBhcmF0b3InXFw+PFxcL2xpXFw+JC8sXCJcIik7XG5cdFx0XHRcdGlmKGlzX2NhbGxiYWNrKSB7IHN0ciArPSBcIjwvdWw+XCI7IH1cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIHRyaWdnZXJlZCBvbiB0aGUgZG9jdW1lbnQgd2hlbiB0aGUgY29udGV4dG1lbnUgaXMgcGFyc2VkIChIVE1MIGlzIGJ1aWx0KVxuXHRcdFx0XHQgKiBAZXZlbnRcblx0XHRcdFx0ICogQHBsdWdpbiBjb250ZXh0bWVudVxuXHRcdFx0XHQgKiBAbmFtZSBjb250ZXh0X3BhcnNlLnZha2F0YVxuXHRcdFx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gcmVmZXJlbmNlIHRoZSBlbGVtZW50IHRoYXQgd2FzIHJpZ2h0IGNsaWNrZWRcblx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgdGhlIERPTSBlbGVtZW50IG9mIHRoZSBtZW51IGl0c2VsZlxuXHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gdGhlIHggJiB5IGNvb3JkaW5hdGVzIG9mIHRoZSBtZW51XG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRpZighaXNfY2FsbGJhY2spIHsgdmFrYXRhX2NvbnRleHQuaHRtbCA9IHN0cjsgJC52YWthdGEuY29udGV4dC5fdHJpZ2dlcihcInBhcnNlXCIpOyB9XG5cdFx0XHRcdHJldHVybiBzdHIubGVuZ3RoID4gMTAgPyBzdHIgOiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRfc2hvd19zdWJtZW51IDogZnVuY3Rpb24gKG8pIHtcblx0XHRcdFx0byA9ICQobyk7XG5cdFx0XHRcdGlmKCFvLmxlbmd0aCB8fCAhby5jaGlsZHJlbihcInVsXCIpLmxlbmd0aCkgeyByZXR1cm47IH1cblx0XHRcdFx0dmFyIGUgPSBvLmNoaWxkcmVuKFwidWxcIiksXG5cdFx0XHRcdFx0eCA9IG8ub2Zmc2V0KCkubGVmdCArIG8ub3V0ZXJXaWR0aCgpLFxuXHRcdFx0XHRcdHkgPSBvLm9mZnNldCgpLnRvcCxcblx0XHRcdFx0XHR3ID0gZS53aWR0aCgpLFxuXHRcdFx0XHRcdGggPSBlLmhlaWdodCgpLFxuXHRcdFx0XHRcdGR3ID0gJCh3aW5kb3cpLndpZHRoKCkgKyAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpLFxuXHRcdFx0XHRcdGRoID0gJCh3aW5kb3cpLmhlaWdodCgpICsgJCh3aW5kb3cpLnNjcm9sbFRvcCgpO1xuXHRcdFx0XHQvLyDQvNC+0LbQtSDQtNCwINGB0LUg0YHQv9C10YHRgtC4INC1INC10LTQvdCwINC/0YDQvtCy0LXRgNC60LAgLSDQtNCw0LvQuCDQvdGP0LzQsCDQvdGP0LrQvtC5INC+0YIg0LrQu9Cw0YHQvtCy0LXRgtC1INCy0LXRh9C1INC90LDQs9C+0YDQtVxuXHRcdFx0XHRpZihyaWdodF90b19sZWZ0KSB7XG5cdFx0XHRcdFx0b1t4IC0gKHcgKyAxMCArIG8ub3V0ZXJXaWR0aCgpKSA8IDAgPyBcImFkZENsYXNzXCIgOiBcInJlbW92ZUNsYXNzXCJdKFwidmFrYXRhLWNvbnRleHQtbGVmdFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRvW3ggKyB3ICsgMTAgPiBkdyA/IFwiYWRkQ2xhc3NcIiA6IFwicmVtb3ZlQ2xhc3NcIl0oXCJ2YWthdGEtY29udGV4dC1yaWdodFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZih5ICsgaCArIDEwID4gZGgpIHtcblx0XHRcdFx0XHRlLmNzcyhcImJvdHRvbVwiLFwiLTFweFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlLnNob3coKTtcblx0XHRcdH0sXG5cdFx0XHRzaG93IDogZnVuY3Rpb24gKHJlZmVyZW5jZSwgcG9zaXRpb24sIGRhdGEpIHtcblx0XHRcdFx0dmFyIG8sIGUsIHgsIHksIHcsIGgsIGR3LCBkaCwgY29uZCA9IHRydWU7XG5cdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0LmVsZW1lbnQgJiYgdmFrYXRhX2NvbnRleHQuZWxlbWVudC5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50LndpZHRoKCcnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzd2l0Y2goY29uZCkge1xuXHRcdFx0XHRcdGNhc2UgKCFwb3NpdGlvbiAmJiAhcmVmZXJlbmNlKTpcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRjYXNlICghIXBvc2l0aW9uICYmICEhcmVmZXJlbmNlKTpcblx0XHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LnJlZmVyZW5jZVx0PSByZWZlcmVuY2U7XG5cdFx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5wb3NpdGlvbl94XHQ9IHBvc2l0aW9uLng7XG5cdFx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5wb3NpdGlvbl95XHQ9IHBvc2l0aW9uLnk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICghcG9zaXRpb24gJiYgISFyZWZlcmVuY2UpOlxuXHRcdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQucmVmZXJlbmNlXHQ9IHJlZmVyZW5jZTtcblx0XHRcdFx0XHRcdG8gPSByZWZlcmVuY2Uub2Zmc2V0KCk7XG5cdFx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5wb3NpdGlvbl94XHQ9IG8ubGVmdCArIHJlZmVyZW5jZS5vdXRlckhlaWdodCgpO1xuXHRcdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQucG9zaXRpb25feVx0PSBvLnRvcDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgKCEhcG9zaXRpb24gJiYgIXJlZmVyZW5jZSk6XG5cdFx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5wb3NpdGlvbl94XHQ9IHBvc2l0aW9uLng7XG5cdFx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5wb3NpdGlvbl95XHQ9IHBvc2l0aW9uLnk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZighIXJlZmVyZW5jZSAmJiAhZGF0YSAmJiAkKHJlZmVyZW5jZSkuZGF0YSgndmFrYXRhX2NvbnRleHRtZW51JykpIHtcblx0XHRcdFx0XHRkYXRhID0gJChyZWZlcmVuY2UpLmRhdGEoJ3Zha2F0YV9jb250ZXh0bWVudScpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCQudmFrYXRhLmNvbnRleHQuX3BhcnNlKGRhdGEpKSB7XG5cdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudC5odG1sKHZha2F0YV9jb250ZXh0Lmh0bWwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0Lml0ZW1zLmxlbmd0aCkge1xuXHRcdFx0XHRcdGUgPSB2YWthdGFfY29udGV4dC5lbGVtZW50O1xuXHRcdFx0XHRcdHggPSB2YWthdGFfY29udGV4dC5wb3NpdGlvbl94O1xuXHRcdFx0XHRcdHkgPSB2YWthdGFfY29udGV4dC5wb3NpdGlvbl95O1xuXHRcdFx0XHRcdHcgPSBlLndpZHRoKCk7XG5cdFx0XHRcdFx0aCA9IGUuaGVpZ2h0KCk7XG5cdFx0XHRcdFx0ZHcgPSAkKHdpbmRvdykud2lkdGgoKSArICQod2luZG93KS5zY3JvbGxMZWZ0KCk7XG5cdFx0XHRcdFx0ZGggPSAkKHdpbmRvdykuaGVpZ2h0KCkgKyAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XG5cdFx0XHRcdFx0aWYocmlnaHRfdG9fbGVmdCkge1xuXHRcdFx0XHRcdFx0eCAtPSBlLm91dGVyV2lkdGgoKTtcblx0XHRcdFx0XHRcdGlmKHggPCAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpICsgMjApIHtcblx0XHRcdFx0XHRcdFx0eCA9ICQod2luZG93KS5zY3JvbGxMZWZ0KCkgKyAyMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoeCArIHcgKyAyMCA+IGR3KSB7XG5cdFx0XHRcdFx0XHR4ID0gZHcgLSAodyArIDIwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoeSArIGggKyAyMCA+IGRoKSB7XG5cdFx0XHRcdFx0XHR5ID0gZGggLSAoaCArIDIwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50XG5cdFx0XHRcdFx0XHQuY3NzKHsgXCJsZWZ0XCIgOiB4LCBcInRvcFwiIDogeSB9KVxuXHRcdFx0XHRcdFx0LnNob3coKVxuXHRcdFx0XHRcdFx0LmZpbmQoJ2E6ZXEoMCknKS5mb2N1cygpLnBhcmVudCgpLmFkZENsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIik7XG5cdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuaXNfdmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCB3aGVuIHRoZSBjb250ZXh0bWVudSBpcyBzaG93blxuXHRcdFx0XHRcdCAqIEBldmVudFxuXHRcdFx0XHRcdCAqIEBwbHVnaW4gY29udGV4dG1lbnVcblx0XHRcdFx0XHQgKiBAbmFtZSBjb250ZXh0X3Nob3cudmFrYXRhXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IHJlZmVyZW5jZSB0aGUgZWxlbWVudCB0aGF0IHdhcyByaWdodCBjbGlja2VkXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGVsZW1lbnQgdGhlIERPTSBlbGVtZW50IG9mIHRoZSBtZW51IGl0c2VsZlxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiB0aGUgeCAmIHkgY29vcmRpbmF0ZXMgb2YgdGhlIG1lbnVcblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHQkLnZha2F0YS5jb250ZXh0Ll90cmlnZ2VyKFwic2hvd1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGhpZGUgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0LmlzX3Zpc2libGUpIHtcblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50LmhpZGUoKS5maW5kKFwidWxcIikuaGlkZSgpLmVuZCgpLmZpbmQoJzpmb2N1cycpLmJsdXIoKTtcblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5pc192aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCB3aGVuIHRoZSBjb250ZXh0bWVudSBpcyBoaWRkZW5cblx0XHRcdFx0XHQgKiBAZXZlbnRcblx0XHRcdFx0XHQgKiBAcGx1Z2luIGNvbnRleHRtZW51XG5cdFx0XHRcdFx0ICogQG5hbWUgY29udGV4dF9oaWRlLnZha2F0YVxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSByZWZlcmVuY2UgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmlnaHQgY2xpY2tlZFxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IHRoZSBET00gZWxlbWVudCBvZiB0aGUgbWVudSBpdHNlbGZcblx0XHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gdGhlIHggJiB5IGNvb3JkaW5hdGVzIG9mIHRoZSBtZW51XG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0JC52YWthdGEuY29udGV4dC5fdHJpZ2dlcihcImhpZGVcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdCQoZnVuY3Rpb24gKCkge1xuXHRcdFx0cmlnaHRfdG9fbGVmdCA9ICQoXCJib2R5XCIpLmNzcyhcImRpcmVjdGlvblwiKSA9PT0gXCJydGxcIjtcblx0XHRcdHZhciB0byA9IGZhbHNlO1xuXG5cdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50ID0gJChcIjx1bCBjbGFzcz0ndmFrYXRhLWNvbnRleHQnPjwvdWw+XCIpO1xuXHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudFxuXHRcdFx0XHQub24oXCJtb3VzZWVudGVyXCIsIFwibGlcIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRcdFx0aWYoJC5jb250YWlucyh0aGlzLCBlLnJlbGF0ZWRUYXJnZXQpKSB7XG5cdFx0XHRcdFx0XHQvLyDQv9GA0LXQvNCw0YXQvdCw0YLQviDQt9Cw0YDQsNC00LggZGVsZWdhdGUgbW91c2VsZWF2ZSDQv9C+LdC00L7Qu9GDXG5cdFx0XHRcdFx0XHQvLyAkKHRoaXMpLmZpbmQoXCIudmFrYXRhLWNvbnRleHQtaG92ZXJcIikucmVtb3ZlQ2xhc3MoXCJ2YWthdGEtY29udGV4dC1ob3ZlclwiKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZih0bykgeyBjbGVhclRpbWVvdXQodG8pOyB9XG5cdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLnJlbW92ZUNsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIikuZW5kKCk7XG5cblx0XHRcdFx0XHQkKHRoaXMpXG5cdFx0XHRcdFx0XHQuc2libGluZ3MoKS5maW5kKFwidWxcIikuaGlkZSgpLmVuZCgpLmVuZCgpXG5cdFx0XHRcdFx0XHQucGFyZW50c1VudGlsKFwiLnZha2F0YS1jb250ZXh0XCIsIFwibGlcIikuYWRkQmFjaygpLmFkZENsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIik7XG5cdFx0XHRcdFx0JC52YWthdGEuY29udGV4dC5fc2hvd19zdWJtZW51KHRoaXMpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQvLyDRgtC10YHRgtC+0LLQviAtINC00LDQu9C4INC90LUg0L3QsNGC0L7QstCw0YDQstCwP1xuXHRcdFx0XHQub24oXCJtb3VzZWxlYXZlXCIsIFwibGlcIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRpZigkLmNvbnRhaW5zKHRoaXMsIGUucmVsYXRlZFRhcmdldCkpIHsgcmV0dXJuOyB9XG5cdFx0XHRcdFx0JCh0aGlzKS5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmFkZEJhY2soKS5yZW1vdmVDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQub24oXCJtb3VzZWxlYXZlXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0JCh0aGlzKS5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLnJlbW92ZUNsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIik7XG5cdFx0XHRcdFx0aWYoJC52YWthdGEuY29udGV4dC5zZXR0aW5ncy5oaWRlX29ubW91c2VsZWF2ZSkge1xuXHRcdFx0XHRcdFx0dG8gPSBzZXRUaW1lb3V0KFxuXHRcdFx0XHRcdFx0XHQoZnVuY3Rpb24gKHQpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkgeyAkLnZha2F0YS5jb250ZXh0LmhpZGUoKTsgfTtcblx0XHRcdFx0XHRcdFx0fSh0aGlzKSksICQudmFrYXRhLmNvbnRleHQuc2V0dGluZ3MuaGlkZV9vbm1vdXNlbGVhdmUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0Lm9uKFwiY2xpY2tcIiwgXCJhXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQub24oXCJtb3VzZXVwXCIsIFwiYVwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGlmKCEkKHRoaXMpLmJsdXIoKS5wYXJlbnQoKS5oYXNDbGFzcyhcInZha2F0YS1jb250ZXh0LWRpc2FibGVkXCIpICYmICQudmFrYXRhLmNvbnRleHQuX2V4ZWN1dGUoJCh0aGlzKS5hdHRyKFwicmVsXCIpKSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdCQudmFrYXRhLmNvbnRleHQuaGlkZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0Lm9uKCdrZXlkb3duJywgJ2EnLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0dmFyIG8gPSBudWxsO1xuXHRcdFx0XHRcdFx0c3dpdGNoKGUud2hpY2gpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSAxMzpcblx0XHRcdFx0XHRcdFx0Y2FzZSAzMjpcblx0XHRcdFx0XHRcdFx0XHRlLnR5cGUgPSBcIm1vdXNldXBcIjtcblx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0JChlLmN1cnJlbnRUYXJnZXQpLnRyaWdnZXIoZSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgMzc6XG5cdFx0XHRcdFx0XHRcdFx0aWYodmFrYXRhX2NvbnRleHQuaXNfdmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmxhc3QoKS5wYXJlbnRzKFwibGk6ZXEoMClcIikuZmluZChcInVsXCIpLmhpZGUoKS5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLnJlbW92ZUNsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIikuZW5kKCkuZW5kKCkuY2hpbGRyZW4oJ2EnKS5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgMzg6XG5cdFx0XHRcdFx0XHRcdFx0aWYodmFrYXRhX2NvbnRleHQuaXNfdmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0byA9IHZha2F0YV9jb250ZXh0LmVsZW1lbnQuZmluZChcInVsOnZpc2libGVcIikuYWRkQmFjaygpLmxhc3QoKS5jaGlsZHJlbihcIi52YWthdGEtY29udGV4dC1ob3ZlclwiKS5yZW1vdmVDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpLnByZXZBbGwoXCJsaTpub3QoLnZha2F0YS1jb250ZXh0LXNlcGFyYXRvcilcIikuZmlyc3QoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKCFvLmxlbmd0aCkgeyBvID0gdmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwidWw6dmlzaWJsZVwiKS5hZGRCYWNrKCkubGFzdCgpLmNoaWxkcmVuKFwibGk6bm90KC52YWthdGEtY29udGV4dC1zZXBhcmF0b3IpXCIpLmxhc3QoKTsgfVxuXHRcdFx0XHRcdFx0XHRcdFx0by5hZGRDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmNoaWxkcmVuKCdhJykuZm9jdXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlIDM5OlxuXHRcdFx0XHRcdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0LmlzX3Zpc2libGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LmVsZW1lbnQuZmluZChcIi52YWthdGEtY29udGV4dC1ob3ZlclwiKS5sYXN0KCkuY2hpbGRyZW4oXCJ1bFwiKS5zaG93KCkuY2hpbGRyZW4oXCJsaTpub3QoLnZha2F0YS1jb250ZXh0LXNlcGFyYXRvcilcIikucmVtb3ZlQ2xhc3MoXCJ2YWthdGEtY29udGV4dC1ob3ZlclwiKS5maXJzdCgpLmFkZENsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIikuY2hpbGRyZW4oJ2EnKS5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgNDA6XG5cdFx0XHRcdFx0XHRcdFx0aWYodmFrYXRhX2NvbnRleHQuaXNfdmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0byA9IHZha2F0YV9jb250ZXh0LmVsZW1lbnQuZmluZChcInVsOnZpc2libGVcIikuYWRkQmFjaygpLmxhc3QoKS5jaGlsZHJlbihcIi52YWthdGEtY29udGV4dC1ob3ZlclwiKS5yZW1vdmVDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpLm5leHRBbGwoXCJsaTpub3QoLnZha2F0YS1jb250ZXh0LXNlcGFyYXRvcilcIikuZmlyc3QoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKCFvLmxlbmd0aCkgeyBvID0gdmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwidWw6dmlzaWJsZVwiKS5hZGRCYWNrKCkubGFzdCgpLmNoaWxkcmVuKFwibGk6bm90KC52YWthdGEtY29udGV4dC1zZXBhcmF0b3IpXCIpLmZpcnN0KCk7IH1cblx0XHRcdFx0XHRcdFx0XHRcdG8uYWRkQ2xhc3MoXCJ2YWthdGEtY29udGV4dC1ob3ZlclwiKS5jaGlsZHJlbignYScpLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAyNzpcblx0XHRcdFx0XHRcdFx0XHQkLnZha2F0YS5jb250ZXh0LmhpZGUoKTtcblx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0Ly9jb25zb2xlLmxvZyhlLndoaWNoKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQub24oJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHR2YXIgYSA9IHZha2F0YV9jb250ZXh0LmVsZW1lbnQuZmluZCgnLnZha2F0YS1jb250ZXh0bWVudS1zaG9ydGN1dC0nICsgZS53aGljaCkucGFyZW50KCk7XG5cdFx0XHRcdFx0aWYoYS5wYXJlbnQoKS5ub3QoJy52YWthdGEtY29udGV4dC1kaXNhYmxlZCcpKSB7XG5cdFx0XHRcdFx0XHRhLm1vdXNldXAoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5hcHBlbmRUbyhcImJvZHlcIik7XG5cblx0XHRcdCQoZG9jdW1lbnQpXG5cdFx0XHRcdC5vbihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0LmlzX3Zpc2libGUgJiYgISQuY29udGFpbnModmFrYXRhX2NvbnRleHQuZWxlbWVudFswXSwgZS50YXJnZXQpKSB7ICQudmFrYXRhLmNvbnRleHQuaGlkZSgpOyB9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5vbihcImNvbnRleHRfc2hvdy52YWthdGFcIiwgZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50LmZpbmQoXCJsaTpoYXModWwpXCIpLmNoaWxkcmVuKFwiYVwiKS5hZGRDbGFzcyhcInZha2F0YS1jb250ZXh0LXBhcmVudFwiKTtcblx0XHRcdFx0XHRpZihyaWdodF90b19sZWZ0KSB7XG5cdFx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50LmFkZENsYXNzKFwidmFrYXRhLWNvbnRleHQtcnRsXCIpLmNzcyhcImRpcmVjdGlvblwiLCBcInJ0bFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gYWxzbyBhcHBseSBhIFJUTCBjbGFzcz9cblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50LmZpbmQoXCJ1bFwiKS5oaWRlKCkuZW5kKCk7XG5cdFx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9KCQpKTtcblx0Ly8gJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKFwiY29udGV4dG1lbnVcIik7XG5cbi8qKlxuICogIyMjIERyYWcnbidkcm9wIHBsdWdpblxuICpcbiAqIEVuYWJsZXMgZHJhZ2dpbmcgYW5kIGRyb3BwaW5nIG9mIG5vZGVzIGluIHRoZSB0cmVlLCByZXN1bHRpbmcgaW4gYSBtb3ZlIG9yIGNvcHkgb3BlcmF0aW9ucy5cbiAqL1xuXG5cdC8qKlxuXHQgKiBzdG9yZXMgYWxsIGRlZmF1bHRzIGZvciB0aGUgZHJhZyduJ2Ryb3AgcGx1Z2luXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmRuZFxuXHQgKiBAcGx1Z2luIGRuZFxuXHQgKi9cblx0JC5qc3RyZWUuZGVmYXVsdHMuZG5kID0ge1xuXHRcdC8qKlxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGEgY29weSBzaG91bGQgYmUgcG9zc2libGUgd2hpbGUgZHJhZ2dpbmcgKGJ5IHByZXNzaW50IHRoZSBtZXRhIGtleSBvciBDdHJsKS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmRuZC5jb3B5XG5cdFx0ICogQHBsdWdpbiBkbmRcblx0XHQgKi9cblx0XHRjb3B5IDogdHJ1ZSxcblx0XHQvKipcblx0XHQgKiBhIG51bWJlciBpbmRpY2F0aW5nIGhvdyBsb25nIGEgbm9kZSBzaG91bGQgcmVtYWluIGhvdmVyZWQgd2hpbGUgZHJhZ2dpbmcgdG8gYmUgb3BlbmVkLiBEZWZhdWx0cyB0byBgNTAwYC5cblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5kbmQub3Blbl90aW1lb3V0XG5cdFx0ICogQHBsdWdpbiBkbmRcblx0XHQgKi9cblx0XHRvcGVuX3RpbWVvdXQgOiA1MDAsXG5cdFx0LyoqXG5cdFx0ICogYSBmdW5jdGlvbiBpbnZva2VkIGVhY2ggdGltZSBhIG5vZGUgaXMgYWJvdXQgdG8gYmUgZHJhZ2dlZCwgaW52b2tlZCBpbiB0aGUgdHJlZSdzIHNjb3BlIGFuZCByZWNlaXZlcyB0aGUgbm9kZSBhcyBhbiBhcmd1bWVudCAtIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgZHJhZ2dpbmdcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5kbmQuaXNfZHJhZ2dhYmxlXG5cdFx0ICogQHBsdWdpbiBkbmRcblx0XHQgKi9cblx0XHRpc19kcmFnZ2FibGUgOiB0cnVlLFxuXHRcdC8qKlxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNoZWNrcyBzaG91bGQgY29uc3RhbnRseSBiZSBtYWRlIHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nIHRoZSBub2RlIChhcyBvcHBvc2VkIHRvIGNoZWNraW5nIG9ubHkgb24gZHJvcCksIGRlZmF1bHQgaXMgYHRydWVgXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuZG5kLmNoZWNrX3doaWxlX2RyYWdnaW5nXG5cdFx0ICogQHBsdWdpbiBkbmRcblx0XHQgKi9cblx0XHRjaGVja193aGlsZV9kcmFnZ2luZyA6IHRydWVcblx0fTtcblx0Ly8gVE9ETzogbm93IGNoZWNrIHdvcmtzIGJ5IGNoZWNraW5nIGZvciBlYWNoIG5vZGUgaW5kaXZpZHVhbGx5LCBob3cgYWJvdXQgbWF4X2NoaWxkcmVuLCB1bmlxdWUsIGV0Yz9cblx0Ly8gVE9ETzogZHJvcCBzb21ld2hlcmUgZWxzZSAtIG1heWJlIGRlbW8gb25seT9cblx0JC5qc3RyZWUucGx1Z2lucy5kbmQgPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyZW50KSB7XG5cdFx0dGhpcy5iaW5kID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cGFyZW50LmJpbmQuY2FsbCh0aGlzKTtcblxuXHRcdFx0dGhpcy5lbGVtZW50XG5cdFx0XHRcdC5vbignbW91c2Vkb3duIHRvdWNoc3RhcnQnLCAnLmpzdHJlZS1hbmNob3InLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0dmFyIG9iaiA9IHRoaXMuZ2V0X25vZGUoZS50YXJnZXQpLFxuXHRcdFx0XHRcdFx0bWx0ID0gdGhpcy5pc19zZWxlY3RlZChvYmopID8gdGhpcy5nZXRfc2VsZWN0ZWQoKS5sZW5ndGggOiAxO1xuXHRcdFx0XHRcdGlmKG9iaiAmJiBvYmouaWQgJiYgb2JqLmlkICE9PSBcIiNcIiAmJiAoZS53aGljaCA9PT0gMSB8fCBlLnR5cGUgPT09IFwidG91Y2hzdGFydFwiKSAmJlxuXHRcdFx0XHRcdFx0KHRoaXMuc2V0dGluZ3MuZG5kLmlzX2RyYWdnYWJsZSA9PT0gdHJ1ZSB8fCAoJC5pc0Z1bmN0aW9uKHRoaXMuc2V0dGluZ3MuZG5kLmlzX2RyYWdnYWJsZSkgJiYgdGhpcy5zZXR0aW5ncy5kbmQuaXNfZHJhZ2dhYmxlLmNhbGwodGhpcywgb2JqKSkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlcignbW91c2Vkb3duLmpzdHJlZScpO1xuXHRcdFx0XHRcdFx0cmV0dXJuICQudmFrYXRhLmRuZC5zdGFydChlLCB7ICdqc3RyZWUnIDogdHJ1ZSwgJ29yaWdpbicgOiB0aGlzLCAnb2JqJyA6IHRoaXMuZ2V0X25vZGUob2JqLHRydWUpLCAnbm9kZXMnIDogbWx0ID4gMSA/IHRoaXMuZ2V0X3NlbGVjdGVkKCkgOiBbb2JqLmlkXSB9LCAnPGRpdiBpZD1cImpzdHJlZS1kbmRcIiBjbGFzcz1cImpzdHJlZS0nICsgdGhpcy5nZXRfdGhlbWUoKSArICdcIj48aSBjbGFzcz1cImpzdHJlZS1pY29uIGpzdHJlZS1lclwiPjwvaT4nICsgKG1sdCA+IDEgPyBtbHQgKyAnICcgKyB0aGlzLmdldF9zdHJpbmcoJ25vZGVzJykgOiB0aGlzLmdldF90ZXh0KGUuY3VycmVudFRhcmdldCwgdHJ1ZSkpICsgJzxpbnMgY2xhc3M9XCJqc3RyZWUtY29weVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPis8L2lucz48L2Rpdj4nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIHRoaXMpKTtcblx0XHR9O1xuXHR9O1xuXG5cdCQoZnVuY3Rpb24oKSB7XG5cdFx0Ly8gYmluZCBvbmx5IG9uY2UgZm9yIGFsbCBpbnN0YW5jZXNcblx0XHR2YXIgbGFzdG12ID0gZmFsc2UsXG5cdFx0XHRsYXN0ZXIgPSBmYWxzZSxcblx0XHRcdG9wZW50byA9IGZhbHNlLFxuXHRcdFx0bWFya2VyID0gJCgnPGRpdiBpZD1cImpzdHJlZS1tYXJrZXJcIj4mIzE2MDs8L2Rpdj4nKS5oaWRlKCkuYXBwZW5kVG8oJ2JvZHknKTtcblxuXHRcdCQoZG9jdW1lbnQpXG5cdFx0XHQuYmluZCgnZG5kX3N0YXJ0LnZha2F0YScsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdGxhc3RtdiA9IGZhbHNlO1xuXHRcdFx0fSlcblx0XHRcdC5iaW5kKCdkbmRfbW92ZS52YWthdGEnLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xuXHRcdFx0XHRpZihvcGVudG8pIHsgY2xlYXJUaW1lb3V0KG9wZW50byk7IH1cblx0XHRcdFx0aWYoIWRhdGEuZGF0YS5qc3RyZWUpIHsgcmV0dXJuOyB9XG5cblx0XHRcdFx0Ly8gaWYgd2UgYXJlIGhvdmVyaW5nIHRoZSBtYXJrZXIgaW1hZ2UgZG8gbm90aGluZyAoY2FuIGhhcHBlbiBvbiBcImluc2lkZVwiIGRyYWdzKVxuXHRcdFx0XHRpZihkYXRhLmV2ZW50LnRhcmdldC5pZCAmJiBkYXRhLmV2ZW50LnRhcmdldC5pZCA9PT0gJ2pzdHJlZS1tYXJrZXInKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGlucyA9ICQuanN0cmVlLnJlZmVyZW5jZShkYXRhLmV2ZW50LnRhcmdldCksXG5cdFx0XHRcdFx0cmVmID0gZmFsc2UsXG5cdFx0XHRcdFx0b2ZmID0gZmFsc2UsXG5cdFx0XHRcdFx0cmVsID0gZmFsc2UsXG5cdFx0XHRcdFx0bCwgdCwgaCwgcCwgaSwgbywgb2ssIHQxLCB0Miwgb3AsIHBzLCBwcjtcblx0XHRcdFx0Ly8gaWYgd2UgYXJlIG92ZXIgYW4gaW5zdGFuY2Vcblx0XHRcdFx0aWYoaW5zICYmIGlucy5fZGF0YSAmJiBpbnMuX2RhdGEuZG5kKSB7XG5cdFx0XHRcdFx0bWFya2VyLmF0dHIoJ2NsYXNzJywgJ2pzdHJlZS0nICsgaW5zLmdldF90aGVtZSgpKTtcblx0XHRcdFx0XHRkYXRhLmhlbHBlclxuXHRcdFx0XHRcdFx0LmNoaWxkcmVuKCkuYXR0cignY2xhc3MnLCAnanN0cmVlLScgKyBpbnMuZ2V0X3RoZW1lKCkpXG5cdFx0XHRcdFx0XHQuZmluZCgnLmpzdHJlZS1jb3B5OmVxKDApJylbIGRhdGEuZGF0YS5vcmlnaW4gJiYgZGF0YS5kYXRhLm9yaWdpbi5zZXR0aW5ncy5kbmQuY29weSAmJiAoZGF0YS5ldmVudC5tZXRhS2V5IHx8IGRhdGEuZXZlbnQuY3RybEtleSkgPyAnc2hvdycgOiAnaGlkZScgXSgpO1xuXG5cblx0XHRcdFx0XHQvLyBpZiBhcmUgaG92ZXJpbmcgdGhlIGNvbnRhaW5lciBpdHNlbGYgYWRkIGEgbmV3IHJvb3Qgbm9kZVxuXHRcdFx0XHRcdGlmKCAoZGF0YS5ldmVudC50YXJnZXQgPT09IGlucy5lbGVtZW50WzBdIHx8IGRhdGEuZXZlbnQudGFyZ2V0ID09PSBpbnMuZ2V0X2NvbnRhaW5lcl91bCgpWzBdKSAmJiBpbnMuZ2V0X2NvbnRhaW5lcl91bCgpLmNoaWxkcmVuKCkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRvayA9IHRydWU7XG5cdFx0XHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IGRhdGEuZGF0YS5ub2Rlcy5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0XHRcdFx0b2sgPSBvayAmJiBpbnMuY2hlY2soIChkYXRhLmRhdGEub3JpZ2luICYmIGRhdGEuZGF0YS5vcmlnaW4uc2V0dGluZ3MuZG5kLmNvcHkgJiYgKGRhdGEuZXZlbnQubWV0YUtleSB8fCBkYXRhLmV2ZW50LmN0cmxLZXkpID8gXCJjb3B5X25vZGVcIiA6IFwibW92ZV9ub2RlXCIpLCAoZGF0YS5kYXRhLm9yaWdpbiAmJiBkYXRhLmRhdGEub3JpZ2luICE9PSBpbnMgPyBkYXRhLmRhdGEub3JpZ2luLmdldF9ub2RlKGRhdGEuZGF0YS5ub2Rlc1t0MV0pIDogZGF0YS5kYXRhLm5vZGVzW3QxXSksICcjJywgJ2xhc3QnKTtcblx0XHRcdFx0XHRcdFx0aWYoIW9rKSB7IGJyZWFrOyB9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZihvaykge1xuXHRcdFx0XHRcdFx0XHRsYXN0bXYgPSB7ICdpbnMnIDogaW5zLCAncGFyJyA6ICcjJywgJ3BvcycgOiAnbGFzdCcgfTtcblx0XHRcdFx0XHRcdFx0bWFya2VyLmhpZGUoKTtcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWxwZXIuZmluZCgnLmpzdHJlZS1pY29uOmVxKDApJykucmVtb3ZlQ2xhc3MoJ2pzdHJlZS1lcicpLmFkZENsYXNzKCdqc3RyZWUtb2snKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdC8vIGlmIHdlIGFyZSBob3ZlcmluZyBhIHRyZWUgbm9kZVxuXHRcdFx0XHRcdFx0cmVmID0gJChkYXRhLmV2ZW50LnRhcmdldCkuY2xvc2VzdCgnYScpO1xuXHRcdFx0XHRcdFx0aWYocmVmICYmIHJlZi5sZW5ndGggJiYgcmVmLnBhcmVudCgpLmlzKCcuanN0cmVlLWNsb3NlZCwgLmpzdHJlZS1vcGVuLCAuanN0cmVlLWxlYWYnKSkge1xuXHRcdFx0XHRcdFx0XHRvZmYgPSByZWYub2Zmc2V0KCk7XG5cdFx0XHRcdFx0XHRcdHJlbCA9IGRhdGEuZXZlbnQucGFnZVkgLSBvZmYudG9wO1xuXHRcdFx0XHRcdFx0XHRoID0gcmVmLmhlaWdodCgpO1xuXHRcdFx0XHRcdFx0XHRpZihyZWwgPCBoIC8gMykge1xuXHRcdFx0XHRcdFx0XHRcdG8gPSBbJ2InLCAnaScsICdhJ107XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSBpZihyZWwgPiBoIC0gaCAvIDMpIHtcblx0XHRcdFx0XHRcdFx0XHRvID0gWydhJywgJ2knLCAnYiddO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG8gPSByZWwgPiBoIC8gMiA/IFsnaScsICdhJywgJ2InXSA6IFsnaScsICdiJywgJ2EnXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQkLmVhY2gobywgZnVuY3Rpb24gKGosIHYpIHtcblx0XHRcdFx0XHRcdFx0XHRzd2l0Y2godikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAnYic6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGwgPSBvZmYubGVmdCAtIDY7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHQgPSBvZmYudG9wIC0gNTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cCA9IGlucy5nZXRfcGFyZW50KHJlZik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGkgPSByZWYucGFyZW50KCkuaW5kZXgoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlICdpJzpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bCA9IG9mZi5sZWZ0IC0gMjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dCA9IG9mZi50b3AgLSA1ICsgaCAvIDIgKyAxO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRwID0gcmVmLnBhcmVudCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlICdhJzpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bCA9IG9mZi5sZWZ0IC0gNjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dCA9IG9mZi50b3AgLSA1ICsgaDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cCA9IGlucy5nZXRfcGFyZW50KHJlZik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGkgPSByZWYucGFyZW50KCkuaW5kZXgoKSArIDE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvKiFcblx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBtb3ZpbmcgaW5zaWRlLCBidXQgdGhlIG5vZGUgaXMgbm90IHlldCBsb2FkZWQ/XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGNoZWNrIHdpbGwgd29yayBhbnl3YXksIGFzIHdoZW4gbW92aW5nIHRoZSBub2RlIHdpbGwgYmUgbG9hZGVkIGZpcnN0IGFuZCBjaGVja2VkIGFnYWluXG5cdFx0XHRcdFx0XHRcdFx0aWYodiA9PT0gJ2knICYmICFpbnMuaXNfbG9hZGVkKHApKSB7IH1cblx0XHRcdFx0XHRcdFx0XHQqL1xuXHRcdFx0XHRcdFx0XHRcdG9rID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IGRhdGEuZGF0YS5ub2Rlcy5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9wID0gZGF0YS5kYXRhLm9yaWdpbiAmJiBkYXRhLmRhdGEub3JpZ2luLnNldHRpbmdzLmRuZC5jb3B5ICYmIChkYXRhLmV2ZW50Lm1ldGFLZXkgfHwgZGF0YS5ldmVudC5jdHJsS2V5KSA/IFwiY29weV9ub2RlXCIgOiBcIm1vdmVfbm9kZVwiO1xuXHRcdFx0XHRcdFx0XHRcdFx0cHMgPSBpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYob3AgPT09IFwibW92ZV9ub2RlXCIgJiYgdiA9PT0gJ2EnICYmIChkYXRhLmRhdGEub3JpZ2luICYmIGRhdGEuZGF0YS5vcmlnaW4gPT09IGlucykgJiYgcCA9PT0gaW5zLmdldF9wYXJlbnQoZGF0YS5kYXRhLm5vZGVzW3QxXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHIgPSBpbnMuZ2V0X25vZGUocCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmKHBzID4gJC5pbkFycmF5KGRhdGEuZGF0YS5ub2Rlc1t0MV0sIHByLmNoaWxkcmVuKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBzIC09IDE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdG9rID0gb2sgJiYgKCAoaW5zICYmIGlucy5zZXR0aW5ncyAmJiBpbnMuc2V0dGluZ3MuZG5kICYmIGlucy5zZXR0aW5ncy5kbmQuY2hlY2tfd2hpbGVfZHJhZ2dpbmcgPT09IGZhbHNlKSB8fCBpbnMuY2hlY2sob3AsIChkYXRhLmRhdGEub3JpZ2luICYmIGRhdGEuZGF0YS5vcmlnaW4gIT09IGlucyA/IGRhdGEuZGF0YS5vcmlnaW4uZ2V0X25vZGUoZGF0YS5kYXRhLm5vZGVzW3QxXSkgOiBkYXRhLmRhdGEubm9kZXNbdDFdKSwgcCwgcHMpICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZighb2spIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYoaW5zICYmIGlucy5sYXN0X2Vycm9yKSB7IGxhc3RlciA9IGlucy5sYXN0X2Vycm9yKCk7IH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmKG9rKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZih2ID09PSAnaScgJiYgcmVmLnBhcmVudCgpLmlzKCcuanN0cmVlLWNsb3NlZCcpICYmIGlucy5zZXR0aW5ncy5kbmQub3Blbl90aW1lb3V0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9wZW50byA9IHNldFRpbWVvdXQoKGZ1bmN0aW9uICh4LCB6KSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHgub3Blbl9ub2RlKHopOyB9OyB9KGlucywgcmVmKSksIGlucy5zZXR0aW5ncy5kbmQub3Blbl90aW1lb3V0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGxhc3RtdiA9IHsgJ2lucycgOiBpbnMsICdwYXInIDogcCwgJ3BvcycgOiBpIH07XG5cdFx0XHRcdFx0XHRcdFx0XHRtYXJrZXIuY3NzKHsgJ2xlZnQnIDogbCArICdweCcsICd0b3AnIDogdCArICdweCcgfSkuc2hvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YS5oZWxwZXIuZmluZCgnLmpzdHJlZS1pY29uOmVxKDApJykucmVtb3ZlQ2xhc3MoJ2pzdHJlZS1lcicpLmFkZENsYXNzKCdqc3RyZWUtb2snKTtcblx0XHRcdFx0XHRcdFx0XHRcdGxhc3RlciA9IHt9O1xuXHRcdFx0XHRcdFx0XHRcdFx0byA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYobyA9PT0gdHJ1ZSkgeyByZXR1cm47IH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0bGFzdG12ID0gZmFsc2U7XG5cdFx0XHRcdGRhdGEuaGVscGVyLmZpbmQoJy5qc3RyZWUtaWNvbicpLnJlbW92ZUNsYXNzKCdqc3RyZWUtb2snKS5hZGRDbGFzcygnanN0cmVlLWVyJyk7XG5cdFx0XHRcdG1hcmtlci5oaWRlKCk7XG5cdFx0XHR9KVxuXHRcdFx0LmJpbmQoJ2RuZF9zY3JvbGwudmFrYXRhJywgZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0aWYoIWRhdGEuZGF0YS5qc3RyZWUpIHsgcmV0dXJuOyB9XG5cdFx0XHRcdG1hcmtlci5oaWRlKCk7XG5cdFx0XHRcdGxhc3RtdiA9IGZhbHNlO1xuXHRcdFx0XHRkYXRhLmhlbHBlci5maW5kKCcuanN0cmVlLWljb246ZXEoMCknKS5yZW1vdmVDbGFzcygnanN0cmVlLW9rJykuYWRkQ2xhc3MoJ2pzdHJlZS1lcicpO1xuXHRcdFx0fSlcblx0XHRcdC5iaW5kKCdkbmRfc3RvcC52YWthdGEnLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xuXHRcdFx0XHRpZihvcGVudG8pIHsgY2xlYXJUaW1lb3V0KG9wZW50byk7IH1cblx0XHRcdFx0aWYoIWRhdGEuZGF0YS5qc3RyZWUpIHsgcmV0dXJuOyB9XG5cdFx0XHRcdG1hcmtlci5oaWRlKCk7XG5cdFx0XHRcdHZhciBpLCBqLCBub2RlcyA9IFtdO1xuXHRcdFx0XHRpZihsYXN0bXYpIHtcblx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkYXRhLmRhdGEubm9kZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0XHRub2Rlc1tpXSA9IGRhdGEuZGF0YS5vcmlnaW4gPyBkYXRhLmRhdGEub3JpZ2luLmdldF9ub2RlKGRhdGEuZGF0YS5ub2Rlc1tpXSkgOiBkYXRhLmRhdGEubm9kZXNbaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxhc3Rtdi5pbnNbIGRhdGEuZGF0YS5vcmlnaW4gJiYgZGF0YS5kYXRhLm9yaWdpbi5zZXR0aW5ncy5kbmQuY29weSAmJiAoZGF0YS5ldmVudC5tZXRhS2V5IHx8IGRhdGEuZXZlbnQuY3RybEtleSkgPyAnY29weV9ub2RlJyA6ICdtb3ZlX25vZGUnIF0obm9kZXMsIGxhc3Rtdi5wYXIsIGxhc3Rtdi5wb3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGkgPSAkKGRhdGEuZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuanN0cmVlJyk7XG5cdFx0XHRcdFx0aWYoaS5sZW5ndGggJiYgbGFzdGVyICYmIGxhc3Rlci5lcnJvciAmJiBsYXN0ZXIuZXJyb3IgPT09ICdjaGVjaycpIHtcblx0XHRcdFx0XHRcdGkgPSBpLmpzdHJlZSh0cnVlKTtcblx0XHRcdFx0XHRcdGlmKGkpIHtcblx0XHRcdFx0XHRcdFx0aS5zZXR0aW5ncy5jb3JlLmVycm9yLmNhbGwodGhpcywgbGFzdGVyKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuYmluZCgna2V5dXAga2V5ZG93bicsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdGRhdGEgPSAkLnZha2F0YS5kbmQuX2dldCgpO1xuXHRcdFx0XHRpZihkYXRhLmRhdGEgJiYgZGF0YS5kYXRhLmpzdHJlZSkge1xuXHRcdFx0XHRcdGRhdGEuaGVscGVyLmZpbmQoJy5qc3RyZWUtY29weTplcSgwKScpWyBkYXRhLmRhdGEub3JpZ2luICYmIGRhdGEuZGF0YS5vcmlnaW4uc2V0dGluZ3MuZG5kLmNvcHkgJiYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpID8gJ3Nob3cnIDogJ2hpZGUnIF0oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH0pO1xuXG5cdC8vIGhlbHBlcnNcblx0KGZ1bmN0aW9uICgkKSB7XG5cdFx0JC5mbi52YWthdGFfcmV2ZXJzZSA9IFtdLnJldmVyc2U7XG5cdFx0Ly8gcHJpdmF0ZSB2YXJpYWJsZVxuXHRcdHZhciB2YWthdGFfZG5kID0ge1xuXHRcdFx0ZWxlbWVudFx0OiBmYWxzZSxcblx0XHRcdGlzX2Rvd25cdDogZmFsc2UsXG5cdFx0XHRpc19kcmFnXHQ6IGZhbHNlLFxuXHRcdFx0aGVscGVyXHQ6IGZhbHNlLFxuXHRcdFx0aGVscGVyX3c6IDAsXG5cdFx0XHRkYXRhXHQ6IGZhbHNlLFxuXHRcdFx0aW5pdF94XHQ6IDAsXG5cdFx0XHRpbml0X3lcdDogMCxcblx0XHRcdHNjcm9sbF9sOiAwLFxuXHRcdFx0c2Nyb2xsX3Q6IDAsXG5cdFx0XHRzY3JvbGxfZTogZmFsc2UsXG5cdFx0XHRzY3JvbGxfaTogZmFsc2Vcblx0XHR9O1xuXHRcdCQudmFrYXRhLmRuZCA9IHtcblx0XHRcdHNldHRpbmdzIDoge1xuXHRcdFx0XHRzY3JvbGxfc3BlZWRcdFx0OiAxMCxcblx0XHRcdFx0c2Nyb2xsX3Byb3hpbWl0eVx0OiAyMCxcblx0XHRcdFx0aGVscGVyX2xlZnRcdFx0XHQ6IDUsXG5cdFx0XHRcdGhlbHBlcl90b3BcdFx0XHQ6IDEwLFxuXHRcdFx0XHR0aHJlc2hvbGRcdFx0XHQ6IDVcblx0XHRcdH0sXG5cdFx0XHRfdHJpZ2dlciA6IGZ1bmN0aW9uIChldmVudF9uYW1lLCBlKSB7XG5cdFx0XHRcdHZhciBkYXRhID0gJC52YWthdGEuZG5kLl9nZXQoKTtcblx0XHRcdFx0ZGF0YS5ldmVudCA9IGU7XG5cdFx0XHRcdCQoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKFwiZG5kX1wiICsgZXZlbnRfbmFtZSArIFwiLnZha2F0YVwiLCBkYXRhKTtcblx0XHRcdH0sXG5cdFx0XHRfZ2V0IDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFwiZGF0YVwiXHRcdDogdmFrYXRhX2RuZC5kYXRhLFxuXHRcdFx0XHRcdFwiZWxlbWVudFwiXHQ6IHZha2F0YV9kbmQuZWxlbWVudCxcblx0XHRcdFx0XHRcImhlbHBlclwiXHQ6IHZha2F0YV9kbmQuaGVscGVyXG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdFx0X2NsZWFuIDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZih2YWthdGFfZG5kLmhlbHBlcikgeyB2YWthdGFfZG5kLmhlbHBlci5yZW1vdmUoKTsgfVxuXHRcdFx0XHRpZih2YWthdGFfZG5kLnNjcm9sbF9pKSB7IGNsZWFySW50ZXJ2YWwodmFrYXRhX2RuZC5zY3JvbGxfaSk7IHZha2F0YV9kbmQuc2Nyb2xsX2kgPSBmYWxzZTsgfVxuXHRcdFx0XHR2YWthdGFfZG5kID0ge1xuXHRcdFx0XHRcdGVsZW1lbnRcdDogZmFsc2UsXG5cdFx0XHRcdFx0aXNfZG93blx0OiBmYWxzZSxcblx0XHRcdFx0XHRpc19kcmFnXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdGhlbHBlclx0OiBmYWxzZSxcblx0XHRcdFx0XHRoZWxwZXJfdzogMCxcblx0XHRcdFx0XHRkYXRhXHQ6IGZhbHNlLFxuXHRcdFx0XHRcdGluaXRfeFx0OiAwLFxuXHRcdFx0XHRcdGluaXRfeVx0OiAwLFxuXHRcdFx0XHRcdHNjcm9sbF9sOiAwLFxuXHRcdFx0XHRcdHNjcm9sbF90OiAwLFxuXHRcdFx0XHRcdHNjcm9sbF9lOiBmYWxzZSxcblx0XHRcdFx0XHRzY3JvbGxfaTogZmFsc2Vcblx0XHRcdFx0fTtcblx0XHRcdFx0JChkb2N1bWVudCkub2ZmKFwibW91c2Vtb3ZlIHRvdWNobW92ZVwiLCAkLnZha2F0YS5kbmQuZHJhZyk7XG5cdFx0XHRcdCQoZG9jdW1lbnQpLm9mZihcIm1vdXNldXAgdG91Y2hlbmRcIiwgJC52YWthdGEuZG5kLnN0b3ApO1xuXHRcdFx0fSxcblx0XHRcdF9zY3JvbGwgOiBmdW5jdGlvbiAoaW5pdF9vbmx5KSB7XG5cdFx0XHRcdGlmKCF2YWthdGFfZG5kLnNjcm9sbF9lIHx8ICghdmFrYXRhX2RuZC5zY3JvbGxfbCAmJiAhdmFrYXRhX2RuZC5zY3JvbGxfdCkpIHtcblx0XHRcdFx0XHRpZih2YWthdGFfZG5kLnNjcm9sbF9pKSB7IGNsZWFySW50ZXJ2YWwodmFrYXRhX2RuZC5zY3JvbGxfaSk7IHZha2F0YV9kbmQuc2Nyb2xsX2kgPSBmYWxzZTsgfVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZighdmFrYXRhX2RuZC5zY3JvbGxfaSkge1xuXHRcdFx0XHRcdHZha2F0YV9kbmQuc2Nyb2xsX2kgPSBzZXRJbnRlcnZhbCgkLnZha2F0YS5kbmQuX3Njcm9sbCwgMTAwKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoaW5pdF9vbmx5ID09PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdFx0XHRcdHZhciBpID0gdmFrYXRhX2RuZC5zY3JvbGxfZS5zY3JvbGxUb3AoKSxcblx0XHRcdFx0XHRqID0gdmFrYXRhX2RuZC5zY3JvbGxfZS5zY3JvbGxMZWZ0KCk7XG5cdFx0XHRcdHZha2F0YV9kbmQuc2Nyb2xsX2Uuc2Nyb2xsVG9wKGkgKyB2YWthdGFfZG5kLnNjcm9sbF90ICogJC52YWthdGEuZG5kLnNldHRpbmdzLnNjcm9sbF9zcGVlZCk7XG5cdFx0XHRcdHZha2F0YV9kbmQuc2Nyb2xsX2Uuc2Nyb2xsTGVmdChqICsgdmFrYXRhX2RuZC5zY3JvbGxfbCAqICQudmFrYXRhLmRuZC5zZXR0aW5ncy5zY3JvbGxfc3BlZWQpO1xuXHRcdFx0XHRpZihpICE9PSB2YWthdGFfZG5kLnNjcm9sbF9lLnNjcm9sbFRvcCgpIHx8IGogIT09IHZha2F0YV9kbmQuc2Nyb2xsX2Uuc2Nyb2xsTGVmdCgpKSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCB3aGVuIGEgZHJhZyBjYXVzZXMgYW4gZWxlbWVudCB0byBzY3JvbGxcblx0XHRcdFx0XHQgKiBAZXZlbnRcblx0XHRcdFx0XHQgKiBAcGx1Z2luIGRuZFxuXHRcdFx0XHRcdCAqIEBuYW1lIGRuZF9zY3JvbGwudmFrYXRhXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtNaXhlZH0gZGF0YSBhbnkgZGF0YSBzdXBwbGllZCB3aXRoIHRoZSBjYWxsIHRvICQudmFrYXRhLmRuZC5zdGFydFxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7RE9NfSBlbGVtZW50IHRoZSBET00gZWxlbWVudCBiZWluZyBkcmFnZ2VkXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGhlbHBlciB0aGUgaGVscGVyIHNob3duIG5leHQgdG8gdGhlIG1vdXNlXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGV2ZW50IHRoZSBlbGVtZW50IHRoYXQgaXMgc2Nyb2xsaW5nXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0JC52YWthdGEuZG5kLl90cmlnZ2VyKFwic2Nyb2xsXCIsIHZha2F0YV9kbmQuc2Nyb2xsX2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c3RhcnQgOiBmdW5jdGlvbiAoZSwgZGF0YSwgaHRtbCkge1xuXHRcdFx0XHRpZihlLnR5cGUgPT09IFwidG91Y2hzdGFydFwiICYmIGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKSB7XG5cdFx0XHRcdFx0ZS5wYWdlWCA9IGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDtcblx0XHRcdFx0XHRlLnBhZ2VZID0gZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZO1xuXHRcdFx0XHRcdGUudGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQsIGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYodmFrYXRhX2RuZC5pc19kcmFnKSB7ICQudmFrYXRhLmRuZC5zdG9wKHt9KTsgfVxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGUuY3VycmVudFRhcmdldC51bnNlbGVjdGFibGUgPSBcIm9uXCI7XG5cdFx0XHRcdFx0ZS5jdXJyZW50VGFyZ2V0Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXHRcdFx0XHRcdGlmKGUuY3VycmVudFRhcmdldC5zdHlsZSkgeyBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuTW96VXNlclNlbGVjdCA9IFwibm9uZVwiOyB9XG5cdFx0XHRcdH0gY2F0Y2goaWdub3JlKSB7IH1cblx0XHRcdFx0dmFrYXRhX2RuZC5pbml0X3hcdD0gZS5wYWdlWDtcblx0XHRcdFx0dmFrYXRhX2RuZC5pbml0X3lcdD0gZS5wYWdlWTtcblx0XHRcdFx0dmFrYXRhX2RuZC5kYXRhXHRcdD0gZGF0YTtcblx0XHRcdFx0dmFrYXRhX2RuZC5pc19kb3duXHQ9IHRydWU7XG5cdFx0XHRcdHZha2F0YV9kbmQuZWxlbWVudFx0PSBlLmN1cnJlbnRUYXJnZXQ7XG5cdFx0XHRcdGlmKGh0bWwgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0dmFrYXRhX2RuZC5oZWxwZXIgPSAkKFwiPGRpdiBpZD0ndmFrYXRhLWRuZCc+PC9kaXY+XCIpLmh0bWwoaHRtbCkuY3NzKHtcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiXHRcdDogXCJibG9ja1wiLFxuXHRcdFx0XHRcdFx0XCJtYXJnaW5cIlx0XHQ6IFwiMFwiLFxuXHRcdFx0XHRcdFx0XCJwYWRkaW5nXCJcdFx0OiBcIjBcIixcblx0XHRcdFx0XHRcdFwicG9zaXRpb25cIlx0XHQ6IFwiYWJzb2x1dGVcIixcblx0XHRcdFx0XHRcdFwidG9wXCJcdFx0XHQ6IFwiLTIwMDBweFwiLFxuXHRcdFx0XHRcdFx0XCJsaW5lSGVpZ2h0XCJcdDogXCIxNnB4XCIsXG5cdFx0XHRcdFx0XHRcInpJbmRleFwiXHRcdDogXCIxMDAwMFwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JChkb2N1bWVudCkuYmluZChcIm1vdXNlbW92ZSB0b3VjaG1vdmVcIiwgJC52YWthdGEuZG5kLmRyYWcpO1xuXHRcdFx0XHQkKGRvY3VtZW50KS5iaW5kKFwibW91c2V1cCB0b3VjaGVuZFwiLCAkLnZha2F0YS5kbmQuc3RvcCk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRkcmFnIDogZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0aWYoZS50eXBlID09PSBcInRvdWNobW92ZVwiICYmIGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKSB7XG5cdFx0XHRcdFx0ZS5wYWdlWCA9IGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDtcblx0XHRcdFx0XHRlLnBhZ2VZID0gZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZO1xuXHRcdFx0XHRcdGUudGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQsIGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoIXZha2F0YV9kbmQuaXNfZG93bikgeyByZXR1cm47IH1cblx0XHRcdFx0aWYoIXZha2F0YV9kbmQuaXNfZHJhZykge1xuXHRcdFx0XHRcdGlmKFxuXHRcdFx0XHRcdFx0TWF0aC5hYnMoZS5wYWdlWCAtIHZha2F0YV9kbmQuaW5pdF94KSA+ICQudmFrYXRhLmRuZC5zZXR0aW5ncy50aHJlc2hvbGQgfHxcblx0XHRcdFx0XHRcdE1hdGguYWJzKGUucGFnZVkgLSB2YWthdGFfZG5kLmluaXRfeSkgPiAkLnZha2F0YS5kbmQuc2V0dGluZ3MudGhyZXNob2xkXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRpZih2YWthdGFfZG5kLmhlbHBlcikge1xuXHRcdFx0XHRcdFx0XHR2YWthdGFfZG5kLmhlbHBlci5hcHBlbmRUbyhcImJvZHlcIik7XG5cdFx0XHRcdFx0XHRcdHZha2F0YV9kbmQuaGVscGVyX3cgPSB2YWthdGFfZG5kLmhlbHBlci5vdXRlcldpZHRoKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR2YWthdGFfZG5kLmlzX2RyYWcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0XHQgKiB0cmlnZ2VyZWQgb24gdGhlIGRvY3VtZW50IHdoZW4gYSBkcmFnIHN0YXJ0c1xuXHRcdFx0XHRcdFx0ICogQGV2ZW50XG5cdFx0XHRcdFx0XHQgKiBAcGx1Z2luIGRuZFxuXHRcdFx0XHRcdFx0ICogQG5hbWUgZG5kX3N0YXJ0LnZha2F0YVxuXHRcdFx0XHRcdFx0ICogQHBhcmFtIHtNaXhlZH0gZGF0YSBhbnkgZGF0YSBzdXBwbGllZCB3aXRoIHRoZSBjYWxsIHRvICQudmFrYXRhLmRuZC5zdGFydFxuXHRcdFx0XHRcdFx0ICogQHBhcmFtIHtET019IGVsZW1lbnQgdGhlIERPTSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcblx0XHRcdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBoZWxwZXIgdGhlIGhlbHBlciBzaG93biBuZXh0IHRvIHRoZSBtb3VzZVxuXHRcdFx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IHRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGUgc3RhcnQgKHByb2JhYmx5IG1vdXNlbW92ZSlcblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0JC52YWthdGEuZG5kLl90cmlnZ2VyKFwic3RhcnRcIiwgZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgeyByZXR1cm47IH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBkICA9IGZhbHNlLCB3ICA9IGZhbHNlLFxuXHRcdFx0XHRcdGRoID0gZmFsc2UsIHdoID0gZmFsc2UsXG5cdFx0XHRcdFx0ZHcgPSBmYWxzZSwgd3cgPSBmYWxzZSxcblx0XHRcdFx0XHRkdCA9IGZhbHNlLCBkbCA9IGZhbHNlLFxuXHRcdFx0XHRcdGh0ID0gZmFsc2UsIGhsID0gZmFsc2U7XG5cblx0XHRcdFx0dmFrYXRhX2RuZC5zY3JvbGxfdCA9IDA7XG5cdFx0XHRcdHZha2F0YV9kbmQuc2Nyb2xsX2wgPSAwO1xuXHRcdFx0XHR2YWthdGFfZG5kLnNjcm9sbF9lID0gZmFsc2U7XG5cdFx0XHRcdCQoZS50YXJnZXQpXG5cdFx0XHRcdFx0LnBhcmVudHNVbnRpbChcImJvZHlcIikuYWRkQmFjaygpLnZha2F0YV9yZXZlcnNlKClcblx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVyblx0KC9eYXV0b3xzY3JvbGwkLykudGVzdCgkKHRoaXMpLmNzcyhcIm92ZXJmbG93XCIpKSAmJlxuXHRcdFx0XHRcdFx0XHRcdCh0aGlzLnNjcm9sbEhlaWdodCA+IHRoaXMub2Zmc2V0SGVpZ2h0IHx8IHRoaXMuc2Nyb2xsV2lkdGggPiB0aGlzLm9mZnNldFdpZHRoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHZhciB0ID0gJCh0aGlzKSwgbyA9IHQub2Zmc2V0KCk7XG5cdFx0XHRcdFx0XHRpZih0aGlzLnNjcm9sbEhlaWdodCA+IHRoaXMub2Zmc2V0SGVpZ2h0KSB7XG5cdFx0XHRcdFx0XHRcdGlmKG8udG9wICsgdC5oZWlnaHQoKSAtIGUucGFnZVkgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdHsgdmFrYXRhX2RuZC5zY3JvbGxfdCA9IDE7IH1cblx0XHRcdFx0XHRcdFx0aWYoZS5wYWdlWSAtIG8udG9wIDwgJC52YWthdGEuZG5kLnNldHRpbmdzLnNjcm9sbF9wcm94aW1pdHkpXHRcdFx0XHR7IHZha2F0YV9kbmQuc2Nyb2xsX3QgPSAtMTsgfVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYodGhpcy5zY3JvbGxXaWR0aCA+IHRoaXMub2Zmc2V0V2lkdGgpIHtcblx0XHRcdFx0XHRcdFx0aWYoby5sZWZ0ICsgdC53aWR0aCgpIC0gZS5wYWdlWCA8ICQudmFrYXRhLmRuZC5zZXR0aW5ncy5zY3JvbGxfcHJveGltaXR5KVx0eyB2YWthdGFfZG5kLnNjcm9sbF9sID0gMTsgfVxuXHRcdFx0XHRcdFx0XHRpZihlLnBhZ2VYIC0gby5sZWZ0IDwgJC52YWthdGEuZG5kLnNldHRpbmdzLnNjcm9sbF9wcm94aW1pdHkpXHRcdFx0XHR7IHZha2F0YV9kbmQuc2Nyb2xsX2wgPSAtMTsgfVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYodmFrYXRhX2RuZC5zY3JvbGxfdCB8fCB2YWthdGFfZG5kLnNjcm9sbF9sKSB7XG5cdFx0XHRcdFx0XHRcdHZha2F0YV9kbmQuc2Nyb2xsX2UgPSAkKHRoaXMpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYoIXZha2F0YV9kbmQuc2Nyb2xsX2UpIHtcblx0XHRcdFx0XHRkICA9ICQoZG9jdW1lbnQpOyB3ID0gJCh3aW5kb3cpO1xuXHRcdFx0XHRcdGRoID0gZC5oZWlnaHQoKTsgd2ggPSB3LmhlaWdodCgpO1xuXHRcdFx0XHRcdGR3ID0gZC53aWR0aCgpOyB3dyA9IHcud2lkdGgoKTtcblx0XHRcdFx0XHRkdCA9IGQuc2Nyb2xsVG9wKCk7IGRsID0gZC5zY3JvbGxMZWZ0KCk7XG5cdFx0XHRcdFx0aWYoZGggPiB3aCAmJiBlLnBhZ2VZIC0gZHQgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdFx0eyB2YWthdGFfZG5kLnNjcm9sbF90ID0gLTE7ICB9XG5cdFx0XHRcdFx0aWYoZGggPiB3aCAmJiB3aCAtIChlLnBhZ2VZIC0gZHQpIDwgJC52YWthdGEuZG5kLnNldHRpbmdzLnNjcm9sbF9wcm94aW1pdHkpXHR7IHZha2F0YV9kbmQuc2Nyb2xsX3QgPSAxOyB9XG5cdFx0XHRcdFx0aWYoZHcgPiB3dyAmJiBlLnBhZ2VYIC0gZGwgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdFx0eyB2YWthdGFfZG5kLnNjcm9sbF9sID0gLTE7IH1cblx0XHRcdFx0XHRpZihkdyA+IHd3ICYmIHd3IC0gKGUucGFnZVggLSBkbCkgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdHsgdmFrYXRhX2RuZC5zY3JvbGxfbCA9IDE7IH1cblx0XHRcdFx0XHRpZih2YWthdGFfZG5kLnNjcm9sbF90IHx8IHZha2F0YV9kbmQuc2Nyb2xsX2wpIHtcblx0XHRcdFx0XHRcdHZha2F0YV9kbmQuc2Nyb2xsX2UgPSBkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZih2YWthdGFfZG5kLnNjcm9sbF9lKSB7ICQudmFrYXRhLmRuZC5fc2Nyb2xsKHRydWUpOyB9XG5cblx0XHRcdFx0aWYodmFrYXRhX2RuZC5oZWxwZXIpIHtcblx0XHRcdFx0XHRodCA9IHBhcnNlSW50KGUucGFnZVkgKyAkLnZha2F0YS5kbmQuc2V0dGluZ3MuaGVscGVyX3RvcCwgMTApO1xuXHRcdFx0XHRcdGhsID0gcGFyc2VJbnQoZS5wYWdlWCArICQudmFrYXRhLmRuZC5zZXR0aW5ncy5oZWxwZXJfbGVmdCwgMTApO1xuXHRcdFx0XHRcdGlmKGRoICYmIGh0ICsgMjUgPiBkaCkgeyBodCA9IGRoIC0gNTA7IH1cblx0XHRcdFx0XHRpZihkdyAmJiBobCArIHZha2F0YV9kbmQuaGVscGVyX3cgPiBkdykgeyBobCA9IGR3IC0gKHZha2F0YV9kbmQuaGVscGVyX3cgKyAyKTsgfVxuXHRcdFx0XHRcdHZha2F0YV9kbmQuaGVscGVyLmNzcyh7XG5cdFx0XHRcdFx0XHRsZWZ0XHQ6IGhsICsgXCJweFwiLFxuXHRcdFx0XHRcdFx0dG9wXHRcdDogaHQgKyBcInB4XCJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCB3aGVuIGEgZHJhZyBpcyBpbiBwcm9ncmVzc1xuXHRcdFx0XHQgKiBAZXZlbnRcblx0XHRcdFx0ICogQHBsdWdpbiBkbmRcblx0XHRcdFx0ICogQG5hbWUgZG5kX21vdmUudmFrYXRhXG5cdFx0XHRcdCAqIEBwYXJhbSB7TWl4ZWR9IGRhdGEgYW55IGRhdGEgc3VwcGxpZWQgd2l0aCB0aGUgY2FsbCB0byAkLnZha2F0YS5kbmQuc3RhcnRcblx0XHRcdFx0ICogQHBhcmFtIHtET019IGVsZW1lbnQgdGhlIERPTSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcblx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGhlbHBlciB0aGUgaGVscGVyIHNob3duIG5leHQgdG8gdGhlIG1vdXNlXG5cdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCB0aGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyB0byB0cmlnZ2VyIChtb3N0IGxpa2VseSBtb3VzZW1vdmUpXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHQkLnZha2F0YS5kbmQuX3RyaWdnZXIoXCJtb3ZlXCIsIGUpO1xuXHRcdFx0fSxcblx0XHRcdHN0b3AgOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRpZihlLnR5cGUgPT09IFwidG91Y2hlbmRcIiAmJiBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXSkge1xuXHRcdFx0XHRcdGUucGFnZVggPSBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7XG5cdFx0XHRcdFx0ZS5wYWdlWSA9IGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWTtcblx0XHRcdFx0XHRlLnRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0LCBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKHZha2F0YV9kbmQuaXNfZHJhZykge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIHRyaWdnZXJlZCBvbiB0aGUgZG9jdW1lbnQgd2hlbiBhIGRyYWcgc3RvcHMgKHRoZSBkcmFnZ2VkIGVsZW1lbnQgaXMgZHJvcHBlZClcblx0XHRcdFx0XHQgKiBAZXZlbnRcblx0XHRcdFx0XHQgKiBAcGx1Z2luIGRuZFxuXHRcdFx0XHRcdCAqIEBuYW1lIGRuZF9zdG9wLnZha2F0YVxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7TWl4ZWR9IGRhdGEgYW55IGRhdGEgc3VwcGxpZWQgd2l0aCB0aGUgY2FsbCB0byAkLnZha2F0YS5kbmQuc3RhcnRcblx0XHRcdFx0XHQgKiBAcGFyYW0ge0RPTX0gZWxlbWVudCB0aGUgRE9NIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBoZWxwZXIgdGhlIGhlbHBlciBzaG93biBuZXh0IHRvIHRoZSBtb3VzZVxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCB0aGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhlIHN0b3Bcblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHQkLnZha2F0YS5kbmQuX3RyaWdnZXIoXCJzdG9wXCIsIGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCQudmFrYXRhLmRuZC5fY2xlYW4oKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KGpRdWVyeSkpO1xuXG5cdC8vIGluY2x1ZGUgdGhlIGRuZCBwbHVnaW4gYnkgZGVmYXVsdFxuXHQvLyAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goXCJkbmRcIik7XG5cblxuLyoqXG4gKiAjIyMgU2VhcmNoIHBsdWdpblxuICpcbiAqIEFkZHMgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgdG8ganNUcmVlLlxuICovXG5cblx0LyoqXG5cdCAqIHN0b3JlcyBhbGwgZGVmYXVsdHMgZm9yIHRoZSBzZWFyY2ggcGx1Z2luXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnNlYXJjaFxuXHQgKiBAcGx1Z2luIHNlYXJjaFxuXHQgKi9cblx0JC5qc3RyZWUuZGVmYXVsdHMuc2VhcmNoID0ge1xuXHRcdC8qKlxuXHRcdCAqIGEgalF1ZXJ5LWxpa2UgQUpBWCBjb25maWcsIHdoaWNoIGpzdHJlZSB1c2VzIGlmIGEgc2VydmVyIHNob3VsZCBiZSBxdWVyaWVkIGZvciByZXN1bHRzLiBcblx0XHQgKiBcblx0XHQgKiBBIGBzdHJgICh3aGljaCBpcyB0aGUgc2VhcmNoIHN0cmluZykgcGFyYW1ldGVyIHdpbGwgYmUgYWRkZWQgd2l0aCB0aGUgcmVxdWVzdC4gVGhlIGV4cGVjdGVkIHJlc3VsdCBpcyBhIEpTT04gYXJyYXkgd2l0aCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgb3BlbmVkIHNvIHRoYXQgbWF0Y2hpbmcgbm9kZXMgd2lsbCBiZSByZXZlYWxlZC5cblx0XHQgKiBMZWF2ZSB0aGlzIHNldHRpbmcgYXMgYGZhbHNlYCB0byBub3QgcXVlcnkgdGhlIHNlcnZlci5cblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5zZWFyY2guYWpheFxuXHRcdCAqIEBwbHVnaW4gc2VhcmNoXG5cdFx0ICovXG5cdFx0YWpheCA6IGZhbHNlLFxuXHRcdC8qKlxuXHRcdCAqIEluZGljYXRlcyBpZiB0aGUgc2VhcmNoIHNob3VsZCBiZSBmdXp6eSBvciBub3QgKHNob3VsZCBgY2huZDNgIG1hdGNoIGBjaGlsZCBub2RlIDNgKS4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuc2VhcmNoLmZ1enp5XG5cdFx0ICogQHBsdWdpbiBzZWFyY2hcblx0XHQgKi9cblx0XHRmdXp6eSA6IHRydWUsXG5cdFx0LyoqXG5cdFx0ICogSW5kaWNhdGVzIGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuc2VhcmNoLmNhc2Vfc2Vuc2l0aXZlXG5cdFx0ICogQHBsdWdpbiBzZWFyY2hcblx0XHQgKi9cblx0XHRjYXNlX3NlbnNpdGl2ZSA6IGZhbHNlLFxuXHRcdC8qKlxuXHRcdCAqIEluZGljYXRlcyBpZiB0aGUgdHJlZSBzaG91bGQgYmUgZmlsdGVyZWQgdG8gc2hvdyBvbmx5IG1hdGNoaW5nIG5vZGVzIChrZWVwIGluIG1pbmQgdGhpcyBjYW4gYmUgYSBoZWF2eSBvbiBsYXJnZSB0cmVlcyBpbiBvbGQgYnJvd3NlcnMpLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuc2VhcmNoLnNob3dfb25seV9tYXRjaGVzXG5cdFx0ICogQHBsdWdpbiBzZWFyY2hcblx0XHQgKi9cblx0XHRzaG93X29ubHlfbWF0Y2hlcyA6IGZhbHNlLFxuXHRcdC8qKlxuXHRcdCAqIEluZGljYXRlcyBpZiBhbGwgbm9kZXMgb3BlbmVkIHRvIHJldmVhbCB0aGUgc2VhcmNoIHJlc3VsdCwgc2hvdWxkIGJlIGNsb3NlZCB3aGVuIHRoZSBzZWFyY2ggaXMgY2xlYXJlZCBvciBhIG5ldyBzZWFyY2ggaXMgcGVyZm9ybWVkLiBEZWZhdWx0IGlzIGB0cnVlYC5cblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5zZWFyY2guY2xvc2Vfb3BlbmVkX29uY2xlYXJcblx0XHQgKiBAcGx1Z2luIHNlYXJjaFxuXHRcdCAqL1xuXHRcdGNsb3NlX29wZW5lZF9vbmNsZWFyIDogdHJ1ZVxuXHR9O1xuXG5cdCQuanN0cmVlLnBsdWdpbnMuc2VhcmNoID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmVudCkge1xuXHRcdHRoaXMuYmluZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHBhcmVudC5iaW5kLmNhbGwodGhpcyk7XG5cblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnN0ciA9IFwiXCI7XG5cdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5kb20gPSAkKCk7XG5cdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5yZXMgPSBbXTtcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLm9wbiA9IFtdO1xuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2guc2xuID0gbnVsbDtcblxuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy5zZWFyY2guc2hvd19vbmx5X21hdGNoZXMpIHtcblx0XHRcdFx0dGhpcy5lbGVtZW50XG5cdFx0XHRcdFx0Lm9uKFwic2VhcmNoLmpzdHJlZVwiLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xuXHRcdFx0XHRcdFx0aWYoZGF0YS5ub2Rlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0JCh0aGlzKS5maW5kKFwibGlcIikuaGlkZSgpLmZpbHRlcignLmpzdHJlZS1sYXN0JykuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5uZXh0U2libGluZzsgfSkucmVtb3ZlQ2xhc3MoJ2pzdHJlZS1sYXN0Jyk7XG5cdFx0XHRcdFx0XHRcdGRhdGEubm9kZXMucGFyZW50c1VudGlsKFwiLmpzdHJlZVwiKS5hZGRCYWNrKCkuc2hvdygpXG5cdFx0XHRcdFx0XHRcdFx0LmZpbHRlcihcInVsXCIpLmVhY2goZnVuY3Rpb24gKCkgeyAkKHRoaXMpLmNoaWxkcmVuKFwibGk6dmlzaWJsZVwiKS5lcSgtMSkuYWRkQ2xhc3MoXCJqc3RyZWUtbGFzdFwiKTsgfSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQub24oXCJjbGVhcl9zZWFyY2guanN0cmVlXCIsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdFx0XHRpZihkYXRhLm5vZGVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHQkKHRoaXMpLmZpbmQoXCJsaVwiKS5jc3MoXCJkaXNwbGF5XCIsXCJcIikuZmlsdGVyKCcuanN0cmVlLWxhc3QnKS5maWx0ZXIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLm5leHRTaWJsaW5nOyB9KS5yZW1vdmVDbGFzcygnanN0cmVlLWxhc3QnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIHVzZWQgdG8gc2VhcmNoIHRoZSB0cmVlIG5vZGVzIGZvciBhIGdpdmVuIHN0cmluZ1xuXHRcdCAqIEBuYW1lIHNlYXJjaChzdHIgWywgc2tpcF9hc3luY10pXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc2VhcmNoIHN0cmluZ1xuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gc2tpcF9hc3luYyBpZiBzZXQgdG8gdHJ1ZSBzZXJ2ZXIgd2lsbCBub3QgYmUgcXVlcmllZCBldmVuIGlmIGNvbmZpZ3VyZWRcblx0XHQgKiBAcGx1Z2luIHNlYXJjaFxuXHRcdCAqIEB0cmlnZ2VyIHNlYXJjaC5qc3RyZWVcblx0XHQgKi9cblx0XHR0aGlzLnNlYXJjaCA9IGZ1bmN0aW9uIChzdHIsIHNraXBfYXN5bmMpIHtcblx0XHRcdGlmKHN0ciA9PT0gZmFsc2UgfHwgJC50cmltKHN0cikgPT09IFwiXCIpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY2xlYXJfc2VhcmNoKCk7XG5cdFx0XHR9XG5cdFx0XHR2YXIgcyA9IHRoaXMuc2V0dGluZ3Muc2VhcmNoLFxuXHRcdFx0XHRhID0gcy5hamF4ID8gJC5leHRlbmQoe30sIHMuYWpheCkgOiBmYWxzZSxcblx0XHRcdFx0ZiA9IG51bGwsXG5cdFx0XHRcdHIgPSBbXSxcblx0XHRcdFx0cCA9IFtdLCBpLCBqO1xuXHRcdFx0aWYodGhpcy5fZGF0YS5zZWFyY2gucmVzLmxlbmd0aCkge1xuXHRcdFx0XHR0aGlzLmNsZWFyX3NlYXJjaCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYoIXNraXBfYXN5bmMgJiYgYSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0aWYoIWEuZGF0YSkgeyBhLmRhdGEgPSB7fTsgfVxuXHRcdFx0XHRhLmRhdGEuc3RyID0gc3RyO1xuXHRcdFx0XHRyZXR1cm4gJC5hamF4KGEpXG5cdFx0XHRcdFx0LmZhaWwoJC5wcm94eShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvciA9IHsgJ2Vycm9yJyA6ICdhamF4JywgJ3BsdWdpbicgOiAnc2VhcmNoJywgJ2lkJyA6ICdzZWFyY2hfMDEnLCAncmVhc29uJyA6ICdDb3VsZCBub3QgbG9hZCBzZWFyY2ggcGFyZW50cycsICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KGEpIH07XG5cdFx0XHRcdFx0XHR0aGlzLnNldHRpbmdzLmNvcmUuZXJyb3IuY2FsbCh0aGlzLCB0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvcik7XG5cdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdFx0LmRvbmUoJC5wcm94eShmdW5jdGlvbiAoZCkge1xuXHRcdFx0XHRcdFx0aWYoZCAmJiBkLmQpIHsgZCA9IGQuZDsgfVxuXHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5zZWFyY2guc2xuID0gISQuaXNBcnJheShkKSA/IFtdIDogZDtcblx0XHRcdFx0XHRcdHRoaXMuX3NlYXJjaF9sb2FkKHN0cik7XG5cdFx0XHRcdFx0fSwgdGhpcykpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2guc3RyID0gc3RyO1xuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2guZG9tID0gJCgpO1xuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2gucmVzID0gW107XG5cdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5vcG4gPSBbXTtcblxuXHRcdFx0ZiA9IG5ldyAkLnZha2F0YS5zZWFyY2goc3RyLCB0cnVlLCB7IGNhc2VTZW5zaXRpdmUgOiBzLmNhc2Vfc2Vuc2l0aXZlLCBmdXp6eSA6IHMuZnV6enkgfSk7XG5cblx0XHRcdCQuZWFjaCh0aGlzLl9tb2RlbC5kYXRhLCBmdW5jdGlvbiAoaSwgdikge1xuXHRcdFx0XHRpZih2LnRleHQgJiYgZi5zZWFyY2godi50ZXh0KS5pc01hdGNoKSB7XG5cdFx0XHRcdFx0ci5wdXNoKGkpO1xuXHRcdFx0XHRcdHAgPSBwLmNvbmNhdCh2LnBhcmVudHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmKHIubGVuZ3RoKSB7XG5cdFx0XHRcdHAgPSAkLnZha2F0YS5hcnJheV91bmlxdWUocCk7XG5cdFx0XHRcdHRoaXMuX3NlYXJjaF9vcGVuKHApO1xuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSByLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdGYgPSB0aGlzLmdldF9ub2RlKHJbaV0sIHRydWUpO1xuXHRcdFx0XHRcdGlmKGYpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLmRvbSA9IHRoaXMuX2RhdGEuc2VhcmNoLmRvbS5hZGQoZik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnJlcyA9IHI7XG5cdFx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLmRvbS5jaGlsZHJlbihcIi5qc3RyZWUtYW5jaG9yXCIpLmFkZENsYXNzKCdqc3RyZWUtc2VhcmNoJyk7XG5cdFx0XHR9XG5cdFx0XHQvKipcblx0XHRcdCAqIHRyaWdnZXJlZCBhZnRlciBzZWFyY2ggaXMgY29tcGxldGVcblx0XHRcdCAqIEBldmVudFxuXHRcdFx0ICogQG5hbWUgc2VhcmNoLmpzdHJlZVxuXHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IG5vZGVzIGEgalF1ZXJ5IGNvbGxlY3Rpb24gb2YgbWF0Y2hpbmcgbm9kZXNcblx0XHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHNlYXJjaCBzdHJpbmdcblx0XHRcdCAqIEBwYXJhbSB7QXJyYXl9IHJlcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyByZXByZXNlaW5nIHRoZSBtYXRjaGluZyBub2Rlc1xuXHRcdFx0ICogQHBsdWdpbiBzZWFyY2hcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdzZWFyY2gnLCB7IG5vZGVzIDogdGhpcy5fZGF0YS5zZWFyY2guZG9tLCBzdHIgOiBzdHIsIHJlcyA6IHRoaXMuX2RhdGEuc2VhcmNoLnJlcyB9KTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIHVzZWQgdG8gY2xlYXIgdGhlIGxhc3Qgc2VhcmNoIChyZW1vdmVzIGNsYXNzZXMgYW5kIHNob3dzIGFsbCBub2RlcyBpZiBmaWx0ZXJpbmcgaXMgb24pXG5cdFx0ICogQG5hbWUgY2xlYXJfc2VhcmNoKClcblx0XHQgKiBAcGx1Z2luIHNlYXJjaFxuXHRcdCAqIEB0cmlnZ2VyIGNsZWFyX3NlYXJjaC5qc3RyZWVcblx0XHQgKi9cblx0XHR0aGlzLmNsZWFyX3NlYXJjaCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLmRvbS5jaGlsZHJlbihcIi5qc3RyZWUtYW5jaG9yXCIpLnJlbW92ZUNsYXNzKFwianN0cmVlLXNlYXJjaFwiKTtcblx0XHRcdGlmKHRoaXMuc2V0dGluZ3Muc2VhcmNoLmNsb3NlX29wZW5lZF9vbmNsZWFyKSB7XG5cdFx0XHRcdHRoaXMuY2xvc2Vfbm9kZSh0aGlzLl9kYXRhLnNlYXJjaC5vcG4sIDApO1xuXHRcdFx0fVxuXHRcdFx0LyoqXG5cdFx0XHQgKiB0cmlnZ2VyZWQgYWZ0ZXIgc2VhcmNoIGlzIGNvbXBsZXRlXG5cdFx0XHQgKiBAZXZlbnRcblx0XHRcdCAqIEBuYW1lIGNsZWFyX3NlYXJjaC5qc3RyZWVcblx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBub2RlcyBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIG1hdGNoaW5nIG5vZGVzICh0aGUgcmVzdWx0IGZyb20gdGhlIGxhc3Qgc2VhcmNoKVxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc2VhcmNoIHN0cmluZyAodGhlIGxhc3Qgc2VhcmNoIHN0cmluZylcblx0XHRcdCAqIEBwYXJhbSB7QXJyYXl9IHJlcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyByZXByZXNlaW5nIHRoZSBtYXRjaGluZyBub2RlcyAodGhlIHJlc3VsdCBmcm9tIHRoZSBsYXN0IHNlYXJjaClcblx0XHRcdCAqIEBwbHVnaW4gc2VhcmNoXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudHJpZ2dlcignY2xlYXJfc2VhcmNoJywgeyAnbm9kZXMnIDogdGhpcy5fZGF0YS5zZWFyY2guZG9tLCBzdHIgOiB0aGlzLl9kYXRhLnNlYXJjaC5zdHIsIHJlcyA6IHRoaXMuX2RhdGEuc2VhcmNoLnJlcyB9KTtcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnN0ciA9IFwiXCI7XG5cdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5yZXMgPSBbXTtcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLm9wbiA9IFtdO1xuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2guZG9tID0gJCgpO1xuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogb3BlbnMgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIG9wZW5lZCB0byByZXZlYWwgdGhlIHNlYXJjaCByZXN1bHRzLiBVc2VkIG9ubHkgaW50ZXJuYWxseS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBuYW1lIF9zZWFyY2hfb3BlbihkKVxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGQgYW4gYXJyYXkgb2Ygbm9kZSBJRHNcblx0XHQgKiBAcGx1Z2luIHNlYXJjaFxuXHRcdCAqL1xuXHRcdHRoaXMuX3NlYXJjaF9vcGVuID0gZnVuY3Rpb24gKGQpIHtcblx0XHRcdHZhciB0ID0gdGhpcztcblx0XHRcdCQuZWFjaChkLmNvbmNhdChbXSksIGZ1bmN0aW9uIChpLCB2KSB7XG5cdFx0XHRcdHYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2KTtcblx0XHRcdFx0aWYodikge1xuXHRcdFx0XHRcdGlmKHQuaXNfY2xvc2VkKHYpKSB7XG5cdFx0XHRcdFx0XHR0Ll9kYXRhLnNlYXJjaC5vcG4ucHVzaCh2LmlkKTtcblx0XHRcdFx0XHRcdHQub3Blbl9ub2RlKHYsIGZ1bmN0aW9uICgpIHsgdC5fc2VhcmNoX29wZW4oZCk7IH0sIDApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBsb2FkcyBub2RlcyB0aGF0IG5lZWQgdG8gYmUgb3BlbmVkIHRvIHJldmVhbCB0aGUgc2VhcmNoIHJlc3VsdHMuIFVzZWQgb25seSBpbnRlcm5hbGx5LlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQG5hbWUgX3NlYXJjaF9sb2FkKGQsIHN0cilcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzZWFyY2ggc3RyaW5nXG5cdFx0ICogQHBsdWdpbiBzZWFyY2hcblx0XHQgKi9cblx0XHR0aGlzLl9zZWFyY2hfbG9hZCA9IGZ1bmN0aW9uIChzdHIpIHtcblx0XHRcdHZhciByZXMgPSB0cnVlLFxuXHRcdFx0XHR0ID0gdGhpcyxcblx0XHRcdFx0bSA9IHQuX21vZGVsLmRhdGE7XG5cdFx0XHRpZigkLmlzQXJyYXkodGhpcy5fZGF0YS5zZWFyY2guc2xuKSkge1xuXHRcdFx0XHRpZighdGhpcy5fZGF0YS5zZWFyY2guc2xuLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnNsbiA9IG51bGw7XG5cdFx0XHRcdFx0dGhpcy5zZWFyY2goc3RyLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHQkLmVhY2godGhpcy5fZGF0YS5zZWFyY2guc2xuLCBmdW5jdGlvbiAoaSwgdikge1xuXHRcdFx0XHRcdFx0aWYobVt2XSkge1xuXHRcdFx0XHRcdFx0XHQkLnZha2F0YS5hcnJheV9yZW1vdmVfaXRlbSh0Ll9kYXRhLnNlYXJjaC5zbG4sIHYpO1xuXHRcdFx0XHRcdFx0XHRpZighbVt2XS5zdGF0ZS5sb2FkZWQpIHtcblx0XHRcdFx0XHRcdFx0XHR0LmxvYWRfbm9kZSh2LCBmdW5jdGlvbiAobywgcykgeyBpZihzKSB7IHQuX3NlYXJjaF9sb2FkKHN0cik7IH0gfSk7XG5cdFx0XHRcdFx0XHRcdFx0cmVzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZihyZXMpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnNsbiA9IFtdO1xuXHRcdFx0XHRcdFx0dGhpcy5fc2VhcmNoX2xvYWQoc3RyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdC8vIGhlbHBlcnNcblx0KGZ1bmN0aW9uICgkKSB7XG5cdFx0Ly8gZnJvbSBodHRwOi8va2lyby5tZS9wcm9qZWN0cy9mdXNlLmh0bWxcblx0XHQkLnZha2F0YS5zZWFyY2ggPSBmdW5jdGlvbihwYXR0ZXJuLCB0eHQsIG9wdGlvbnMpIHtcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdFx0aWYob3B0aW9ucy5mdXp6eSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0b3B0aW9ucy5mdXp6eSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRwYXR0ZXJuID0gb3B0aW9ucy5jYXNlU2Vuc2l0aXZlID8gcGF0dGVybiA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTtcblx0XHRcdHZhciBNQVRDSF9MT0NBVElPTlx0PSBvcHRpb25zLmxvY2F0aW9uIHx8IDAsXG5cdFx0XHRcdE1BVENIX0RJU1RBTkNFXHQ9IG9wdGlvbnMuZGlzdGFuY2UgfHwgMTAwLFxuXHRcdFx0XHRNQVRDSF9USFJFU0hPTERcdD0gb3B0aW9ucy50aHJlc2hvbGQgfHwgMC42LFxuXHRcdFx0XHRwYXR0ZXJuTGVuID0gcGF0dGVybi5sZW5ndGgsXG5cdFx0XHRcdG1hdGNobWFzaywgcGF0dGVybl9hbHBoYWJldCwgbWF0Y2hfYml0YXBTY29yZSwgc2VhcmNoO1xuXHRcdFx0aWYocGF0dGVybkxlbiA+IDMyKSB7XG5cdFx0XHRcdG9wdGlvbnMuZnV6enkgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmKG9wdGlvbnMuZnV6enkpIHtcblx0XHRcdFx0bWF0Y2htYXNrID0gMSA8PCAocGF0dGVybkxlbiAtIDEpO1xuXHRcdFx0XHRwYXR0ZXJuX2FscGhhYmV0ID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgbWFzayA9IHt9LFxuXHRcdFx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHBhdHRlcm5MZW47IGkrKykge1xuXHRcdFx0XHRcdFx0bWFza1twYXR0ZXJuLmNoYXJBdChpKV0gPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgcGF0dGVybkxlbjsgaSsrKSB7XG5cdFx0XHRcdFx0XHRtYXNrW3BhdHRlcm4uY2hhckF0KGkpXSB8PSAxIDw8IChwYXR0ZXJuTGVuIC0gaSAtIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWFzaztcblx0XHRcdFx0fSgpKTtcblx0XHRcdFx0bWF0Y2hfYml0YXBTY29yZSA9IGZ1bmN0aW9uIChlLCB4KSB7XG5cdFx0XHRcdFx0dmFyIGFjY3VyYWN5ID0gZSAvIHBhdHRlcm5MZW4sXG5cdFx0XHRcdFx0XHRwcm94aW1pdHkgPSBNYXRoLmFicyhNQVRDSF9MT0NBVElPTiAtIHgpO1xuXHRcdFx0XHRcdGlmKCFNQVRDSF9ESVNUQU5DRSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHByb3hpbWl0eSA/IDEuMCA6IGFjY3VyYWN5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gYWNjdXJhY3kgKyAocHJveGltaXR5IC8gTUFUQ0hfRElTVEFOQ0UpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0c2VhcmNoID0gZnVuY3Rpb24gKHRleHQpIHtcblx0XHRcdFx0dGV4dCA9IG9wdGlvbnMuY2FzZVNlbnNpdGl2ZSA/IHRleHQgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdGlmKHBhdHRlcm4gPT09IHRleHQgfHwgdGV4dC5pbmRleE9mKHBhdHRlcm4pICE9PSAtMSkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRpc01hdGNoOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2NvcmU6IDBcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCFvcHRpb25zLmZ1enp5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGlzTWF0Y2g6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2NvcmU6IDFcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBpLCBqLFxuXHRcdFx0XHRcdHRleHRMZW4gPSB0ZXh0Lmxlbmd0aCxcblx0XHRcdFx0XHRzY29yZVRocmVzaG9sZCA9IE1BVENIX1RIUkVTSE9MRCxcblx0XHRcdFx0XHRiZXN0TG9jID0gdGV4dC5pbmRleE9mKHBhdHRlcm4sIE1BVENIX0xPQ0FUSU9OKSxcblx0XHRcdFx0XHRiaW5NaW4sIGJpbk1pZCxcblx0XHRcdFx0XHRiaW5NYXggPSBwYXR0ZXJuTGVuICsgdGV4dExlbixcblx0XHRcdFx0XHRsYXN0UmQsIHN0YXJ0LCBmaW5pc2gsIHJkLCBjaGFyTWF0Y2gsXG5cdFx0XHRcdFx0c2NvcmUgPSAxLFxuXHRcdFx0XHRcdGxvY2F0aW9ucyA9IFtdO1xuXHRcdFx0XHRpZiAoYmVzdExvYyAhPT0gLTEpIHtcblx0XHRcdFx0XHRzY29yZVRocmVzaG9sZCA9IE1hdGgubWluKG1hdGNoX2JpdGFwU2NvcmUoMCwgYmVzdExvYyksIHNjb3JlVGhyZXNob2xkKTtcblx0XHRcdFx0XHRiZXN0TG9jID0gdGV4dC5sYXN0SW5kZXhPZihwYXR0ZXJuLCBNQVRDSF9MT0NBVElPTiArIHBhdHRlcm5MZW4pO1xuXHRcdFx0XHRcdGlmIChiZXN0TG9jICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0c2NvcmVUaHJlc2hvbGQgPSBNYXRoLm1pbihtYXRjaF9iaXRhcFNjb3JlKDAsIGJlc3RMb2MpLCBzY29yZVRocmVzaG9sZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJlc3RMb2MgPSAtMTtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHBhdHRlcm5MZW47IGkrKykge1xuXHRcdFx0XHRcdGJpbk1pbiA9IDA7XG5cdFx0XHRcdFx0YmluTWlkID0gYmluTWF4O1xuXHRcdFx0XHRcdHdoaWxlIChiaW5NaW4gPCBiaW5NaWQpIHtcblx0XHRcdFx0XHRcdGlmIChtYXRjaF9iaXRhcFNjb3JlKGksIE1BVENIX0xPQ0FUSU9OICsgYmluTWlkKSA8PSBzY29yZVRocmVzaG9sZCkge1xuXHRcdFx0XHRcdFx0XHRiaW5NaW4gPSBiaW5NaWQ7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRiaW5NYXggPSBiaW5NaWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRiaW5NaWQgPSBNYXRoLmZsb29yKChiaW5NYXggLSBiaW5NaW4pIC8gMiArIGJpbk1pbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJpbk1heCA9IGJpbk1pZDtcblx0XHRcdFx0XHRzdGFydCA9IE1hdGgubWF4KDEsIE1BVENIX0xPQ0FUSU9OIC0gYmluTWlkICsgMSk7XG5cdFx0XHRcdFx0ZmluaXNoID0gTWF0aC5taW4oTUFUQ0hfTE9DQVRJT04gKyBiaW5NaWQsIHRleHRMZW4pICsgcGF0dGVybkxlbjtcblx0XHRcdFx0XHRyZCA9IG5ldyBBcnJheShmaW5pc2ggKyAyKTtcblx0XHRcdFx0XHRyZFtmaW5pc2ggKyAxXSA9ICgxIDw8IGkpIC0gMTtcblx0XHRcdFx0XHRmb3IgKGogPSBmaW5pc2g7IGogPj0gc3RhcnQ7IGotLSkge1xuXHRcdFx0XHRcdFx0Y2hhck1hdGNoID0gcGF0dGVybl9hbHBoYWJldFt0ZXh0LmNoYXJBdChqIC0gMSldO1xuXHRcdFx0XHRcdFx0aWYgKGkgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0cmRbal0gPSAoKHJkW2ogKyAxXSA8PCAxKSB8IDEpICYgY2hhck1hdGNoO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmRbal0gPSAoKHJkW2ogKyAxXSA8PCAxKSB8IDEpICYgY2hhck1hdGNoIHwgKCgobGFzdFJkW2ogKyAxXSB8IGxhc3RSZFtqXSkgPDwgMSkgfCAxKSB8IGxhc3RSZFtqICsgMV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAocmRbal0gJiBtYXRjaG1hc2spIHtcblx0XHRcdFx0XHRcdFx0c2NvcmUgPSBtYXRjaF9iaXRhcFNjb3JlKGksIGogLSAxKTtcblx0XHRcdFx0XHRcdFx0aWYgKHNjb3JlIDw9IHNjb3JlVGhyZXNob2xkKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2NvcmVUaHJlc2hvbGQgPSBzY29yZTtcblx0XHRcdFx0XHRcdFx0XHRiZXN0TG9jID0gaiAtIDE7XG5cdFx0XHRcdFx0XHRcdFx0bG9jYXRpb25zLnB1c2goYmVzdExvYyk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGJlc3RMb2MgPiBNQVRDSF9MT0NBVElPTikge1xuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBNYXRoLm1heCgxLCAyICogTUFUQ0hfTE9DQVRJT04gLSBiZXN0TG9jKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChtYXRjaF9iaXRhcFNjb3JlKGkgKyAxLCBNQVRDSF9MT0NBVElPTikgPiBzY29yZVRocmVzaG9sZCkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxhc3RSZCA9IHJkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0aXNNYXRjaDogYmVzdExvYyA+PSAwLFxuXHRcdFx0XHRcdHNjb3JlOiBzY29yZVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiB0eHQgPT09IHRydWUgPyB7ICdzZWFyY2gnIDogc2VhcmNoIH0gOiBzZWFyY2godHh0KTtcblx0XHR9O1xuXHR9KGpRdWVyeSkpO1xuXG5cdC8vIGluY2x1ZGUgdGhlIHNlYXJjaCBwbHVnaW4gYnkgZGVmYXVsdFxuXHQvLyAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goXCJzZWFyY2hcIik7XG5cbi8qKlxuICogIyMjIFNvcnQgcGx1Z2luXG4gKlxuICogQXV0bWF0aWNhbGx5IHNvcnRzIGFsbCBzaWJsaW5ncyBpbiB0aGUgdHJlZSBhY2NvcmRpbmcgdG8gYSBzb3J0aW5nIGZ1bmN0aW9uLlxuICovXG5cblx0LyoqXG5cdCAqIHRoZSBzZXR0aW5ncyBmdW5jdGlvbiB1c2VkIHRvIHNvcnQgdGhlIG5vZGVzLlxuXHQgKiBJdCBpcyBleGVjdXRlZCBpbiB0aGUgdHJlZSdzIGNvbnRleHQsIGFjY2VwdHMgdHdvIG5vZGVzIGFzIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHJldHVybiBgMWAgb3IgYC0xYC5cblx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuc29ydFxuXHQgKiBAcGx1Z2luIHNvcnRcblx0ICovXG5cdCQuanN0cmVlLmRlZmF1bHRzLnNvcnQgPSBmdW5jdGlvbiAoYSwgYikge1xuXHRcdC8vcmV0dXJuIHRoaXMuZ2V0X3R5cGUoYSkgPT09IHRoaXMuZ2V0X3R5cGUoYikgPyAodGhpcy5nZXRfdGV4dChhKSA+IHRoaXMuZ2V0X3RleHQoYikgPyAxIDogLTEpIDogdGhpcy5nZXRfdHlwZShhKSA+PSB0aGlzLmdldF90eXBlKGIpO1xuXHRcdHJldHVybiB0aGlzLmdldF90ZXh0KGEpID4gdGhpcy5nZXRfdGV4dChiKSA/IDEgOiAtMTtcblx0fTtcblx0JC5qc3RyZWUucGx1Z2lucy5zb3J0ID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmVudCkge1xuXHRcdHRoaXMuYmluZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHBhcmVudC5iaW5kLmNhbGwodGhpcyk7XG5cdFx0XHR0aGlzLmVsZW1lbnRcblx0XHRcdFx0Lm9uKFwibW9kZWwuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0XHRcdHRoaXMuc29ydChkYXRhLnBhcmVudCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdC5vbihcInJlbmFtZV9ub2RlLmpzdHJlZSBjcmVhdGVfbm9kZS5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xuXHRcdFx0XHRcdFx0dGhpcy5zb3J0KGRhdGEucGFyZW50IHx8IGRhdGEubm9kZS5wYXJlbnQsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHRoaXMucmVkcmF3X25vZGUoZGF0YS5wYXJlbnQgfHwgZGF0YS5ub2RlLnBhcmVudCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdC5vbihcIm1vdmVfbm9kZS5qc3RyZWUgY29weV9ub2RlLmpzdHJlZVwiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNvcnQoZGF0YS5wYXJlbnQsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHRoaXMucmVkcmF3X25vZGUoZGF0YS5wYXJlbnQsIHRydWUpO1xuXHRcdFx0XHRcdH0sIHRoaXMpKTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIHVzZWQgdG8gc29ydCBhIG5vZGUncyBjaGlsZHJlblxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQG5hbWUgc29ydChvYmogWywgZGVlcF0pXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZVxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcCBpZiBzZXQgdG8gYHRydWVgIG5vZGVzIGFyZSBzb3J0ZWQgcmVjdXJzaXZlbHkuXG5cdFx0ICogQHBsdWdpbiBzb3J0XG5cdFx0ICogQHRyaWdnZXIgc2VhcmNoLmpzdHJlZVxuXHRcdCAqL1xuXHRcdHRoaXMuc29ydCA9IGZ1bmN0aW9uIChvYmosIGRlZXApIHtcblx0XHRcdHZhciBpLCBqO1xuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xuXHRcdFx0aWYob2JqICYmIG9iai5jaGlsZHJlbiAmJiBvYmouY2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdG9iai5jaGlsZHJlbi5zb3J0KCQucHJveHkodGhpcy5zZXR0aW5ncy5zb3J0LCB0aGlzKSk7XG5cdFx0XHRcdGlmKGRlZXApIHtcblx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRcdHRoaXMuc29ydChvYmouY2hpbGRyZW5fZFtpXSwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH07XG5cblx0Ly8gaW5jbHVkZSB0aGUgc29ydCBwbHVnaW4gYnkgZGVmYXVsdFxuXHQvLyAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goXCJzb3J0XCIpO1xuXG4vKipcbiAqICMjIyBTdGF0ZSBwbHVnaW5cbiAqXG4gKiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIHRyZWUgKHNlbGVjdGVkIG5vZGVzLCBvcGVuZWQgbm9kZXMpIG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgdXNpbmcgYXZhaWxhYmxlIG9wdGlvbnMgKGxvY2FsU3RvcmFnZSwgY29va2llcywgZXRjKVxuICovXG5cblx0dmFyIHRvID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBzdG9yZXMgYWxsIGRlZmF1bHRzIGZvciB0aGUgc3RhdGUgcGx1Z2luXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnN0YXRlXG5cdCAqIEBwbHVnaW4gc3RhdGVcblx0ICovXG5cdCQuanN0cmVlLmRlZmF1bHRzLnN0YXRlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIGZvciB0aGUga2V5IHRvIHVzZSB3aGVuIHNhdmluZyB0aGUgY3VycmVudCB0cmVlIChjaGFuZ2UgaWYgdXNpbmcgbXVsdGlwbGUgdHJlZXMgaW4geW91ciBwcm9qZWN0KS4gRGVmYXVsdHMgdG8gYGpzdHJlZWAuXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuc3RhdGUua2V5XG5cdFx0ICogQHBsdWdpbiBzdGF0ZVxuXHRcdCAqL1xuXHRcdGtleVx0XHQ6ICdqc3RyZWUnLFxuXHRcdC8qKlxuXHRcdCAqIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnRzIHRoYXQgdHJpZ2dlciBhIHN0YXRlIHNhdmUuIERlZmF1bHRzIHRvIGBjaGFuZ2VkLmpzdHJlZSBvcGVuX25vZGUuanN0cmVlIGNsb3NlX25vZGUuanN0cmVlYC5cblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5zdGF0ZS5ldmVudHNcblx0XHQgKiBAcGx1Z2luIHN0YXRlXG5cdFx0ICovXG5cdFx0ZXZlbnRzXHQ6ICdjaGFuZ2VkLmpzdHJlZSBvcGVuX25vZGUuanN0cmVlIGNsb3NlX25vZGUuanN0cmVlJyxcblx0XHQvKipcblx0XHQgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgc3RhdGUgd2lsbCBleHBpcmUuIERlZmF1bHRzIHRvICdmYWxzZScgbWVhbmluZyAtIG5vIGV4cGlyZS5cblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5zdGF0ZS50dGxcblx0XHQgKiBAcGx1Z2luIHN0YXRlXG5cdFx0ICovXG5cdFx0dHRsXHRcdDogZmFsc2UsXG5cdFx0LyoqXG5cdFx0ICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gcmVzdG9yaW5nIHN0YXRlIHdpdGggb25lIGFyZ3VtZW50IC0gdGhlIHN0YXRlIG9iamVjdC4gQ2FuIGJlIHVzZWQgdG8gY2xlYXIgdW53YW50ZWQgcGFydHMgb2YgdGhlIHN0YXRlLlxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnN0YXRlLmZpbHRlclxuXHRcdCAqIEBwbHVnaW4gc3RhdGVcblx0XHQgKi9cblx0XHRmaWx0ZXJcdDogZmFsc2Vcblx0fTtcblx0JC5qc3RyZWUucGx1Z2lucy5zdGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zLCBwYXJlbnQpIHtcblx0XHR0aGlzLmJpbmQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRwYXJlbnQuYmluZC5jYWxsKHRoaXMpO1xuXHRcdFx0dmFyIGJpbmQgPSAkLnByb3h5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhpcy5lbGVtZW50Lm9uKHRoaXMuc2V0dGluZ3Muc3RhdGUuZXZlbnRzLCAkLnByb3h5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpZih0bykgeyBjbGVhclRpbWVvdXQodG8pOyB9XG5cdFx0XHRcdFx0dG8gPSBzZXRUaW1lb3V0KCQucHJveHkoZnVuY3Rpb24gKCkgeyB0aGlzLnNhdmVfc3RhdGUoKTsgfSwgdGhpcyksIDEwMCk7XG5cdFx0XHRcdH0sIHRoaXMpKTtcblx0XHRcdH0sIHRoaXMpO1xuXHRcdFx0dGhpcy5lbGVtZW50XG5cdFx0XHRcdC5vbihcInJlYWR5LmpzdHJlZVwiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVsZW1lbnQub25lKFwicmVzdG9yZV9zdGF0ZS5qc3RyZWVcIiwgYmluZCk7XG5cdFx0XHRcdFx0XHRpZighdGhpcy5yZXN0b3JlX3N0YXRlKCkpIHsgYmluZCgpOyB9XG5cdFx0XHRcdFx0fSwgdGhpcykpO1xuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogc2F2ZSB0aGUgc3RhdGVcblx0XHQgKiBAbmFtZSBzYXZlX3N0YXRlKClcblx0XHQgKiBAcGx1Z2luIHN0YXRlXG5cdFx0ICovXG5cdFx0dGhpcy5zYXZlX3N0YXRlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHN0ID0geyAnc3RhdGUnIDogdGhpcy5nZXRfc3RhdGUoKSwgJ3R0bCcgOiB0aGlzLnNldHRpbmdzLnN0YXRlLnR0bCwgJ3NlYycgOiArKG5ldyBEYXRlKCkpIH07XG5cdFx0XHQkLnZha2F0YS5zdG9yYWdlLnNldCh0aGlzLnNldHRpbmdzLnN0YXRlLmtleSwgSlNPTi5zdHJpbmdpZnkoc3QpKTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIHJlc3RvcmUgdGhlIHN0YXRlIGZyb20gdGhlIHVzZXIncyBjb21wdXRlclxuXHRcdCAqIEBuYW1lIHJlc3RvcmVfc3RhdGUoKVxuXHRcdCAqIEBwbHVnaW4gc3RhdGVcblx0XHQgKi9cblx0XHR0aGlzLnJlc3RvcmVfc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgayA9ICQudmFrYXRhLnN0b3JhZ2UuZ2V0KHRoaXMuc2V0dGluZ3Muc3RhdGUua2V5KTtcblx0XHRcdGlmKCEhaykgeyB0cnkgeyBrID0gSlNPTi5wYXJzZShrKTsgfSBjYXRjaChleCkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXHRcdFx0aWYoISFrICYmIGsudHRsICYmIGsuc2VjICYmICsobmV3IERhdGUoKSkgLSBrLnNlYyA+IGsudHRsKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0aWYoISFrICYmIGsuc3RhdGUpIHsgayA9IGsuc3RhdGU7IH1cblx0XHRcdGlmKCEhayAmJiAkLmlzRnVuY3Rpb24odGhpcy5zZXR0aW5ncy5zdGF0ZS5maWx0ZXIpKSB7IGsgPSB0aGlzLnNldHRpbmdzLnN0YXRlLmZpbHRlci5jYWxsKHRoaXMsIGspOyB9XG5cdFx0XHRpZighIWspIHtcblx0XHRcdFx0dGhpcy5lbGVtZW50Lm9uZShcInNldF9zdGF0ZS5qc3RyZWVcIiwgZnVuY3Rpb24gKGUsIGRhdGEpIHsgZGF0YS5pbnN0YW5jZS50cmlnZ2VyKCdyZXN0b3JlX3N0YXRlJywgeyAnc3RhdGUnIDogJC5leHRlbmQodHJ1ZSwge30sIGspIH0pOyB9KTtcblx0XHRcdFx0dGhpcy5zZXRfc3RhdGUoayk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogY2xlYXIgdGhlIHN0YXRlIG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXJcblx0XHQgKiBAbmFtZSBjbGVhcl9zdGF0ZSgpXG5cdFx0ICogQHBsdWdpbiBzdGF0ZVxuXHRcdCAqL1xuXHRcdHRoaXMuY2xlYXJfc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gJC52YWthdGEuc3RvcmFnZS5kZWwodGhpcy5zZXR0aW5ncy5zdGF0ZS5rZXkpO1xuXHRcdH07XG5cdH07XG5cblx0KGZ1bmN0aW9uICgkLCB1bmRlZmluZWQpIHtcblx0XHQkLnZha2F0YS5zdG9yYWdlID0ge1xuXHRcdFx0Ly8gc2ltcGx5IHNwZWNpZnlpbmcgdGhlIGZ1bmN0aW9ucyBpbiBGRiB0aHJvd3MgYW4gZXJyb3Jcblx0XHRcdHNldCA6IGZ1bmN0aW9uIChrZXksIHZhbCkgeyByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsKTsgfSxcblx0XHRcdGdldCA6IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpOyB9LFxuXHRcdFx0ZGVsIDogZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH1cblx0XHR9O1xuXHR9KGpRdWVyeSkpO1xuXG5cdC8vIGluY2x1ZGUgdGhlIHN0YXRlIHBsdWdpbiBieSBkZWZhdWx0XG5cdC8vICQuanN0cmVlLmRlZmF1bHRzLnBsdWdpbnMucHVzaChcInN0YXRlXCIpO1xuXG4vKipcbiAqICMjIyBUeXBlcyBwbHVnaW5cbiAqXG4gKiBNYWtlcyBpdCBwb3NzaWJsZSB0byBhZGQgcHJlZGVmaW5lZCB0eXBlcyBmb3IgZ3JvdXBzIG9mIG5vZGVzLCB3aGljaCBtYWtlIGl0IHBvc3NpYmxlIHRvIGVhc2lseSBjb250cm9sIG5lc3RpbmcgcnVsZXMgYW5kIGljb24gZm9yIGVhY2ggZ3JvdXAuXG4gKi9cblxuXHQvKipcblx0ICogQW4gb2JqZWN0IHN0b3JpbmcgYWxsIHR5cGVzIGFzIGtleSB2YWx1ZSBwYWlycywgd2hlcmUgdGhlIGtleSBpcyB0aGUgdHlwZSBuYW1lIGFuZCB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IHRoYXQgY291bGQgY29udGFpbiBmb2xsb3dpbmcga2V5cyAoYWxsIG9wdGlvbmFsKS5cblx0ICogXG5cdCAqICogYG1heF9jaGlsZHJlbmAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGltbWVkaWF0ZSBjaGlsZHJlbiB0aGlzIG5vZGUgdHlwZSBjYW4gaGF2ZS4gRG8gbm90IHNwZWNpZnkgb3Igc2V0IHRvIGAtMWAgZm9yIHVubGltaXRlZC5cblx0ICogKiBgbWF4X2RlcHRoYCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGluZyB0aGlzIG5vZGUgdHlwZSBjYW4gaGF2ZS4gQSB2YWx1ZSBvZiBgMWAgd291bGQgbWVhbiB0aGF0IHRoZSBub2RlIGNhbiBoYXZlIGNoaWxkcmVuLCBidXQgbm8gZ3JhbmRjaGlsZHJlbi4gRG8gbm90IHNwZWNpZnkgb3Igc2V0IHRvIGAtMWAgZm9yIHVubGltaXRlZC5cblx0ICogKiBgdmFsaWRfY2hpbGRyZW5gIGFuIGFycmF5IG9mIG5vZGUgdHlwZSBzdHJpbmdzLCB0aGF0IG5vZGVzIG9mIHRoaXMgdHlwZSBjYW4gaGF2ZSBhcyBjaGlsZHJlbi4gRG8gbm90IHNwZWNpZnkgb3Igc2V0IHRvIGAtMWAgZm9yIG5vIGxpbWl0cy5cblx0ICogKiBgaWNvbmAgYSBzdHJpbmcgLSBjYW4gYmUgYSBwYXRoIHRvIGFuIGljb24gb3IgYSBjbGFzc05hbWUsIGlmIHVzaW5nIGFuIGltYWdlIHRoYXQgaXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVzZSBhIGAuL2AgcHJlZml4LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZXRlY3RlZCBhcyBhIGNsYXNzLiBPbWl0IHRvIHVzZSB0aGUgZGVmYXVsdCBpY29uIGZyb20geW91ciB0aGVtZS5cblx0ICpcblx0ICogVGhlcmUgYXJlIHR3byBwcmVkZWZpbmVkIHR5cGVzOlxuXHQgKiBcblx0ICogKiBgI2AgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgdHJlZSwgZm9yIGV4YW1wbGUgYG1heF9jaGlsZHJlbmAgd291bGQgY29udHJvbCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm9vdCBub2Rlcy5cblx0ICogKiBgZGVmYXVsdGAgcmVwcmVzZW50cyB0aGUgZGVmYXVsdCBub2RlIC0gYW55IHNldHRpbmdzIGhlcmUgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBub2RlcyB0aGF0IGRvIG5vdCBoYXZlIGEgdHlwZSBzcGVjaWZpZWQuXG5cdCAqIFxuXHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy50eXBlc1xuXHQgKiBAcGx1Z2luIHR5cGVzXG5cdCAqL1xuXHQkLmpzdHJlZS5kZWZhdWx0cy50eXBlcyA9IHtcblx0XHQnIycgOiB7fSxcblx0XHQnZGVmYXVsdCcgOiB7fVxuXHR9O1xuXG5cdCQuanN0cmVlLnBsdWdpbnMudHlwZXMgPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyZW50KSB7XG5cdFx0dGhpcy5pbml0ID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgaSwgajtcblx0XHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy50eXBlcyAmJiBvcHRpb25zLnR5cGVzWydkZWZhdWx0J10pIHtcblx0XHRcdFx0Zm9yKGkgaW4gb3B0aW9ucy50eXBlcykge1xuXHRcdFx0XHRcdGlmKGkgIT09IFwiZGVmYXVsdFwiICYmIGkgIT09IFwiI1wiICYmIG9wdGlvbnMudHlwZXMuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRcdGZvcihqIGluIG9wdGlvbnMudHlwZXNbJ2RlZmF1bHQnXSkge1xuXHRcdFx0XHRcdFx0XHRpZihvcHRpb25zLnR5cGVzWydkZWZhdWx0J10uaGFzT3duUHJvcGVydHkoaikgJiYgb3B0aW9ucy50eXBlc1tpXVtqXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50eXBlc1tpXVtqXSA9IG9wdGlvbnMudHlwZXNbJ2RlZmF1bHQnXVtqXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cGFyZW50LmluaXQuY2FsbCh0aGlzLCBlbCwgb3B0aW9ucyk7XG5cdFx0XHR0aGlzLl9tb2RlbC5kYXRhWycjJ10udHlwZSA9ICcjJztcblx0XHR9O1xuXHRcdHRoaXMuYmluZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHBhcmVudC5iaW5kLmNhbGwodGhpcyk7XG5cdFx0XHR0aGlzLmVsZW1lbnRcblx0XHRcdFx0Lm9uKCdtb2RlbC5qc3RyZWUnLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XG5cdFx0XHRcdFx0XHR2YXIgbSA9IHRoaXMuX21vZGVsLmRhdGEsXG5cdFx0XHRcdFx0XHRcdGRwYyA9IGRhdGEubm9kZXMsXG5cdFx0XHRcdFx0XHRcdHQgPSB0aGlzLnNldHRpbmdzLnR5cGVzLFxuXHRcdFx0XHRcdFx0XHRpLCBqLCBjID0gJ2RlZmF1bHQnO1xuXHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gZHBjLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRjID0gJ2RlZmF1bHQnO1xuXHRcdFx0XHRcdFx0XHRpZihtW2RwY1tpXV0ub3JpZ2luYWwgJiYgbVtkcGNbaV1dLm9yaWdpbmFsLnR5cGUgJiYgdFttW2RwY1tpXV0ub3JpZ2luYWwudHlwZV0pIHtcblx0XHRcdFx0XHRcdFx0XHRjID0gbVtkcGNbaV1dLm9yaWdpbmFsLnR5cGU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYobVtkcGNbaV1dLmRhdGEgJiYgbVtkcGNbaV1dLmRhdGEuanN0cmVlICYmIG1bZHBjW2ldXS5kYXRhLmpzdHJlZS50eXBlICYmIHRbbVtkcGNbaV1dLmRhdGEuanN0cmVlLnR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdFx0YyA9IG1bZHBjW2ldXS5kYXRhLmpzdHJlZS50eXBlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG1bZHBjW2ldXS50eXBlID0gYztcblx0XHRcdFx0XHRcdFx0aWYobVtkcGNbaV1dLmljb24gPT09IHRydWUgJiYgdFtjXS5pY29uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRtW2RwY1tpXV0uaWNvbiA9IHRbY10uaWNvbjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIHRoaXMpKTtcblx0XHR9O1xuXHRcdHRoaXMuZ2V0X2pzb24gPSBmdW5jdGlvbiAob2JqLCBvcHRpb25zLCBmbGF0KSB7XG5cdFx0XHR2YXIgaSwgaixcblx0XHRcdFx0bSA9IHRoaXMuX21vZGVsLmRhdGEsXG5cdFx0XHRcdG9wdCA9IG9wdGlvbnMgPyAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0aW9ucywge25vX2lkOmZhbHNlfSkgOiB7fSxcblx0XHRcdFx0dG1wID0gcGFyZW50LmdldF9qc29uLmNhbGwodGhpcywgb2JqLCBvcHQsIGZsYXQpO1xuXHRcdFx0aWYodG1wID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdGlmKCQuaXNBcnJheSh0bXApKSB7XG5cdFx0XHRcdGZvcihpID0gMCwgaiA9IHRtcC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHR0bXBbaV0udHlwZSA9IHRtcFtpXS5pZCAmJiBtW3RtcFtpXS5pZF0gJiYgbVt0bXBbaV0uaWRdLnR5cGUgPyBtW3RtcFtpXS5pZF0udHlwZSA6IFwiZGVmYXVsdFwiO1xuXHRcdFx0XHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5ub19pZCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRtcFtpXS5pZDtcblx0XHRcdFx0XHRcdGlmKHRtcFtpXS5saV9hdHRyICYmIHRtcFtpXS5saV9hdHRyLmlkKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB0bXBbaV0ubGlfYXR0ci5pZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0bXAudHlwZSA9IHRtcC5pZCAmJiBtW3RtcC5pZF0gJiYgbVt0bXAuaWRdLnR5cGUgPyBtW3RtcC5pZF0udHlwZSA6IFwiZGVmYXVsdFwiO1xuXHRcdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMubm9faWQpIHtcblx0XHRcdFx0XHR0bXAgPSB0aGlzLl9kZWxldGVfaWRzKHRtcCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0bXA7XG5cdFx0fTtcblx0XHR0aGlzLl9kZWxldGVfaWRzID0gZnVuY3Rpb24gKHRtcCkge1xuXHRcdFx0aWYoJC5pc0FycmF5KHRtcCkpIHtcblx0XHRcdFx0Zm9yKHZhciBpID0gMCwgaiA9IHRtcC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHR0bXBbaV0gPSB0aGlzLl9kZWxldGVfaWRzKHRtcFtpXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdGRlbGV0ZSB0bXAuaWQ7XG5cdFx0XHRpZih0bXAubGlfYXR0ciAmJiB0bXAubGlfYXR0ci5pZCkge1xuXHRcdFx0XHRkZWxldGUgdG1wLmxpX2F0dHIuaWQ7XG5cdFx0XHR9XG5cdFx0XHRpZih0bXAuY2hpbGRyZW4gJiYgJC5pc0FycmF5KHRtcC5jaGlsZHJlbikpIHtcblx0XHRcdFx0dG1wLmNoaWxkcmVuID0gdGhpcy5fZGVsZXRlX2lkcyh0bXAuY2hpbGRyZW4pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRtcDtcblx0XHR9O1xuXHRcdHRoaXMuY2hlY2sgPSBmdW5jdGlvbiAoY2hrLCBvYmosIHBhciwgcG9zKSB7XG5cdFx0XHRpZihwYXJlbnQuY2hlY2suY2FsbCh0aGlzLCBjaGssIG9iaiwgcGFyLCBwb3MpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdG9iaiA9IG9iaiAmJiBvYmouaWQgPyBvYmogOiB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRwYXIgPSBwYXIgJiYgcGFyLmlkID8gcGFyIDogdGhpcy5nZXRfbm9kZShwYXIpO1xuXHRcdFx0dmFyIG0gPSBvYmogJiYgb2JqLmlkID8gJC5qc3RyZWUucmVmZXJlbmNlKG9iai5pZCkgOiBudWxsLCB0bXAsIGQsIGksIGo7XG5cdFx0XHRtID0gbSAmJiBtLl9tb2RlbCAmJiBtLl9tb2RlbC5kYXRhID8gbS5fbW9kZWwuZGF0YSA6IG51bGw7XG5cdFx0XHRzd2l0Y2goY2hrKSB7XG5cdFx0XHRcdGNhc2UgXCJjcmVhdGVfbm9kZVwiOlxuXHRcdFx0XHRjYXNlIFwibW92ZV9ub2RlXCI6XG5cdFx0XHRcdGNhc2UgXCJjb3B5X25vZGVcIjpcblx0XHRcdFx0XHRpZihjaGsgIT09ICdtb3ZlX25vZGUnIHx8ICQuaW5BcnJheShvYmouaWQsIHBhci5jaGlsZHJlbikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0bXAgPSB0aGlzLmdldF9ydWxlcyhwYXIpO1xuXHRcdFx0XHRcdFx0aWYodG1wLm1heF9jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICYmIHRtcC5tYXhfY2hpbGRyZW4gIT09IC0xICYmIHRtcC5tYXhfY2hpbGRyZW4gPT09IHBhci5jaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3IgPSB7ICdlcnJvcicgOiAnY2hlY2snLCAncGx1Z2luJyA6ICd0eXBlcycsICdpZCcgOiAndHlwZXNfMDEnLCAncmVhc29uJyA6ICdtYXhfY2hpbGRyZW4gcHJldmVudHMgZnVuY3Rpb246ICcgKyBjaGssICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHsgJ2NoaycgOiBjaGssICdwb3MnIDogcG9zLCAnb2JqJyA6IG9iaiAmJiBvYmouaWQgPyBvYmouaWQgOiBmYWxzZSwgJ3BhcicgOiBwYXIgJiYgcGFyLmlkID8gcGFyLmlkIDogZmFsc2UgfSkgfTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYodG1wLnZhbGlkX2NoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgdG1wLnZhbGlkX2NoaWxkcmVuICE9PSAtMSAmJiAkLmluQXJyYXkob2JqLnR5cGUsIHRtcC52YWxpZF9jaGlsZHJlbikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2NoZWNrJywgJ3BsdWdpbicgOiAndHlwZXMnLCAnaWQnIDogJ3R5cGVzXzAyJywgJ3JlYXNvbicgOiAndmFsaWRfY2hpbGRyZW4gcHJldmVudHMgZnVuY3Rpb246ICcgKyBjaGssICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHsgJ2NoaycgOiBjaGssICdwb3MnIDogcG9zLCAnb2JqJyA6IG9iaiAmJiBvYmouaWQgPyBvYmouaWQgOiBmYWxzZSwgJ3BhcicgOiBwYXIgJiYgcGFyLmlkID8gcGFyLmlkIDogZmFsc2UgfSkgfTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYobSAmJiBvYmouY2hpbGRyZW5fZCAmJiBvYmoucGFyZW50cykge1xuXHRcdFx0XHRcdFx0XHRkID0gMDtcblx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLmNoaWxkcmVuX2QubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZCA9IE1hdGgubWF4KGQsIG1bb2JqLmNoaWxkcmVuX2RbaV1dLnBhcmVudHMubGVuZ3RoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRkID0gZCAtIG9iai5wYXJlbnRzLmxlbmd0aCArIDE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZihkIDw9IDAgfHwgZCA9PT0gdW5kZWZpbmVkKSB7IGQgPSAxOyB9XG5cdFx0XHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0XHRcdGlmKHRtcC5tYXhfZGVwdGggIT09IHVuZGVmaW5lZCAmJiB0bXAubWF4X2RlcHRoICE9PSAtMSAmJiB0bXAubWF4X2RlcHRoIDwgZCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2NoZWNrJywgJ3BsdWdpbicgOiAndHlwZXMnLCAnaWQnIDogJ3R5cGVzXzAzJywgJ3JlYXNvbicgOiAnbWF4X2RlcHRoIHByZXZlbnRzIGZ1bmN0aW9uOiAnICsgY2hrLCAnZGF0YScgOiBKU09OLnN0cmluZ2lmeSh7ICdjaGsnIDogY2hrLCAncG9zJyA6IHBvcywgJ29iaicgOiBvYmogJiYgb2JqLmlkID8gb2JqLmlkIDogZmFsc2UsICdwYXInIDogcGFyICYmIHBhci5pZCA/IHBhci5pZCA6IGZhbHNlIH0pIH07XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHBhciA9IHRoaXMuZ2V0X25vZGUocGFyLnBhcmVudCk7XG5cdFx0XHRcdFx0XHRcdHRtcCA9IHRoaXMuZ2V0X3J1bGVzKHBhcik7XG5cdFx0XHRcdFx0XHRcdGQrKztcblx0XHRcdFx0XHRcdH0gd2hpbGUocGFyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIHVzZWQgdG8gcmV0cmlldmUgdGhlIHR5cGUgc2V0dGluZ3Mgb2JqZWN0IGZvciBhIG5vZGVcblx0XHQgKiBAbmFtZSBnZXRfcnVsZXMob2JqKVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBmaW5kIHRoZSBydWxlcyBmb3Jcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICogQHBsdWdpbiB0eXBlc1xuXHRcdCAqL1xuXHRcdHRoaXMuZ2V0X3J1bGVzID0gZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xuXHRcdFx0aWYoIW9iaikgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdHZhciB0bXAgPSB0aGlzLmdldF90eXBlKG9iaiwgdHJ1ZSk7XG5cdFx0XHRpZih0bXAubWF4X2RlcHRoID09PSB1bmRlZmluZWQpIHsgdG1wLm1heF9kZXB0aCA9IC0xOyB9XG5cdFx0XHRpZih0bXAubWF4X2NoaWxkcmVuID09PSB1bmRlZmluZWQpIHsgdG1wLm1heF9jaGlsZHJlbiA9IC0xOyB9XG5cdFx0XHRpZih0bXAudmFsaWRfY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkgeyB0bXAudmFsaWRfY2hpbGRyZW4gPSAtMTsgfVxuXHRcdFx0cmV0dXJuIHRtcDtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIHVzZWQgdG8gcmV0cmlldmUgdGhlIHR5cGUgc3RyaW5nIG9yIHNldHRpbmdzIG9iamVjdCBmb3IgYSBub2RlXG5cdFx0ICogQG5hbWUgZ2V0X3R5cGUob2JqIFssIHJ1bGVzXSlcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogdGhlIG5vZGUgdG8gZmluZCB0aGUgcnVsZXMgZm9yXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBydWxlcyBpZiBzZXQgdG8gYHRydWVgIGluc3RlYWQgb2YgYSBzdHJpbmcgdGhlIHNldHRpbmdzIG9iamVjdCB3aWxsIGJlIHJldHVybmVkXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfE9iamVjdH1cblx0XHQgKiBAcGx1Z2luIHR5cGVzXG5cdFx0ICovXG5cdFx0dGhpcy5nZXRfdHlwZSA9IGZ1bmN0aW9uIChvYmosIHJ1bGVzKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRyZXR1cm4gKCFvYmopID8gZmFsc2UgOiAoIHJ1bGVzID8gJC5leHRlbmQoeyAndHlwZScgOiBvYmoudHlwZSB9LCB0aGlzLnNldHRpbmdzLnR5cGVzW29iai50eXBlXSkgOiBvYmoudHlwZSk7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiB1c2VkIHRvIGNoYW5nZSBhIG5vZGUncyB0eXBlXG5cdFx0ICogQG5hbWUgc2V0X3R5cGUob2JqLCB0eXBlKVxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBjaGFuZ2Vcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbmV3IHR5cGVcblx0XHQgKiBAcGx1Z2luIHR5cGVzXG5cdFx0ICovXG5cdFx0dGhpcy5zZXRfdHlwZSA9IGZ1bmN0aW9uIChvYmosIHR5cGUpIHtcblx0XHRcdHZhciB0LCB0MSwgdDIsIG9sZF90eXBlLCBvbGRfaWNvbjtcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcblx0XHRcdFx0XHR0aGlzLnNldF90eXBlKG9ialt0MV0sIHR5cGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dCA9IHRoaXMuc2V0dGluZ3MudHlwZXM7XG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRpZighdFt0eXBlXSB8fCAhb2JqKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFx0b2xkX3R5cGUgPSBvYmoudHlwZTtcblx0XHRcdG9sZF9pY29uID0gdGhpcy5nZXRfaWNvbihvYmopO1xuXHRcdFx0b2JqLnR5cGUgPSB0eXBlO1xuXHRcdFx0aWYob2xkX2ljb24gPT09IHRydWUgfHwgKHRbb2xkX3R5cGVdICYmIHRbb2xkX3R5cGVdLmljb24gJiYgb2xkX2ljb24gPT09IHRbb2xkX3R5cGVdLmljb24pKSB7XG5cdFx0XHRcdHRoaXMuc2V0X2ljb24ob2JqLCB0W3R5cGVdLmljb24gIT09IHVuZGVmaW5lZCA/IHRbdHlwZV0uaWNvbiA6IHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fTtcblx0Ly8gaW5jbHVkZSB0aGUgdHlwZXMgcGx1Z2luIGJ5IGRlZmF1bHRcblx0Ly8gJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKFwidHlwZXNcIik7XG5cbi8qKlxuICogIyMjIFVuaXF1ZSBwbHVnaW5cbiAqXG4gKiBFbmZvcmNlcyB0aGF0IG5vIG5vZGVzIHdpdGggdGhlIHNhbWUgbmFtZSBjYW4gY29leGlzdCBhcyBzaWJsaW5ncy5cbiAqL1xuXG5cdCQuanN0cmVlLnBsdWdpbnMudW5pcXVlID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmVudCkge1xuXHRcdHRoaXMuY2hlY2sgPSBmdW5jdGlvbiAoY2hrLCBvYmosIHBhciwgcG9zKSB7XG5cdFx0XHRpZihwYXJlbnQuY2hlY2suY2FsbCh0aGlzLCBjaGssIG9iaiwgcGFyLCBwb3MpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdG9iaiA9IG9iaiAmJiBvYmouaWQgPyBvYmogOiB0aGlzLmdldF9ub2RlKG9iaik7XG5cdFx0XHRwYXIgPSBwYXIgJiYgcGFyLmlkID8gcGFyIDogdGhpcy5nZXRfbm9kZShwYXIpO1xuXHRcdFx0aWYoIXBhciB8fCAhcGFyLmNoaWxkcmVuKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0XHR2YXIgbiA9IGNoayA9PT0gXCJyZW5hbWVfbm9kZVwiID8gcG9zIDogb2JqLnRleHQsXG5cdFx0XHRcdGMgPSBbXSxcblx0XHRcdFx0bSA9IHRoaXMuX21vZGVsLmRhdGEsIGksIGo7XG5cdFx0XHRmb3IoaSA9IDAsIGogPSBwYXIuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRcdGMucHVzaChtW3Bhci5jaGlsZHJlbltpXV0udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2goY2hrKSB7XG5cdFx0XHRcdGNhc2UgXCJkZWxldGVfbm9kZVwiOlxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRjYXNlIFwicmVuYW1lX25vZGVcIjpcblx0XHRcdFx0Y2FzZSBcImNvcHlfbm9kZVwiOlxuXHRcdFx0XHRcdGkgPSAoJC5pbkFycmF5KG4sIGMpID09PSAtMSk7XG5cdFx0XHRcdFx0aWYoIWkpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2NoZWNrJywgJ3BsdWdpbicgOiAndW5pcXVlJywgJ2lkJyA6ICd1bmlxdWVfMDEnLCAncmVhc29uJyA6ICdDaGlsZCB3aXRoIG5hbWUgJyArIG4gKyAnIGFscmVhZHkgZXhpc3RzLiBQcmV2ZW50aW5nOiAnICsgY2hrLCAnZGF0YScgOiBKU09OLnN0cmluZ2lmeSh7ICdjaGsnIDogY2hrLCAncG9zJyA6IHBvcywgJ29iaicgOiBvYmogJiYgb2JqLmlkID8gb2JqLmlkIDogZmFsc2UsICdwYXInIDogcGFyICYmIHBhci5pZCA/IHBhci5pZCA6IGZhbHNlIH0pIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0XHRjYXNlIFwibW92ZV9ub2RlXCI6XG5cdFx0XHRcdFx0aSA9IChvYmoucGFyZW50ID09PSBwYXIuaWQgfHwgJC5pbkFycmF5KG4sIGMpID09PSAtMSk7XG5cdFx0XHRcdFx0aWYoIWkpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2NoZWNrJywgJ3BsdWdpbicgOiAndW5pcXVlJywgJ2lkJyA6ICd1bmlxdWVfMDEnLCAncmVhc29uJyA6ICdDaGlsZCB3aXRoIG5hbWUgJyArIG4gKyAnIGFscmVhZHkgZXhpc3RzLiBQcmV2ZW50aW5nOiAnICsgY2hrLCAnZGF0YScgOiBKU09OLnN0cmluZ2lmeSh7ICdjaGsnIDogY2hrLCAncG9zJyA6IHBvcywgJ29iaicgOiBvYmogJiYgb2JqLmlkID8gb2JqLmlkIDogZmFsc2UsICdwYXInIDogcGFyICYmIHBhci5pZCA/IHBhci5pZCA6IGZhbHNlIH0pIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fTtcblxuXHQvLyBpbmNsdWRlIHRoZSB1bmlxdWUgcGx1Z2luIGJ5IGRlZmF1bHRcblx0Ly8gJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKFwidW5pcXVlXCIpO1xuXG5cbi8qKlxuICogIyMjIFdob2xlcm93IHBsdWdpblxuICpcbiAqIE1ha2VzIGVhY2ggbm9kZSBhcHBlYXIgYmxvY2sgbGV2ZWwuIE1ha2luZyBzZWxlY3Rpb24gZWFzaWVyLiBNYXkgY2F1c2Ugc2xvdyBkb3duIGZvciBsYXJnZSB0cmVlcyBpbiBvbGQgYnJvd3NlcnMuXG4gKi9cblxuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cdGRpdi5zZXRBdHRyaWJ1dGUoJ3Vuc2VsZWN0YWJsZScsJ29uJyk7XG5cdGRpdi5jbGFzc05hbWUgPSAnanN0cmVlLXdob2xlcm93Jztcblx0ZGl2LmlubmVySFRNTCA9ICcmIzE2MDsnO1xuXHQkLmpzdHJlZS5wbHVnaW5zLndob2xlcm93ID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmVudCkge1xuXHRcdHRoaXMuYmluZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHBhcmVudC5iaW5kLmNhbGwodGhpcyk7XG5cblx0XHRcdHRoaXMuZWxlbWVudFxuXHRcdFx0XHQub24oJ2xvYWRpbmcnLCAkLnByb3h5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGRpdi5zdHlsZS5oZWlnaHQgPSB0aGlzLl9kYXRhLmNvcmUubGlfaGVpZ2h0ICsgJ3B4Jztcblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKCdyZWFkeS5qc3RyZWUgc2V0X3N0YXRlLmpzdHJlZScsICQucHJveHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5oaWRlX2RvdHMoKTtcblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKFwicmVhZHkuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5nZXRfY29udGFpbmVyX3VsKCkuYWRkQ2xhc3MoJ2pzdHJlZS13aG9sZXJvdy11bCcpO1xuXHRcdFx0XHRcdH0sIHRoaXMpKVxuXHRcdFx0XHQub24oXCJkZXNlbGVjdF9hbGwuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0XHRcdHRoaXMuZWxlbWVudC5maW5kKCcuanN0cmVlLXdob2xlcm93LWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnanN0cmVlLXdob2xlcm93LWNsaWNrZWQnKTtcblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKFwiY2hhbmdlZC5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xuXHRcdFx0XHRcdFx0dGhpcy5lbGVtZW50LmZpbmQoJy5qc3RyZWUtd2hvbGVyb3ctY2xpY2tlZCcpLnJlbW92ZUNsYXNzKCdqc3RyZWUtd2hvbGVyb3ctY2xpY2tlZCcpO1xuXHRcdFx0XHRcdFx0dmFyIHRtcCA9IGZhbHNlLCBpLCBqO1xuXHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gZGF0YS5zZWxlY3RlZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShkYXRhLnNlbGVjdGVkW2ldLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0aWYodG1wICYmIHRtcC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHR0bXAuY2hpbGRyZW4oJy5qc3RyZWUtd2hvbGVyb3cnKS5hZGRDbGFzcygnanN0cmVlLXdob2xlcm93LWNsaWNrZWQnKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIHRoaXMpKVxuXHRcdFx0XHQub24oXCJvcGVuX25vZGUuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0X25vZGUoZGF0YS5ub2RlLCB0cnVlKS5maW5kKCcuanN0cmVlLWNsaWNrZWQnKS5wYXJlbnQoKS5jaGlsZHJlbignLmpzdHJlZS13aG9sZXJvdycpLmFkZENsYXNzKCdqc3RyZWUtd2hvbGVyb3ctY2xpY2tlZCcpO1xuXHRcdFx0XHRcdH0sIHRoaXMpKVxuXHRcdFx0XHQub24oXCJob3Zlcl9ub2RlLmpzdHJlZSBkZWhvdmVyX25vZGUuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0X25vZGUoZGF0YS5ub2RlLCB0cnVlKS5jaGlsZHJlbignLmpzdHJlZS13aG9sZXJvdycpW2UudHlwZSA9PT0gXCJob3Zlcl9ub2RlXCI/XCJhZGRDbGFzc1wiOlwicmVtb3ZlQ2xhc3NcIl0oJ2pzdHJlZS13aG9sZXJvdy1ob3ZlcmVkJyk7XG5cdFx0XHRcdFx0fSwgdGhpcykpXG5cdFx0XHRcdC5vbihcImNvbnRleHRtZW51LmpzdHJlZVwiLCBcIi5qc3RyZWUtd2hvbGVyb3dcIiwgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0JChlLmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoXCJsaVwiKS5jaGlsZHJlbihcImE6ZXEoMClcIikudHJpZ2dlcignY29udGV4dG1lbnUnLGUpO1xuXHRcdFx0XHRcdH0sIHRoaXMpKVxuXHRcdFx0XHQub24oXCJjbGljay5qc3RyZWVcIiwgXCIuanN0cmVlLXdob2xlcm93XCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0dmFyIHRtcCA9ICQuRXZlbnQoJ2NsaWNrJywgeyBtZXRhS2V5IDogZS5tZXRhS2V5LCBjdHJsS2V5IDogZS5jdHJsS2V5LCBhbHRLZXkgOiBlLmFsdEtleSwgc2hpZnRLZXkgOiBlLnNoaWZ0S2V5IH0pO1xuXHRcdFx0XHRcdFx0JChlLmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoXCJsaVwiKS5jaGlsZHJlbihcImE6ZXEoMClcIikudHJpZ2dlcih0bXApLmZvY3VzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0Lm9uKFwiY2xpY2suanN0cmVlXCIsIFwiLmpzdHJlZS1sZWFmID4gLmpzdHJlZS1vY2xcIiwgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdHZhciB0bXAgPSAkLkV2ZW50KCdjbGljaycsIHsgbWV0YUtleSA6IGUubWV0YUtleSwgY3RybEtleSA6IGUuY3RybEtleSwgYWx0S2V5IDogZS5hbHRLZXksIHNoaWZ0S2V5IDogZS5zaGlmdEtleSB9KTtcblx0XHRcdFx0XHRcdCQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KFwibGlcIikuY2hpbGRyZW4oXCJhOmVxKDApXCIpLnRyaWdnZXIodG1wKS5mb2N1cygpO1xuXHRcdFx0XHRcdH0sIHRoaXMpKVxuXHRcdFx0XHQub24oXCJtb3VzZW92ZXIuanN0cmVlXCIsIFwiLmpzdHJlZS13aG9sZXJvdywgLmpzdHJlZS1pY29uXCIsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmhvdmVyX25vZGUoZS5jdXJyZW50VGFyZ2V0KTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9LCB0aGlzKSlcblx0XHRcdFx0Lm9uKFwibW91c2VsZWF2ZS5qc3RyZWVcIiwgXCIuanN0cmVlLW5vZGVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5kZWhvdmVyX25vZGUoZS5jdXJyZW50VGFyZ2V0KTtcblx0XHRcdFx0XHR9LCB0aGlzKSk7XG5cdFx0fTtcblx0XHR0aGlzLnRlYXJkb3duID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy53aG9sZXJvdykge1xuXHRcdFx0XHR0aGlzLmVsZW1lbnQuZmluZChcIi5qc3RyZWUtd2hvbGVyb3dcIikucmVtb3ZlKCk7XG5cdFx0XHR9XG5cdFx0XHRwYXJlbnQudGVhcmRvd24uY2FsbCh0aGlzKTtcblx0XHR9O1xuXHRcdHRoaXMucmVkcmF3X25vZGUgPSBmdW5jdGlvbihvYmosIGRlZXAsIGNhbGxiYWNrKSB7XG5cdFx0XHRvYmogPSBwYXJlbnQucmVkcmF3X25vZGUuY2FsbCh0aGlzLCBvYmosIGRlZXAsIGNhbGxiYWNrKTtcblx0XHRcdGlmKG9iaikge1xuXHRcdFx0XHR2YXIgdG1wID0gZGl2LmNsb25lTm9kZSh0cnVlKTtcblx0XHRcdFx0Ly90bXAuc3R5bGUuaGVpZ2h0ID0gdGhpcy5fZGF0YS5jb3JlLmxpX2hlaWdodCArICdweCc7XG5cdFx0XHRcdGlmKCQuaW5BcnJheShvYmouaWQsIHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCkgIT09IC0xKSB7IHRtcC5jbGFzc05hbWUgKz0gJyBqc3RyZWUtd2hvbGVyb3ctY2xpY2tlZCc7IH1cblx0XHRcdFx0b2JqLmluc2VydEJlZm9yZSh0bXAsIG9iai5jaGlsZE5vZGVzWzBdKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmo7XG5cdFx0fTtcblx0fTtcblx0Ly8gaW5jbHVkZSB0aGUgd2hvbGVyb3cgcGx1Z2luIGJ5IGRlZmF1bHRcblx0Ly8gJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKFwid2hvbGVyb3dcIik7XG5cbn0pKTsiXSwiZmlsZSI6ImpzdHJlZS5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqc3RyZWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypnbG9iYWxzIGpRdWVyeSwgZGVmaW5lLCBleHBvcnRzLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovXHJcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcclxuXHRcdGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTtcclxuXHR9XHJcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcclxuXHRcdGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpO1xyXG5cdH1cclxuXHRlbHNlIHtcclxuXHRcdGZhY3RvcnkoalF1ZXJ5KTtcclxuXHR9XHJcbn0oZnVuY3Rpb24gKCQsIHVuZGVmaW5lZCkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG4vKiFcclxuICoganNUcmVlIDMuMC4wXHJcbiAqIGh0dHA6Ly9qc3RyZWUuY29tL1xyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMgSXZhbiBCb3poYW5vdiAoaHR0cDovL3Zha2F0YS5jb20pXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHNhbWUgYXMganF1ZXJ5IC0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgTGljZW5zZVxyXG4gKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcbiAqL1xyXG4vKiFcclxuICogaWYgdXNpbmcganNsaW50IHBsZWFzZSBhbGxvdyBmb3IgdGhlIGpRdWVyeSBnbG9iYWwgYW5kIHVzZSBmb2xsb3dpbmcgb3B0aW9uczogXHJcbiAqIGpzbGludDogYnJvd3NlcjogdHJ1ZSwgYXNzOiB0cnVlLCBiaXR3aXNlOiB0cnVlLCBjb250aW51ZTogdHJ1ZSwgbm9tZW46IHRydWUsIHBsdXNwbHVzOiB0cnVlLCByZWdleHA6IHRydWUsIHVucGFyYW06IHRydWUsIHRvZG86IHRydWUsIHdoaXRlOiB0cnVlXHJcbiAqL1xyXG5cclxuXHQvLyBwcmV2ZW50IGFub3RoZXIgbG9hZD8gbWF5YmUgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5P1xyXG5cdGlmKCQuanN0cmVlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiAjIyMganNUcmVlIGNvcmUgZnVuY3Rpb25hbGl0eVxyXG5cdCAqL1xyXG5cclxuXHQvLyBpbnRlcm5hbCB2YXJpYWJsZXNcclxuXHR2YXIgaW5zdGFuY2VfY291bnRlciA9IDAsXHJcblx0XHRjY3Bfbm9kZSA9IGZhbHNlLFxyXG5cdFx0Y2NwX21vZGUgPSBmYWxzZSxcclxuXHRcdGNjcF9pbnN0ID0gZmFsc2UsXHJcblx0XHR0aGVtZXNfbG9hZGVkID0gW10sXHJcblx0XHRzcmMgPSAkKCdzY3JpcHQ6bGFzdCcpLmF0dHIoJ3NyYycpLFxyXG5cdFx0X2QgPSBkb2N1bWVudCwgX25vZGUgPSBfZC5jcmVhdGVFbGVtZW50KCdMSScpLCBfdGVtcDEsIF90ZW1wMjtcclxuXHJcblx0X25vZGUuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RyZWVpdGVtJyk7XHJcblx0X3RlbXAxID0gX2QuY3JlYXRlRWxlbWVudCgnSScpO1xyXG5cdF90ZW1wMS5jbGFzc05hbWUgPSAnanN0cmVlLWljb24ganN0cmVlLW9jbCc7XHJcblx0X25vZGUuYXBwZW5kQ2hpbGQoX3RlbXAxKTtcclxuXHRfdGVtcDEgPSBfZC5jcmVhdGVFbGVtZW50KCdBJyk7XHJcblx0X3RlbXAxLmNsYXNzTmFtZSA9ICdqc3RyZWUtYW5jaG9yJztcclxuXHRfdGVtcDEuc2V0QXR0cmlidXRlKCdocmVmJywnIycpO1xyXG5cdF90ZW1wMiA9IF9kLmNyZWF0ZUVsZW1lbnQoJ0knKTtcclxuXHRfdGVtcDIuY2xhc3NOYW1lID0gJ2pzdHJlZS1pY29uIGpzdHJlZS10aGVtZWljb24nO1xyXG5cdF90ZW1wMS5hcHBlbmRDaGlsZChfdGVtcDIpO1xyXG5cdF9ub2RlLmFwcGVuZENoaWxkKF90ZW1wMSk7XHJcblx0X3RlbXAxID0gX3RlbXAyID0gbnVsbDtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIGhvbGRzIGFsbCBqc3RyZWUgcmVsYXRlZCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgY2xhc3MgYW5kIG1ldGhvZHMgdG8gY3JlYXRlLCBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgaW5zdGFuY2VzLlxyXG5cdCAqIEBuYW1lICQuanN0cmVlXHJcblx0ICovXHJcblx0JC5qc3RyZWUgPSB7XHJcblx0XHQvKiogXHJcblx0XHQgKiBzcGVjaWZpZXMgdGhlIGpzdHJlZSB2ZXJzaW9uIGluIHVzZVxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUudmVyc2lvblxyXG5cdFx0ICovXHJcblx0XHR2ZXJzaW9uIDogJzMuMC4wLWJldGE5JyxcclxuXHRcdC8qKlxyXG5cdFx0ICogaG9sZHMgYWxsIHRoZSBkZWZhdWx0IG9wdGlvbnMgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzXHJcblx0XHQgKi9cclxuXHRcdGRlZmF1bHRzIDoge1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogY29uZmlndXJlIHdoaWNoIHBsdWdpbnMgd2lsbCBiZSBhY3RpdmUgb24gYW4gaW5zdGFuY2UuIFNob3VsZCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLCB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgYSBwbHVnaW4gbmFtZS4gVGhlIGRlZmF1bHQgaXMgYFtdYFxyXG5cdFx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRwbHVnaW5zIDogW11cclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHN0b3JlcyBhbGwgbG9hZGVkIGpzdHJlZSBwbHVnaW5zICh1c2VkIGludGVybmFsbHkpXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5wbHVnaW5zXHJcblx0XHQgKi9cclxuXHRcdHBsdWdpbnMgOiB7fSxcclxuXHRcdHBhdGggOiBzcmMgJiYgc3JjLmluZGV4T2YoJy8nKSAhPT0gLTEgPyBzcmMucmVwbGFjZSgvXFwvW15cXC9dKyQvLCcnKSA6ICcnXHJcblx0fTtcclxuXHQvKipcclxuXHQgKiBjcmVhdGVzIGEganN0cmVlIGluc3RhbmNlXHJcblx0ICogQG5hbWUgJC5qc3RyZWUuY3JlYXRlKGVsIFssIG9wdGlvbnNdKVxyXG5cdCAqIEBwYXJhbSB7RE9NRWxlbWVudHxqUXVlcnl8U3RyaW5nfSBlbCB0aGUgZWxlbWVudCB0byBjcmVhdGUgdGhlIGluc3RhbmNlIG9uLCBjYW4gYmUgalF1ZXJ5IGV4dGVuZGVkIG9yIGEgc2VsZWN0b3JcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGlzIGluc3RhbmNlIChleHRlbmRzIGAkLmpzdHJlZS5kZWZhdWx0c2ApXHJcblx0ICogQHJldHVybiB7anNUcmVlfSB0aGUgbmV3IGluc3RhbmNlXHJcblx0ICovXHJcblx0JC5qc3RyZWUuY3JlYXRlID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7XHJcblx0XHR2YXIgdG1wID0gbmV3ICQuanN0cmVlLmNvcmUoKytpbnN0YW5jZV9jb3VudGVyKSxcclxuXHRcdFx0b3B0ID0gb3B0aW9ucztcclxuXHRcdG9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5qc3RyZWUuZGVmYXVsdHMsIG9wdGlvbnMpO1xyXG5cdFx0aWYob3B0ICYmIG9wdC5wbHVnaW5zKSB7XHJcblx0XHRcdG9wdGlvbnMucGx1Z2lucyA9IG9wdC5wbHVnaW5zO1xyXG5cdFx0fVxyXG5cdFx0JC5lYWNoKG9wdGlvbnMucGx1Z2lucywgZnVuY3Rpb24gKGksIGspIHtcclxuXHRcdFx0aWYoaSAhPT0gJ2NvcmUnKSB7XHJcblx0XHRcdFx0dG1wID0gdG1wLnBsdWdpbihrLCBvcHRpb25zW2tdKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHR0bXAuaW5pdChlbCwgb3B0aW9ucyk7XHJcblx0XHRyZXR1cm4gdG1wO1xyXG5cdH07XHJcblx0LyoqXHJcblx0ICogdGhlIGpzdHJlZSBjbGFzcyBjb25zdHJ1Y3RvciwgdXNlZCBvbmx5IGludGVybmFsbHlcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBuYW1lICQuanN0cmVlLmNvcmUoaWQpXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGlkIHRoaXMgaW5zdGFuY2UncyBpbmRleFxyXG5cdCAqL1xyXG5cdCQuanN0cmVlLmNvcmUgPSBmdW5jdGlvbiAoaWQpIHtcclxuXHRcdHRoaXMuX2lkID0gaWQ7XHJcblx0XHR0aGlzLl9jbnQgPSAwO1xyXG5cdFx0dGhpcy5fZGF0YSA9IHtcclxuXHRcdFx0Y29yZSA6IHtcclxuXHRcdFx0XHR0aGVtZXMgOiB7XHJcblx0XHRcdFx0XHRuYW1lIDogZmFsc2UsXHJcblx0XHRcdFx0XHRkb3RzIDogZmFsc2UsXHJcblx0XHRcdFx0XHRpY29ucyA6IGZhbHNlXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRzZWxlY3RlZCA6IFtdLFxyXG5cdFx0XHRcdGxhc3RfZXJyb3IgOiB7fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdH07XHJcblx0LyoqXHJcblx0ICogZ2V0IGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIGluc3RhbmNlXHJcblx0ICpcclxuXHQgKiBfX0V4YW1wbGVzX19cclxuXHQgKlxyXG5cdCAqXHQvLyBwcm92aWRlZCBhIGNvbnRhaW5lciB3aXRoIGFuIElEIG9mIFwidHJlZVwiLCBhbmQgYSBuZXN0ZWQgbm9kZSB3aXRoIGFuIElEIG9mIFwiYnJhbmNoXCJcclxuXHQgKlx0Ly8gYWxsIG9mIHRoZXJlIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlXHJcblx0ICpcdCQuanN0cmVlLnJlZmVyZW5jZSgndHJlZScpO1xyXG5cdCAqXHQkLmpzdHJlZS5yZWZlcmVuY2UoJyN0cmVlJyk7XHJcblx0ICpcdCQuanN0cmVlLnJlZmVyZW5jZSgkKCcjdHJlZScpKTtcclxuXHQgKlx0JC5qc3RyZWUucmVmZXJlbmNlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlEKCd0cmVlJykpO1xyXG5cdCAqXHQkLmpzdHJlZS5yZWZlcmVuY2UoJ2JyYW5jaCcpO1xyXG5cdCAqXHQkLmpzdHJlZS5yZWZlcmVuY2UoJyNicmFuY2gnKTtcclxuXHQgKlx0JC5qc3RyZWUucmVmZXJlbmNlKCQoJyNicmFuY2gnKSk7XHJcblx0ICpcdCQuanN0cmVlLnJlZmVyZW5jZShkb2N1bWVudC5nZXRFbGVtZW50QnlJRCgnYnJhbmNoJykpO1xyXG5cdCAqXHJcblx0ICogQG5hbWUgJC5qc3RyZWUucmVmZXJlbmNlKG5lZWRsZSlcclxuXHQgKiBAcGFyYW0ge0RPTUVsZW1lbnR8alF1ZXJ5fFN0cmluZ30gbmVlZGxlXHJcblx0ICogQHJldHVybiB7anNUcmVlfG51bGx9IHRoZSBpbnN0YW5jZSBvciBgbnVsbGAgaWYgbm90IGZvdW5kXHJcblx0ICovXHJcblx0JC5qc3RyZWUucmVmZXJlbmNlID0gZnVuY3Rpb24gKG5lZWRsZSkge1xyXG5cdFx0aWYobmVlZGxlICYmICEkKG5lZWRsZSkubGVuZ3RoKSB7XHJcblx0XHRcdGlmKG5lZWRsZS5pZCkge1xyXG5cdFx0XHRcdG5lZWRsZSA9IG5lZWRsZS5pZDtcclxuXHRcdFx0fVxyXG5cdFx0XHR2YXIgdG1wID0gbnVsbDtcclxuXHRcdFx0JCgnLmpzdHJlZScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHZhciBpbnN0ID0gJCh0aGlzKS5kYXRhKCdqc3RyZWUnKTtcclxuXHRcdFx0XHRpZihpbnN0ICYmIGluc3QuX21vZGVsLmRhdGFbbmVlZGxlXSkge1xyXG5cdFx0XHRcdFx0dG1wID0gaW5zdDtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRyZXR1cm4gdG1wO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuICQobmVlZGxlKS5jbG9zZXN0KCcuanN0cmVlJykuZGF0YSgnanN0cmVlJyk7XHJcblx0fTtcclxuXHQvKipcclxuXHQgKiBDcmVhdGUgYW4gaW5zdGFuY2UsIGdldCBhbiBpbnN0YW5jZSBvciBpbnZva2UgYSBjb21tYW5kIG9uIGEgaW5zdGFuY2UuIFxyXG5cdCAqIFxyXG5cdCAqIElmIHRoZXJlIGlzIG5vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCBgYXJnYCBpcyB1c2VkIHRvIGV4dGVuZCBgJC5qc3RyZWUuZGVmYXVsdHNgIGZvciB0aGlzIG5ldyBpbnN0YW5jZS4gVGhlcmUgd291bGQgYmUgbm8gcmV0dXJuIHZhbHVlIChjaGFpbmluZyBpcyBub3QgYnJva2VuKS5cclxuXHQgKiBcclxuXHQgKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBpbnN0YW5jZSBhbmQgYGFyZ2AgaXMgYSBzdHJpbmcgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IGBhcmdgIGlzIGV4ZWN1dGVkIG9uIHRoZSBpbnN0YW5jZSwgd2l0aCBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBpdCB3aWxsIGJlIHJldHVybmVkIChjaGFpbmluZyBjb3VsZCBicmVhayBkZXBlbmRpbmcgb24gZnVuY3Rpb24pLlxyXG5cdCAqIFxyXG5cdCAqIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGluc3RhbmNlIGFuZCBgYXJnYCBpcyBub3QgYSBzdHJpbmcgdGhlIGluc3RhbmNlIGl0c2VsZiBpcyByZXR1cm5lZCAoc2ltaWxhciB0byBgJC5qc3RyZWUucmVmZXJlbmNlYCkuXHJcblx0ICogXHJcblx0ICogSW4gYW55IG90aGVyIGNhc2UgLSBub3RoaW5nIGlzIHJldHVybmVkIGFuZCBjaGFpbmluZyBpcyBub3QgYnJva2VuLlxyXG5cdCAqXHJcblx0ICogX19FeGFtcGxlc19fXHJcblx0ICpcclxuXHQgKlx0JCgnI3RyZWUxJykuanN0cmVlKCk7IC8vIGNyZWF0ZXMgYW4gaW5zdGFuY2VcclxuXHQgKlx0JCgnI3RyZWUyJykuanN0cmVlKHsgcGx1Z2lucyA6IFtdIH0pOyAvLyBjcmVhdGUgYW4gaW5zdGFuY2Ugd2l0aCBzb21lIG9wdGlvbnNcclxuXHQgKlx0JCgnI3RyZWUxJykuanN0cmVlKCdvcGVuX25vZGUnLCAnI2JyYW5jaF8xJyk7IC8vIGNhbGwgYSBtZXRob2Qgb24gYW4gZXhpc3RpbmcgaW5zdGFuY2UsIHBhc3NpbmcgYWRkaXRpb25hbCBhcmd1bWVudHNcclxuXHQgKlx0JCgnI3RyZWUyJykuanN0cmVlKCk7IC8vIGdldCBhbiBleGlzdGluZyBpbnN0YW5jZSAob3IgY3JlYXRlIGFuIGluc3RhbmNlKVxyXG5cdCAqXHQkKCcjdHJlZTInKS5qc3RyZWUodHJ1ZSk7IC8vIGdldCBhbiBleGlzdGluZyBpbnN0YW5jZSAod2lsbCBub3QgY3JlYXRlIG5ldyBpbnN0YW5jZSlcclxuXHQgKlx0JCgnI2JyYW5jaF8xJykuanN0cmVlKCkuc2VsZWN0X25vZGUoJyNicmFuY2hfMScpOyAvLyBnZXQgYW4gaW5zdGFuY2UgKHVzaW5nIGEgbmVzdGVkIGVsZW1lbnQgYW5kIGNhbGwgYSBtZXRob2QpXHJcblx0ICpcclxuXHQgKiBAbmFtZSAkKCkuanN0cmVlKFthcmddKVxyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gYXJnXHJcblx0ICogQHJldHVybiB7TWl4ZWR9XHJcblx0ICovXHJcblx0JC5mbi5qc3RyZWUgPSBmdW5jdGlvbiAoYXJnKSB7XHJcblx0XHQvLyBjaGVjayBmb3Igc3RyaW5nIGFyZ3VtZW50XHJcblx0XHR2YXIgaXNfbWV0aG9kXHQ9ICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJyksXHJcblx0XHRcdGFyZ3NcdFx0PSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxyXG5cdFx0XHRyZXN1bHRcdFx0PSBudWxsO1xyXG5cdFx0dGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Ly8gZ2V0IHRoZSBpbnN0YW5jZSAoaWYgdGhlcmUgaXMgb25lKSBhbmQgbWV0aG9kIChpZiBpdCBleGlzdHMpXHJcblx0XHRcdHZhciBpbnN0YW5jZSA9ICQuanN0cmVlLnJlZmVyZW5jZSh0aGlzKSxcclxuXHRcdFx0XHRtZXRob2QgPSBpc19tZXRob2QgJiYgaW5zdGFuY2UgPyBpbnN0YW5jZVthcmddIDogbnVsbDtcclxuXHRcdFx0Ly8gaWYgY2FsbGluZyBhIG1ldGhvZCwgYW5kIG1ldGhvZCBpcyBhdmFpbGFibGUgLSBleGVjdXRlIG9uIHRoZSBpbnN0YW5jZVxyXG5cdFx0XHRyZXN1bHQgPSBpc19tZXRob2QgJiYgbWV0aG9kID9cclxuXHRcdFx0XHRtZXRob2QuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpIDpcclxuXHRcdFx0XHRudWxsO1xyXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBpbnN0YW5jZSBhbmQgbm8gbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCAtIGNyZWF0ZSBvbmVcclxuXHRcdFx0aWYoIWluc3RhbmNlICYmICFpc19tZXRob2QgJiYgKGFyZyA9PT0gdW5kZWZpbmVkIHx8ICQuaXNQbGFpbk9iamVjdChhcmcpKSkge1xyXG5cdFx0XHRcdCQodGhpcykuZGF0YSgnanN0cmVlJywgbmV3ICQuanN0cmVlLmNyZWF0ZSh0aGlzLCBhcmcpKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBhbiBpbnN0YW5jZSBhbmQgbm8gbWV0aG9kIGlzIGNhbGxlZCAtIHJldHVybiB0aGUgaW5zdGFuY2VcclxuXHRcdFx0aWYoaW5zdGFuY2UgJiYgIWlzX21ldGhvZCkge1xyXG5cdFx0XHRcdHJlc3VsdCA9IGluc3RhbmNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIGlmIHRoZXJlIHdhcyBhIG1ldGhvZCBjYWxsIHdoaWNoIHJldHVybmVkIGEgcmVzdWx0IC0gYnJlYWsgYW5kIHJldHVybiB0aGUgdmFsdWVcclxuXHRcdFx0aWYocmVzdWx0ICE9PSBudWxsICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdC8vIGlmIHRoZXJlIHdhcyBhIG1ldGhvZCBjYWxsIHdpdGggYSB2YWxpZCByZXR1cm4gdmFsdWUgLSByZXR1cm4gdGhhdCwgb3RoZXJ3aXNlIGNvbnRpbnVlIHRoZSBjaGFpblxyXG5cdFx0cmV0dXJuIHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCA/XHJcblx0XHRcdHJlc3VsdCA6IHRoaXM7XHJcblx0fTtcclxuXHQvKipcclxuXHQgKiB1c2VkIHRvIGZpbmQgZWxlbWVudHMgY29udGFpbmluZyBhbiBpbnN0YW5jZVxyXG5cdCAqXHJcblx0ICogX19FeGFtcGxlc19fXHJcblx0ICpcclxuXHQgKlx0JCgnZGl2OmpzdHJlZScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG5cdCAqXHRcdCQodGhpcykuanN0cmVlKCdkZXN0cm95Jyk7XHJcblx0ICpcdH0pO1xyXG5cdCAqXHJcblx0ICogQG5hbWUgJCgnOmpzdHJlZScpXHJcblx0ICogQHJldHVybiB7alF1ZXJ5fVxyXG5cdCAqL1xyXG5cdCQuZXhwclsnOiddLmpzdHJlZSA9ICQuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24oc2VhcmNoKSB7XHJcblx0XHRyZXR1cm4gZnVuY3Rpb24oYSkge1xyXG5cdFx0XHRyZXR1cm4gJChhKS5oYXNDbGFzcygnanN0cmVlJykgJiZcclxuXHRcdFx0XHQkKGEpLmRhdGEoJ2pzdHJlZScpICE9PSB1bmRlZmluZWQ7XHJcblx0XHR9O1xyXG5cdH0pO1xyXG5cclxuXHQvKipcclxuXHQgKiBzdG9yZXMgYWxsIGRlZmF1bHRzIGZvciB0aGUgY29yZVxyXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmVcclxuXHQgKi9cclxuXHQkLmpzdHJlZS5kZWZhdWx0cy5jb3JlID0ge1xyXG5cdFx0LyoqXHJcblx0XHQgKiBkYXRhIGNvbmZpZ3VyYXRpb25cclxuXHRcdCAqIFxyXG5cdFx0ICogSWYgbGVmdCBhcyBgZmFsc2VgIHRoZSBIVE1MIGluc2lkZSB0aGUganN0cmVlIGNvbnRhaW5lciBlbGVtZW50IGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHRyZWUgKHRoYXQgc2hvdWxkIGJlIGFuIHVub3JkZXJlZCBsaXN0IHdpdGggbGlzdCBpdGVtcykuXHJcblx0XHQgKlxyXG5cdFx0ICogWW91IGNhbiBhbHNvIHBhc3MgaW4gYSBIVE1MIHN0cmluZyBvciBhIEpTT04gYXJyYXkgaGVyZS5cclxuXHRcdCAqIFxyXG5cdFx0ICogSXQgaXMgcG9zc2libGUgdG8gcGFzcyBpbiBhIHN0YW5kYXJkIGpRdWVyeS1saWtlIEFKQVggY29uZmlnIGFuZCBqc3RyZWUgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBpZiB0aGUgcmVzcG9uc2UgaXMgSlNPTiBvciBIVE1MIGFuZCB1c2UgdGhhdCB0byBwb3B1bGF0ZSB0aGUgdHJlZS4gXHJcblx0XHQgKiBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgalF1ZXJ5IGFqYXggb3B0aW9ucyBoZXJlIHlvdSBjYW4gc3VwcHkgZnVuY3Rpb25zIGZvciBgZGF0YWAgYW5kIGB1cmxgLCB0aGUgZnVuY3Rpb25zIHdpbGwgYmUgcnVuIGluIHRoZSBjdXJyZW50IGluc3RhbmNlJ3Mgc2NvcGUgYW5kIGEgcGFyYW0gd2lsbCBiZSBwYXNzZWQgaW5kaWNhdGluZyB3aGljaCBub2RlIGlzIGJlaW5nIGxvYWRlZCwgdGhlIHJldHVybiB2YWx1ZSBvZiB0aG9zZSBmdW5jdGlvbnMgd2lsbCBiZSB1c2VkLlxyXG5cdFx0ICogXHJcblx0XHQgKiBUaGUgbGFzdCBvcHRpb24gaXMgdG8gc3BlY2lmeSBhIGZ1bmN0aW9uLCB0aGF0IGZ1bmN0aW9uIHdpbGwgcmVjZWl2ZSB0aGUgbm9kZSBiZWluZyBsb2FkZWQgYXMgYXJndW1lbnQgYW5kIGEgc2Vjb25kIHBhcmFtIHdoaWNoIGlzIGEgZnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSByZXN1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogX19FeGFtcGxlc19fXHJcblx0XHQgKlxyXG5cdFx0ICpcdC8vIEFKQVhcclxuXHRcdCAqXHQkKCcjdHJlZScpLmpzdHJlZSh7XHJcblx0XHQgKlx0XHQnY29yZScgOiB7XHJcblx0XHQgKlx0XHRcdCdkYXRhJyA6IHtcclxuXHRcdCAqXHRcdFx0XHQndXJsJyA6ICcvZ2V0L2NoaWxkcmVuLycsXHJcblx0XHQgKlx0XHRcdFx0J2RhdGEnIDogZnVuY3Rpb24gKG5vZGUpIHtcclxuXHRcdCAqXHRcdFx0XHRcdHJldHVybiB7ICdpZCcgOiBub2RlLmlkIH07XHJcblx0XHQgKlx0XHRcdFx0fVxyXG5cdFx0ICpcdFx0XHR9XHJcblx0XHQgKlx0XHR9KTtcclxuXHRcdCAqXHJcblx0XHQgKlx0Ly8gZGlyZWN0IGRhdGFcclxuXHRcdCAqXHQkKCcjdHJlZScpLmpzdHJlZSh7XHJcblx0XHQgKlx0XHQnY29yZScgOiB7XHJcblx0XHQgKlx0XHRcdCdkYXRhJyA6IFtcclxuXHRcdCAqXHRcdFx0XHQnU2ltcGxlIHJvb3Qgbm9kZScsXHJcblx0XHQgKlx0XHRcdFx0e1xyXG5cdFx0ICpcdFx0XHRcdFx0J2lkJyA6ICdub2RlXzInLFxyXG5cdFx0ICpcdFx0XHRcdFx0J3RleHQnIDogJ1Jvb3Qgbm9kZSB3aXRoIG9wdGlvbnMnLFxyXG5cdFx0ICpcdFx0XHRcdFx0J3N0YXRlJyA6IHsgJ29wZW5lZCcgOiB0cnVlLCAnc2VsZWN0ZWQnIDogdHJ1ZSB9LFxyXG5cdFx0ICpcdFx0XHRcdFx0J2NoaWxkcmVuJyA6IFsgeyAndGV4dCcgOiAnQ2hpbGQgMScgfSwgJ0NoaWxkIDInXVxyXG5cdFx0ICpcdFx0XHRcdH1cclxuXHRcdCAqXHRcdFx0XVxyXG5cdFx0ICpcdFx0fSk7XHJcblx0XHQgKlx0XHJcblx0XHQgKlx0Ly8gZnVuY3Rpb25cclxuXHRcdCAqXHQkKCcjdHJlZScpLmpzdHJlZSh7XHJcblx0XHQgKlx0XHQnY29yZScgOiB7XHJcblx0XHQgKlx0XHRcdCdkYXRhJyA6IGZ1bmN0aW9uIChvYmosIGNhbGxiYWNrKSB7XHJcblx0XHQgKlx0XHRcdFx0Y2FsbGJhY2suY2FsbCh0aGlzLCBbJ1Jvb3QgMScsICdSb290IDInXSk7XHJcblx0XHQgKlx0XHRcdH1cclxuXHRcdCAqXHRcdH0pO1xyXG5cdFx0ICogXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb3JlLmRhdGFcclxuXHRcdCAqL1xyXG5cdFx0ZGF0YVx0XHRcdDogZmFsc2UsXHJcblx0XHQvKipcclxuXHRcdCAqIGNvbmZpZ3VyZSB0aGUgdmFyaW91cyBzdHJpbmdzIHVzZWQgdGhyb3VnaG91dCB0aGUgdHJlZVxyXG5cdFx0ICpcclxuXHRcdCAqIFlvdSBjYW4gdXNlIGFuIG9iamVjdCB3aGVyZSB0aGUga2V5IGlzIHRoZSBzdHJpbmcgeW91IG5lZWQgdG8gcmVwbGFjZSBhbmQgdGhlIHZhbHVlIGlzIHlvdXIgcmVwbGFjZW1lbnQuXHJcblx0XHQgKiBBbm90aGVyIG9wdGlvbiBpcyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBvZiB0aGUgbmVlZGVkIHN0cmluZyBhbmQgc2hvdWxkIHJldHVybiB0aGUgcmVwbGFjZW1lbnQuXHJcblx0XHQgKiBJZiBsZWZ0IGFzIGBmYWxzZWAgbm8gcmVwbGFjZW1lbnQgaXMgbWFkZS5cclxuXHRcdCAqXHJcblx0XHQgKiBfX0V4YW1wbGVzX19cclxuXHRcdCAqXHJcblx0XHQgKlx0JCgnI3RyZWUnKS5qc3RyZWUoe1xyXG5cdFx0ICpcdFx0J2NvcmUnIDoge1xyXG5cdFx0ICpcdFx0XHQnc3RyaW5ncycgOiB7XHJcblx0XHQgKlx0XHRcdFx0J0xvYWRpbmcuLi4nIDogJ1BsZWFzZSB3YWl0IC4uLidcclxuXHRcdCAqXHRcdFx0fVxyXG5cdFx0ICpcdFx0fVxyXG5cdFx0ICpcdH0pO1xyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUuc3RyaW5nc1xyXG5cdFx0ICovXHJcblx0XHRzdHJpbmdzXHRcdFx0OiBmYWxzZSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZGV0ZXJtaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiBhIHVzZXIgdHJpZXMgdG8gbW9kaWZ5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHRyZWVcclxuXHRcdCAqIElmIGxlZnQgYXMgYGZhbHNlYCBhbGwgb3BlcmF0aW9ucyBsaWtlIGNyZWF0ZSwgcmVuYW1lLCBkZWxldGUsIG1vdmUgb3IgY29weSBhcmUgcHJldmVudGVkLlxyXG5cdFx0ICogWW91IGNhbiBzZXQgdGhpcyB0byBgdHJ1ZWAgdG8gYWxsb3cgYWxsIGludGVyYWN0aW9ucyBvciB1c2UgYSBmdW5jdGlvbiB0byBoYXZlIGJldHRlciBjb250cm9sLlxyXG5cdFx0ICpcclxuXHRcdCAqIF9fRXhhbXBsZXNfX1xyXG5cdFx0ICpcclxuXHRcdCAqXHQkKCcjdHJlZScpLmpzdHJlZSh7XHJcblx0XHQgKlx0XHQnY29yZScgOiB7XHJcblx0XHQgKlx0XHRcdCdjaGVja19jYWxsYmFjaycgOiBmdW5jdGlvbiAob3BlcmF0aW9uLCBub2RlLCBub2RlX3BhcmVudCwgbm9kZV9wb3NpdGlvbikge1xyXG5cdFx0ICpcdFx0XHRcdC8vIG9wZXJhdGlvbiBjYW4gYmUgJ2NyZWF0ZV9ub2RlJywgJ3JlbmFtZV9ub2RlJywgJ2RlbGV0ZV9ub2RlJywgJ21vdmVfbm9kZScgb3IgJ2NvcHlfbm9kZSdcclxuXHRcdCAqXHRcdFx0XHQvLyBpbiBjYXNlIG9mICdyZW5hbWVfbm9kZScgbm9kZV9wb3NpdGlvbiBpcyBmaWxsZWQgd2l0aCB0aGUgbmV3IG5vZGUgbmFtZVxyXG5cdFx0ICpcdFx0XHRcdHJldHVybiBvcGVyYXRpb24gPT09ICdyZW5hbWVfbm9kZScgPyB0cnVlIDogZmFsc2U7XHJcblx0XHQgKlx0XHRcdH1cclxuXHRcdCAqXHRcdH1cclxuXHRcdCAqXHR9KTtcclxuXHRcdCAqIFxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS5jaGVja19jYWxsYmFja1xyXG5cdFx0ICovXHJcblx0XHRjaGVja19jYWxsYmFja1x0OiBmYWxzZSxcclxuXHRcdC8qKlxyXG5cdFx0ICogYSBjYWxsYmFjayBjYWxsZWQgd2l0aCBhIHNpbmdsZSBvYmplY3QgcGFyYW1ldGVyIGluIHRoZSBpbnN0YW5jZSdzIHNjb3BlIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcgKG9wZXJhdGlvbiBwcmV2ZW50ZWQsIGFqYXggZmFpbGVkLCBldGMpXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb3JlLmVycm9yXHJcblx0XHQgKi9cclxuXHRcdGVycm9yXHRcdFx0OiAkLm5vb3AsXHJcblx0XHQvKipcclxuXHRcdCAqIHRoZSBvcGVuIC8gY2xvc2UgYW5pbWF0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAtIHNldCB0aGlzIHRvIGBmYWxzZWAgdG8gZGlzYWJsZSB0aGUgYW5pbWF0aW9uIChkZWZhdWx0IGlzIGAyMDBgKVxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS5hbmltYXRpb25cclxuXHRcdCAqL1xyXG5cdFx0YW5pbWF0aW9uXHRcdDogMjAwLFxyXG5cdFx0LyoqXHJcblx0XHQgKiBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBtdWx0aXBsZSBub2RlcyBjYW4gYmUgc2VsZWN0ZWRcclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUubXVsdGlwbGVcclxuXHRcdCAqL1xyXG5cdFx0bXVsdGlwbGVcdFx0OiB0cnVlLFxyXG5cdFx0LyoqXHJcblx0XHQgKiB0aGVtZSBjb25maWd1cmF0aW9uIG9iamVjdFxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXNcclxuXHRcdCAqL1xyXG5cdFx0dGhlbWVzXHRcdFx0OiB7XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0aGUgbmFtZSBvZiB0aGUgdGhlbWUgdG8gdXNlIChpZiBsZWZ0IGFzIGBmYWxzZWAgdGhlIGRlZmF1bHQgdGhlbWUgaXMgdXNlZClcclxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMubmFtZVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0bmFtZVx0XHRcdDogZmFsc2UsXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0aGUgVVJMIG9mIHRoZSB0aGVtZSdzIENTUyBmaWxlLCBsZWF2ZSB0aGlzIGFzIGBmYWxzZWAgaWYgeW91IGhhdmUgbWFudWFsbHkgaW5jbHVkZWQgdGhlIHRoZW1lIENTUyAocmVjb21tZW5kZWQpLiBZb3UgY2FuIHNldCB0aGlzIHRvIGB0cnVlYCB0b28gd2hpY2ggd2lsbCB0cnkgdG8gYXV0b2xvYWQgdGhlIHRoZW1lLlxyXG5cdFx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb3JlLnRoZW1lcy51cmxcclxuXHRcdFx0ICovXHJcblx0XHRcdHVybFx0XHRcdFx0OiBmYWxzZSxcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIHRoZSBsb2NhdGlvbiBvZiBhbGwganN0cmVlIHRoZW1lcyAtIG9ubHkgdXNlZCBpZiBgdXJsYCBpcyBzZXQgdG8gYHRydWVgXHJcblx0XHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUudGhlbWVzLmRpclxyXG5cdFx0XHQgKi9cclxuXHRcdFx0ZGlyXHRcdFx0XHQ6IGZhbHNlLFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogYSBib29sZWFuIGluZGljYXRpbmcgaWYgY29ubmVjdGluZyBkb3RzIGFyZSBzaG93blxyXG5cdFx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb3JlLnRoZW1lcy5kb3RzXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRkb3RzXHRcdFx0OiB0cnVlLFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogYSBib29sZWFuIGluZGljYXRpbmcgaWYgbm9kZSBpY29ucyBhcmUgc2hvd25cclxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMuaWNvbnNcclxuXHRcdFx0ICovXHJcblx0XHRcdGljb25zXHRcdFx0OiB0cnVlLFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHRyZWUgYmFja2dyb3VuZCBpcyBzdHJpcGVkXHJcblx0XHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUudGhlbWVzLnN0cmlwZXNcclxuXHRcdFx0ICovXHJcblx0XHRcdHN0cmlwZXNcdFx0XHQ6IGZhbHNlLFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogYSBzdHJpbmcgKG9yIGJvb2xlYW4gYGZhbHNlYCkgc3BlY2lmeWluZyB0aGUgdGhlbWUgdmFyaWFudCB0byB1c2UgKGlmIHRoZSB0aGVtZSBzdXBwb3J0cyB2YXJpYW50cylcclxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMudmFyaWFudFxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dmFyaWFudFx0XHRcdDogZmFsc2UsXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBhIGJvb2xlYW4gc3BlY2lmeWluZyBpZiBhIHJlcG9uc2l2ZSB2ZXJzaW9uIG9mIHRoZSB0aGVtZSBzaG91bGQga2ljayBpbiBvbiBzbWFsbGVyIHNjcmVlbnMgKGlmIHRoZSB0aGVtZSBzdXBwb3J0cyBpdCkuIERlZmF1bHRzIHRvIGB0cnVlYC5cclxuXHRcdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY29yZS50aGVtZXMucmVzcG9uc2l2ZVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0cmVzcG9uc2l2ZVx0XHQ6IHRydWVcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGlmIGxlZnQgYXMgYHRydWVgIGFsbCBwYXJlbnRzIG9mIGFsbCBzZWxlY3RlZCBub2RlcyB3aWxsIGJlIG9wZW5lZCBvbmNlIHRoZSB0cmVlIGxvYWRzIChzbyB0aGF0IGFsbCBzZWxlY3RlZCBub2RlcyBhcmUgdmlzaWJsZSB0byB0aGUgdXNlcilcclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvcmUuZXhwYW5kX3NlbGVjdGVkX29ubG9hZFxyXG5cdFx0ICovXHJcblx0XHRleHBhbmRfc2VsZWN0ZWRfb25sb2FkIDogdHJ1ZVxyXG5cdH07XHJcblx0JC5qc3RyZWUuY29yZS5wcm90b3R5cGUgPSB7XHJcblx0XHQvKipcclxuXHRcdCAqIHVzZWQgdG8gZGVjb3JhdGUgYW4gaW5zdGFuY2Ugd2l0aCBhIHBsdWdpbi4gVXNlZCBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIHBsdWdpbihkZWNvIFssIG9wdHNdKVxyXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBkZWNvIHRoZSBwbHVnaW4gdG8gZGVjb3JhdGUgd2l0aFxyXG5cdFx0ICogQHBhcmFtICB7T2JqZWN0fSBvcHRzIG9wdGlvbnMgZm9yIHRoZSBwbHVnaW5cclxuXHRcdCAqIEByZXR1cm4ge2pzVHJlZX1cclxuXHRcdCAqL1xyXG5cdFx0cGx1Z2luIDogZnVuY3Rpb24gKGRlY28sIG9wdHMpIHtcclxuXHRcdFx0dmFyIENoaWxkID0gJC5qc3RyZWUucGx1Z2luc1tkZWNvXTtcclxuXHRcdFx0aWYoQ2hpbGQpIHtcclxuXHRcdFx0XHR0aGlzLl9kYXRhW2RlY29dID0ge307XHJcblx0XHRcdFx0Q2hpbGQucHJvdG90eXBlID0gdGhpcztcclxuXHRcdFx0XHRyZXR1cm4gbmV3IENoaWxkKG9wdHMsIHRoaXMpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogdXNlZCB0byBkZWNvcmF0ZSBhbiBpbnN0YW5jZSB3aXRoIGEgcGx1Z2luLiBVc2VkIGludGVybmFsbHkuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQG5hbWUgaW5pdChlbCwgb3B0b25zKVxyXG5cdFx0ICogQHBhcmFtIHtET01FbGVtZW50fGpRdWVyeXxTdHJpbmd9IGVsIHRoZSBlbGVtZW50IHdlIGFyZSB0cmFuc2Zvcm1pbmdcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG9wdGlvbnMgZm9yIHRoaXMgaW5zdGFuY2VcclxuXHRcdCAqIEB0cmlnZ2VyIGluaXQuanN0cmVlLCBsb2FkaW5nLmpzdHJlZSwgbG9hZGVkLmpzdHJlZSwgcmVhZHkuanN0cmVlLCBjaGFuZ2VkLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRpbml0IDogZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7XHJcblx0XHRcdHRoaXMuX21vZGVsID0ge1xyXG5cdFx0XHRcdGRhdGEgOiB7XHJcblx0XHRcdFx0XHQnIycgOiB7XHJcblx0XHRcdFx0XHRcdGlkIDogJyMnLFxyXG5cdFx0XHRcdFx0XHRwYXJlbnQgOiBudWxsLFxyXG5cdFx0XHRcdFx0XHRwYXJlbnRzIDogW10sXHJcblx0XHRcdFx0XHRcdGNoaWxkcmVuIDogW10sXHJcblx0XHRcdFx0XHRcdGNoaWxkcmVuX2QgOiBbXSxcclxuXHRcdFx0XHRcdFx0c3RhdGUgOiB7IGxvYWRlZCA6IGZhbHNlIH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGNoYW5nZWQgOiBbXSxcclxuXHRcdFx0XHRmb3JjZV9mdWxsX3JlZHJhdyA6IGZhbHNlLFxyXG5cdFx0XHRcdHJlZHJhd190aW1lb3V0IDogZmFsc2UsXHJcblx0XHRcdFx0ZGVmYXVsdF9zdGF0ZSA6IHtcclxuXHRcdFx0XHRcdGxvYWRlZCA6IHRydWUsXHJcblx0XHRcdFx0XHRvcGVuZWQgOiBmYWxzZSxcclxuXHRcdFx0XHRcdHNlbGVjdGVkIDogZmFsc2UsXHJcblx0XHRcdFx0XHRkaXNhYmxlZCA6IGZhbHNlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0dGhpcy5lbGVtZW50ID0gJChlbCkuYWRkQ2xhc3MoJ2pzdHJlZSBqc3RyZWUtJyArIHRoaXMuX2lkKTtcclxuXHRcdFx0dGhpcy5zZXR0aW5ncyA9IG9wdGlvbnM7XHJcblx0XHRcdHRoaXMuZWxlbWVudC5iaW5kKFwiZGVzdHJveWVkXCIsICQucHJveHkodGhpcy50ZWFyZG93biwgdGhpcykpO1xyXG5cclxuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLnJlYWR5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX2RhdGEuY29yZS5sb2FkZWQgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLnJ0bCA9ICh0aGlzLmVsZW1lbnQuY3NzKFwiZGlyZWN0aW9uXCIpID09PSBcInJ0bFwiKTtcclxuXHRcdFx0dGhpcy5lbGVtZW50W3RoaXMuX2RhdGEuY29yZS5ydGwgPyAnYWRkQ2xhc3MnIDogJ3JlbW92ZUNsYXNzJ10oXCJqc3RyZWUtcnRsXCIpO1xyXG5cdFx0XHR0aGlzLmVsZW1lbnQuYXR0cigncm9sZScsJ3RyZWUnKTtcclxuXHJcblx0XHRcdHRoaXMuYmluZCgpO1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIGFsbCBldmVudHMgYXJlIGJvdW5kXHJcblx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHQgKiBAbmFtZSBpbml0LmpzdHJlZVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dGhpcy50cmlnZ2VyKFwiaW5pdFwiKTtcclxuXHJcblx0XHRcdHRoaXMuX2RhdGEuY29yZS5vcmlnaW5hbF9jb250YWluZXJfaHRtbCA9IHRoaXMuZWxlbWVudC5maW5kKFwiID4gdWwgPiBsaVwiKS5jbG9uZSh0cnVlKTtcclxuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLm9yaWdpbmFsX2NvbnRhaW5lcl9odG1sXHJcblx0XHRcdFx0LmZpbmQoXCJsaVwiKS5hZGRCYWNrKClcclxuXHRcdFx0XHQuY29udGVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ub2RlVHlwZSA9PT0gMyAmJiAoIXRoaXMubm9kZVZhbHVlIHx8IC9eXFxzKyQvLnRlc3QodGhpcy5ub2RlVmFsdWUpKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5yZW1vdmUoKTtcclxuXHRcdFx0dGhpcy5lbGVtZW50Lmh0bWwoXCI8XCIrXCJ1bCBjbGFzcz0nanN0cmVlLWNvbnRhaW5lci11bCc+PFwiK1wibGkgY2xhc3M9J2pzdHJlZS1pbml0aWFsLW5vZGUganN0cmVlLWxvYWRpbmcganN0cmVlLWxlYWYganN0cmVlLWxhc3QnPjxpIGNsYXNzPSdqc3RyZWUtaWNvbiBqc3RyZWUtb2NsJz48L2k+PFwiK1wiYSBjbGFzcz0nanN0cmVlLWFuY2hvcicgaHJlZj0nIyc+PGkgY2xhc3M9J2pzdHJlZS1pY29uIGpzdHJlZS10aGVtZWljb24taGlkZGVuJz48L2k+XCIgKyB0aGlzLmdldF9zdHJpbmcoXCJMb2FkaW5nIC4uLlwiKSArIFwiPC9hPjwvbGk+PC91bD5cIik7XHJcblx0XHRcdHRoaXMuX2RhdGEuY29yZS5saV9oZWlnaHQgPSB0aGlzLmdldF9jb250YWluZXJfdWwoKS5jaGlsZHJlbihcImxpOmVxKDApXCIpLmhlaWdodCgpIHx8IDE4O1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIHRoZSBsb2FkaW5nIHRleHQgaXMgc2hvd24gYW5kIGJlZm9yZSBsb2FkaW5nIHN0YXJ0c1xyXG5cdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0ICogQG5hbWUgbG9hZGluZy5qc3RyZWVcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcihcImxvYWRpbmdcIik7XHJcblx0XHRcdHRoaXMubG9hZF9ub2RlKCcjJyk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBkZXN0cm95IGFuIGluc3RhbmNlXHJcblx0XHQgKiBAbmFtZSBkZXN0cm95KClcclxuXHRcdCAqL1xyXG5cdFx0ZGVzdHJveSA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0dGhpcy5lbGVtZW50LnVuYmluZChcImRlc3Ryb3llZFwiLCB0aGlzLnRlYXJkb3duKTtcclxuXHRcdFx0dGhpcy50ZWFyZG93bigpO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogcGFydCBvZiB0aGUgZGVzdHJveWluZyBvZiBhbiBpbnN0YW5jZS4gVXNlZCBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIHRlYXJkb3duKClcclxuXHRcdCAqL1xyXG5cdFx0dGVhcmRvd24gOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRoaXMudW5iaW5kKCk7XHJcblx0XHRcdHRoaXMuZWxlbWVudFxyXG5cdFx0XHRcdC5yZW1vdmVDbGFzcygnanN0cmVlJylcclxuXHRcdFx0XHQucmVtb3ZlRGF0YSgnanN0cmVlJylcclxuXHRcdFx0XHQuZmluZChcIltjbGFzc149J2pzdHJlZSddXCIpXHJcblx0XHRcdFx0XHQuYWRkQmFjaygpXHJcblx0XHRcdFx0XHQuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpOyB9KTtcclxuXHRcdFx0dGhpcy5lbGVtZW50ID0gbnVsbDtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGJpbmQgYWxsIGV2ZW50cy4gVXNlZCBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIGJpbmQoKVxyXG5cdFx0ICovXHJcblx0XHRiaW5kIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHR0aGlzLmVsZW1lbnRcclxuXHRcdFx0XHQub24oXCJkYmxjbGljay5qc3RyZWVcIiwgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0XHRpZihkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KSB7XHJcblx0XHRcdFx0XHRcdFx0ZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0aWYod2luZG93LmdldFNlbGVjdGlvbikge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHRcdFx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2VsLmNvbGxhcHNlKCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoIChpZ25vcmUpIHsgfVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQub24oXCJjbGljay5qc3RyZWVcIiwgXCIuanN0cmVlLW9jbFwiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMudG9nZ2xlX25vZGUoZS50YXJnZXQpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKFwiY2xpY2suanN0cmVlXCIsIFwiLmpzdHJlZS1hbmNob3JcIiwgJC5wcm94eShmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdCQoZS5jdXJyZW50VGFyZ2V0KS5mb2N1cygpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmFjdGl2YXRlX25vZGUoZS5jdXJyZW50VGFyZ2V0LCBlKTtcclxuXHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdC5vbigna2V5ZG93bi5qc3RyZWUnLCAnLmpzdHJlZS1hbmNob3InLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRcdHZhciBvID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0c3dpdGNoKGUud2hpY2gpIHtcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDEzOlxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzI6XHJcblx0XHRcdFx0XHRcdFx0XHRlLnR5cGUgPSBcImNsaWNrXCI7XHJcblx0XHRcdFx0XHRcdFx0XHQkKGUuY3VycmVudFRhcmdldCkudHJpZ2dlcihlKTtcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzc6XHJcblx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZih0aGlzLmlzX29wZW4oZS5jdXJyZW50VGFyZ2V0KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmNsb3NlX25vZGUoZS5jdXJyZW50VGFyZ2V0KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRvID0gdGhpcy5nZXRfcHJldl9kb20oZS5jdXJyZW50VGFyZ2V0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYobyAmJiBvLmxlbmd0aCkgeyBvLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmZvY3VzKCk7IH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzg6XHJcblx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRvID0gdGhpcy5nZXRfcHJldl9kb20oZS5jdXJyZW50VGFyZ2V0KTtcclxuXHRcdFx0XHRcdFx0XHRcdGlmKG8gJiYgby5sZW5ndGgpIHsgby5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5mb2N1cygpOyB9XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDM5OlxyXG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYodGhpcy5pc19jbG9zZWQoZS5jdXJyZW50VGFyZ2V0KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLm9wZW5fbm9kZShlLmN1cnJlbnRUYXJnZXQsIGZ1bmN0aW9uIChvKSB7IHRoaXMuZ2V0X25vZGUobywgdHJ1ZSkuY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykuZm9jdXMoKTsgfSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0byA9IHRoaXMuZ2V0X25leHRfZG9tKGUuY3VycmVudFRhcmdldCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmKG8gJiYgby5sZW5ndGgpIHsgby5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5mb2N1cygpOyB9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDQwOlxyXG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0byA9IHRoaXMuZ2V0X25leHRfZG9tKGUuY3VycmVudFRhcmdldCk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZihvICYmIG8ubGVuZ3RoKSB7IG8uY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykuZm9jdXMoKTsgfVxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Ly8gZGVsZXRlXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSA0NjpcclxuXHRcdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdG8gPSB0aGlzLmdldF9ub2RlKGUuY3VycmVudFRhcmdldCk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZihvICYmIG8uaWQgJiYgby5pZCAhPT0gJyMnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdG8gPSB0aGlzLmlzX3NlbGVjdGVkKG8pID8gdGhpcy5nZXRfc2VsZWN0ZWQoKSA6IG87XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoaXMuZGVsZXRlX25vZGUobyk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHQvLyBmMlxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgMTEzOlxyXG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0byA9IHRoaXMuZ2V0X25vZGUoZS5jdXJyZW50VGFyZ2V0KTtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYobyAmJiBvLmlkICYmIG8uaWQgIT09ICcjJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0aGlzLmVkaXQobyk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHQqL1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGUud2hpY2gpO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdC5vbihcImxvYWRfbm9kZS5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHRpZihkYXRhLnN0YXR1cykge1xyXG5cdFx0XHRcdFx0XHRcdGlmKGRhdGEubm9kZS5pZCA9PT0gJyMnICYmICF0aGlzLl9kYXRhLmNvcmUubG9hZGVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubG9hZGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdC8qKlxyXG5cdFx0XHRcdFx0XHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIHRoZSByb290IG5vZGUgaXMgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZVxyXG5cdFx0XHRcdFx0XHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdFx0XHRcdFx0XHQgKiBAbmFtZSBsb2FkZWQuanN0cmVlXHJcblx0XHRcdFx0XHRcdFx0XHQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMudHJpZ2dlcihcImxvYWRlZFwiKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYoIXRoaXMuX2RhdGEuY29yZS5yZWFkeSAmJiAhdGhpcy5nZXRfY29udGFpbmVyX3VsKCkuZmluZCgnLmpzdHJlZS1sb2FkaW5nOmVxKDApJykubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUucmVhZHkgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZih0aGlzLnNldHRpbmdzLmNvcmUuZXhwYW5kX3NlbGVjdGVkX29ubG9hZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB0bXAgPSBbXSwgaSwgajtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAgPSB0bXAuY29uY2F0KHRoaXMuX21vZGVsLmRhdGFbdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldXS5wYXJlbnRzKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG1wID0gJC52YWthdGEuYXJyYXlfdW5pcXVlKHRtcCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gdG1wLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5vcGVuX25vZGUodG1wW2ldLCBmYWxzZSwgMCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJpZ2dlcignY2hhbmdlZCcsIHsgJ2FjdGlvbicgOiAncmVhZHknLCAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0LyoqXHJcblx0XHRcdFx0XHRcdFx0XHQgKiB0cmlnZ2VyZWQgYWZ0ZXIgYWxsIG5vZGVzIGFyZSBmaW5pc2hlZCBsb2FkaW5nXHJcblx0XHRcdFx0XHRcdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0XHRcdFx0XHRcdCAqIEBuYW1lIHJlYWR5LmpzdHJlZVxyXG5cdFx0XHRcdFx0XHRcdFx0ICovXHJcblx0XHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCQucHJveHkoZnVuY3Rpb24gKCkgeyB0aGlzLnRyaWdnZXIoXCJyZWFkeVwiKTsgfSwgdGhpcyksIDApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Ly8gVEhFTUUgUkVMQVRFRFxyXG5cdFx0XHRcdC5vbihcImluaXQuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgcyA9IHRoaXMuc2V0dGluZ3MuY29yZS50aGVtZXM7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS50aGVtZXMuZG90c1x0XHRcdD0gcy5kb3RzO1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUudGhlbWVzLnN0cmlwZXNcdFx0PSBzLnN0cmlwZXM7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS50aGVtZXMuaWNvbnNcdFx0PSBzLmljb25zO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldF90aGVtZShzLm5hbWUgfHwgXCJkZWZhdWx0XCIsIHMudXJsKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRfdGhlbWVfdmFyaWFudChzLnZhcmlhbnQpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKFwibG9hZGluZy5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdHRoaXNbIHRoaXMuX2RhdGEuY29yZS50aGVtZXMuZG90cyA/IFwic2hvd19kb3RzXCIgOiBcImhpZGVfZG90c1wiIF0oKTtcclxuXHRcdFx0XHRcdFx0dGhpc1sgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5pY29ucyA/IFwic2hvd19pY29uc1wiIDogXCJoaWRlX2ljb25zXCIgXSgpO1xyXG5cdFx0XHRcdFx0XHR0aGlzWyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLnN0cmlwZXMgPyBcInNob3dfc3RyaXBlc1wiIDogXCJoaWRlX3N0cmlwZXNcIiBdKCk7XHJcblx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHQub24oJ2ZvY3VzLmpzdHJlZScsICcuanN0cmVlLWFuY2hvcicsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5lbGVtZW50LmZpbmQoJy5qc3RyZWUtaG92ZXJlZCcpLm5vdChlLmN1cnJlbnRUYXJnZXQpLm1vdXNlbGVhdmUoKTtcclxuXHRcdFx0XHRcdFx0JChlLmN1cnJlbnRUYXJnZXQpLm1vdXNlZW50ZXIoKTtcclxuXHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdC5vbignbW91c2VlbnRlci5qc3RyZWUnLCAnLmpzdHJlZS1hbmNob3InLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuaG92ZXJfbm9kZShlLmN1cnJlbnRUYXJnZXQpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKCdtb3VzZWxlYXZlLmpzdHJlZScsICcuanN0cmVlLWFuY2hvcicsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5kZWhvdmVyX25vZGUoZS5jdXJyZW50VGFyZ2V0KTtcclxuXHRcdFx0XHRcdH0sIHRoaXMpKTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHBhcnQgb2YgdGhlIGRlc3Ryb3lpbmcgb2YgYW4gaW5zdGFuY2UuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSB1bmJpbmQoKVxyXG5cdFx0ICovXHJcblx0XHR1bmJpbmQgOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRoaXMuZWxlbWVudC5vZmYoJy5qc3RyZWUnKTtcclxuXHRcdFx0JChkb2N1bWVudCkub2ZmKCcuanN0cmVlLScgKyB0aGlzLl9pZCk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiB0cmlnZ2VyIGFuIGV2ZW50LiBVc2VkIGludGVybmFsbHkuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQG5hbWUgdHJpZ2dlcihldiBbLCBkYXRhXSlcclxuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30gZXYgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcclxuXHRcdCAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBhZGRpdGlvbmFsIGRhdGEgdG8gcGFzcyB3aXRoIHRoZSBldmVudFxyXG5cdFx0ICovXHJcblx0XHR0cmlnZ2VyIDogZnVuY3Rpb24gKGV2LCBkYXRhKSB7XHJcblx0XHRcdGlmKCFkYXRhKSB7XHJcblx0XHRcdFx0ZGF0YSA9IHt9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGRhdGEuaW5zdGFuY2UgPSB0aGlzO1xyXG5cdFx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlckhhbmRsZXIoZXYucmVwbGFjZSgnLmpzdHJlZScsJycpICsgJy5qc3RyZWUnLCBkYXRhKTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHJldHVybnMgdGhlIGpRdWVyeSBleHRlbmRlZCBpbnN0YW5jZSBjb250YWluZXJcclxuXHRcdCAqIEBuYW1lIGdldF9jb250YWluZXIoKVxyXG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxyXG5cdFx0ICovXHJcblx0XHRnZXRfY29udGFpbmVyIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lbGVtZW50O1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogcmV0dXJucyB0aGUgalF1ZXJ5IGV4dGVuZGVkIG1haW4gVUwgbm9kZSBpbnNpZGUgdGhlIGluc3RhbmNlIGNvbnRhaW5lci4gVXNlZCBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIGdldF9jb250YWluZXJfdWwoKVxyXG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxyXG5cdFx0ICovXHJcblx0XHRnZXRfY29udGFpbmVyX3VsIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lbGVtZW50LmNoaWxkcmVuKFwidWw6ZXEoMClcIik7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBnZXRzIHN0cmluZyByZXBsYWNlbWVudHMgKGxvY2FsaXphdGlvbikuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBnZXRfc3RyaW5nKGtleSlcclxuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30ga2V5XHJcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdGdldF9zdHJpbmcgOiBmdW5jdGlvbiAoa2V5KSB7XHJcblx0XHRcdHZhciBhID0gdGhpcy5zZXR0aW5ncy5jb3JlLnN0cmluZ3M7XHJcblx0XHRcdGlmKCQuaXNGdW5jdGlvbihhKSkgeyByZXR1cm4gYS5jYWxsKHRoaXMsIGtleSk7IH1cclxuXHRcdFx0aWYoYSAmJiBhW2tleV0pIHsgcmV0dXJuIGFba2V5XTsgfVxyXG5cdFx0XHRyZXR1cm4ga2V5O1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0cyB0aGUgZmlyc3QgY2hpbGQgb2YgYSBET00gbm9kZS4gVXNlZCBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIF9maXJzdENoaWxkKGRvbSlcclxuXHRcdCAqIEBwYXJhbSAge0RPTUVsZW1lbnR9IGRvbVxyXG5cdFx0ICogQHJldHVybiB7RE9NRWxlbWVudH1cclxuXHRcdCAqL1xyXG5cdFx0X2ZpcnN0Q2hpbGQgOiBmdW5jdGlvbiAoZG9tKSB7XHJcblx0XHRcdGRvbSA9IGRvbSA/IGRvbS5maXJzdENoaWxkIDogbnVsbDtcclxuXHRcdFx0d2hpbGUoZG9tICE9PSBudWxsICYmIGRvbS5ub2RlVHlwZSAhPT0gMSkge1xyXG5cdFx0XHRcdGRvbSA9IGRvbS5uZXh0U2libGluZztcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gZG9tO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0cyB0aGUgbmV4dCBzaWJsaW5nIG9mIGEgRE9NIG5vZGUuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBfbmV4dFNpYmxpbmcoZG9tKVxyXG5cdFx0ICogQHBhcmFtICB7RE9NRWxlbWVudH0gZG9tXHJcblx0XHQgKiBAcmV0dXJuIHtET01FbGVtZW50fVxyXG5cdFx0ICovXHJcblx0XHRfbmV4dFNpYmxpbmcgOiBmdW5jdGlvbiAoZG9tKSB7XHJcblx0XHRcdGRvbSA9IGRvbSA/IGRvbS5uZXh0U2libGluZyA6IG51bGw7XHJcblx0XHRcdHdoaWxlKGRvbSAhPT0gbnVsbCAmJiBkb20ubm9kZVR5cGUgIT09IDEpIHtcclxuXHRcdFx0XHRkb20gPSBkb20ubmV4dFNpYmxpbmc7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGRvbTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGdldHMgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgYSBET00gbm9kZS4gVXNlZCBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIF9wcmV2aW91c1NpYmxpbmcoZG9tKVxyXG5cdFx0ICogQHBhcmFtICB7RE9NRWxlbWVudH0gZG9tXHJcblx0XHQgKiBAcmV0dXJuIHtET01FbGVtZW50fVxyXG5cdFx0ICovXHJcblx0XHRfcHJldmlvdXNTaWJsaW5nIDogZnVuY3Rpb24gKGRvbSkge1xyXG5cdFx0XHRkb20gPSBkb20gPyBkb20ucHJldmlvdXNTaWJsaW5nIDogbnVsbDtcclxuXHRcdFx0d2hpbGUoZG9tICE9PSBudWxsICYmIGRvbS5ub2RlVHlwZSAhPT0gMSkge1xyXG5cdFx0XHRcdGRvbSA9IGRvbS5wcmV2aW91c1NpYmxpbmc7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGRvbTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGdldCB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIG5vZGUgKG9yIHRoZSBhY3R1YWwgalF1ZXJ5IGV4dGVuZGVkIERPTSBub2RlKSBieSB1c2luZyBhbnkgaW5wdXQgKGNoaWxkIERPTSBlbGVtZW50LCBJRCBzdHJpbmcsIHNlbGVjdG9yLCBldGMpXHJcblx0XHQgKiBAbmFtZSBnZXRfbm9kZShvYmogWywgYXNfZG9tXSlcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcclxuXHRcdCAqIEBwYXJhbSAge0Jvb2xlYW59IGFzX2RvbVxyXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fGpRdWVyeX1cclxuXHRcdCAqL1xyXG5cdFx0Z2V0X25vZGUgOiBmdW5jdGlvbiAob2JqLCBhc19kb20pIHtcclxuXHRcdFx0aWYob2JqICYmIG9iai5pZCkge1xyXG5cdFx0XHRcdG9iaiA9IG9iai5pZDtcclxuXHRcdFx0fVxyXG5cdFx0XHR2YXIgZG9tO1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGlmKHRoaXMuX21vZGVsLmRhdGFbb2JqXSkge1xyXG5cdFx0XHRcdFx0b2JqID0gdGhpcy5fbW9kZWwuZGF0YVtvYmpdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlbHNlIGlmKCgoZG9tID0gJChvYmosIHRoaXMuZWxlbWVudCkpLmxlbmd0aCB8fCAoZG9tID0gJCgnIycgKyBvYmosIHRoaXMuZWxlbWVudCkpLmxlbmd0aCkgJiYgdGhpcy5fbW9kZWwuZGF0YVtkb20uY2xvc2VzdCgnbGknKS5hdHRyKCdpZCcpXSkge1xyXG5cdFx0XHRcdFx0b2JqID0gdGhpcy5fbW9kZWwuZGF0YVtkb20uY2xvc2VzdCgnbGknKS5hdHRyKCdpZCcpXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSBpZigoZG9tID0gJChvYmosIHRoaXMuZWxlbWVudCkpLmxlbmd0aCAmJiBkb20uaGFzQ2xhc3MoJ2pzdHJlZScpKSB7XHJcblx0XHRcdFx0XHRvYmogPSB0aGlzLl9tb2RlbC5kYXRhWycjJ107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYoYXNfZG9tKSB7XHJcblx0XHRcdFx0XHRvYmogPSBvYmouaWQgPT09ICcjJyA/IHRoaXMuZWxlbWVudCA6ICQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqLmlkKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBvYmo7XHJcblx0XHRcdH0gY2F0Y2ggKGV4KSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0IHRoZSBwYXRoIHRvIGEgbm9kZSwgZWl0aGVyIGNvbnNpc3Rpbmcgb2Ygbm9kZSB0ZXh0cywgb3Igb2Ygbm9kZSBJRHMsIG9wdGlvbmFsbHkgZ2x1ZWQgdG9nZXRoZXIgKG90aGVyd2lzZSBhbiBhcnJheSlcclxuXHRcdCAqIEBuYW1lIGdldF9wYXRoKG9iaiBbLCBnbHVlLCBpZHNdKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZVxyXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBnbHVlIGlmIHlvdSB3YW50IHRoZSBwYXRoIGFzIGEgc3RyaW5nIC0gcGFzcyB0aGUgZ2x1ZSBoZXJlIChmb3IgZXhhbXBsZSAnLycpLCBpZiBhIGZhbHN5IHZhbHVlIGlzIHN1cHBsaWVkIGhlcmUsIGFuIGFycmF5IGlzIHJldHVybmVkXHJcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBpZHMgaWYgc2V0IHRvIHRydWUgYnVpbGQgdGhlIHBhdGggdXNpbmcgSUQsIG90aGVyd2lzZSBub2RlIHRleHQgaXMgdXNlZFxyXG5cdFx0ICogQHJldHVybiB7bWl4ZWR9XHJcblx0XHQgKi9cclxuXHRcdGdldF9wYXRoIDogZnVuY3Rpb24gKG9iaiwgZ2x1ZSwgaWRzKSB7XHJcblx0XHRcdG9iaiA9IG9iai5wYXJlbnRzID8gb2JqIDogdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnIHx8ICFvYmoucGFyZW50cykge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHR2YXIgaSwgaiwgcCA9IFtdO1xyXG5cdFx0XHRwLnB1c2goaWRzID8gb2JqLmlkIDogb2JqLnRleHQpO1xyXG5cdFx0XHRmb3IoaSA9IDAsIGogPSBvYmoucGFyZW50cy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRwLnB1c2goaWRzID8gb2JqLnBhcmVudHNbaV0gOiB0aGlzLmdldF90ZXh0KG9iai5wYXJlbnRzW2ldKSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cCA9IHAucmV2ZXJzZSgpLnNsaWNlKDEpO1xyXG5cdFx0XHRyZXR1cm4gZ2x1ZSA/IHAuam9pbihnbHVlKSA6IHA7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBnZXQgdGhlIG5leHQgdmlzaWJsZSBub2RlIHRoYXQgaXMgYmVsb3cgdGhlIGBvYmpgIG5vZGUuIElmIGBzdHJpY3RgIGlzIHNldCB0byBgdHJ1ZWAgb25seSBzaWJsaW5nIG5vZGVzIGFyZSByZXR1cm5lZC5cclxuXHRcdCAqIEBuYW1lIGdldF9uZXh0X2RvbShvYmogWywgc3RyaWN0XSlcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcclxuXHRcdCAqIEBwYXJhbSAge0Jvb2xlYW59IHN0cmljdFxyXG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxyXG5cdFx0ICovXHJcblx0XHRnZXRfbmV4dF9kb20gOiBmdW5jdGlvbiAob2JqLCBzdHJpY3QpIHtcclxuXHRcdFx0dmFyIHRtcDtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpO1xyXG5cdFx0XHRpZihvYmpbMF0gPT09IHRoaXMuZWxlbWVudFswXSkge1xyXG5cdFx0XHRcdHRtcCA9IHRoaXMuX2ZpcnN0Q2hpbGQodGhpcy5nZXRfY29udGFpbmVyX3VsKClbMF0pO1xyXG5cdFx0XHRcdHJldHVybiB0bXAgPyAkKHRtcCkgOiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZighb2JqIHx8ICFvYmoubGVuZ3RoKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHN0cmljdCkge1xyXG5cdFx0XHRcdHRtcCA9IHRoaXMuX25leHRTaWJsaW5nKG9ialswXSk7XHJcblx0XHRcdFx0cmV0dXJuIHRtcCA/ICQodG1wKSA6IGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKG9iai5oYXNDbGFzcyhcImpzdHJlZS1vcGVuXCIpKSB7XHJcblx0XHRcdFx0dG1wID0gdGhpcy5fZmlyc3RDaGlsZChvYmouY2hpbGRyZW4oJ3VsJylbMF0pO1xyXG5cdFx0XHRcdHJldHVybiB0bXAgPyAkKHRtcCkgOiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZigodG1wID0gdGhpcy5fbmV4dFNpYmxpbmcob2JqWzBdKSkgIT09IG51bGwpIHtcclxuXHRcdFx0XHRyZXR1cm4gJCh0bXApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBvYmoucGFyZW50c1VudGlsKFwiLmpzdHJlZVwiLFwibGlcIikubmV4dChcImxpXCIpLmVxKDApO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0IHRoZSBwcmV2aW91cyB2aXNpYmxlIG5vZGUgdGhhdCBpcyBhYm92ZSB0aGUgYG9iamAgbm9kZS4gSWYgYHN0cmljdGAgaXMgc2V0IHRvIGB0cnVlYCBvbmx5IHNpYmxpbmcgbm9kZXMgYXJlIHJldHVybmVkLlxyXG5cdFx0ICogQG5hbWUgZ2V0X3ByZXZfZG9tKG9iaiBbLCBzdHJpY3RdKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxyXG5cdFx0ICogQHBhcmFtICB7Qm9vbGVhbn0gc3RyaWN0XHJcblx0XHQgKiBAcmV0dXJuIHtqUXVlcnl9XHJcblx0XHQgKi9cclxuXHRcdGdldF9wcmV2X2RvbSA6IGZ1bmN0aW9uIChvYmosIHN0cmljdCkge1xyXG5cdFx0XHR2YXIgdG1wO1xyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XHJcblx0XHRcdGlmKG9ialswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7XHJcblx0XHRcdFx0dG1wID0gdGhpcy5nZXRfY29udGFpbmVyX3VsKClbMF0ubGFzdENoaWxkO1xyXG5cdFx0XHRcdHJldHVybiB0bXAgPyAkKHRtcCkgOiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZighb2JqIHx8ICFvYmoubGVuZ3RoKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHN0cmljdCkge1xyXG5cdFx0XHRcdHRtcCA9IHRoaXMuX3ByZXZpb3VzU2libGluZyhvYmpbMF0pO1xyXG5cdFx0XHRcdHJldHVybiB0bXAgPyAkKHRtcCkgOiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZigodG1wID0gdGhpcy5fcHJldmlvdXNTaWJsaW5nKG9ialswXSkpICE9PSBudWxsKSB7XHJcblx0XHRcdFx0b2JqID0gJCh0bXApO1xyXG5cdFx0XHRcdHdoaWxlKG9iai5oYXNDbGFzcyhcImpzdHJlZS1vcGVuXCIpKSB7XHJcblx0XHRcdFx0XHRvYmogPSBvYmouY2hpbGRyZW4oXCJ1bDplcSgwKVwiKS5jaGlsZHJlbihcImxpOmxhc3RcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBvYmo7XHJcblx0XHRcdH1cclxuXHRcdFx0dG1wID0gb2JqWzBdLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuXHRcdFx0cmV0dXJuIHRtcCAmJiB0bXAudGFnTmFtZSA9PT0gJ0xJJyA/ICQodG1wKSA6IGZhbHNlO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0IHRoZSBwYXJlbnQgSUQgb2YgYSBub2RlXHJcblx0XHQgKiBAbmFtZSBnZXRfcGFyZW50KG9iailcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcclxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0Z2V0X3BhcmVudCA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBvYmoucGFyZW50O1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0IGEgalF1ZXJ5IGNvbGxlY3Rpb24gb2YgYWxsIHRoZSBjaGlsZHJlbiBvZiBhIG5vZGUgKG5vZGUgbXVzdCBiZSByZW5kZXJlZClcclxuXHRcdCAqIEBuYW1lIGdldF9jaGlsZHJlbl9kb20ob2JqKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxyXG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxyXG5cdFx0ICovXHJcblx0XHRnZXRfY2hpbGRyZW5fZG9tIDogZnVuY3Rpb24gKG9iaikge1xyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XHJcblx0XHRcdGlmKG9ialswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpLmNoaWxkcmVuKFwibGlcIik7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIW9iaiB8fCAhb2JqLmxlbmd0aCkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gb2JqLmNoaWxkcmVuKFwidWxcIikuY2hpbGRyZW4oXCJsaVwiKTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGNoZWNrcyBpZiBhIG5vZGUgaGFzIGNoaWxkcmVuXHJcblx0XHQgKiBAbmFtZSBpc19wYXJlbnQob2JqKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxyXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0aXNfcGFyZW50IDogZnVuY3Rpb24gKG9iaikge1xyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdHJldHVybiBvYmogJiYgKG9iai5zdGF0ZS5sb2FkZWQgPT09IGZhbHNlIHx8IG9iai5jaGlsZHJlbi5sZW5ndGggPiAwKTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGNoZWNrcyBpZiBhIG5vZGUgaXMgbG9hZGVkIChpdHMgY2hpbGRyZW4gYXJlIGF2YWlsYWJsZSlcclxuXHRcdCAqIEBuYW1lIGlzX2xvYWRlZChvYmopXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRpc19sb2FkZWQgOiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcclxuXHRcdFx0cmV0dXJuIG9iaiAmJiBvYmouc3RhdGUubG9hZGVkO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogY2hlY2sgaWYgYSBub2RlIGlzIGN1cnJlbnRseSBsb2FkaW5nIChmZXRjaGluZyBjaGlsZHJlbilcclxuXHRcdCAqIEBuYW1lIGlzX2xvYWRpbmcob2JqKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxyXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0aXNfbG9hZGluZyA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpO1xyXG5cdFx0XHRyZXR1cm4gb2JqICYmIG9iai5oYXNDbGFzcyhcImpzdHJlZS1sb2FkaW5nXCIpO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogY2hlY2sgaWYgYSBub2RlIGlzIG9wZW5lZFxyXG5cdFx0ICogQG5hbWUgaXNfb3BlbihvYmopXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRpc19vcGVuIDogZnVuY3Rpb24gKG9iaikge1xyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdHJldHVybiBvYmogJiYgb2JqLnN0YXRlLm9wZW5lZDtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGNoZWNrIGlmIGEgbm9kZSBpcyBpbiBhIGNsb3NlZCBzdGF0ZVxyXG5cdFx0ICogQG5hbWUgaXNfY2xvc2VkKG9iailcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcclxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdGlzX2Nsb3NlZCA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRyZXR1cm4gb2JqICYmIHRoaXMuaXNfcGFyZW50KG9iaikgJiYgIW9iai5zdGF0ZS5vcGVuZWQ7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBjaGVjayBpZiBhIG5vZGUgaGFzIG5vIGNoaWxkcmVuXHJcblx0XHQgKiBAbmFtZSBpc19sZWFmKG9iailcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcclxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdGlzX2xlYWYgOiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdHJldHVybiAhdGhpcy5pc19wYXJlbnQob2JqKTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGxvYWRzIGEgbm9kZSAoZmV0Y2hlcyBpdHMgY2hpbGRyZW4gdXNpbmcgdGhlIGBjb3JlLmRhdGFgIHNldHRpbmcpLiBNdWx0aXBsZSBub2RlcyBjYW4gYmUgcGFzc2VkIHRvIGJ5IHVzaW5nIGFuIGFycmF5LlxyXG5cdFx0ICogQG5hbWUgbG9hZF9ub2RlKG9iaiBbLCBjYWxsYmFja10pXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXHJcblx0XHQgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmNlIGxvYWRpbmcgaXMgY29ucGxldGUsIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCBpbiB0aGUgaW5zdGFuY2UncyBzY29wZSBhbmQgcmVjZWl2ZXMgdHdvIGFyZ3VtZW50cyAtIHRoZSBub2RlIGFuZCBhIGJvb2xlYW4gc3RhdHVzXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICogQHRyaWdnZXIgbG9hZF9ub2RlLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRsb2FkX25vZGUgOiBmdW5jdGlvbiAob2JqLCBjYWxsYmFjaykge1xyXG5cdFx0XHR2YXIgdDEsIHQyO1xyXG5cdFx0XHRpZigkLmlzQXJyYXkob2JqKSkge1xyXG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xyXG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xyXG5cdFx0XHRcdFx0dGhpcy5sb2FkX25vZGUob2JqW3QxXSwgY2FsbGJhY2spO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmopIHtcclxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKHRoaXMsIG9iaiwgZmFsc2UpO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSkuYWRkQ2xhc3MoXCJqc3RyZWUtbG9hZGluZ1wiKTtcclxuXHRcdFx0dGhpcy5fbG9hZF9ub2RlKG9iaiwgJC5wcm94eShmdW5jdGlvbiAoc3RhdHVzKSB7XHJcblx0XHRcdFx0b2JqLnN0YXRlLmxvYWRlZCA9IHN0YXR1cztcclxuXHRcdFx0XHR0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSkucmVtb3ZlQ2xhc3MoXCJqc3RyZWUtbG9hZGluZ1wiKTtcclxuXHRcdFx0XHQvKipcclxuXHRcdFx0XHQgKiB0cmlnZ2VyZWQgYWZ0ZXIgYSBub2RlIGlzIGxvYWRlZFxyXG5cdFx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHRcdCAqIEBuYW1lIGxvYWRfbm9kZS5qc3RyZWVcclxuXHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgbm9kZSB0aGF0IHdhcyBsb2FkaW5nXHJcblx0XHRcdFx0ICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgd2FzIHRoZSBub2RlIGxvYWRlZCBzdWNjZXNzZnVsbHlcclxuXHRcdFx0XHQgKi9cclxuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ2xvYWRfbm9kZScsIHsgXCJub2RlXCIgOiBvYmosIFwic3RhdHVzXCIgOiBzdGF0dXMgfSk7XHJcblx0XHRcdFx0aWYoY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwodGhpcywgb2JqLCBzdGF0dXMpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSwgdGhpcykpO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGhhbmRsZXMgdGhlIGFjdHVhbCBsb2FkaW5nIG9mIGEgbm9kZS4gVXNlZCBvbmx5IGludGVybmFsbHkuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQG5hbWUgX2xvYWRfbm9kZShvYmogWywgY2FsbGJhY2tdKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxyXG5cdFx0ICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25jZSBsb2FkaW5nIGlzIGNvbnBsZXRlLCB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgaW4gdGhlIGluc3RhbmNlJ3Mgc2NvcGUgYW5kIHJlY2VpdmVzIG9uZSBhcmd1bWVudCAtIGEgYm9vbGVhbiBzdGF0dXNcclxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdF9sb2FkX25vZGUgOiBmdW5jdGlvbiAob2JqLCBjYWxsYmFjaykge1xyXG5cdFx0XHR2YXIgcyA9IHRoaXMuc2V0dGluZ3MuY29yZS5kYXRhLCB0O1xyXG5cdFx0XHQvLyB1c2Ugb3JpZ2luYWwgSFRNTFxyXG5cdFx0XHRpZighcykge1xyXG5cdFx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG9iai5pZCA9PT0gJyMnID8gdGhpcy5fYXBwZW5kX2h0bWxfZGF0YShvYmosIHRoaXMuX2RhdGEuY29yZS5vcmlnaW5hbF9jb250YWluZXJfaHRtbC5jbG9uZSh0cnVlKSkgOiBmYWxzZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoJC5pc0Z1bmN0aW9uKHMpKSB7XHJcblx0XHRcdFx0cmV0dXJuIHMuY2FsbCh0aGlzLCBvYmosICQucHJveHkoZnVuY3Rpb24gKGQpIHtcclxuXHRcdFx0XHRcdHJldHVybiBkID09PSBmYWxzZSA/IGNhbGxiYWNrLmNhbGwodGhpcywgZmFsc2UpIDogY2FsbGJhY2suY2FsbCh0aGlzLCB0aGlzW3R5cGVvZiBkID09PSAnc3RyaW5nJyA/ICdfYXBwZW5kX2h0bWxfZGF0YScgOiAnX2FwcGVuZF9qc29uX2RhdGEnXShvYmosIHR5cGVvZiBkID09PSAnc3RyaW5nJyA/ICQoZCkgOiBkKSk7XHJcblx0XHRcdFx0fSwgdGhpcykpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRcdGlmKHMudXJsKSB7XHJcblx0XHRcdFx0XHRzID0gJC5leHRlbmQodHJ1ZSwge30sIHMpO1xyXG5cdFx0XHRcdFx0aWYoJC5pc0Z1bmN0aW9uKHMudXJsKSkge1xyXG5cdFx0XHRcdFx0XHRzLnVybCA9IHMudXJsLmNhbGwodGhpcywgb2JqKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKCQuaXNGdW5jdGlvbihzLmRhdGEpKSB7XHJcblx0XHRcdFx0XHRcdHMuZGF0YSA9IHMuZGF0YS5jYWxsKHRoaXMsIG9iaik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gJC5hamF4KHMpXHJcblx0XHRcdFx0XHRcdC5kb25lKCQucHJveHkoZnVuY3Rpb24gKGQsdCx4KSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgdHlwZSA9IHguZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYodHlwZS5pbmRleE9mKCdqc29uJykgIT09IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIHRoaXMuX2FwcGVuZF9qc29uX2RhdGEob2JqLCBkKSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZih0eXBlLmluZGV4T2YoJ2h0bWwnKSAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgdGhpcy5fYXBwZW5kX2h0bWxfZGF0YShvYmosICQoZCkpKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHRcdFx0LmZhaWwoJC5wcm94eShmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjYWxsYmFjay5jYWxsKHRoaXMsIGZhbHNlKTtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2FqYXgnLCAncGx1Z2luJyA6ICdjb3JlJywgJ2lkJyA6ICdjb3JlXzA0JywgJ3JlYXNvbicgOiAnQ291bGQgbm90IGxvYWQgbm9kZScsICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHMpIH07XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNldHRpbmdzLmNvcmUuZXJyb3IuY2FsbCh0aGlzLCB0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvcik7XHJcblx0XHRcdFx0XHRcdFx0fSwgdGhpcykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0ID0gKCQuaXNBcnJheShzKSB8fCAkLmlzUGxhaW5PYmplY3QocykpID8gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzKSkgOiBzO1xyXG5cdFx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIHRoaXMuX2FwcGVuZF9qc29uX2RhdGEob2JqLCB0KSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgdGhpcy5fYXBwZW5kX2h0bWxfZGF0YShvYmosIHMpKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzLCBmYWxzZSk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBhZGRzIGEgbm9kZSB0byB0aGUgbGlzdCBvZiBub2RlcyB0byByZWRyYXcuIFVzZWQgb25seSBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIF9ub2RlX2NoYW5nZWQob2JqIFssIGNhbGxiYWNrXSlcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcclxuXHRcdCAqL1xyXG5cdFx0X25vZGVfY2hhbmdlZCA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZihvYmopIHtcclxuXHRcdFx0XHR0aGlzLl9tb2RlbC5jaGFuZ2VkLnB1c2gob2JqLmlkKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogYXBwZW5kcyBIVE1MIGNvbnRlbnQgdG8gdGhlIHRyZWUuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBfYXBwZW5kX2h0bWxfZGF0YShvYmosIGRhdGEpXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIGFwcGVuZCB0b1xyXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBkYXRhIHRoZSBIVE1MIHN0cmluZyB0byBwYXJzZSBhbmQgYXBwZW5kXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICogQHRyaWdnZXIgbW9kZWwuanN0cmVlLCBjaGFuZ2VkLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRfYXBwZW5kX2h0bWxfZGF0YSA6IGZ1bmN0aW9uIChkb20sIGRhdGEpIHtcclxuXHRcdFx0ZG9tID0gdGhpcy5nZXRfbm9kZShkb20pO1xyXG5cdFx0XHRkb20uY2hpbGRyZW4gPSBbXTtcclxuXHRcdFx0ZG9tLmNoaWxkcmVuX2QgPSBbXTtcclxuXHRcdFx0dmFyIGRhdCA9IGRhdGEuaXMoJ3VsJykgPyBkYXRhLmNoaWxkcmVuKCkgOiBkYXRhLFxyXG5cdFx0XHRcdHBhciA9IGRvbS5pZCxcclxuXHRcdFx0XHRjaGQgPSBbXSxcclxuXHRcdFx0XHRkcGMgPSBbXSxcclxuXHRcdFx0XHRtID0gdGhpcy5fbW9kZWwuZGF0YSxcclxuXHRcdFx0XHRwID0gbVtwYXJdLFxyXG5cdFx0XHRcdHMgPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQubGVuZ3RoLFxyXG5cdFx0XHRcdHRtcCwgaSwgajtcclxuXHRcdFx0ZGF0LmVhY2goJC5wcm94eShmdW5jdGlvbiAoaSwgdikge1xyXG5cdFx0XHRcdHRtcCA9IHRoaXMuX3BhcnNlX21vZGVsX2Zyb21faHRtbCgkKHYpLCBwYXIsIHAucGFyZW50cy5jb25jYXQoKSk7XHJcblx0XHRcdFx0aWYodG1wKSB7XHJcblx0XHRcdFx0XHRjaGQucHVzaCh0bXApO1xyXG5cdFx0XHRcdFx0ZHBjLnB1c2godG1wKTtcclxuXHRcdFx0XHRcdGlmKG1bdG1wXS5jaGlsZHJlbl9kLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRkcGMgPSBkcGMuY29uY2F0KG1bdG1wXS5jaGlsZHJlbl9kKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIHRoaXMpKTtcclxuXHRcdFx0cC5jaGlsZHJlbiA9IGNoZDtcclxuXHRcdFx0cC5jaGlsZHJlbl9kID0gZHBjO1xyXG5cdFx0XHRmb3IoaSA9IDAsIGogPSBwLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0bVtwLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QgPSBtW3AucGFyZW50c1tpXV0uY2hpbGRyZW5fZC5jb25jYXQoZHBjKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gbmV3IGRhdGEgaXMgaW5zZXJ0ZWQgdG8gdGhlIHRyZWUgbW9kZWxcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIG1vZGVsLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge0FycmF5fSBub2RlcyBhbiBhcnJheSBvZiBub2RlIElEc1xyXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gcGFyZW50IHRoZSBwYXJlbnQgSUQgb2YgdGhlIG5vZGVzXHJcblx0XHRcdCAqL1xyXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ21vZGVsJywgeyBcIm5vZGVzXCIgOiBkcGMsICdwYXJlbnQnIDogcGFyIH0pO1xyXG5cdFx0XHRpZihwYXIgIT09ICcjJykge1xyXG5cdFx0XHRcdHRoaXMuX25vZGVfY2hhbmdlZChwYXIpO1xyXG5cdFx0XHRcdHRoaXMucmVkcmF3KCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5nZXRfY29udGFpbmVyX3VsKCkuY2hpbGRyZW4oJy5qc3RyZWUtaW5pdGlhbC1ub2RlJykucmVtb3ZlKCk7XHJcblx0XHRcdFx0dGhpcy5yZWRyYXcodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmxlbmd0aCAhPT0gcykge1xyXG5cdFx0XHRcdHRoaXMudHJpZ2dlcignY2hhbmdlZCcsIHsgJ2FjdGlvbicgOiAnbW9kZWwnLCAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkIH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogYXBwZW5kcyBKU09OIGNvbnRlbnQgdG8gdGhlIHRyZWUuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBfYXBwZW5kX2pzb25fZGF0YShvYmosIGRhdGEpXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIGFwcGVuZCB0b1xyXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBkYXRhIHRoZSBKU09OIG9iamVjdCB0byBwYXJzZSBhbmQgYXBwZW5kXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRfYXBwZW5kX2pzb25fZGF0YSA6IGZ1bmN0aW9uIChkb20sIGRhdGEpIHtcclxuXHRcdFx0ZG9tID0gdGhpcy5nZXRfbm9kZShkb20pO1xyXG5cdFx0XHRkb20uY2hpbGRyZW4gPSBbXTtcclxuXHRcdFx0ZG9tLmNoaWxkcmVuX2QgPSBbXTtcclxuXHRcdFx0dmFyIGRhdCA9IGRhdGEsXHJcblx0XHRcdFx0cGFyID0gZG9tLmlkLFxyXG5cdFx0XHRcdGNoZCA9IFtdLFxyXG5cdFx0XHRcdGRwYyA9IFtdLFxyXG5cdFx0XHRcdG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxyXG5cdFx0XHRcdHAgPSBtW3Bhcl0sXHJcblx0XHRcdFx0cyA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5sZW5ndGgsXHJcblx0XHRcdFx0dG1wLCBpLCBqO1xyXG5cdFx0XHQvLyAqJSRAISEhXHJcblx0XHRcdGlmKGRhdC5kKSB7XHJcblx0XHRcdFx0ZGF0ID0gZGF0LmQ7XHJcblx0XHRcdFx0aWYodHlwZW9mIGRhdCA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdFx0ZGF0ID0gSlNPTi5wYXJzZShkYXQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZighJC5pc0FycmF5KGRhdCkpIHsgZGF0ID0gW2RhdF07IH1cclxuXHRcdFx0aWYoZGF0Lmxlbmd0aCAmJiBkYXRbMF0uaWQgIT09IHVuZGVmaW5lZCAmJiBkYXRbMF0ucGFyZW50ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHQvLyBGbGF0IEpTT04gc3VwcG9ydCAoZm9yIGVhc3kgaW1wb3J0IGZyb20gREIpOlxyXG5cdFx0XHRcdC8vIDEpIGNvbnZlcnQgdG8gb2JqZWN0IChmb3JlYWNoKVxyXG5cdFx0XHRcdGZvcihpID0gMCwgaiA9IGRhdC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdGlmKCFkYXRbaV0uY2hpbGRyZW4pIHtcclxuXHRcdFx0XHRcdFx0ZGF0W2ldLmNoaWxkcmVuID0gW107XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRtW2RhdFtpXS5pZF0gPSBkYXRbaV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIDIpIHBvcHVsYXRlIGNoaWxkcmVuIChmb3JlYWNoKVxyXG5cdFx0XHRcdGZvcihpID0gMCwgaiA9IGRhdC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdG1bZGF0W2ldLnBhcmVudF0uY2hpbGRyZW4ucHVzaChkYXRbaV0uaWQpO1xyXG5cdFx0XHRcdFx0Ly8gcG9wdWxhdGUgcGFyZW50LmNoaWxkcmVuX2RcclxuXHRcdFx0XHRcdHAuY2hpbGRyZW5fZC5wdXNoKGRhdFtpXS5pZCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIDMpIG5vcm1hbGl6ZSAmJiBwb3B1bGF0ZSBwYXJlbnRzIGFuZCBjaGlsZHJlbl9kIHdpdGggcmVjdXJzaW9uXHJcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gcC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdHRtcCA9IHRoaXMuX3BhcnNlX21vZGVsX2Zyb21fZmxhdF9qc29uKG1bcC5jaGlsZHJlbltpXV0sIHBhciwgcC5wYXJlbnRzLmNvbmNhdCgpKTtcclxuXHRcdFx0XHRcdGRwYy5wdXNoKHRtcCk7XHJcblx0XHRcdFx0XHRpZihtW3RtcF0uY2hpbGRyZW5fZC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0ZHBjID0gZHBjLmNvbmNhdChtW3RtcF0uY2hpbGRyZW5fZCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vID8pIHRocmVlX3N0YXRlIHNlbGVjdGlvbiAtIHAuc3RhdGUuc2VsZWN0ZWQgJiYgdCAtIChpZiB0aHJlZV9zdGF0ZSBmb3JlYWNoKGRhdCA9PiBjaCkgLT4gZm9yZWFjaChwYXJlbnRzKSBpZihwYXJlbnQuc2VsZWN0ZWQpIGNoaWxkLnNlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkYXQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHR0bXAgPSB0aGlzLl9wYXJzZV9tb2RlbF9mcm9tX2pzb24oZGF0W2ldLCBwYXIsIHAucGFyZW50cy5jb25jYXQoKSk7XHJcblx0XHRcdFx0XHRpZih0bXApIHtcclxuXHRcdFx0XHRcdFx0Y2hkLnB1c2godG1wKTtcclxuXHRcdFx0XHRcdFx0ZHBjLnB1c2godG1wKTtcclxuXHRcdFx0XHRcdFx0aWYobVt0bXBdLmNoaWxkcmVuX2QubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0ZHBjID0gZHBjLmNvbmNhdChtW3RtcF0uY2hpbGRyZW5fZCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cC5jaGlsZHJlbiA9IGNoZDtcclxuXHRcdFx0XHRwLmNoaWxkcmVuX2QgPSBkcGM7XHJcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gcC5wYXJlbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0bVtwLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QgPSBtW3AucGFyZW50c1tpXV0uY2hpbGRyZW5fZC5jb25jYXQoZHBjKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdtb2RlbCcsIHsgXCJub2Rlc1wiIDogZHBjLCAncGFyZW50JyA6IHBhciB9KTtcclxuXHJcblx0XHRcdGlmKHBhciAhPT0gJyMnKSB7XHJcblx0XHRcdFx0dGhpcy5fbm9kZV9jaGFuZ2VkKHBhcik7XHJcblx0XHRcdFx0dGhpcy5yZWRyYXcoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHQvLyB0aGlzLmdldF9jb250YWluZXJfdWwoKS5jaGlsZHJlbignLmpzdHJlZS1pbml0aWFsLW5vZGUnKS5yZW1vdmUoKTtcclxuXHRcdFx0XHR0aGlzLnJlZHJhdyh0cnVlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZih0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQubGVuZ3RoICE9PSBzKSB7XHJcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyAnYWN0aW9uJyA6ICdtb2RlbCcsICdzZWxlY3RlZCcgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgfSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBwYXJzZXMgYSBub2RlIGZyb20gYSBqUXVlcnkgb2JqZWN0IGFuZCBhcHBlbmRzIHRoZW0gdG8gdGhlIGluIG1lbW9yeSB0cmVlIG1vZGVsLiBVc2VkIGludGVybmFsbHkuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQG5hbWUgX3BhcnNlX21vZGVsX2Zyb21faHRtbChkIFssIHAsIHBzXSlcclxuXHRcdCAqIEBwYXJhbSAge2pRdWVyeX0gZCB0aGUgalF1ZXJ5IG9iamVjdCB0byBwYXJzZVxyXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBwIHRoZSBwYXJlbnQgSURcclxuXHRcdCAqIEBwYXJhbSAge0FycmF5fSBwcyBsaXN0IG9mIGFsbCBwYXJlbnRzXHJcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBJRCBvZiB0aGUgb2JqZWN0IGFkZGVkIHRvIHRoZSBtb2RlbFxyXG5cdFx0ICovXHJcblx0XHRfcGFyc2VfbW9kZWxfZnJvbV9odG1sIDogZnVuY3Rpb24gKGQsIHAsIHBzKSB7XHJcblx0XHRcdGlmKCFwcykgeyBwcyA9IFtdOyB9XHJcblx0XHRcdGVsc2UgeyBwcyA9IFtdLmNvbmNhdChwcyk7IH1cclxuXHRcdFx0aWYocCkgeyBwcy51bnNoaWZ0KHApOyB9XHJcblx0XHRcdHZhciBjLCBlLCBtID0gdGhpcy5fbW9kZWwuZGF0YSxcclxuXHRcdFx0XHRkYXRhID0ge1xyXG5cdFx0XHRcdFx0aWRcdFx0XHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0dGV4dFx0XHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0aWNvblx0XHQ6IHRydWUsXHJcblx0XHRcdFx0XHRwYXJlbnRcdFx0OiBwLFxyXG5cdFx0XHRcdFx0cGFyZW50c1x0XHQ6IHBzLFxyXG5cdFx0XHRcdFx0Y2hpbGRyZW5cdDogW10sXHJcblx0XHRcdFx0XHRjaGlsZHJlbl9kXHQ6IFtdLFxyXG5cdFx0XHRcdFx0ZGF0YVx0XHQ6IG51bGwsXHJcblx0XHRcdFx0XHRzdGF0ZVx0XHQ6IHsgfSxcclxuXHRcdFx0XHRcdGxpX2F0dHJcdFx0OiB7IGlkIDogZmFsc2UgfSxcclxuXHRcdFx0XHRcdGFfYXR0clx0XHQ6IHsgaHJlZiA6ICcjJyB9LFxyXG5cdFx0XHRcdFx0b3JpZ2luYWxcdDogZmFsc2VcclxuXHRcdFx0XHR9LCBpLCB0bXAsIHRpZDtcclxuXHRcdFx0Zm9yKGkgaW4gdGhpcy5fbW9kZWwuZGVmYXVsdF9zdGF0ZSkge1xyXG5cdFx0XHRcdGlmKHRoaXMuX21vZGVsLmRlZmF1bHRfc3RhdGUuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuXHRcdFx0XHRcdGRhdGEuc3RhdGVbaV0gPSB0aGlzLl9tb2RlbC5kZWZhdWx0X3N0YXRlW2ldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR0bXAgPSAkLnZha2F0YS5hdHRyaWJ1dGVzKGQsIHRydWUpO1xyXG5cdFx0XHQkLmVhY2godG1wLCBmdW5jdGlvbiAoaSwgdikge1xyXG5cdFx0XHRcdHYgPSAkLnRyaW0odik7XHJcblx0XHRcdFx0aWYoIXYubGVuZ3RoKSB7IHJldHVybiB0cnVlOyB9XHJcblx0XHRcdFx0ZGF0YS5saV9hdHRyW2ldID0gdjtcclxuXHRcdFx0XHRpZihpID09PSAnaWQnKSB7XHJcblx0XHRcdFx0XHRkYXRhLmlkID0gdjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0bXAgPSBkLmNoaWxkcmVuKCdhJykuZXEoMCk7XHJcblx0XHRcdGlmKHRtcC5sZW5ndGgpIHtcclxuXHRcdFx0XHR0bXAgPSAkLnZha2F0YS5hdHRyaWJ1dGVzKHRtcCwgdHJ1ZSk7XHJcblx0XHRcdFx0JC5lYWNoKHRtcCwgZnVuY3Rpb24gKGksIHYpIHtcclxuXHRcdFx0XHRcdHYgPSAkLnRyaW0odik7XHJcblx0XHRcdFx0XHRpZih2Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRkYXRhLmFfYXR0cltpXSA9IHY7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dG1wID0gZC5jaGlsZHJlbihcImE6ZXEoMClcIikubGVuZ3RoID8gZC5jaGlsZHJlbihcImE6ZXEoMClcIikuY2xvbmUoKSA6IGQuY2xvbmUoKTtcclxuXHRcdFx0dG1wLmNoaWxkcmVuKFwiaW5zLCBpLCB1bFwiKS5yZW1vdmUoKTtcclxuXHRcdFx0dG1wID0gdG1wLmh0bWwoKTtcclxuXHRcdFx0dG1wID0gJCgnPGRpdiAvPicpLmh0bWwodG1wKTtcclxuXHRcdFx0ZGF0YS50ZXh0ID0gdG1wLmh0bWwoKTtcclxuXHRcdFx0dG1wID0gZC5kYXRhKCk7XHJcblx0XHRcdGRhdGEuZGF0YSA9IHRtcCA/ICQuZXh0ZW5kKHRydWUsIHt9LCB0bXApIDogbnVsbDtcclxuXHRcdFx0ZGF0YS5zdGF0ZS5vcGVuZWQgPSBkLmhhc0NsYXNzKCdqc3RyZWUtb3BlbicpO1xyXG5cdFx0XHRkYXRhLnN0YXRlLnNlbGVjdGVkID0gZC5jaGlsZHJlbignYScpLmhhc0NsYXNzKCdqc3RyZWUtY2xpY2tlZCcpO1xyXG5cdFx0XHRkYXRhLnN0YXRlLmRpc2FibGVkID0gZC5jaGlsZHJlbignYScpLmhhc0NsYXNzKCdqc3RyZWUtZGlzYWJsZWQnKTtcclxuXHRcdFx0aWYoZGF0YS5kYXRhICYmIGRhdGEuZGF0YS5qc3RyZWUpIHtcclxuXHRcdFx0XHRmb3IoaSBpbiBkYXRhLmRhdGEuanN0cmVlKSB7XHJcblx0XHRcdFx0XHRpZihkYXRhLmRhdGEuanN0cmVlLmhhc093blByb3BlcnR5KGkpKSB7XHJcblx0XHRcdFx0XHRcdGRhdGEuc3RhdGVbaV0gPSBkYXRhLmRhdGEuanN0cmVlW2ldO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR0bXAgPSBkLmNoaWxkcmVuKFwiYVwiKS5jaGlsZHJlbihcIi5qc3RyZWUtdGhlbWVpY29uXCIpO1xyXG5cdFx0XHRpZih0bXAubGVuZ3RoKSB7XHJcblx0XHRcdFx0ZGF0YS5pY29uID0gdG1wLmhhc0NsYXNzKCdqc3RyZWUtdGhlbWVpY29uLWhpZGRlbicpID8gZmFsc2UgOiB0bXAuYXR0cigncmVsJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoZGF0YS5zdGF0ZS5pY29uKSB7XHJcblx0XHRcdFx0ZGF0YS5pY29uID0gZGF0YS5zdGF0ZS5pY29uO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRtcCA9IGQuY2hpbGRyZW4oXCJ1bFwiKS5jaGlsZHJlbihcImxpXCIpO1xyXG5cdFx0XHRkbyB7XHJcblx0XHRcdFx0dGlkID0gJ2onICsgdGhpcy5faWQgKyAnXycgKyAoKyt0aGlzLl9jbnQpO1xyXG5cdFx0XHR9IHdoaWxlKG1bdGlkXSk7XHJcblx0XHRcdGRhdGEuaWQgPSBkYXRhLmxpX2F0dHIuaWQgfHwgdGlkO1xyXG5cdFx0XHRpZih0bXAubGVuZ3RoKSB7XHJcblx0XHRcdFx0dG1wLmVhY2goJC5wcm94eShmdW5jdGlvbiAoaSwgdikge1xyXG5cdFx0XHRcdFx0YyA9IHRoaXMuX3BhcnNlX21vZGVsX2Zyb21faHRtbCgkKHYpLCBkYXRhLmlkLCBwcyk7XHJcblx0XHRcdFx0XHRlID0gdGhpcy5fbW9kZWwuZGF0YVtjXTtcclxuXHRcdFx0XHRcdGRhdGEuY2hpbGRyZW4ucHVzaChjKTtcclxuXHRcdFx0XHRcdGlmKGUuY2hpbGRyZW5fZC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0ZGF0YS5jaGlsZHJlbl9kID0gZGF0YS5jaGlsZHJlbl9kLmNvbmNhdChlLmNoaWxkcmVuX2QpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sIHRoaXMpKTtcclxuXHRcdFx0XHRkYXRhLmNoaWxkcmVuX2QgPSBkYXRhLmNoaWxkcmVuX2QuY29uY2F0KGRhdGEuY2hpbGRyZW4pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdGlmKGQuaGFzQ2xhc3MoJ2pzdHJlZS1jbG9zZWQnKSkge1xyXG5cdFx0XHRcdFx0ZGF0YS5zdGF0ZS5sb2FkZWQgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoZGF0YS5saV9hdHRyWydjbGFzcyddKSB7XHJcblx0XHRcdFx0ZGF0YS5saV9hdHRyWydjbGFzcyddID0gZGF0YS5saV9hdHRyWydjbGFzcyddLnJlcGxhY2UoJ2pzdHJlZS1jbG9zZWQnLCcnKS5yZXBsYWNlKCdqc3RyZWUtb3BlbicsJycpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKGRhdGEuYV9hdHRyWydjbGFzcyddKSB7XHJcblx0XHRcdFx0ZGF0YS5hX2F0dHJbJ2NsYXNzJ10gPSBkYXRhLmFfYXR0clsnY2xhc3MnXS5yZXBsYWNlKCdqc3RyZWUtY2xpY2tlZCcsJycpLnJlcGxhY2UoJ2pzdHJlZS1kaXNhYmxlZCcsJycpO1xyXG5cdFx0XHR9XHJcblx0XHRcdG1bZGF0YS5pZF0gPSBkYXRhO1xyXG5cdFx0XHRpZihkYXRhLnN0YXRlLnNlbGVjdGVkKSB7XHJcblx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLnB1c2goZGF0YS5pZCk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGRhdGEuaWQ7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBwYXJzZXMgYSBub2RlIGZyb20gYSBKU09OIG9iamVjdCAodXNlZCB3aGVuIGRlYWxpbmcgd2l0aCBmbGF0IGRhdGEsIHdoaWNoIGhhcyBubyBuZXN0aW5nIG9mIGNoaWxkcmVuLCBidXQgaGFzIGlkIGFuZCBwYXJlbnQgcHJvcGVydGllcykgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGluIG1lbW9yeSB0cmVlIG1vZGVsLiBVc2VkIGludGVybmFsbHkuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQG5hbWUgX3BhcnNlX21vZGVsX2Zyb21fZmxhdF9qc29uKGQgWywgcCwgcHNdKVxyXG5cdFx0ICogQHBhcmFtICB7T2JqZWN0fSBkIHRoZSBKU09OIG9iamVjdCB0byBwYXJzZVxyXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBwIHRoZSBwYXJlbnQgSURcclxuXHRcdCAqIEBwYXJhbSAge0FycmF5fSBwcyBsaXN0IG9mIGFsbCBwYXJlbnRzXHJcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBJRCBvZiB0aGUgb2JqZWN0IGFkZGVkIHRvIHRoZSBtb2RlbFxyXG5cdFx0ICovXHJcblx0XHRfcGFyc2VfbW9kZWxfZnJvbV9mbGF0X2pzb24gOiBmdW5jdGlvbiAoZCwgcCwgcHMpIHtcclxuXHRcdFx0aWYoIXBzKSB7IHBzID0gW107IH1cclxuXHRcdFx0ZWxzZSB7IHBzID0gcHMuY29uY2F0KCk7IH1cclxuXHRcdFx0aWYocCkgeyBwcy51bnNoaWZ0KHApOyB9XHJcblx0XHRcdHZhciB0aWQgPSBkLmlkLFxyXG5cdFx0XHRcdG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxyXG5cdFx0XHRcdGRmID0gdGhpcy5fbW9kZWwuZGVmYXVsdF9zdGF0ZSxcclxuXHRcdFx0XHRpLCBqLCBjLCBlLFxyXG5cdFx0XHRcdHRtcCA9IHtcclxuXHRcdFx0XHRcdGlkXHRcdFx0OiB0aWQsXHJcblx0XHRcdFx0XHR0ZXh0XHRcdDogZC50ZXh0IHx8ICcnLFxyXG5cdFx0XHRcdFx0aWNvblx0XHQ6IGQuaWNvbiAhPT0gdW5kZWZpbmVkID8gZC5pY29uIDogdHJ1ZSxcclxuXHRcdFx0XHRcdHBhcmVudFx0XHQ6IHAsXHJcblx0XHRcdFx0XHRwYXJlbnRzXHRcdDogcHMsXHJcblx0XHRcdFx0XHRjaGlsZHJlblx0OiBkLmNoaWxkcmVuIHx8IFtdLFxyXG5cdFx0XHRcdFx0Y2hpbGRyZW5fZFx0OiBkLmNoaWxkcmVuX2QgfHwgW10sXHJcblx0XHRcdFx0XHRkYXRhXHRcdDogZC5kYXRhLFxyXG5cdFx0XHRcdFx0c3RhdGVcdFx0OiB7IH0sXHJcblx0XHRcdFx0XHRsaV9hdHRyXHRcdDogeyBpZCA6IGZhbHNlIH0sXHJcblx0XHRcdFx0XHRhX2F0dHJcdFx0OiB7IGhyZWYgOiAnIycgfSxcclxuXHRcdFx0XHRcdG9yaWdpbmFsXHQ6IGZhbHNlXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0Zm9yKGkgaW4gZGYpIHtcclxuXHRcdFx0XHRpZihkZi5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG5cdFx0XHRcdFx0dG1wLnN0YXRlW2ldID0gZGZbaV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmKGQgJiYgZC5kYXRhICYmIGQuZGF0YS5qc3RyZWUgJiYgZC5kYXRhLmpzdHJlZS5pY29uKSB7XHJcblx0XHRcdFx0dG1wLmljb24gPSBkLmRhdGEuanN0cmVlLmljb247XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoZCAmJiBkLmRhdGEpIHtcclxuXHRcdFx0XHR0bXAuZGF0YSA9IGQuZGF0YTtcclxuXHRcdFx0XHRpZihkLmRhdGEuanN0cmVlKSB7XHJcblx0XHRcdFx0XHRmb3IoaSBpbiBkLmRhdGEuanN0cmVlKSB7XHJcblx0XHRcdFx0XHRcdGlmKGQuZGF0YS5qc3RyZWUuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuXHRcdFx0XHRcdFx0XHR0bXAuc3RhdGVbaV0gPSBkLmRhdGEuanN0cmVlW2ldO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmKGQgJiYgdHlwZW9mIGQuc3RhdGUgPT09ICdvYmplY3QnKSB7XHJcblx0XHRcdFx0Zm9yIChpIGluIGQuc3RhdGUpIHtcclxuXHRcdFx0XHRcdGlmKGQuc3RhdGUuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuXHRcdFx0XHRcdFx0dG1wLnN0YXRlW2ldID0gZC5zdGF0ZVtpXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoZCAmJiB0eXBlb2YgZC5saV9hdHRyID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRcdGZvciAoaSBpbiBkLmxpX2F0dHIpIHtcclxuXHRcdFx0XHRcdGlmKGQubGlfYXR0ci5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG5cdFx0XHRcdFx0XHR0bXAubGlfYXR0cltpXSA9IGQubGlfYXR0cltpXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIXRtcC5saV9hdHRyLmlkKSB7XHJcblx0XHRcdFx0dG1wLmxpX2F0dHIuaWQgPSB0aWQ7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoZCAmJiB0eXBlb2YgZC5hX2F0dHIgPT09ICdvYmplY3QnKSB7XHJcblx0XHRcdFx0Zm9yIChpIGluIGQuYV9hdHRyKSB7XHJcblx0XHRcdFx0XHRpZihkLmFfYXR0ci5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG5cdFx0XHRcdFx0XHR0bXAuYV9hdHRyW2ldID0gZC5hX2F0dHJbaV07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmKGQgJiYgZC5jaGlsZHJlbiAmJiBkLmNoaWxkcmVuID09PSB0cnVlKSB7XHJcblx0XHRcdFx0dG1wLnN0YXRlLmxvYWRlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdHRtcC5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0XHRcdHRtcC5jaGlsZHJlbl9kID0gW107XHJcblx0XHRcdH1cclxuXHRcdFx0bVt0bXAuaWRdID0gdG1wO1xyXG5cdFx0XHRmb3IoaSA9IDAsIGogPSB0bXAuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0YyA9IHRoaXMuX3BhcnNlX21vZGVsX2Zyb21fZmxhdF9qc29uKG1bdG1wLmNoaWxkcmVuW2ldXSwgdG1wLmlkLCBwcyk7XHJcblx0XHRcdFx0ZSA9IG1bY107XHJcblx0XHRcdFx0dG1wLmNoaWxkcmVuX2QucHVzaChjKTtcclxuXHRcdFx0XHRpZihlLmNoaWxkcmVuX2QubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHR0bXAuY2hpbGRyZW5fZCA9IHRtcC5jaGlsZHJlbl9kLmNvbmNhdChlLmNoaWxkcmVuX2QpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRkZWxldGUgZC5kYXRhO1xyXG5cdFx0XHRkZWxldGUgZC5jaGlsZHJlbjtcclxuXHRcdFx0bVt0bXAuaWRdLm9yaWdpbmFsID0gZDtcclxuXHRcdFx0aWYodG1wLnN0YXRlLnNlbGVjdGVkKSB7XHJcblx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLnB1c2godG1wLmlkKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdG1wLmlkO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogcGFyc2VzIGEgbm9kZSBmcm9tIGEgSlNPTiBvYmplY3QgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGluIG1lbW9yeSB0cmVlIG1vZGVsLiBVc2VkIGludGVybmFsbHkuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQG5hbWUgX3BhcnNlX21vZGVsX2Zyb21fanNvbihkIFssIHAsIHBzXSlcclxuXHRcdCAqIEBwYXJhbSAge09iamVjdH0gZCB0aGUgSlNPTiBvYmplY3QgdG8gcGFyc2VcclxuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30gcCB0aGUgcGFyZW50IElEXHJcblx0XHQgKiBAcGFyYW0gIHtBcnJheX0gcHMgbGlzdCBvZiBhbGwgcGFyZW50c1xyXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfSB0aGUgSUQgb2YgdGhlIG9iamVjdCBhZGRlZCB0byB0aGUgbW9kZWxcclxuXHRcdCAqL1xyXG5cdFx0X3BhcnNlX21vZGVsX2Zyb21fanNvbiA6IGZ1bmN0aW9uIChkLCBwLCBwcykge1xyXG5cdFx0XHRpZighcHMpIHsgcHMgPSBbXTsgfVxyXG5cdFx0XHRlbHNlIHsgcHMgPSBwcy5jb25jYXQoKTsgfVxyXG5cdFx0XHRpZihwKSB7IHBzLnVuc2hpZnQocCk7IH1cclxuXHRcdFx0dmFyIHRpZCA9IGZhbHNlLCBpLCBqLCBjLCBlLCBtID0gdGhpcy5fbW9kZWwuZGF0YSwgZGYgPSB0aGlzLl9tb2RlbC5kZWZhdWx0X3N0YXRlLCB0bXA7XHJcblx0XHRcdGRvIHtcclxuXHRcdFx0XHR0aWQgPSAnaicgKyB0aGlzLl9pZCArICdfJyArICgrK3RoaXMuX2NudCk7XHJcblx0XHRcdH0gd2hpbGUobVt0aWRdKTtcclxuXHJcblx0XHRcdHRtcCA9IHtcclxuXHRcdFx0XHRpZFx0XHRcdDogZmFsc2UsXHJcblx0XHRcdFx0dGV4dFx0XHQ6IHR5cGVvZiBkID09PSAnc3RyaW5nJyA/IGQgOiAnJyxcclxuXHRcdFx0XHRpY29uXHRcdDogdHlwZW9mIGQgPT09ICdvYmplY3QnICYmIGQuaWNvbiAhPT0gdW5kZWZpbmVkID8gZC5pY29uIDogdHJ1ZSxcclxuXHRcdFx0XHRwYXJlbnRcdFx0OiBwLFxyXG5cdFx0XHRcdHBhcmVudHNcdFx0OiBwcyxcclxuXHRcdFx0XHRjaGlsZHJlblx0OiBbXSxcclxuXHRcdFx0XHRjaGlsZHJlbl9kXHQ6IFtdLFxyXG5cdFx0XHRcdGRhdGFcdFx0OiBudWxsLFxyXG5cdFx0XHRcdHN0YXRlXHRcdDogeyB9LFxyXG5cdFx0XHRcdGxpX2F0dHJcdFx0OiB7IGlkIDogZmFsc2UgfSxcclxuXHRcdFx0XHRhX2F0dHJcdFx0OiB7IGhyZWYgOiAnIycgfSxcclxuXHRcdFx0XHRvcmlnaW5hbFx0OiBmYWxzZVxyXG5cdFx0XHR9O1xyXG5cdFx0XHRmb3IoaSBpbiBkZikge1xyXG5cdFx0XHRcdGlmKGRmLmhhc093blByb3BlcnR5KGkpKSB7XHJcblx0XHRcdFx0XHR0bXAuc3RhdGVbaV0gPSBkZltpXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoZCAmJiBkLmlkKSB7IHRtcC5pZCA9IGQuaWQ7IH1cclxuXHRcdFx0aWYoZCAmJiBkLnRleHQpIHsgdG1wLnRleHQgPSBkLnRleHQ7IH1cclxuXHRcdFx0aWYoZCAmJiBkLmRhdGEgJiYgZC5kYXRhLmpzdHJlZSAmJiBkLmRhdGEuanN0cmVlLmljb24pIHtcclxuXHRcdFx0XHR0bXAuaWNvbiA9IGQuZGF0YS5qc3RyZWUuaWNvbjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZihkICYmIGQuZGF0YSkge1xyXG5cdFx0XHRcdHRtcC5kYXRhID0gZC5kYXRhO1xyXG5cdFx0XHRcdGlmKGQuZGF0YS5qc3RyZWUpIHtcclxuXHRcdFx0XHRcdGZvcihpIGluIGQuZGF0YS5qc3RyZWUpIHtcclxuXHRcdFx0XHRcdFx0aWYoZC5kYXRhLmpzdHJlZS5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG5cdFx0XHRcdFx0XHRcdHRtcC5zdGF0ZVtpXSA9IGQuZGF0YS5qc3RyZWVbaV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoZCAmJiB0eXBlb2YgZC5zdGF0ZSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHRmb3IgKGkgaW4gZC5zdGF0ZSkge1xyXG5cdFx0XHRcdFx0aWYoZC5zdGF0ZS5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG5cdFx0XHRcdFx0XHR0bXAuc3RhdGVbaV0gPSBkLnN0YXRlW2ldO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZihkICYmIHR5cGVvZiBkLmxpX2F0dHIgPT09ICdvYmplY3QnKSB7XHJcblx0XHRcdFx0Zm9yIChpIGluIGQubGlfYXR0cikge1xyXG5cdFx0XHRcdFx0aWYoZC5saV9hdHRyLmhhc093blByb3BlcnR5KGkpKSB7XHJcblx0XHRcdFx0XHRcdHRtcC5saV9hdHRyW2ldID0gZC5saV9hdHRyW2ldO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZih0bXAubGlfYXR0ci5pZCAmJiAhdG1wLmlkKSB7XHJcblx0XHRcdFx0dG1wLmlkID0gdG1wLmxpX2F0dHIuaWQ7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIXRtcC5pZCkge1xyXG5cdFx0XHRcdHRtcC5pZCA9IHRpZDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZighdG1wLmxpX2F0dHIuaWQpIHtcclxuXHRcdFx0XHR0bXAubGlfYXR0ci5pZCA9IHRtcC5pZDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZihkICYmIHR5cGVvZiBkLmFfYXR0ciA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHRmb3IgKGkgaW4gZC5hX2F0dHIpIHtcclxuXHRcdFx0XHRcdGlmKGQuYV9hdHRyLmhhc093blByb3BlcnR5KGkpKSB7XHJcblx0XHRcdFx0XHRcdHRtcC5hX2F0dHJbaV0gPSBkLmFfYXR0cltpXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoZCAmJiBkLmNoaWxkcmVuICYmIGQuY2hpbGRyZW4ubGVuZ3RoKSB7XHJcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gZC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdGMgPSB0aGlzLl9wYXJzZV9tb2RlbF9mcm9tX2pzb24oZC5jaGlsZHJlbltpXSwgdG1wLmlkLCBwcyk7XHJcblx0XHRcdFx0XHRlID0gbVtjXTtcclxuXHRcdFx0XHRcdHRtcC5jaGlsZHJlbi5wdXNoKGMpO1xyXG5cdFx0XHRcdFx0aWYoZS5jaGlsZHJlbl9kLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHR0bXAuY2hpbGRyZW5fZCA9IHRtcC5jaGlsZHJlbl9kLmNvbmNhdChlLmNoaWxkcmVuX2QpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0bXAuY2hpbGRyZW5fZCA9IHRtcC5jaGlsZHJlbl9kLmNvbmNhdCh0bXAuY2hpbGRyZW4pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKGQgJiYgZC5jaGlsZHJlbiAmJiBkLmNoaWxkcmVuID09PSB0cnVlKSB7XHJcblx0XHRcdFx0dG1wLnN0YXRlLmxvYWRlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdHRtcC5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0XHRcdHRtcC5jaGlsZHJlbl9kID0gW107XHJcblx0XHRcdH1cclxuXHRcdFx0ZGVsZXRlIGQuZGF0YTtcclxuXHRcdFx0ZGVsZXRlIGQuY2hpbGRyZW47XHJcblx0XHRcdHRtcC5vcmlnaW5hbCA9IGQ7XHJcblx0XHRcdG1bdG1wLmlkXSA9IHRtcDtcclxuXHRcdFx0aWYodG1wLnN0YXRlLnNlbGVjdGVkKSB7XHJcblx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLnB1c2godG1wLmlkKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdG1wLmlkO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogcmVkcmF3cyBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlZHJhd24uIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBfcmVkcmF3KClcclxuXHRcdCAqIEB0cmlnZ2VyIHJlZHJhdy5qc3RyZWVcclxuXHRcdCAqL1xyXG5cdFx0X3JlZHJhdyA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0dmFyIG5vZGVzID0gdGhpcy5fbW9kZWwuZm9yY2VfZnVsbF9yZWRyYXcgPyB0aGlzLl9tb2RlbC5kYXRhWycjJ10uY2hpbGRyZW4uY29uY2F0KFtdKSA6IHRoaXMuX21vZGVsLmNoYW5nZWQuY29uY2F0KFtdKSxcclxuXHRcdFx0XHRmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnVUwnKSwgdG1wLCBpLCBqO1xyXG5cdFx0XHRmb3IoaSA9IDAsIGogPSBub2Rlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHR0bXAgPSB0aGlzLnJlZHJhd19ub2RlKG5vZGVzW2ldLCB0cnVlLCB0aGlzLl9tb2RlbC5mb3JjZV9mdWxsX3JlZHJhdyk7XHJcblx0XHRcdFx0aWYodG1wICYmIHRoaXMuX21vZGVsLmZvcmNlX2Z1bGxfcmVkcmF3KSB7XHJcblx0XHRcdFx0XHRmLmFwcGVuZENoaWxkKHRtcCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHRoaXMuX21vZGVsLmZvcmNlX2Z1bGxfcmVkcmF3KSB7XHJcblx0XHRcdFx0Zi5jbGFzc05hbWUgPSB0aGlzLmdldF9jb250YWluZXJfdWwoKVswXS5jbGFzc05hbWU7XHJcblx0XHRcdFx0dGhpcy5lbGVtZW50LmVtcHR5KCkuYXBwZW5kKGYpO1xyXG5cdFx0XHRcdC8vdGhpcy5nZXRfY29udGFpbmVyX3VsKClbMF0uYXBwZW5kQ2hpbGQoZik7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5fbW9kZWwuZm9yY2VfZnVsbF9yZWRyYXcgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fbW9kZWwuY2hhbmdlZCA9IFtdO1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIG5vZGVzIGFyZSByZWRyYXduXHJcblx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHQgKiBAbmFtZSByZWRyYXcuanN0cmVlXHJcblx0XHRcdCAqIEBwYXJhbSB7YXJyYXl9IG5vZGVzIHRoZSByZWRyYXduIG5vZGVzXHJcblx0XHRcdCAqL1xyXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ3JlZHJhdycsIHsgXCJub2Rlc1wiIDogbm9kZXMgfSk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiByZWRyYXdzIGFsbCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgcmVkcmF3biBvciBvcHRpb25hbGx5IC0gdGhlIHdob2xlIHRyZWVcclxuXHRcdCAqIEBuYW1lIHJlZHJhdyhbZnVsbF0pXHJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGZ1bGwgaWYgc2V0IHRvIGB0cnVlYCBhbGwgbm9kZXMgYXJlIHJlZHJhd24uXHJcblx0XHQgKi9cclxuXHRcdHJlZHJhdyA6IGZ1bmN0aW9uIChmdWxsKSB7XHJcblx0XHRcdGlmKGZ1bGwpIHtcclxuXHRcdFx0XHR0aGlzLl9tb2RlbC5mb3JjZV9mdWxsX3JlZHJhdyA9IHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly9pZih0aGlzLl9tb2RlbC5yZWRyYXdfdGltZW91dCkge1xyXG5cdFx0XHQvL1x0Y2xlYXJUaW1lb3V0KHRoaXMuX21vZGVsLnJlZHJhd190aW1lb3V0KTtcclxuXHRcdFx0Ly99XHJcblx0XHRcdC8vdGhpcy5fbW9kZWwucmVkcmF3X3RpbWVvdXQgPSBzZXRUaW1lb3V0KCQucHJveHkodGhpcy5fcmVkcmF3LCB0aGlzKSwwKTtcclxuXHRcdFx0dGhpcy5fcmVkcmF3KCk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiByZWRyYXdzIGEgc2luZ2xlIG5vZGUuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSByZWRyYXdfbm9kZShub2RlLCBkZWVwLCBpc19jYWxsYmFjaylcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG5vZGUgdGhlIG5vZGUgdG8gcmVkcmF3XHJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXAgc2hvdWxkIGNoaWxkIG5vZGVzIGJlIHJlZHJhd24gdG9vXHJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzX2NhbGxiYWNrIGlzIHRoaXMgYSByZWN1cnNpb24gY2FsbFxyXG5cdFx0ICovXHJcblx0XHRyZWRyYXdfbm9kZSA6IGZ1bmN0aW9uIChub2RlLCBkZWVwLCBpc19jYWxsYmFjaykge1xyXG5cdFx0XHR2YXIgb2JqID0gdGhpcy5nZXRfbm9kZShub2RlKSxcclxuXHRcdFx0XHRwYXIgPSBmYWxzZSxcclxuXHRcdFx0XHRpbmQgPSBmYWxzZSxcclxuXHRcdFx0XHRvbGQgPSBmYWxzZSxcclxuXHRcdFx0XHRpID0gZmFsc2UsXHJcblx0XHRcdFx0aiA9IGZhbHNlLFxyXG5cdFx0XHRcdGsgPSBmYWxzZSxcclxuXHRcdFx0XHRjID0gJycsXHJcblx0XHRcdFx0ZCA9IGRvY3VtZW50LFxyXG5cdFx0XHRcdG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxyXG5cdFx0XHRcdGYgPSBmYWxzZSxcclxuXHRcdFx0XHRzID0gZmFsc2U7XHJcblx0XHRcdGlmKCFvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdGlmKG9iai5pZCA9PT0gJyMnKSB7ICByZXR1cm4gdGhpcy5yZWRyYXcodHJ1ZSk7IH1cclxuXHRcdFx0ZGVlcCA9IGRlZXAgfHwgb2JqLmNoaWxkcmVuLmxlbmd0aCA9PT0gMDtcclxuXHRcdFx0bm9kZSA9IGQuZ2V0RWxlbWVudEJ5SWQob2JqLmlkKTsgLy8sIHRoaXMuZWxlbWVudCk7XHJcblx0XHRcdGlmKCFub2RlKSB7XHJcblx0XHRcdFx0ZGVlcCA9IHRydWU7XHJcblx0XHRcdFx0Ly9ub2RlID0gZC5jcmVhdGVFbGVtZW50KCdMSScpO1xyXG5cdFx0XHRcdGlmKCFpc19jYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0cGFyID0gb2JqLnBhcmVudCAhPT0gJyMnID8gJCgnIycgKyBvYmoucGFyZW50LCB0aGlzLmVsZW1lbnQpWzBdIDogbnVsbDtcclxuXHRcdFx0XHRcdGlmKHBhciAhPT0gbnVsbCAmJiAoIXBhciB8fCAhbVtvYmoucGFyZW50XS5zdGF0ZS5vcGVuZWQpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGluZCA9ICQuaW5BcnJheShvYmouaWQsIHBhciA9PT0gbnVsbCA/IG1bJyMnXS5jaGlsZHJlbiA6IG1bb2JqLnBhcmVudF0uY2hpbGRyZW4pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRub2RlID0gJChub2RlKTtcclxuXHRcdFx0XHRpZighaXNfY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdHBhciA9IG5vZGUucGFyZW50KCkucGFyZW50KClbMF07XHJcblx0XHRcdFx0XHRpZihwYXIgPT09IHRoaXMuZWxlbWVudFswXSkge1xyXG5cdFx0XHRcdFx0XHRwYXIgPSBudWxsO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aW5kID0gbm9kZS5pbmRleCgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBtW29iai5pZF0uZGF0YSA9IG5vZGUuZGF0YSgpOyAvLyB1c2Ugb25seSBub2RlJ3MgZGF0YSwgbm8gbmVlZCB0byB0b3VjaCBqcXVlcnkgc3RvcmFnZVxyXG5cdFx0XHRcdGlmKCFkZWVwICYmIG9iai5jaGlsZHJlbi5sZW5ndGggJiYgIW5vZGUuY2hpbGRyZW4oJ3VsJykubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRkZWVwID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoIWRlZXApIHtcclxuXHRcdFx0XHRcdG9sZCA9IG5vZGUuY2hpbGRyZW4oJ1VMJylbMF07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHMgPSBub2RlLmF0dHIoJ2FyaWEtc2VsZWN0ZWQnKTtcclxuXHRcdFx0XHRmID0gbm9kZS5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKVswXSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHRcdFx0XHRub2RlLnJlbW92ZSgpO1xyXG5cdFx0XHRcdC8vbm9kZSA9IGQuY3JlYXRlRWxlbWVudCgnTEknKTtcclxuXHRcdFx0XHQvL25vZGUgPSBub2RlWzBdO1xyXG5cdFx0XHR9XHJcblx0XHRcdG5vZGUgPSBfbm9kZS5jbG9uZU5vZGUodHJ1ZSk7XHJcblx0XHRcdC8vIG5vZGUgaXMgRE9NLCBkZWVwIGlzIGJvb2xlYW5cclxuXHJcblx0XHRcdGMgPSAnanN0cmVlLW5vZGUgJztcclxuXHRcdFx0Zm9yKGkgaW4gb2JqLmxpX2F0dHIpIHtcclxuXHRcdFx0XHRpZihvYmoubGlfYXR0ci5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG5cdFx0XHRcdFx0aWYoaSA9PT0gJ2lkJykgeyBjb250aW51ZTsgfVxyXG5cdFx0XHRcdFx0aWYoaSAhPT0gJ2NsYXNzJykge1xyXG5cdFx0XHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZShpLCBvYmoubGlfYXR0cltpXSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0YyArPSBvYmoubGlfYXR0cltpXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYocyAmJiBzICE9PSBcImZhbHNlXCIpIHtcclxuXHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCFvYmouY2hpbGRyZW4ubGVuZ3RoICYmIG9iai5zdGF0ZS5sb2FkZWQpIHtcclxuXHRcdFx0XHRjICs9ICcganN0cmVlLWxlYWYnO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdGMgKz0gb2JqLnN0YXRlLm9wZW5lZCA/ICcganN0cmVlLW9wZW4nIDogJyBqc3RyZWUtY2xvc2VkJztcclxuXHRcdFx0XHRub2RlLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIG9iai5zdGF0ZS5vcGVuZWQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKG9iai5wYXJlbnQgIT09IG51bGwgJiYgbVtvYmoucGFyZW50XS5jaGlsZHJlblttW29iai5wYXJlbnRdLmNoaWxkcmVuLmxlbmd0aCAtIDFdID09PSBvYmouaWQpIHtcclxuXHRcdFx0XHRjICs9ICcganN0cmVlLWxhc3QnO1xyXG5cdFx0XHR9XHJcblx0XHRcdG5vZGUuaWQgPSBvYmouaWQ7XHJcblx0XHRcdG5vZGUuY2xhc3NOYW1lID0gYztcclxuXHRcdFx0YyA9ICggb2JqLnN0YXRlLnNlbGVjdGVkID8gJyBqc3RyZWUtY2xpY2tlZCcgOiAnJykgKyAoIG9iai5zdGF0ZS5kaXNhYmxlZCA/ICcganN0cmVlLWRpc2FibGVkJyA6ICcnKTtcclxuXHRcdFx0Zm9yKGogaW4gb2JqLmFfYXR0cikge1xyXG5cdFx0XHRcdGlmKG9iai5hX2F0dHIuaGFzT3duUHJvcGVydHkoaikpIHtcclxuXHRcdFx0XHRcdGlmKGogPT09ICdocmVmJyAmJiBvYmouYV9hdHRyW2pdID09PSAnIycpIHsgY29udGludWU7IH1cclxuXHRcdFx0XHRcdGlmKGogIT09ICdjbGFzcycpIHtcclxuXHRcdFx0XHRcdFx0bm9kZS5jaGlsZE5vZGVzWzFdLnNldEF0dHJpYnV0ZShqLCBvYmouYV9hdHRyW2pdKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRjICs9ICcgJyArIG9iai5hX2F0dHJbal07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmKGMubGVuZ3RoKSB7XHJcblx0XHRcdFx0bm9kZS5jaGlsZE5vZGVzWzFdLmNsYXNzTmFtZSA9ICdqc3RyZWUtYW5jaG9yICcgKyBjO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKChvYmouaWNvbiAmJiBvYmouaWNvbiAhPT0gdHJ1ZSkgfHwgb2JqLmljb24gPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0aWYob2JqLmljb24gPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jbGFzc05hbWUgKz0gJyBqc3RyZWUtdGhlbWVpY29uLWhpZGRlbic7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVsc2UgaWYob2JqLmljb24uaW5kZXhPZignLycpID09PSAtMSAmJiBvYmouaWNvbi5pbmRleE9mKCcuJykgPT09IC0xKSB7XHJcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jbGFzc05hbWUgKz0gJyAnICsgb2JqLmljb24gKyAnIGpzdHJlZS10aGVtZWljb24tY3VzdG9tJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCcrb2JqLmljb24rJyknO1xyXG5cdFx0XHRcdFx0bm9kZS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0uc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gJ2NlbnRlciBjZW50ZXInO1xyXG5cdFx0XHRcdFx0bm9kZS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0uc3R5bGUuYmFja2dyb3VuZFNpemUgPSAnYXV0byc7XHJcblx0XHRcdFx0XHRub2RlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jbGFzc05hbWUgKz0gJyBqc3RyZWUtdGhlbWVpY29uLWN1c3RvbSc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8vbm9kZS5jaGlsZE5vZGVzWzFdLmFwcGVuZENoaWxkKGQuY3JlYXRlVGV4dE5vZGUob2JqLnRleHQpKTtcclxuXHRcdFx0bm9kZS5jaGlsZE5vZGVzWzFdLmlubmVySFRNTCArPSBvYmoudGV4dDtcclxuXHRcdFx0Ly8gaWYob2JqLmRhdGEpIHsgJC5kYXRhKG5vZGUsIG9iai5kYXRhKTsgfSAvLyBhbHdheXMgd29yayB3aXRoIG5vZGUncyBkYXRhLCBubyBuZWVkIHRvIHRvdWNoIGpxdWVyeSBzdG9yZVxyXG5cclxuXHRcdFx0aWYoZGVlcCAmJiBvYmouY2hpbGRyZW4ubGVuZ3RoICYmIG9iai5zdGF0ZS5vcGVuZWQpIHtcclxuXHRcdFx0XHRrID0gZC5jcmVhdGVFbGVtZW50KCdVTCcpO1xyXG5cdFx0XHRcdGsuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2dyb3VwJyk7XHJcblx0XHRcdFx0ay5jbGFzc05hbWUgPSAnanN0cmVlLWNoaWxkcmVuJztcclxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRrLmFwcGVuZENoaWxkKHRoaXMucmVkcmF3X25vZGUob2JqLmNoaWxkcmVuW2ldLCBkZWVwLCB0cnVlKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG5vZGUuYXBwZW5kQ2hpbGQoayk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYob2xkKSB7XHJcblx0XHRcdFx0bm9kZS5hcHBlbmRDaGlsZChvbGQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCFpc19jYWxsYmFjaykge1xyXG5cdFx0XHRcdC8vIGFwcGVuZCBiYWNrIHVzaW5nIHBhciAvIGluZFxyXG5cdFx0XHRcdGlmKCFwYXIpIHtcclxuXHRcdFx0XHRcdHBhciA9IHRoaXMuZWxlbWVudFswXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoIXBhci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnVUwnKS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGkgPSBkLmNyZWF0ZUVsZW1lbnQoJ1VMJyk7XHJcblx0XHRcdFx0XHRpLnNldEF0dHJpYnV0ZSgncm9sZScsICdncm91cCcpO1xyXG5cdFx0XHRcdFx0aS5jbGFzc05hbWUgPSAnanN0cmVlLWNoaWxkcmVuJztcclxuXHRcdFx0XHRcdHBhci5hcHBlbmRDaGlsZChpKTtcclxuXHRcdFx0XHRcdHBhciA9IGk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0cGFyID0gcGFyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdVTCcpWzBdO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYoaW5kIDwgcGFyLmNoaWxkTm9kZXMubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRwYXIuaW5zZXJ0QmVmb3JlKG5vZGUsIHBhci5jaGlsZE5vZGVzW2luZF0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdHBhci5hcHBlbmRDaGlsZChub2RlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoZikge1xyXG5cdFx0XHRcdFx0bm9kZS5jaGlsZE5vZGVzWzFdLmZvY3VzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBub2RlO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogb3BlbnMgYSBub2RlLCByZXZhbGluZyBpdHMgY2hpbGRyZW4uIElmIHRoZSBub2RlIGlzIG5vdCBsb2FkZWQgaXQgd2lsbCBiZSBsb2FkZWQgYW5kIG9wZW5lZCBvbmNlIHJlYWR5LlxyXG5cdFx0ICogQG5hbWUgb3Blbl9ub2RlKG9iaiBbLCBjYWxsYmFjaywgYW5pbWF0aW9uXSlcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBvcGVuXHJcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb25jZSB0aGUgbm9kZSBpcyBvcGVuZWRcclxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBhbmltYXRpb24gdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgd2hlbiBvcGVuaW5nIHRoZSBub2RlIChvdmVycmlkZXMgdGhlIGBjb3JlLmFuaW1hdGlvbmAgc2V0dGluZykuIFVzZSBgZmFsc2VgIGZvciBubyBhbmltYXRpb24uXHJcblx0XHQgKiBAdHJpZ2dlciBvcGVuX25vZGUuanN0cmVlLCBhZnRlcl9vcGVuLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRvcGVuX25vZGUgOiBmdW5jdGlvbiAob2JqLCBjYWxsYmFjaywgYW5pbWF0aW9uKSB7XHJcblx0XHRcdHZhciB0MSwgdDIsIGQsIHQ7XHJcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XHJcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XHJcblx0XHRcdFx0Zm9yKHQxID0gMCwgdDIgPSBvYmoubGVuZ3RoOyB0MSA8IHQyOyB0MSsrKSB7XHJcblx0XHRcdFx0XHR0aGlzLm9wZW5fbm9kZShvYmpbdDFdLCBjYWxsYmFjaywgYW5pbWF0aW9uKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGFuaW1hdGlvbiA9IGFuaW1hdGlvbiA9PT0gdW5kZWZpbmVkID8gdGhpcy5zZXR0aW5ncy5jb3JlLmFuaW1hdGlvbiA6IGFuaW1hdGlvbjtcclxuXHRcdFx0aWYoIXRoaXMuaXNfY2xvc2VkKG9iaikpIHtcclxuXHRcdFx0XHRpZihjYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0Y2FsbGJhY2suY2FsbCh0aGlzLCBvYmosIGZhbHNlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCF0aGlzLmlzX2xvYWRlZChvYmopKSB7XHJcblx0XHRcdFx0aWYodGhpcy5pc19sb2FkaW5nKG9iaikpIHtcclxuXHRcdFx0XHRcdHJldHVybiBzZXRUaW1lb3V0KCQucHJveHkoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLm9wZW5fbm9kZShvYmosIGNhbGxiYWNrLCBhbmltYXRpb24pO1xyXG5cdFx0XHRcdFx0fSwgdGhpcyksIDUwMCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMubG9hZF9ub2RlKG9iaiwgZnVuY3Rpb24gKG8sIG9rKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gb2sgPyB0aGlzLm9wZW5fbm9kZShvLCBjYWxsYmFjaywgYW5pbWF0aW9uKSA6IChjYWxsYmFjayA/IGNhbGxiYWNrLmNhbGwodGhpcywgbywgZmFsc2UpIDogZmFsc2UpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdGQgPSB0aGlzLmdldF9ub2RlKG9iaiwgdHJ1ZSk7XHJcblx0XHRcdFx0dCA9IHRoaXM7XHJcblx0XHRcdFx0aWYoZC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGlmKG9iai5jaGlsZHJlbi5sZW5ndGggJiYgIXRoaXMuX2ZpcnN0Q2hpbGQoZC5jaGlsZHJlbigndWwnKVswXSkpIHtcclxuXHRcdFx0XHRcdFx0b2JqLnN0YXRlLm9wZW5lZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVkcmF3X25vZGUob2JqLCB0cnVlKTtcclxuXHRcdFx0XHRcdFx0ZCA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKCFhbmltYXRpb24pIHtcclxuXHRcdFx0XHRcdFx0ZFswXS5jbGFzc05hbWUgPSBkWzBdLmNsYXNzTmFtZS5yZXBsYWNlKCdqc3RyZWUtY2xvc2VkJywgJ2pzdHJlZS1vcGVuJyk7XHJcblx0XHRcdFx0XHRcdGRbMF0uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCB0cnVlKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRkXHJcblx0XHRcdFx0XHRcdFx0LmNoaWxkcmVuKFwidWxcIikuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKS5lbmQoKVxyXG5cdFx0XHRcdFx0XHRcdC5yZW1vdmVDbGFzcyhcImpzdHJlZS1jbG9zZWRcIikuYWRkQ2xhc3MoXCJqc3RyZWUtb3BlblwiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCB0cnVlKVxyXG5cdFx0XHRcdFx0XHRcdC5jaGlsZHJlbihcInVsXCIpLnN0b3AodHJ1ZSwgdHJ1ZSlcclxuXHRcdFx0XHRcdFx0XHRcdC5zbGlkZURvd24oYW5pbWF0aW9uLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHQudHJpZ2dlcihcImFmdGVyX29wZW5cIiwgeyBcIm5vZGVcIiA6IG9iaiB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRvYmouc3RhdGUub3BlbmVkID0gdHJ1ZTtcclxuXHRcdFx0XHRpZihjYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0Y2FsbGJhY2suY2FsbCh0aGlzLCBvYmosIHRydWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvKipcclxuXHRcdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgaXMgb3BlbmVkIChpZiB0aGVyZSBpcyBhbiBhbmltYXRpb24gaXQgd2lsbCBub3QgYmUgY29tcGxldGVkIHlldClcclxuXHRcdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0XHQgKiBAbmFtZSBvcGVuX25vZGUuanN0cmVlXHJcblx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgdGhlIG9wZW5lZCBub2RlXHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdvcGVuX25vZGUnLCB7IFwibm9kZVwiIDogb2JqIH0pO1xyXG5cdFx0XHRcdGlmKCFhbmltYXRpb24gfHwgIWQubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHQvKipcclxuXHRcdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgbm9kZSBpcyBvcGVuZWQgYW5kIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGVcclxuXHRcdFx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHRcdFx0ICogQG5hbWUgYWZ0ZXJfb3Blbi5qc3RyZWVcclxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIHRoZSBvcGVuZWQgbm9kZVxyXG5cdFx0XHRcdFx0ICovXHJcblx0XHRcdFx0XHR0aGlzLnRyaWdnZXIoXCJhZnRlcl9vcGVuXCIsIHsgXCJub2RlXCIgOiBvYmogfSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBvcGVucyBldmVyeSBwYXJlbnQgb2YgYSBub2RlIChub2RlIHNob3VsZCBiZSBsb2FkZWQpXHJcblx0XHQgKiBAbmFtZSBfb3Blbl90byhvYmopXHJcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogdGhlIG5vZGUgdG8gcmV2ZWFsXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRfb3Blbl90byA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhciBpLCBqLCBwID0gb2JqLnBhcmVudHM7XHJcblx0XHRcdGZvcihpID0gMCwgaiA9IHAubGVuZ3RoOyBpIDwgajsgaSs9MSkge1xyXG5cdFx0XHRcdGlmKGkgIT09ICcjJykge1xyXG5cdFx0XHRcdFx0dGhpcy5vcGVuX25vZGUocFtpXSwgZmFsc2UsIDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gJChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvYmouaWQpKTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGNsb3NlcyBhIG5vZGUsIGhpZGluZyBpdHMgY2hpbGRyZW5cclxuXHRcdCAqIEBuYW1lIGNsb3NlX25vZGUob2JqIFssIGFuaW1hdGlvbl0pXHJcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogdGhlIG5vZGUgdG8gY2xvc2VcclxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBhbmltYXRpb24gdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgd2hlbiBjbG9zaW5nIHRoZSBub2RlIChvdmVycmlkZXMgdGhlIGBjb3JlLmFuaW1hdGlvbmAgc2V0dGluZykuIFVzZSBgZmFsc2VgIGZvciBubyBhbmltYXRpb24uXHJcblx0XHQgKiBAdHJpZ2dlciBjbG9zZV9ub2RlLmpzdHJlZSwgYWZ0ZXJfY2xvc2UuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGNsb3NlX25vZGUgOiBmdW5jdGlvbiAob2JqLCBhbmltYXRpb24pIHtcclxuXHRcdFx0dmFyIHQxLCB0MiwgdCwgZDtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuY2xvc2Vfbm9kZShvYmpbdDFdLCBhbmltYXRpb24pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0YW5pbWF0aW9uID0gYW5pbWF0aW9uID09PSB1bmRlZmluZWQgPyB0aGlzLnNldHRpbmdzLmNvcmUuYW5pbWF0aW9uIDogYW5pbWF0aW9uO1xyXG5cdFx0XHR0ID0gdGhpcztcclxuXHRcdFx0ZCA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcclxuXHRcdFx0aWYoZC5sZW5ndGgpIHtcclxuXHRcdFx0XHRpZighYW5pbWF0aW9uKSB7XHJcblx0XHRcdFx0XHRkWzBdLmNsYXNzTmFtZSA9IGRbMF0uY2xhc3NOYW1lLnJlcGxhY2UoJ2pzdHJlZS1vcGVuJywgJ2pzdHJlZS1jbG9zZWQnKTtcclxuXHRcdFx0XHRcdGQuYXR0cihcImFyaWEtZXhwYW5kZWRcIiwgZmFsc2UpLmNoaWxkcmVuKCd1bCcpLnJlbW92ZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdGRcclxuXHRcdFx0XHRcdFx0LmNoaWxkcmVuKFwidWxcIikuYXR0cihcInN0eWxlXCIsXCJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnRcIikuZW5kKClcclxuXHRcdFx0XHRcdFx0LnJlbW92ZUNsYXNzKFwianN0cmVlLW9wZW5cIikuYWRkQ2xhc3MoXCJqc3RyZWUtY2xvc2VkXCIpLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsIGZhbHNlKVxyXG5cdFx0XHRcdFx0XHQuY2hpbGRyZW4oXCJ1bFwiKS5zdG9wKHRydWUsIHRydWUpLnNsaWRlVXAoYW5pbWF0aW9uLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRkLmNoaWxkcmVuKCd1bCcpLnJlbW92ZSgpO1xyXG5cdFx0XHRcdFx0XHRcdHQudHJpZ2dlcihcImFmdGVyX2Nsb3NlXCIsIHsgXCJub2RlXCIgOiBvYmogfSk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRvYmouc3RhdGUub3BlbmVkID0gZmFsc2U7XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgaXMgY2xvc2VkIChpZiB0aGVyZSBpcyBhbiBhbmltYXRpb24gaXQgd2lsbCBub3QgYmUgY29tcGxldGUgeWV0KVxyXG5cdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0ICogQG5hbWUgY2xvc2Vfbm9kZS5qc3RyZWVcclxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgdGhlIGNsb3NlZCBub2RlXHJcblx0XHRcdCAqL1xyXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2Nsb3NlX25vZGUnLHsgXCJub2RlXCIgOiBvYmogfSk7XHJcblx0XHRcdGlmKCFhbmltYXRpb24gfHwgIWQubGVuZ3RoKSB7XHJcblx0XHRcdFx0LyoqXHJcblx0XHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYSBub2RlIGlzIGNsb3NlZCBhbmQgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxyXG5cdFx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHRcdCAqIEBuYW1lIGFmdGVyX2Nsb3NlLmpzdHJlZVxyXG5cdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIHRoZSBjbG9zZWQgbm9kZVxyXG5cdFx0XHRcdCAqL1xyXG5cdFx0XHRcdHRoaXMudHJpZ2dlcihcImFmdGVyX2Nsb3NlXCIsIHsgXCJub2RlXCIgOiBvYmogfSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHRvZ2dsZXMgYSBub2RlIC0gY2xvc2luZyBpdCBpZiBpdCBpcyBvcGVuLCBvcGVuaW5nIGl0IGlmIGl0IGlzIGNsb3NlZFxyXG5cdFx0ICogQG5hbWUgdG9nZ2xlX25vZGUob2JqKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIHRvZ2dsZVxyXG5cdFx0ICovXHJcblx0XHR0b2dnbGVfbm9kZSA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0dmFyIHQxLCB0MjtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlX25vZGUob2JqW3QxXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHRoaXMuaXNfY2xvc2VkKG9iaikpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5vcGVuX25vZGUob2JqKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZih0aGlzLmlzX29wZW4ob2JqKSkge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNsb3NlX25vZGUob2JqKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogb3BlbnMgYWxsIG5vZGVzIHdpdGhpbiBhIG5vZGUgKG9yIHRoZSB0cmVlKSwgcmV2YWxpbmcgdGhlaXIgY2hpbGRyZW4uIElmIHRoZSBub2RlIGlzIG5vdCBsb2FkZWQgaXQgd2lsbCBiZSBsb2FkZWQgYW5kIG9wZW5lZCBvbmNlIHJlYWR5LlxyXG5cdFx0ICogQG5hbWUgb3Blbl9hbGwoW29iaiwgYW5pbWF0aW9uLCBvcmlnaW5hbF9vYmpdKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIG9wZW4gcmVjdXJzaXZlbHksIG9taXQgdG8gb3BlbiBhbGwgbm9kZXMgaW4gdGhlIHRyZWVcclxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBhbmltYXRpb24gdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgd2hlbiBvcGVuaW5nIHRoZSBub2RlcywgdGhlIGRlZmF1bHQgaXMgbm8gYW5pbWF0aW9uXHJcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gcmVmZXJlbmNlIHRvIHRoZSBub2RlIHRoYXQgc3RhcnRlZCB0aGUgcHJvY2VzcyAoaW50ZXJuYWwgdXNlKVxyXG5cdFx0ICogQHRyaWdnZXIgb3Blbl9hbGwuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdG9wZW5fYWxsIDogZnVuY3Rpb24gKG9iaiwgYW5pbWF0aW9uLCBvcmlnaW5hbF9vYmopIHtcclxuXHRcdFx0aWYoIW9iaikgeyBvYmogPSAnIyc7IH1cclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHR2YXIgZG9tID0gb2JqLmlkID09PSAnIycgPyB0aGlzLmdldF9jb250YWluZXJfdWwoKSA6IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKSwgaSwgaiwgX3RoaXM7XHJcblx0XHRcdGlmKCFkb20ubGVuZ3RoKSB7XHJcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLmNoaWxkcmVuX2QubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRpZih0aGlzLmlzX2Nsb3NlZCh0aGlzLl9tb2RlbC5kYXRhW29iai5jaGlsZHJlbl9kW2ldXSkpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fbW9kZWwuZGF0YVtvYmouY2hpbGRyZW5fZFtpXV0uc3RhdGUub3BlbmVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMudHJpZ2dlcignb3Blbl9hbGwnLCB7IFwibm9kZVwiIDogb2JqIH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdG9yaWdpbmFsX29iaiA9IG9yaWdpbmFsX29iaiB8fCBkb207XHJcblx0XHRcdF90aGlzID0gdGhpcztcclxuXHRcdFx0ZG9tID0gdGhpcy5pc19jbG9zZWQob2JqKSA/IGRvbS5maW5kKCdsaS5qc3RyZWUtY2xvc2VkJykuYWRkQmFjaygpIDogZG9tLmZpbmQoJ2xpLmpzdHJlZS1jbG9zZWQnKTtcclxuXHRcdFx0ZG9tLmVhY2goZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdF90aGlzLm9wZW5fbm9kZShcclxuXHRcdFx0XHRcdHRoaXMsXHJcblx0XHRcdFx0XHRmdW5jdGlvbihub2RlLCBzdGF0dXMpIHsgaWYoc3RhdHVzICYmIHRoaXMuaXNfcGFyZW50KG5vZGUpKSB7IHRoaXMub3Blbl9hbGwobm9kZSwgYW5pbWF0aW9uLCBvcmlnaW5hbF9vYmopOyB9IH0sXHJcblx0XHRcdFx0XHRhbmltYXRpb24gfHwgMFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRpZihvcmlnaW5hbF9vYmouZmluZCgnbGkuanN0cmVlLWNsb3NlZCcpLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdC8qKlxyXG5cdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGFuIGBvcGVuX2FsbGAgY2FsbCBjb21wbGV0ZXNcclxuXHRcdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0XHQgKiBAbmFtZSBvcGVuX2FsbC5qc3RyZWVcclxuXHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgb3BlbmVkIG5vZGVcclxuXHRcdFx0XHQgKi9cclxuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ29wZW5fYWxsJywgeyBcIm5vZGVcIiA6IHRoaXMuZ2V0X25vZGUob3JpZ2luYWxfb2JqKSB9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogY2xvc2VzIGFsbCBub2RlcyB3aXRoaW4gYSBub2RlIChvciB0aGUgdHJlZSksIHJldmFsaW5nIHRoZWlyIGNoaWxkcmVuXHJcblx0XHQgKiBAbmFtZSBjbG9zZV9hbGwoW29iaiwgYW5pbWF0aW9uXSlcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBjbG9zZSByZWN1cnNpdmVseSwgb21pdCB0byBjbG9zZSBhbGwgbm9kZXMgaW4gdGhlIHRyZWVcclxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBhbmltYXRpb24gdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgd2hlbiBjbG9zaW5nIHRoZSBub2RlcywgdGhlIGRlZmF1bHQgaXMgbm8gYW5pbWF0aW9uXHJcblx0XHQgKiBAdHJpZ2dlciBjbG9zZV9hbGwuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGNsb3NlX2FsbCA6IGZ1bmN0aW9uIChvYmosIGFuaW1hdGlvbikge1xyXG5cdFx0XHRpZighb2JqKSB7IG9iaiA9ICcjJzsgfVxyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdHZhciBkb20gPSBvYmouaWQgPT09ICcjJyA/IHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpIDogdGhpcy5nZXRfbm9kZShvYmosIHRydWUpLFxyXG5cdFx0XHRcdF90aGlzID0gdGhpcywgaSwgajtcclxuXHRcdFx0aWYoIWRvbS5sZW5ndGgpIHtcclxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbb2JqLmNoaWxkcmVuX2RbaV1dLnN0YXRlLm9wZW5lZCA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdGhpcy50cmlnZ2VyKCdjbG9zZV9hbGwnLCB7IFwibm9kZVwiIDogb2JqIH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGRvbSA9IHRoaXMuaXNfb3BlbihvYmopID8gZG9tLmZpbmQoJ2xpLmpzdHJlZS1vcGVuJykuYWRkQmFjaygpIDogZG9tLmZpbmQoJ2xpLmpzdHJlZS1vcGVuJyk7XHJcblx0XHRcdGRvbS52YWthdGFfcmV2ZXJzZSgpLmVhY2goZnVuY3Rpb24gKCkgeyBfdGhpcy5jbG9zZV9ub2RlKHRoaXMsIGFuaW1hdGlvbiB8fCAwKTsgfSk7XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhbiBgY2xvc2VfYWxsYCBjYWxsIGNvbXBsZXRlc1xyXG5cdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0ICogQG5hbWUgY2xvc2VfYWxsLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgY2xvc2VkIG5vZGVcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignY2xvc2VfYWxsJywgeyBcIm5vZGVcIiA6IG9iaiB9KTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGNoZWNrcyBpZiBhIG5vZGUgaXMgZGlzYWJsZWQgKG5vdCBzZWxlY3RhYmxlKVxyXG5cdFx0ICogQG5hbWUgaXNfZGlzYWJsZWQob2JqKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9ialxyXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0aXNfZGlzYWJsZWQgOiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcclxuXHRcdFx0cmV0dXJuIG9iaiAmJiBvYmouc3RhdGUgJiYgb2JqLnN0YXRlLmRpc2FibGVkO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZW5hYmxlcyBhIG5vZGUgLSBzbyB0aGF0IGl0IGNhbiBiZSBzZWxlY3RlZFxyXG5cdFx0ICogQG5hbWUgZW5hYmxlX25vZGUob2JqKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIGVuYWJsZVxyXG5cdFx0ICogQHRyaWdnZXIgZW5hYmxlX25vZGUuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGVuYWJsZV9ub2RlIDogZnVuY3Rpb24gKG9iaikge1xyXG5cdFx0XHR2YXIgdDEsIHQyO1xyXG5cdFx0XHRpZigkLmlzQXJyYXkob2JqKSkge1xyXG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xyXG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xyXG5cdFx0XHRcdFx0dGhpcy5lbmFibGVfbm9kZShvYmpbdDFdKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdG9iai5zdGF0ZS5kaXNhYmxlZCA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLmdldF9ub2RlKG9iaix0cnVlKS5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5yZW1vdmVDbGFzcygnanN0cmVlLWRpc2FibGVkJyk7XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhbiBub2RlIGlzIGVuYWJsZWRcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIGVuYWJsZV9ub2RlLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgZW5hYmxlZCBub2RlXHJcblx0XHRcdCAqL1xyXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2VuYWJsZV9ub2RlJywgeyAnbm9kZScgOiBvYmogfSk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBkaXNhYmxlcyBhIG5vZGUgLSBzbyB0aGF0IGl0IGNhbiBub3QgYmUgc2VsZWN0ZWRcclxuXHRcdCAqIEBuYW1lIGRpc2FibGVfbm9kZShvYmopXHJcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogdGhlIG5vZGUgdG8gZGlzYWJsZVxyXG5cdFx0ICogQHRyaWdnZXIgZGlzYWJsZV9ub2RlLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRkaXNhYmxlX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdHZhciB0MSwgdDI7XHJcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XHJcblx0XHRcdFx0b2JqID0gb2JqLnNsaWNlKCk7XHJcblx0XHRcdFx0Zm9yKHQxID0gMCwgdDIgPSBvYmoubGVuZ3RoOyB0MSA8IHQyOyB0MSsrKSB7XHJcblx0XHRcdFx0XHR0aGlzLmRpc2FibGVfbm9kZShvYmpbdDFdKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdG9iai5zdGF0ZS5kaXNhYmxlZCA9IHRydWU7XHJcblx0XHRcdHRoaXMuZ2V0X25vZGUob2JqLHRydWUpLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmFkZENsYXNzKCdqc3RyZWUtZGlzYWJsZWQnKTtcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGFuIG5vZGUgaXMgZGlzYWJsZWRcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIGRpc2FibGVfbm9kZS5qc3RyZWVcclxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgdGhlIGRpc2FibGVkIG5vZGVcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignZGlzYWJsZV9ub2RlJywgeyAnbm9kZScgOiBvYmogfSk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBhY3RpdmF0ZV9ub2RlKG9iaiwgZSlcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiB0aGUgbm9kZVxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGUgdGhlIHJlbGF0ZWQgZXZlbnRcclxuXHRcdCAqIEB0cmlnZ2VyIGFjdGl2YXRlX25vZGUuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGFjdGl2YXRlX25vZGUgOiBmdW5jdGlvbiAob2JqLCBlKSB7XHJcblx0XHRcdGlmKHRoaXMuaXNfZGlzYWJsZWQob2JqKSkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZighdGhpcy5zZXR0aW5ncy5jb3JlLm11bHRpcGxlIHx8ICghZS5tZXRhS2V5ICYmICFlLmN0cmxLZXkgJiYgIWUuc2hpZnRLZXkpIHx8IChlLnNoaWZ0S2V5ICYmICghdGhpcy5fZGF0YS5jb3JlLmxhc3RfY2xpY2tlZCB8fCAhdGhpcy5nZXRfcGFyZW50KG9iaikgfHwgdGhpcy5nZXRfcGFyZW50KG9iaikgIT09IHRoaXMuX2RhdGEuY29yZS5sYXN0X2NsaWNrZWQucGFyZW50ICkgKSkge1xyXG5cdFx0XHRcdGlmKCF0aGlzLnNldHRpbmdzLmNvcmUubXVsdGlwbGUgJiYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSkgJiYgdGhpcy5pc19zZWxlY3RlZChvYmopKSB7XHJcblx0XHRcdFx0XHR0aGlzLmRlc2VsZWN0X25vZGUob2JqLCBmYWxzZSwgZmFsc2UsIGUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMuZGVzZWxlY3RfYWxsKHRydWUpO1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3Rfbm9kZShvYmosIGZhbHNlLCBmYWxzZSwgZSk7XHJcblx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubGFzdF9jbGlja2VkID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRpZihlLnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0XHR2YXIgbyA9IHRoaXMuZ2V0X25vZGUob2JqKS5pZCxcclxuXHRcdFx0XHRcdFx0bCA9IHRoaXMuX2RhdGEuY29yZS5sYXN0X2NsaWNrZWQuaWQsXHJcblx0XHRcdFx0XHRcdHAgPSB0aGlzLmdldF9ub2RlKHRoaXMuX2RhdGEuY29yZS5sYXN0X2NsaWNrZWQucGFyZW50KS5jaGlsZHJlbixcclxuXHRcdFx0XHRcdFx0YyA9IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRpLCBqO1xyXG5cdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gcC5sZW5ndGg7IGkgPCBqOyBpICs9IDEpIHtcclxuXHRcdFx0XHRcdFx0Ly8gc2VwYXJhdGUgSUZzIHdvcmsgd2hlbSBvIGFuZCBsIGFyZSB0aGUgc2FtZVxyXG5cdFx0XHRcdFx0XHRpZihwW2ldID09PSBvKSB7XHJcblx0XHRcdFx0XHRcdFx0YyA9ICFjO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmKHBbaV0gPT09IGwpIHtcclxuXHRcdFx0XHRcdFx0XHRjID0gIWM7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYoYyB8fCBwW2ldID09PSBvIHx8IHBbaV0gPT09IGwpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbGVjdF9ub2RlKHBbaV0sIGZhbHNlLCBmYWxzZSwgZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZXNlbGVjdF9ub2RlKHBbaV0sIGZhbHNlLCBmYWxzZSwgZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRpZighdGhpcy5pc19zZWxlY3RlZChvYmopKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0X25vZGUob2JqLCBmYWxzZSwgZmFsc2UsIGUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZGVzZWxlY3Rfbm9kZShvYmosIGZhbHNlLCBmYWxzZSwgZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhbiBub2RlIGlzIGNsaWNrZWQgb3IgaW50ZXJjYXRlZCB3aXRoIGJ5IHRoZSB1c2VyXHJcblx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHQgKiBAbmFtZSBhY3RpdmF0ZV9ub2RlLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdhY3RpdmF0ZV9ub2RlJywgeyAnbm9kZScgOiB0aGlzLmdldF9ub2RlKG9iaikgfSk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBhcHBsaWVzIHRoZSBob3ZlciBzdGF0ZSBvbiBhIG5vZGUsIGNhbGxlZCB3aGVuIGEgbm9kZSBpcyBob3ZlcmVkIGJ5IHRoZSB1c2VyLiBVc2VkIGludGVybmFsbHkuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQG5hbWUgaG92ZXJfbm9kZShvYmopXHJcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmpcclxuXHRcdCAqIEB0cmlnZ2VyIGhvdmVyX25vZGUuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGhvdmVyX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcclxuXHRcdFx0aWYoIW9iaiB8fCAhb2JqLmxlbmd0aCB8fCBvYmouY2hpbGRyZW4oJy5qc3RyZWUtaG92ZXJlZCcpLmxlbmd0aCkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHR2YXIgbyA9IHRoaXMuZWxlbWVudC5maW5kKCcuanN0cmVlLWhvdmVyZWQnKSwgdCA9IHRoaXMuZWxlbWVudDtcclxuXHRcdFx0aWYobyAmJiBvLmxlbmd0aCkgeyB0aGlzLmRlaG92ZXJfbm9kZShvKTsgfVxyXG5cclxuXHRcdFx0b2JqLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmFkZENsYXNzKCdqc3RyZWUtaG92ZXJlZCcpO1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYW4gbm9kZSBpcyBob3ZlcmVkXHJcblx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHQgKiBAbmFtZSBob3Zlcl9ub2RlLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdob3Zlcl9ub2RlJywgeyAnbm9kZScgOiB0aGlzLmdldF9ub2RlKG9iaikgfSk7XHJcblx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0LmF0dHIoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsIG9ialswXS5pZCk7IG9iai5hdHRyKCdhcmlhLXNlbGVjdGVkJywgdHJ1ZSk7IH0sIDApO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogcmVtb3ZlcyB0aGUgaG92ZXIgc3RhdGUgZnJvbSBhIG5vZGVjYWxsZWQgd2hlbiBhIG5vZGUgaXMgbm8gbG9uZ2VyIGhvdmVyZWQgYnkgdGhlIHVzZXIuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBkZWhvdmVyX25vZGUob2JqKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqXHJcblx0XHQgKiBAdHJpZ2dlciBkZWhvdmVyX25vZGUuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGRlaG92ZXJfbm9kZSA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpO1xyXG5cdFx0XHRpZighb2JqIHx8ICFvYmoubGVuZ3RoIHx8ICFvYmouY2hpbGRyZW4oJy5qc3RyZWUtaG92ZXJlZCcpLmxlbmd0aCkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRvYmouYXR0cignYXJpYS1zZWxlY3RlZCcsIGZhbHNlKS5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5yZW1vdmVDbGFzcygnanN0cmVlLWhvdmVyZWQnKTtcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGFuIG5vZGUgaXMgbm8gbG9uZ2VyIGhvdmVyZWRcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIGRlaG92ZXJfbm9kZS5qc3RyZWVcclxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignZGVob3Zlcl9ub2RlJywgeyAnbm9kZScgOiB0aGlzLmdldF9ub2RlKG9iaikgfSk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBzZWxlY3QgYSBub2RlXHJcblx0XHQgKiBAbmFtZSBzZWxlY3Rfbm9kZShvYmogWywgc3VwcmVzc19ldmVudCwgcHJldmVudF9vcGVuXSlcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiBhbiBhcnJheSBjYW4gYmUgdXNlZCB0byBzZWxlY3QgbXVsdGlwbGUgbm9kZXNcclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VwcmVzc19ldmVudCBpZiBzZXQgdG8gYHRydWVgIHRoZSBgY2hhbmdlZC5qc3RyZWVgIGV2ZW50IHdvbid0IGJlIHRyaWdnZXJlZFxyXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBwcmV2ZW50X29wZW4gaWYgc2V0IHRvIGB0cnVlYCBwYXJlbnRzIG9mIHRoZSBzZWxlY3RlZCBub2RlIHdvbid0IGJlIG9wZW5lZFxyXG5cdFx0ICogQHRyaWdnZXIgc2VsZWN0X25vZGUuanN0cmVlLCBjaGFuZ2VkLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRzZWxlY3Rfbm9kZSA6IGZ1bmN0aW9uIChvYmosIHN1cHJlc3NfZXZlbnQsIHByZXZlbnRfb3BlbiwgZSkge1xyXG5cdFx0XHR2YXIgZG9tLCB0MSwgdDIsIHRoO1xyXG5cdFx0XHRpZigkLmlzQXJyYXkob2JqKSkge1xyXG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xyXG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3Rfbm9kZShvYmpbdDFdLCBzdXByZXNzX2V2ZW50LCBwcmV2ZW50X29wZW4sIGUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0ZG9tID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpO1xyXG5cdFx0XHRpZighb2JqLnN0YXRlLnNlbGVjdGVkKSB7XHJcblx0XHRcdFx0b2JqLnN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQucHVzaChvYmouaWQpO1xyXG5cdFx0XHRcdGlmKCFwcmV2ZW50X29wZW4pIHtcclxuXHRcdFx0XHRcdGRvbSA9IHRoaXMuX29wZW5fdG8ob2JqKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoZG9tICYmIGRvbS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGRvbS5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5hZGRDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0LyoqXHJcblx0XHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYW4gbm9kZSBpcyBzZWxlY3RlZFxyXG5cdFx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHRcdCAqIEBuYW1lIHNlbGVjdF9ub2RlLmpzdHJlZVxyXG5cdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBub2RlXHJcblx0XHRcdFx0ICogQHBhcmFtIHtBcnJheX0gc2VsZWN0ZWQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcblx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IHRoZSBldmVudCAoaWYgYW55KSB0aGF0IHRyaWdnZXJlZCB0aGlzIHNlbGVjdF9ub2RlXHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdzZWxlY3Rfbm9kZScsIHsgJ25vZGUnIDogb2JqLCAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCAnZXZlbnQnIDogZSB9KTtcclxuXHRcdFx0XHRpZighc3VwcmVzc19ldmVudCkge1xyXG5cdFx0XHRcdFx0LyoqXHJcblx0XHRcdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlc1xyXG5cdFx0XHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdFx0XHQgKiBAbmFtZSBjaGFuZ2VkLmpzdHJlZVxyXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcclxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gdGhlIGFjdGlvbiB0aGF0IGNhdXNlZCB0aGUgc2VsZWN0aW9uIHRvIGNoYW5nZVxyXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtBcnJheX0gc2VsZWN0ZWQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcblx0XHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgdGhlIGV2ZW50IChpZiBhbnkpIHRoYXQgdHJpZ2dlcmVkIHRoaXMgY2hhbmdlZCBldmVudFxyXG5cdFx0XHRcdFx0ICovXHJcblx0XHRcdFx0XHR0aGlzLnRyaWdnZXIoJ2NoYW5nZWQnLCB7ICdhY3Rpb24nIDogJ3NlbGVjdF9ub2RlJywgJ25vZGUnIDogb2JqLCAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCAnZXZlbnQnIDogZSB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGRlc2VsZWN0IGEgbm9kZVxyXG5cdFx0ICogQG5hbWUgZGVzZWxlY3Rfbm9kZShvYmogWywgc3VwcmVzc19ldmVudF0pXHJcblx0XHQgKiBAcGFyYW0ge21peGVkfSBvYmogYW4gYXJyYXkgY2FuIGJlIHVzZWQgdG8gZGVzZWxlY3QgbXVsdGlwbGUgbm9kZXNcclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VwcmVzc19ldmVudCBpZiBzZXQgdG8gYHRydWVgIHRoZSBgY2hhbmdlZC5qc3RyZWVgIGV2ZW50IHdvbid0IGJlIHRyaWdnZXJlZFxyXG5cdFx0ICogQHRyaWdnZXIgZGVzZWxlY3Rfbm9kZS5qc3RyZWUsIGNoYW5nZWQuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGRlc2VsZWN0X25vZGUgOiBmdW5jdGlvbiAob2JqLCBzdXByZXNzX2V2ZW50LCBlKSB7XHJcblx0XHRcdHZhciB0MSwgdDIsIGRvbTtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuZGVzZWxlY3Rfbm9kZShvYmpbdDFdLCBzdXByZXNzX2V2ZW50LCBlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGRvbSA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcclxuXHRcdFx0aWYob2JqLnN0YXRlLnNlbGVjdGVkKSB7XHJcblx0XHRcdFx0b2JqLnN0YXRlLnNlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkID0gJC52YWthdGEuYXJyYXlfcmVtb3ZlX2l0ZW0odGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCBvYmouaWQpO1xyXG5cdFx0XHRcdGlmKGRvbS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGRvbS5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5yZW1vdmVDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0LyoqXHJcblx0XHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYW4gbm9kZSBpcyBkZXNlbGVjdGVkXHJcblx0XHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdFx0ICogQG5hbWUgZGVzZWxlY3Rfbm9kZS5qc3RyZWVcclxuXHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxyXG5cdFx0XHRcdCAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdGVkIHRoZSBjdXJyZW50IHNlbGVjdGlvblxyXG5cdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCB0aGUgZXZlbnQgKGlmIGFueSkgdGhhdCB0cmlnZ2VyZWQgdGhpcyBkZXNlbGVjdF9ub2RlXHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdkZXNlbGVjdF9ub2RlJywgeyAnbm9kZScgOiBvYmosICdzZWxlY3RlZCcgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsICdldmVudCcgOiBlIH0pO1xyXG5cdFx0XHRcdGlmKCFzdXByZXNzX2V2ZW50KSB7XHJcblx0XHRcdFx0XHR0aGlzLnRyaWdnZXIoJ2NoYW5nZWQnLCB7ICdhY3Rpb24nIDogJ2Rlc2VsZWN0X25vZGUnLCAnbm9kZScgOiBvYmosICdzZWxlY3RlZCcgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsICdldmVudCcgOiBlIH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogc2VsZWN0IGFsbCBub2RlcyBpbiB0aGUgdHJlZVxyXG5cdFx0ICogQG5hbWUgc2VsZWN0X2FsbChbc3VwcmVzc19ldmVudF0pXHJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IHN1cHJlc3NfZXZlbnQgaWYgc2V0IHRvIGB0cnVlYCB0aGUgYGNoYW5nZWQuanN0cmVlYCBldmVudCB3b24ndCBiZSB0cmlnZ2VyZWRcclxuXHRcdCAqIEB0cmlnZ2VyIHNlbGVjdF9hbGwuanN0cmVlLCBjaGFuZ2VkLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRzZWxlY3RfYWxsIDogZnVuY3Rpb24gKHN1cHJlc3NfZXZlbnQpIHtcclxuXHRcdFx0dmFyIHRtcCA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5jb25jYXQoW10pLCBpLCBqO1xyXG5cdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSB0aGlzLl9tb2RlbC5kYXRhWycjJ10uY2hpbGRyZW5fZC5jb25jYXQoKTtcclxuXHRcdFx0Zm9yKGkgPSAwLCBqID0gdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdGlmKHRoaXMuX21vZGVsLmRhdGFbdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldXSkge1xyXG5cdFx0XHRcdFx0dGhpcy5fbW9kZWwuZGF0YVt0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWRbaV1dLnN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5yZWRyYXcodHJ1ZSk7XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhbGwgbm9kZXMgYXJlIHNlbGVjdGVkXHJcblx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHQgKiBAbmFtZSBzZWxlY3RfYWxsLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge0FycmF5fSBzZWxlY3RlZCB0aGUgY3VycmVudCBzZWxlY3Rpb25cclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignc2VsZWN0X2FsbCcsIHsgJ3NlbGVjdGVkJyA6IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCB9KTtcclxuXHRcdFx0aWYoIXN1cHJlc3NfZXZlbnQpIHtcclxuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ2NoYW5nZWQnLCB7ICdhY3Rpb24nIDogJ3NlbGVjdF9hbGwnLCAnc2VsZWN0ZWQnIDogdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCAnb2xkX3NlbGVjdGlvbicgOiB0bXAgfSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGRlc2VsZWN0IGFsbCBzZWxlY3RlZCBub2Rlc1xyXG5cdFx0ICogQG5hbWUgZGVzZWxlY3RfYWxsKFtzdXByZXNzX2V2ZW50XSlcclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VwcmVzc19ldmVudCBpZiBzZXQgdG8gYHRydWVgIHRoZSBgY2hhbmdlZC5qc3RyZWVgIGV2ZW50IHdvbid0IGJlIHRyaWdnZXJlZFxyXG5cdFx0ICogQHRyaWdnZXIgZGVzZWxlY3RfYWxsLmpzdHJlZSwgY2hhbmdlZC5qc3RyZWVcclxuXHRcdCAqL1xyXG5cdFx0ZGVzZWxlY3RfYWxsIDogZnVuY3Rpb24gKHN1cHJlc3NfZXZlbnQpIHtcclxuXHRcdFx0dmFyIHRtcCA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5jb25jYXQoW10pLCBpLCBqO1xyXG5cdFx0XHRmb3IoaSA9IDAsIGogPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0aWYodGhpcy5fbW9kZWwuZGF0YVt0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWRbaV1dKSB7XHJcblx0XHRcdFx0XHR0aGlzLl9tb2RlbC5kYXRhW3RoaXMuX2RhdGEuY29yZS5zZWxlY3RlZFtpXV0uc3RhdGUuc2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkID0gW107XHJcblx0XHRcdHRoaXMuZWxlbWVudC5maW5kKCcuanN0cmVlLWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGFsbCBub2RlcyBhcmUgZGVzZWxlY3RlZFxyXG5cdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0ICogQG5hbWUgZGVzZWxlY3RfYWxsLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uXHJcblx0XHRcdCAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdGVkIHRoZSBjdXJyZW50IHNlbGVjdGlvblxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdkZXNlbGVjdF9hbGwnLCB7ICdzZWxlY3RlZCcgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsICdub2RlJyA6IHRtcCB9KTtcclxuXHRcdFx0aWYoIXN1cHJlc3NfZXZlbnQpIHtcclxuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ2NoYW5nZWQnLCB7ICdhY3Rpb24nIDogJ2Rlc2VsZWN0X2FsbCcsICdzZWxlY3RlZCcgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsICdvbGRfc2VsZWN0aW9uJyA6IHRtcCB9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogY2hlY2tzIGlmIGEgbm9kZSBpcyBzZWxlY3RlZFxyXG5cdFx0ICogQG5hbWUgaXNfc2VsZWN0ZWQob2JqKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9ICBvYmpcclxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdGlzX3NlbGVjdGVkIDogZnVuY3Rpb24gKG9iaikge1xyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG9iai5zdGF0ZS5zZWxlY3RlZDtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGdldCBhbiBhcnJheSBvZiBhbGwgc2VsZWN0ZWQgbm9kZSBJRHNcclxuXHRcdCAqIEBuYW1lIGdldF9zZWxlY3RlZChbZnVsbF0pXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gIGZ1bGwgaWYgc2V0IHRvIGB0cnVlYCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb25zaXN0IG9mIHRoZSBmdWxsIG5vZGUgb2JqZWN0cywgb3RoZXJ3aXNlIC0gb25seSBJRHMgd2lsbCBiZSByZXR1cm5lZFxyXG5cdFx0ICogQHJldHVybiB7QXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdGdldF9zZWxlY3RlZCA6IGZ1bmN0aW9uIChmdWxsKSB7XHJcblx0XHRcdHJldHVybiBmdWxsID8gJC5tYXAodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLCAkLnByb3h5KGZ1bmN0aW9uIChpKSB7IHJldHVybiB0aGlzLmdldF9ub2RlKGkpOyB9LCB0aGlzKSkgOiB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQ7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBnZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB0cmVlIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyIHdpdGggYHNldF9zdGF0ZShzdGF0ZSlgLiBVc2VkIGludGVybmFsbHkuXHJcblx0XHQgKiBAbmFtZSBnZXRfc3RhdGUoKVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0Z2V0X3N0YXRlIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHR2YXIgc3RhdGVcdD0ge1xyXG5cdFx0XHRcdCdjb3JlJyA6IHtcclxuXHRcdFx0XHRcdCdvcGVuJyA6IFtdLFxyXG5cdFx0XHRcdFx0J3Njcm9sbCcgOiB7XHJcblx0XHRcdFx0XHRcdCdsZWZ0JyA6IHRoaXMuZWxlbWVudC5zY3JvbGxMZWZ0KCksXHJcblx0XHRcdFx0XHRcdCd0b3AnIDogdGhpcy5lbGVtZW50LnNjcm9sbFRvcCgpXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0LyohXHJcblx0XHRcdFx0XHQndGhlbWVzJyA6IHtcclxuXHRcdFx0XHRcdFx0J25hbWUnIDogdGhpcy5nZXRfdGhlbWUoKSxcclxuXHRcdFx0XHRcdFx0J2ljb25zJyA6IHRoaXMuX2RhdGEuY29yZS50aGVtZXMuaWNvbnMsXHJcblx0XHRcdFx0XHRcdCdkb3RzJyA6IHRoaXMuX2RhdGEuY29yZS50aGVtZXMuZG90c1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdCovXHJcblx0XHRcdFx0XHQnc2VsZWN0ZWQnIDogW11cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIGk7XHJcblx0XHRcdGZvcihpIGluIHRoaXMuX21vZGVsLmRhdGEpIHtcclxuXHRcdFx0XHRpZih0aGlzLl9tb2RlbC5kYXRhLmhhc093blByb3BlcnR5KGkpKSB7XHJcblx0XHRcdFx0XHRpZihpICE9PSAnIycpIHtcclxuXHRcdFx0XHRcdFx0aWYodGhpcy5fbW9kZWwuZGF0YVtpXS5zdGF0ZS5vcGVuZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5jb3JlLm9wZW4ucHVzaChpKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZih0aGlzLl9tb2RlbC5kYXRhW2ldLnN0YXRlLnNlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHRcdFx0c3RhdGUuY29yZS5zZWxlY3RlZC5wdXNoKGkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBzdGF0ZTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHNldHMgdGhlIHN0YXRlIG9mIHRoZSB0cmVlLiBVc2VkIGludGVybmFsbHkuXHJcblx0XHQgKiBAbmFtZSBzZXRfc3RhdGUoc3RhdGUgWywgY2FsbGJhY2tdKVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSB0aGUgc3RhdGUgdG8gcmVzdG9yZVxyXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbmNlIHRoZSBzdGF0ZSBpcyByZXN0b3JlZC5cclxuXHRcdCAqIEB0cmlnZ2VyIHNldF9zdGF0ZS5qc3RyZWVcclxuXHRcdCAqL1xyXG5cdFx0c2V0X3N0YXRlIDogZnVuY3Rpb24gKHN0YXRlLCBjYWxsYmFjaykge1xyXG5cdFx0XHRpZihzdGF0ZSkge1xyXG5cdFx0XHRcdGlmKHN0YXRlLmNvcmUpIHtcclxuXHRcdFx0XHRcdHZhciByZXMsIG4sIHQsIF90aGlzO1xyXG5cdFx0XHRcdFx0aWYoc3RhdGUuY29yZS5vcGVuKSB7XHJcblx0XHRcdFx0XHRcdGlmKCEkLmlzQXJyYXkoc3RhdGUuY29yZS5vcGVuKSkge1xyXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBzdGF0ZS5jb3JlLm9wZW47XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zZXRfc3RhdGUoc3RhdGUsIGNhbGxiYWNrKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmVzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0biA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR0ID0gdGhpcztcclxuXHRcdFx0XHRcdFx0JC5lYWNoKHN0YXRlLmNvcmUub3Blbi5jb25jYXQoW10pLCBmdW5jdGlvbiAoaSwgdikge1xyXG5cdFx0XHRcdFx0XHRcdG4gPSB0LmdldF9ub2RlKHYpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKG4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmKHQuaXNfbG9hZGVkKHYpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmKHQuaXNfY2xvc2VkKHYpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dC5vcGVuX25vZGUodiwgZmFsc2UsIDApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmKHN0YXRlICYmIHN0YXRlLmNvcmUgJiYgc3RhdGUuY29yZS5vcGVuKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JC52YWthdGEuYXJyYXlfcmVtb3ZlX2l0ZW0oc3RhdGUuY29yZS5vcGVuLCB2KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmKCF0LmlzX2xvYWRpbmcodikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0Lm9wZW5fbm9kZSh2LCAkLnByb3h5KGZ1bmN0aW9uICgpIHsgdGhpcy5zZXRfc3RhdGUoc3RhdGUsIGNhbGxiYWNrKTsgfSwgdCksIDApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoZXJlIHdpbGwgYmUgc29tZSBhc3luYyBhY3Rpdml0eSAtIHNvIHdhaXQgZm9yIGl0XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJlcyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdGlmKHJlcykge1xyXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBzdGF0ZS5jb3JlLm9wZW47XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zZXRfc3RhdGUoc3RhdGUsIGNhbGxiYWNrKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihzdGF0ZS5jb3JlLnNjcm9sbCkge1xyXG5cdFx0XHRcdFx0XHRpZihzdGF0ZS5jb3JlLnNjcm9sbCAmJiBzdGF0ZS5jb3JlLnNjcm9sbC5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdChzdGF0ZS5jb3JlLnNjcm9sbC5sZWZ0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZihzdGF0ZS5jb3JlLnNjcm9sbCAmJiBzdGF0ZS5jb3JlLnNjcm9sbC50b3AgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZWxlbWVudC5zY3JvbGxUb3Aoc3RhdGUuY29yZS5zY3JvbGwudG9wKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRkZWxldGUgc3RhdGUuY29yZS5zY3JvbGw7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0X3N0YXRlKHN0YXRlLCBjYWxsYmFjayk7XHJcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8qIVxyXG5cdFx0XHRcdFx0aWYoc3RhdGUuY29yZS50aGVtZXMpIHtcclxuXHRcdFx0XHRcdFx0aWYoc3RhdGUuY29yZS50aGVtZXMubmFtZSkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0X3RoZW1lKHN0YXRlLmNvcmUudGhlbWVzLm5hbWUpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmKHR5cGVvZiBzdGF0ZS5jb3JlLnRoZW1lcy5kb3RzICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXNbIHN0YXRlLmNvcmUudGhlbWVzLmRvdHMgPyBcInNob3dfZG90c1wiIDogXCJoaWRlX2RvdHNcIiBdKCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYodHlwZW9mIHN0YXRlLmNvcmUudGhlbWVzLmljb25zICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXNbIHN0YXRlLmNvcmUudGhlbWVzLmljb25zID8gXCJzaG93X2ljb25zXCIgOiBcImhpZGVfaWNvbnNcIiBdKCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ZGVsZXRlIHN0YXRlLmNvcmUudGhlbWVzO1xyXG5cdFx0XHRcdFx0XHRkZWxldGUgc3RhdGUuY29yZS5vcGVuO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldF9zdGF0ZShzdGF0ZSwgY2FsbGJhY2spO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQqL1xyXG5cdFx0XHRcdFx0aWYoc3RhdGUuY29yZS5zZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0XHRfdGhpcyA9IHRoaXM7XHJcblx0XHRcdFx0XHRcdHRoaXMuZGVzZWxlY3RfYWxsKCk7XHJcblx0XHRcdFx0XHRcdCQuZWFjaChzdGF0ZS5jb3JlLnNlbGVjdGVkLCBmdW5jdGlvbiAoaSwgdikge1xyXG5cdFx0XHRcdFx0XHRcdF90aGlzLnNlbGVjdF9ub2RlKHYpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0ZGVsZXRlIHN0YXRlLmNvcmUuc2VsZWN0ZWQ7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0X3N0YXRlKHN0YXRlLCBjYWxsYmFjayk7XHJcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKCQuaXNFbXB0eU9iamVjdChzdGF0ZS5jb3JlKSkge1xyXG5cdFx0XHRcdFx0XHRkZWxldGUgc3RhdGUuY29yZTtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRfc3RhdGUoc3RhdGUsIGNhbGxiYWNrKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZigkLmlzRW1wdHlPYmplY3Qoc3RhdGUpKSB7XHJcblx0XHRcdFx0XHRzdGF0ZSA9IG51bGw7XHJcblx0XHRcdFx0XHRpZihjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMpOyB9XHJcblx0XHRcdFx0XHQvKipcclxuXHRcdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgYHNldF9zdGF0ZWAgY2FsbCBjb21wbGV0ZXNcclxuXHRcdFx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHRcdFx0ICogQG5hbWUgc2V0X3N0YXRlLmpzdHJlZVxyXG5cdFx0XHRcdFx0ICovXHJcblx0XHRcdFx0XHR0aGlzLnRyaWdnZXIoJ3NldF9zdGF0ZScpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiByZWZyZXNoZXMgdGhlIHRyZWUgLSBhbGwgbm9kZXMgYXJlIHJlbG9hZGVkIHdpdGggY2FsbHMgdG8gYGxvYWRfbm9kZWAuXHJcblx0XHQgKiBAbmFtZSByZWZyZXNoKClcclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gc2tpcF9sb2FkaW5nIGFuIG9wdGlvbiB0byBza2lwIHNob3dpbmcgdGhlIGxvYWRpbmcgaW5kaWNhdG9yXHJcblx0XHQgKiBAdHJpZ2dlciByZWZyZXNoLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRyZWZyZXNoIDogZnVuY3Rpb24gKHNraXBfbG9hZGluZykge1xyXG5cdFx0XHR0aGlzLl9kYXRhLmNvcmUuc3RhdGUgPSB0aGlzLmdldF9zdGF0ZSgpO1xyXG5cdFx0XHR0aGlzLl9jbnQgPSAwO1xyXG5cdFx0XHR0aGlzLl9tb2RlbC5kYXRhID0ge1xyXG5cdFx0XHRcdCcjJyA6IHtcclxuXHRcdFx0XHRcdGlkIDogJyMnLFxyXG5cdFx0XHRcdFx0cGFyZW50IDogbnVsbCxcclxuXHRcdFx0XHRcdHBhcmVudHMgOiBbXSxcclxuXHRcdFx0XHRcdGNoaWxkcmVuIDogW10sXHJcblx0XHRcdFx0XHRjaGlsZHJlbl9kIDogW10sXHJcblx0XHRcdFx0XHRzdGF0ZSA6IHsgbG9hZGVkIDogZmFsc2UgfVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHRcdFx0dmFyIGMgPSB0aGlzLmdldF9jb250YWluZXJfdWwoKVswXS5jbGFzc05hbWU7XHJcblx0XHRcdGlmKCFza2lwX2xvYWRpbmcpIHtcclxuXHRcdFx0XHR0aGlzLmVsZW1lbnQuaHRtbChcIjxcIitcInVsIGNsYXNzPSdqc3RyZWUtY29udGFpbmVyLXVsJz48XCIrXCJsaSBjbGFzcz0nanN0cmVlLWluaXRpYWwtbm9kZSBqc3RyZWUtbG9hZGluZyBqc3RyZWUtbGVhZiBqc3RyZWUtbGFzdCc+PGkgY2xhc3M9J2pzdHJlZS1pY29uIGpzdHJlZS1vY2wnPjwvaT48XCIrXCJhIGNsYXNzPSdqc3RyZWUtYW5jaG9yJyBocmVmPScjJz48aSBjbGFzcz0nanN0cmVlLWljb24ganN0cmVlLXRoZW1laWNvbi1oaWRkZW4nPjwvaT5cIiArIHRoaXMuZ2V0X3N0cmluZyhcIkxvYWRpbmcgLi4uXCIpICsgXCI8L2E+PC9saT48L3VsPlwiKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmxvYWRfbm9kZSgnIycsIGZ1bmN0aW9uIChvLCBzKSB7XHJcblx0XHRcdFx0aWYocykge1xyXG5cdFx0XHRcdFx0dGhpcy5nZXRfY29udGFpbmVyX3VsKClbMF0uY2xhc3NOYW1lID0gYztcclxuXHRcdFx0XHRcdHRoaXMuc2V0X3N0YXRlKCQuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLl9kYXRhLmNvcmUuc3RhdGUpLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdC8qKlxyXG5cdFx0XHRcdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIGByZWZyZXNoYCBjYWxsIGNvbXBsZXRlc1xyXG5cdFx0XHRcdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0XHRcdFx0ICogQG5hbWUgcmVmcmVzaC5qc3RyZWVcclxuXHRcdFx0XHRcdFx0ICovXHJcblx0XHRcdFx0XHRcdHRoaXMudHJpZ2dlcigncmVmcmVzaCcpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5zdGF0ZSA9IG51bGw7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogc2V0IChjaGFuZ2UpIHRoZSBJRCBvZiBhIG5vZGVcclxuXHRcdCAqIEBuYW1lIHNldF9pZChvYmosIGlkKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZVxyXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSBpZCB0aGUgbmV3IElEXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRzZXRfaWQgOiBmdW5jdGlvbiAob2JqLCBpZCkge1xyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdHZhciBpLCBqLCBtID0gdGhpcy5fbW9kZWwuZGF0YTtcclxuXHRcdFx0Ly8gdXBkYXRlIHBhcmVudHMgKHJlcGxhY2UgY3VycmVudCBJRCB3aXRoIG5ldyBvbmUgaW4gY2hpbGRyZW4gYW5kIGNoaWxkcmVuX2QpXHJcblx0XHRcdG1bb2JqLnBhcmVudF0uY2hpbGRyZW5bJC5pbkFycmF5KG9iai5pZCwgbVtvYmoucGFyZW50XS5jaGlsZHJlbildID0gaWQ7XHJcblx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5wYXJlbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdG1bb2JqLnBhcmVudHNbaV1dLmNoaWxkcmVuX2RbJC5pbkFycmF5KG9iai5pZCwgbVtvYmoucGFyZW50c1tpXV0uY2hpbGRyZW5fZCldID0gaWQ7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gdXBkYXRlIGNoaWxkcmVuIChyZXBsYWNlIGN1cnJlbnQgSUQgd2l0aCBuZXcgb25lIGluIHBhcmVudCBhbmQgcGFyZW50cylcclxuXHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdG1bb2JqLmNoaWxkcmVuW2ldXS5wYXJlbnQgPSBpZDtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRtW29iai5jaGlsZHJlbl9kW2ldXS5wYXJlbnRzWyQuaW5BcnJheShvYmouaWQsIG1bb2JqLmNoaWxkcmVuX2RbaV1dLnBhcmVudHMpXSA9IGlkO1xyXG5cdFx0XHR9XHJcblx0XHRcdGkgPSAkLmluQXJyYXkob2JqLmlkLCB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQpO1xyXG5cdFx0XHRpZihpICE9PSAtMSkgeyB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWRbaV0gPSBpZDsgfVxyXG5cdFx0XHQvLyB1cGRhdGUgbW9kZWwgYW5kIG9iaiBpdHNlbGYgKG9iai5pZCwgdGhpcy5fbW9kZWwuZGF0YVtLRVldKVxyXG5cdFx0XHRpID0gdGhpcy5nZXRfbm9kZShvYmouaWQsIHRydWUpO1xyXG5cdFx0XHRpZihpKSB7XHJcblx0XHRcdFx0aS5hdHRyKCdpZCcsIGlkKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRkZWxldGUgbVtvYmouaWRdO1xyXG5cdFx0XHRvYmouaWQgPSBpZDtcclxuXHRcdFx0bVtpZF0gPSBvYmo7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0IHRoZSB0ZXh0IHZhbHVlIG9mIGEgbm9kZVxyXG5cdFx0ICogQG5hbWUgZ2V0X3RleHQob2JqKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZVxyXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRnZXRfdGV4dCA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRyZXR1cm4gKCFvYmogfHwgb2JqLmlkID09PSAnIycpID8gZmFsc2UgOiBvYmoudGV4dDtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHNldCB0aGUgdGV4dCB2YWx1ZSBvZiBhIG5vZGUuIFVzZWQgaW50ZXJuYWxseSwgcGxlYXNlIHVzZSBgcmVuYW1lX25vZGUob2JqLCB2YWwpYC5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBzZXRfdGV4dChvYmosIHZhbClcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmogdGhlIG5vZGUsIHlvdSBjYW4gcGFzcyBhbiBhcnJheSB0byBzZXQgdGhlIHRleHQgb24gbXVsdGlwbGUgbm9kZXNcclxuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30gdmFsIHRoZSBuZXcgdGV4dCB2YWx1ZVxyXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cclxuXHRcdCAqIEB0cmlnZ2VyIHNldF90ZXh0LmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRzZXRfdGV4dCA6IGZ1bmN0aW9uIChvYmosIHZhbCkge1xyXG5cdFx0XHR2YXIgdDEsIHQyLCBkb20sIHRtcDtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuc2V0X3RleHQob2JqW3QxXSwgdmFsKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHRvYmoudGV4dCA9IHZhbDtcclxuXHRcdFx0ZG9tID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpO1xyXG5cdFx0XHRpZihkb20ubGVuZ3RoKSB7XHJcblx0XHRcdFx0ZG9tID0gZG9tLmNoaWxkcmVuKFwiLmpzdHJlZS1hbmNob3I6ZXEoMClcIik7XHJcblx0XHRcdFx0dG1wID0gZG9tLmNoaWxkcmVuKFwiSVwiKS5jbG9uZSgpO1xyXG5cdFx0XHRcdGRvbS5odG1sKHZhbCkucHJlcGVuZCh0bXApO1xyXG5cdFx0XHRcdC8qKlxyXG5cdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgbm9kZSB0ZXh0IHZhbHVlIGlzIGNoYW5nZWRcclxuXHRcdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0XHQgKiBAbmFtZSBzZXRfdGV4dC5qc3RyZWVcclxuXHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gb2JqXHJcblx0XHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIG5ldyB2YWx1ZVxyXG5cdFx0XHRcdCAqL1xyXG5cdFx0XHRcdHRoaXMudHJpZ2dlcignc2V0X3RleHQnLHsgXCJvYmpcIiA6IG9iaiwgXCJ0ZXh0XCIgOiB2YWwgfSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBnZXRzIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIG5vZGUgKG9yIHRoZSB3aG9sZSB0cmVlKVxyXG5cdFx0ICogQG5hbWUgZ2V0X2pzb24oW29iaiwgb3B0aW9uc10pXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqXHJcblx0XHQgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcclxuXHRcdCAqIEBwYXJhbSAge0Jvb2xlYW59IG9wdGlvbnMubm9fc3RhdGUgZG8gbm90IHJldHVybiBzdGF0ZSBpbmZvcm1hdGlvblxyXG5cdFx0ICogQHBhcmFtICB7Qm9vbGVhbn0gb3B0aW9ucy5ub19pZCBkbyBub3QgcmV0dXJuIElEXHJcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBvcHRpb25zLm5vX2NoaWxkcmVuIGRvIG5vdCBpbmNsdWRlIGNoaWxkcmVuXHJcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBvcHRpb25zLm5vX2RhdGEgZG8gbm90IGluY2x1ZGUgbm9kZSBkYXRhXHJcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBvcHRpb25zLmZsYXQgcmV0dXJuIGZsYXQgSlNPTiBpbnN0ZWFkIG9mIG5lc3RlZFxyXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHRnZXRfanNvbiA6IGZ1bmN0aW9uIChvYmosIG9wdGlvbnMsIGZsYXQpIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmogfHwgJyMnKTtcclxuXHRcdFx0aWYoIW9iaikgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLmZsYXQgJiYgIWZsYXQpIHsgZmxhdCA9IFtdOyB9XHJcblx0XHRcdHZhciB0bXAgPSB7XHJcblx0XHRcdFx0J2lkJyA6IG9iai5pZCxcclxuXHRcdFx0XHQndGV4dCcgOiBvYmoudGV4dCxcclxuXHRcdFx0XHQnaWNvbicgOiB0aGlzLmdldF9pY29uKG9iaiksXHJcblx0XHRcdFx0J2xpX2F0dHInIDogb2JqLmxpX2F0dHIsXHJcblx0XHRcdFx0J2FfYXR0cicgOiBvYmouYV9hdHRyLFxyXG5cdFx0XHRcdCdzdGF0ZScgOiB7fSxcclxuXHRcdFx0XHQnZGF0YScgOiBvcHRpb25zICYmIG9wdGlvbnMubm9fZGF0YSA/IGZhbHNlIDogb2JqLmRhdGFcclxuXHRcdFx0XHQvLyggdGhpcy5nZXRfbm9kZShvYmosIHRydWUpLmxlbmd0aCA/IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKS5kYXRhKCkgOiBvYmouZGF0YSApLFxyXG5cdFx0XHR9LCBpLCBqO1xyXG5cdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMuZmxhdCkge1xyXG5cdFx0XHRcdHRtcC5wYXJlbnQgPSBvYmoucGFyZW50O1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdHRtcC5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCFvcHRpb25zIHx8ICFvcHRpb25zLm5vX3N0YXRlKSB7XHJcblx0XHRcdFx0Zm9yKGkgaW4gb2JqLnN0YXRlKSB7XHJcblx0XHRcdFx0XHRpZihvYmouc3RhdGUuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuXHRcdFx0XHRcdFx0dG1wLnN0YXRlW2ldID0gb2JqLnN0YXRlW2ldO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMubm9faWQpIHtcclxuXHRcdFx0XHRkZWxldGUgdG1wLmlkO1xyXG5cdFx0XHRcdGlmKHRtcC5saV9hdHRyICYmIHRtcC5saV9hdHRyLmlkKSB7XHJcblx0XHRcdFx0XHRkZWxldGUgdG1wLmxpX2F0dHIuaWQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5mbGF0ICYmIG9iai5pZCAhPT0gJyMnKSB7XHJcblx0XHRcdFx0ZmxhdC5wdXNoKHRtcCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIW9wdGlvbnMgfHwgIW9wdGlvbnMubm9fY2hpbGRyZW4pIHtcclxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMuZmxhdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmdldF9qc29uKG9iai5jaGlsZHJlbltpXSwgb3B0aW9ucywgZmxhdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0dG1wLmNoaWxkcmVuLnB1c2godGhpcy5nZXRfanNvbihvYmouY2hpbGRyZW5baV0sIG9wdGlvbnMpKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5mbGF0ID8gZmxhdCA6IChvYmouaWQgPT09ICcjJyA/IHRtcC5jaGlsZHJlbiA6IHRtcCk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBjcmVhdGUgYSBuZXcgbm9kZSAoZG8gbm90IGNvbmZ1c2Ugd2l0aCBsb2FkX25vZGUpXHJcblx0XHQgKiBAbmFtZSBjcmVhdGVfbm9kZShbb2JqLCBub2RlLCBwb3MsIGNhbGxiYWNrLCBpc19sb2FkZWRdKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9ICAgcGFyICAgICAgIHRoZSBwYXJlbnQgbm9kZVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9ICAgbm9kZSAgICAgIHRoZSBkYXRhIGZvciB0aGUgbmV3IG5vZGUgKGEgdmFsaWQgSlNPTiBvYmplY3QsIG9yIGEgc2ltcGxlIHN0cmluZyB3aXRoIHRoZSBuYW1lKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9ICAgcG9zICAgICAgIHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIG5vZGUsIFwiZmlyc3RcIiBhbmQgXCJsYXN0XCIgYXJlIGFsc28gc3VwcG9ydGVkLCBkZWZhdWx0IGlzIFwibGFzdFwiXHJcblx0XHQgKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSB0aGUgbm9kZSBpcyBjcmVhdGVkXHJcblx0XHQgKiBAcGFyYW0gIHtCb29sZWFufSBpc19sb2FkZWQgaW50ZXJuYWwgYXJndW1lbnQgaW5kaWNhdGluZyBpZiB0aGUgcGFyZW50IG5vZGUgd2FzIHN1Y2Nlc2Z1bGx5IGxvYWRlZFxyXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgbmV3bHkgY3JlYXRlIG5vZGVcclxuXHRcdCAqIEB0cmlnZ2VyIG1vZGVsLmpzdHJlZSwgY3JlYXRlX25vZGUuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGNyZWF0ZV9ub2RlIDogZnVuY3Rpb24gKHBhciwgbm9kZSwgcG9zLCBjYWxsYmFjaywgaXNfbG9hZGVkKSB7XHJcblx0XHRcdHBhciA9IHRoaXMuZ2V0X25vZGUocGFyKTtcclxuXHRcdFx0aWYoIXBhcikgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0cG9zID0gcG9zID09PSB1bmRlZmluZWQgPyBcImxhc3RcIiA6IHBvcztcclxuXHRcdFx0aWYoIXBvcy50b1N0cmluZygpLm1hdGNoKC9eKGJlZm9yZXxhZnRlcikkLykgJiYgIWlzX2xvYWRlZCAmJiAhdGhpcy5pc19sb2FkZWQocGFyKSkge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmxvYWRfbm9kZShwYXIsIGZ1bmN0aW9uICgpIHsgdGhpcy5jcmVhdGVfbm9kZShwYXIsIG5vZGUsIHBvcywgY2FsbGJhY2ssIHRydWUpOyB9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZighbm9kZSkgeyBub2RlID0geyBcInRleHRcIiA6IHRoaXMuZ2V0X3N0cmluZygnTmV3IG5vZGUnKSB9OyB9XHJcblx0XHRcdGlmKG5vZGUudGV4dCA9PT0gdW5kZWZpbmVkKSB7IG5vZGUudGV4dCA9IHRoaXMuZ2V0X3N0cmluZygnTmV3IG5vZGUnKTsgfVxyXG5cdFx0XHR2YXIgdG1wLCBkcGMsIGksIGo7XHJcblxyXG5cdFx0XHRpZihwYXIuaWQgPT09ICcjJykge1xyXG5cdFx0XHRcdGlmKHBvcyA9PT0gXCJiZWZvcmVcIikgeyBwb3MgPSBcImZpcnN0XCI7IH1cclxuXHRcdFx0XHRpZihwb3MgPT09IFwiYWZ0ZXJcIikgeyBwb3MgPSBcImxhc3RcIjsgfVxyXG5cdFx0XHR9XHJcblx0XHRcdHN3aXRjaChwb3MpIHtcclxuXHRcdFx0XHRjYXNlIFwiYmVmb3JlXCI6XHJcblx0XHRcdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKHBhci5wYXJlbnQpO1xyXG5cdFx0XHRcdFx0cG9zID0gJC5pbkFycmF5KHBhci5pZCwgdG1wLmNoaWxkcmVuKTtcclxuXHRcdFx0XHRcdHBhciA9IHRtcDtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJhZnRlclwiIDpcclxuXHRcdFx0XHRcdHRtcCA9IHRoaXMuZ2V0X25vZGUocGFyLnBhcmVudCk7XHJcblx0XHRcdFx0XHRwb3MgPSAkLmluQXJyYXkocGFyLmlkLCB0bXAuY2hpbGRyZW4pICsgMTtcclxuXHRcdFx0XHRcdHBhciA9IHRtcDtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJpbnNpZGVcIjpcclxuXHRcdFx0XHRjYXNlIFwiZmlyc3RcIjpcclxuXHRcdFx0XHRcdHBvcyA9IDA7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwibGFzdFwiOlxyXG5cdFx0XHRcdFx0cG9zID0gcGFyLmNoaWxkcmVuLmxlbmd0aDtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRpZighcG9zKSB7IHBvcyA9IDA7IH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHBvcyA+IHBhci5jaGlsZHJlbi5sZW5ndGgpIHsgcG9zID0gcGFyLmNoaWxkcmVuLmxlbmd0aDsgfVxyXG5cdFx0XHRpZighbm9kZS5pZCkgeyBub2RlLmlkID0gdHJ1ZTsgfVxyXG5cdFx0XHRpZighdGhpcy5jaGVjayhcImNyZWF0ZV9ub2RlXCIsIG5vZGUsIHBhciwgcG9zKSkge1xyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuY29yZS5lcnJvci5jYWxsKHRoaXMsIHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yKTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYobm9kZS5pZCA9PT0gdHJ1ZSkgeyBkZWxldGUgbm9kZS5pZDsgfVxyXG5cdFx0XHRub2RlID0gdGhpcy5fcGFyc2VfbW9kZWxfZnJvbV9qc29uKG5vZGUsIHBhci5pZCwgcGFyLnBhcmVudHMuY29uY2F0KCkpO1xyXG5cdFx0XHRpZighbm9kZSkgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShub2RlKTtcclxuXHRcdFx0ZHBjID0gW107XHJcblx0XHRcdGRwYy5wdXNoKG5vZGUpO1xyXG5cdFx0XHRkcGMgPSBkcGMuY29uY2F0KHRtcC5jaGlsZHJlbl9kKTtcclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdtb2RlbCcsIHsgXCJub2Rlc1wiIDogZHBjLCBcInBhcmVudFwiIDogcGFyLmlkIH0pO1xyXG5cclxuXHRcdFx0cGFyLmNoaWxkcmVuX2QgPSBwYXIuY2hpbGRyZW5fZC5jb25jYXQoZHBjKTtcclxuXHRcdFx0Zm9yKGkgPSAwLCBqID0gcGFyLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0dGhpcy5fbW9kZWwuZGF0YVtwYXIucGFyZW50c1tpXV0uY2hpbGRyZW5fZCA9IHRoaXMuX21vZGVsLmRhdGFbcGFyLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QuY29uY2F0KGRwYyk7XHJcblx0XHRcdH1cclxuXHRcdFx0bm9kZSA9IHRtcDtcclxuXHRcdFx0dG1wID0gW107XHJcblx0XHRcdGZvcihpID0gMCwgaiA9IHBhci5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHR0bXBbaSA+PSBwb3MgPyBpKzEgOiBpXSA9IHBhci5jaGlsZHJlbltpXTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0bXBbcG9zXSA9IG5vZGUuaWQ7XHJcblx0XHRcdHBhci5jaGlsZHJlbiA9IHRtcDtcclxuXHJcblx0XHRcdHRoaXMucmVkcmF3X25vZGUocGFyLCB0cnVlKTtcclxuXHRcdFx0aWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCh0aGlzLCB0aGlzLmdldF9ub2RlKG5vZGUpKTsgfVxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gYSBub2RlIGlzIGNyZWF0ZWRcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIGNyZWF0ZV9ub2RlLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxyXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gcGFyZW50IHRoZSBwYXJlbnQncyBJRFxyXG5cdFx0XHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgbm9kZSBhbW9uZyB0aGUgcGFyZW50J3MgY2hpbGRyZW5cclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignY3JlYXRlX25vZGUnLCB7IFwibm9kZVwiIDogdGhpcy5nZXRfbm9kZShub2RlKSwgXCJwYXJlbnRcIiA6IHBhci5pZCwgXCJwb3NpdGlvblwiIDogcG9zIH0pO1xyXG5cdFx0XHRyZXR1cm4gbm9kZS5pZDtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHNldCB0aGUgdGV4dCB2YWx1ZSBvZiBhIG5vZGVcclxuXHRcdCAqIEBuYW1lIHJlbmFtZV9ub2RlKG9iaiwgdmFsKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZSwgeW91IGNhbiBwYXNzIGFuIGFycmF5IHRvIHJlbmFtZSBtdWx0aXBsZSBub2RlcyB0byB0aGUgc2FtZSBuYW1lXHJcblx0XHQgKiBAcGFyYW0gIHtTdHJpbmd9IHZhbCB0aGUgbmV3IHRleHQgdmFsdWVcclxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XHJcblx0XHQgKiBAdHJpZ2dlciByZW5hbWVfbm9kZS5qc3RyZWVcclxuXHRcdCAqL1xyXG5cdFx0cmVuYW1lX25vZGUgOiBmdW5jdGlvbiAob2JqLCB2YWwpIHtcclxuXHRcdFx0dmFyIHQxLCB0Miwgb2xkO1xyXG5cdFx0XHRpZigkLmlzQXJyYXkob2JqKSkge1xyXG5cdFx0XHRcdG9iaiA9IG9iai5zbGljZSgpO1xyXG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xyXG5cdFx0XHRcdFx0dGhpcy5yZW5hbWVfbm9kZShvYmpbdDFdLCB2YWwpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdG9sZCA9IG9iai50ZXh0O1xyXG5cdFx0XHRpZighdGhpcy5jaGVjayhcInJlbmFtZV9ub2RlXCIsIG9iaiwgdGhpcy5nZXRfcGFyZW50KG9iaiksIHZhbCkpIHtcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmNvcmUuZXJyb3IuY2FsbCh0aGlzLCB0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvcik7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuc2V0X3RleHQob2JqLCB2YWwpOyAvLyAuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSlcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgbm9kZSBpcyByZW5hbWVkXHJcblx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHQgKiBAbmFtZSByZW5hbWVfbm9kZS5qc3RyZWVcclxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcclxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIG5ldyB2YWx1ZVxyXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gb2xkIHRoZSBvbGQgdmFsdWVcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcigncmVuYW1lX25vZGUnLCB7IFwibm9kZVwiIDogb2JqLCBcInRleHRcIiA6IHZhbCwgXCJvbGRcIiA6IG9sZCB9KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiByZW1vdmUgYSBub2RlXHJcblx0XHQgKiBAbmFtZSBkZWxldGVfbm9kZShvYmopXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqIHRoZSBub2RlLCB5b3UgY2FuIHBhc3MgYW4gYXJyYXkgdG8gZGVsZXRlIG11bHRpcGxlIG5vZGVzXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICogQHRyaWdnZXIgZGVsZXRlX25vZGUuanN0cmVlLCBjaGFuZ2VkLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRkZWxldGVfbm9kZSA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0dmFyIHQxLCB0MiwgcGFyLCBwb3MsIHRtcCwgaSwgaiwgaywgbCwgYztcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuZGVsZXRlX25vZGUob2JqW3QxXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcclxuXHRcdFx0aWYoIW9iaiB8fCBvYmouaWQgPT09ICcjJykgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0cGFyID0gdGhpcy5nZXRfbm9kZShvYmoucGFyZW50KTtcclxuXHRcdFx0cG9zID0gJC5pbkFycmF5KG9iai5pZCwgcGFyLmNoaWxkcmVuKTtcclxuXHRcdFx0YyA9IGZhbHNlO1xyXG5cdFx0XHRpZighdGhpcy5jaGVjayhcImRlbGV0ZV9ub2RlXCIsIG9iaiwgcGFyLCBwb3MpKSB7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5jb3JlLmVycm9yLmNhbGwodGhpcywgdGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3IpO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZihwb3MgIT09IC0xKSB7XHJcblx0XHRcdFx0cGFyLmNoaWxkcmVuID0gJC52YWthdGEuYXJyYXlfcmVtb3ZlKHBhci5jaGlsZHJlbiwgcG9zKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0bXAgPSBvYmouY2hpbGRyZW5fZC5jb25jYXQoW10pO1xyXG5cdFx0XHR0bXAucHVzaChvYmouaWQpO1xyXG5cdFx0XHRmb3IoayA9IDAsIGwgPSB0bXAubGVuZ3RoOyBrIDwgbDsgaysrKSB7XHJcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRwb3MgPSAkLmluQXJyYXkodG1wW2tdLCB0aGlzLl9tb2RlbC5kYXRhW29iai5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kKTtcclxuXHRcdFx0XHRcdGlmKHBvcyAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fbW9kZWwuZGF0YVtvYmoucGFyZW50c1tpXV0uY2hpbGRyZW5fZCA9ICQudmFrYXRhLmFycmF5X3JlbW92ZSh0aGlzLl9tb2RlbC5kYXRhW29iai5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kLCBwb3MpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZih0aGlzLl9tb2RlbC5kYXRhW3RtcFtrXV0uc3RhdGUuc2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdGMgPSB0cnVlO1xyXG5cdFx0XHRcdFx0cG9zID0gJC5pbkFycmF5KHRtcFtrXSwgdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkKTtcclxuXHRcdFx0XHRcdGlmKHBvcyAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkID0gJC52YWthdGEuYXJyYXlfcmVtb3ZlKHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCwgcG9zKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIGEgbm9kZSBpcyBkZWxldGVkXHJcblx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHQgKiBAbmFtZSBkZWxldGVfbm9kZS5qc3RyZWVcclxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcclxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHBhcmVudCB0aGUgcGFyZW50J3MgSURcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignZGVsZXRlX25vZGUnLCB7IFwibm9kZVwiIDogb2JqLCBcInBhcmVudFwiIDogcGFyLmlkIH0pO1xyXG5cdFx0XHRpZihjKSB7XHJcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyAnYWN0aW9uJyA6ICdkZWxldGVfbm9kZScsICdub2RlJyA6IG9iaiwgJ3NlbGVjdGVkJyA6IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCwgJ3BhcmVudCcgOiBwYXIuaWQgfSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Zm9yKGsgPSAwLCBsID0gdG1wLmxlbmd0aDsgayA8IGw7IGsrKykge1xyXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9tb2RlbC5kYXRhW3RtcFtrXV07XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5yZWRyYXdfbm9kZShwYXIsIHRydWUpO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGNoZWNrIGlmIGFuIG9wZXJhdGlvbiBpcyBwcmVtaXR0ZWQgb24gdGhlIHRyZWUuIFVzZWQgaW50ZXJuYWxseS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBjaGVjayhjaGssIG9iaiwgcGFyLCBwb3MpXHJcblx0XHQgKiBAcGFyYW0gIHtTdHJpbmd9IGNoayB0aGUgb3BlcmF0aW9uIHRvIGNoZWNrLCBjYW4gYmUgXCJjcmVhdGVfbm9kZVwiLCBcInJlbmFtZV9ub2RlXCIsIFwiZGVsZXRlX25vZGVcIiwgXCJjb3B5X25vZGVcIiBvciBcIm1vdmVfbm9kZVwiXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqIHRoZSBub2RlXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gcGFyIHRoZSBwYXJlbnRcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBwb3MgdGhlIHBvc2l0aW9uIHRvIGluc2VydCBhdCwgb3IgaWYgXCJyZW5hbWVfbm9kZVwiIC0gdGhlIG5ldyBuYW1lXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRjaGVjayA6IGZ1bmN0aW9uIChjaGssIG9iaiwgcGFyLCBwb3MpIHtcclxuXHRcdFx0b2JqID0gb2JqICYmIG9iai5pZCA/IG9iaiA6IHRoaXMuZ2V0X25vZGUob2JqKTtcclxuXHRcdFx0cGFyID0gcGFyICYmIHBhci5pZCA/IHBhciA6IHRoaXMuZ2V0X25vZGUocGFyKTtcclxuXHRcdFx0dmFyIHRtcCA9IGNoay5tYXRjaCgvXm1vdmVfbm9kZXxjb3B5X25vZGV8Y3JlYXRlX25vZGUkL2kpID8gcGFyIDogb2JqLFxyXG5cdFx0XHRcdGNoYyA9IHRoaXMuc2V0dGluZ3MuY29yZS5jaGVja19jYWxsYmFjaztcclxuXHRcdFx0aWYoY2hrID09PSBcIm1vdmVfbm9kZVwiKSB7XHJcblx0XHRcdFx0aWYob2JqLmlkID09PSBwYXIuaWQgfHwgJC5pbkFycmF5KG9iai5pZCwgcGFyLmNoaWxkcmVuKSA9PT0gcG9zIHx8ICQuaW5BcnJheShwYXIuaWQsIG9iai5jaGlsZHJlbl9kKSAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2NoZWNrJywgJ3BsdWdpbicgOiAnY29yZScsICdpZCcgOiAnY29yZV8wMScsICdyZWFzb24nIDogJ01vdmluZyBwYXJlbnQgaW5zaWRlIGNoaWxkJywgJ2RhdGEnIDogSlNPTi5zdHJpbmdpZnkoeyAnY2hrJyA6IGNoaywgJ3BvcycgOiBwb3MsICdvYmonIDogb2JqICYmIG9iai5pZCA/IG9iai5pZCA6IGZhbHNlLCAncGFyJyA6IHBhciAmJiBwYXIuaWQgPyBwYXIuaWQgOiBmYWxzZSB9KSB9O1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKHRtcCwgdHJ1ZSk7XHJcblx0XHRcdGlmKHRtcC5sZW5ndGgpIHsgdG1wID0gdG1wLmRhdGEoJ2pzdHJlZScpOyB9XHJcblx0XHRcdGlmKHRtcCAmJiB0bXAuZnVuY3Rpb25zICYmICh0bXAuZnVuY3Rpb25zW2Noa10gPT09IGZhbHNlIHx8IHRtcC5mdW5jdGlvbnNbY2hrXSA9PT0gdHJ1ZSkpIHtcclxuXHRcdFx0XHRpZih0bXAuZnVuY3Rpb25zW2Noa10gPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvciA9IHsgJ2Vycm9yJyA6ICdjaGVjaycsICdwbHVnaW4nIDogJ2NvcmUnLCAnaWQnIDogJ2NvcmVfMDInLCAncmVhc29uJyA6ICdOb2RlIGRhdGEgcHJldmVudHMgZnVuY3Rpb246ICcgKyBjaGssICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHsgJ2NoaycgOiBjaGssICdwb3MnIDogcG9zLCAnb2JqJyA6IG9iaiAmJiBvYmouaWQgPyBvYmouaWQgOiBmYWxzZSwgJ3BhcicgOiBwYXIgJiYgcGFyLmlkID8gcGFyLmlkIDogZmFsc2UgfSkgfTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHRtcC5mdW5jdGlvbnNbY2hrXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZihjaGMgPT09IGZhbHNlIHx8ICgkLmlzRnVuY3Rpb24oY2hjKSAmJiBjaGMuY2FsbCh0aGlzLCBjaGssIG9iaiwgcGFyLCBwb3MpID09PSBmYWxzZSkgfHwgKGNoYyAmJiBjaGNbY2hrXSA9PT0gZmFsc2UpKSB7XHJcblx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3IgPSB7ICdlcnJvcicgOiAnY2hlY2snLCAncGx1Z2luJyA6ICdjb3JlJywgJ2lkJyA6ICdjb3JlXzAzJywgJ3JlYXNvbicgOiAnVXNlciBjb25maWcgZm9yIGNvcmUuY2hlY2tfY2FsbGJhY2sgcHJldmVudHMgZnVuY3Rpb246ICcgKyBjaGssICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHsgJ2NoaycgOiBjaGssICdwb3MnIDogcG9zLCAnb2JqJyA6IG9iaiAmJiBvYmouaWQgPyBvYmouaWQgOiBmYWxzZSwgJ3BhcicgOiBwYXIgJiYgcGFyLmlkID8gcGFyLmlkIDogZmFsc2UgfSkgfTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBnZXQgdGhlIGxhc3QgZXJyb3JcclxuXHRcdCAqIEBuYW1lIGxhc3RfZXJyb3IoKVxyXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHRsYXN0X2Vycm9yIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3I7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBtb3ZlIGEgbm9kZSB0byBhIG5ldyBwYXJlbnRcclxuXHRcdCAqIEBuYW1lIG1vdmVfbm9kZShvYmosIHBhciBbLCBwb3MsIGNhbGxiYWNrLCBpc19sb2FkZWRdKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBtb3ZlLCBwYXNzIGFuIGFycmF5IHRvIG1vdmUgbXVsdGlwbGUgbm9kZXNcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBwYXIgdGhlIG5ldyBwYXJlbnRcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBwb3MgdGhlIHBvc2l0aW9uIHRvIGluc2VydCBhdCAoXCJmaXJzdFwiIGFuZCBcImxhc3RcIiBhcmUgc3VwcG9ydGVkLCBhcyB3ZWxsIGFzIFwiYmVmb3JlXCIgYW5kIFwiYWZ0ZXJcIiksIGRlZmF1bHRzIHRvIGAwYFxyXG5cdFx0ICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIGEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBtb3ZlIGlzIGNvbXBsZXRlZCwgcmVjZWl2ZXMgMyBhcmd1bWVudHMgLSB0aGUgbm9kZSwgdGhlIG5ldyBwYXJlbnQgYW5kIHRoZSBwb3NpdGlvblxyXG5cdFx0ICogQHBhcmFtICB7Qm9vbGVhbn0gaW50ZXJuYWwgcGFyYW1ldGVyIGluZGljYXRpbmcgaWYgdGhlIHBhcmVudCBub2RlIGhhcyBiZWVuIGxvYWRlZFxyXG5cdFx0ICogQHRyaWdnZXIgbW92ZV9ub2RlLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRtb3ZlX25vZGUgOiBmdW5jdGlvbiAob2JqLCBwYXIsIHBvcywgY2FsbGJhY2ssIGlzX2xvYWRlZCkge1xyXG5cdFx0XHR2YXIgdDEsIHQyLCBvbGRfcGFyLCBuZXdfcGFyLCBvbGRfaW5zLCBpc19tdWx0aSwgZHBjLCB0bXAsIGksIGosIGssIGwsIHA7XHJcblx0XHRcdGlmKCQuaXNBcnJheShvYmopKSB7XHJcblx0XHRcdFx0b2JqID0gb2JqLnJldmVyc2UoKS5zbGljZSgpO1xyXG5cdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xyXG5cdFx0XHRcdFx0dGhpcy5tb3ZlX25vZGUob2JqW3QxXSwgcGFyLCBwb3MsIGNhbGxiYWNrLCBpc19sb2FkZWQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRvYmogPSBvYmogJiYgb2JqLmlkID8gb2JqIDogdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRwYXIgPSB0aGlzLmdldF9ub2RlKHBhcik7XHJcblx0XHRcdHBvcyA9IHBvcyA9PT0gdW5kZWZpbmVkID8gMCA6IHBvcztcclxuXHJcblx0XHRcdGlmKCFwYXIgfHwgIW9iaiB8fCBvYmouaWQgPT09ICcjJykgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0aWYoIXBvcy50b1N0cmluZygpLm1hdGNoKC9eKGJlZm9yZXxhZnRlcikkLykgJiYgIWlzX2xvYWRlZCAmJiAhdGhpcy5pc19sb2FkZWQocGFyKSkge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmxvYWRfbm9kZShwYXIsIGZ1bmN0aW9uICgpIHsgdGhpcy5tb3ZlX25vZGUob2JqLCBwYXIsIHBvcywgY2FsbGJhY2ssIHRydWUpOyB9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0b2xkX3BhciA9IChvYmoucGFyZW50IHx8ICcjJykudG9TdHJpbmcoKTtcclxuXHRcdFx0bmV3X3BhciA9ICghcG9zLnRvU3RyaW5nKCkubWF0Y2goL14oYmVmb3JlfGFmdGVyKSQvKSB8fCBwYXIuaWQgPT09ICcjJykgPyBwYXIgOiB0aGlzLmdldF9ub2RlKHBhci5wYXJlbnQpO1xyXG5cdFx0XHRvbGRfaW5zID0gdGhpcy5fbW9kZWwuZGF0YVtvYmouaWRdID8gdGhpcyA6ICQuanN0cmVlLnJlZmVyZW5jZShvYmouaWQpO1xyXG5cdFx0XHRpc19tdWx0aSA9ICFvbGRfaW5zIHx8ICFvbGRfaW5zLl9pZCB8fCAodGhpcy5faWQgIT09IG9sZF9pbnMuX2lkKTtcclxuXHRcdFx0aWYoaXNfbXVsdGkpIHtcclxuXHRcdFx0XHRpZih0aGlzLmNvcHlfbm9kZShvYmosIHBhciwgcG9zLCBjYWxsYmFjaywgaXNfbG9hZGVkKSkge1xyXG5cdFx0XHRcdFx0aWYob2xkX2lucykgeyBvbGRfaW5zLmRlbGV0ZV9ub2RlKG9iaik7IH1cclxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly92YXIgbSA9IHRoaXMuX21vZGVsLmRhdGE7XHJcblx0XHRcdGlmKG5ld19wYXIuaWQgPT09ICcjJykge1xyXG5cdFx0XHRcdGlmKHBvcyA9PT0gXCJiZWZvcmVcIikgeyBwb3MgPSBcImZpcnN0XCI7IH1cclxuXHRcdFx0XHRpZihwb3MgPT09IFwiYWZ0ZXJcIikgeyBwb3MgPSBcImxhc3RcIjsgfVxyXG5cdFx0XHR9XHJcblx0XHRcdHN3aXRjaChwb3MpIHtcclxuXHRcdFx0XHRjYXNlIFwiYmVmb3JlXCI6XHJcblx0XHRcdFx0XHRwb3MgPSAkLmluQXJyYXkocGFyLmlkLCBuZXdfcGFyLmNoaWxkcmVuKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJhZnRlclwiIDpcclxuXHRcdFx0XHRcdHBvcyA9ICQuaW5BcnJheShwYXIuaWQsIG5ld19wYXIuY2hpbGRyZW4pICsgMTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJpbnNpZGVcIjpcclxuXHRcdFx0XHRjYXNlIFwiZmlyc3RcIjpcclxuXHRcdFx0XHRcdHBvcyA9IDA7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwibGFzdFwiOlxyXG5cdFx0XHRcdFx0cG9zID0gbmV3X3Bhci5jaGlsZHJlbi5sZW5ndGg7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0aWYoIXBvcykgeyBwb3MgPSAwOyB9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZihwb3MgPiBuZXdfcGFyLmNoaWxkcmVuLmxlbmd0aCkgeyBwb3MgPSBuZXdfcGFyLmNoaWxkcmVuLmxlbmd0aDsgfVxyXG5cdFx0XHRpZighdGhpcy5jaGVjayhcIm1vdmVfbm9kZVwiLCBvYmosIG5ld19wYXIsIHBvcykpIHtcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmNvcmUuZXJyb3IuY2FsbCh0aGlzLCB0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvcik7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKG9iai5wYXJlbnQgPT09IG5ld19wYXIuaWQpIHtcclxuXHRcdFx0XHRkcGMgPSBuZXdfcGFyLmNoaWxkcmVuLmNvbmNhdCgpO1xyXG5cdFx0XHRcdHRtcCA9ICQuaW5BcnJheShvYmouaWQsIGRwYyk7XHJcblx0XHRcdFx0aWYodG1wICE9PSAtMSkge1xyXG5cdFx0XHRcdFx0ZHBjID0gJC52YWthdGEuYXJyYXlfcmVtb3ZlKGRwYywgdG1wKTtcclxuXHRcdFx0XHRcdGlmKHBvcyA+IHRtcCkgeyBwb3MtLTsgfVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0bXAgPSBbXTtcclxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkcGMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHR0bXBbaSA+PSBwb3MgPyBpKzEgOiBpXSA9IGRwY1tpXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dG1wW3Bvc10gPSBvYmouaWQ7XHJcblx0XHRcdFx0bmV3X3Bhci5jaGlsZHJlbiA9IHRtcDtcclxuXHRcdFx0XHR0aGlzLl9ub2RlX2NoYW5nZWQobmV3X3Bhci5pZCk7XHJcblx0XHRcdFx0dGhpcy5yZWRyYXcobmV3X3Bhci5pZCA9PT0gJyMnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHQvLyBjbGVhbiBvbGQgcGFyZW50IGFuZCB1cFxyXG5cdFx0XHRcdHRtcCA9IG9iai5jaGlsZHJlbl9kLmNvbmNhdCgpO1xyXG5cdFx0XHRcdHRtcC5wdXNoKG9iai5pZCk7XHJcblx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gb2JqLnBhcmVudHMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRkcGMgPSBbXTtcclxuXHRcdFx0XHRcdHAgPSBvbGRfaW5zLl9tb2RlbC5kYXRhW29iai5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kO1xyXG5cdFx0XHRcdFx0Zm9yKGsgPSAwLCBsID0gcC5sZW5ndGg7IGsgPCBsOyBrKyspIHtcclxuXHRcdFx0XHRcdFx0aWYoJC5pbkFycmF5KHBba10sIHRtcCkgPT09IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0ZHBjLnB1c2gocFtrXSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdG9sZF9pbnMuX21vZGVsLmRhdGFbb2JqLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QgPSBkcGM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG9sZF9pbnMuX21vZGVsLmRhdGFbb2xkX3Bhcl0uY2hpbGRyZW4gPSAkLnZha2F0YS5hcnJheV9yZW1vdmVfaXRlbShvbGRfaW5zLl9tb2RlbC5kYXRhW29sZF9wYXJdLmNoaWxkcmVuLCBvYmouaWQpO1xyXG5cclxuXHRcdFx0XHQvLyBpbnNlcnQgaW50byBuZXcgcGFyZW50IGFuZCB1cFxyXG5cdFx0XHRcdGZvcihpID0gMCwgaiA9IG5ld19wYXIucGFyZW50cy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbbmV3X3Bhci5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kID0gdGhpcy5fbW9kZWwuZGF0YVtuZXdfcGFyLnBhcmVudHNbaV1dLmNoaWxkcmVuX2QuY29uY2F0KHRtcCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGRwYyA9IFtdO1xyXG5cdFx0XHRcdGZvcihpID0gMCwgaiA9IG5ld19wYXIuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRkcGNbaSA+PSBwb3MgPyBpKzEgOiBpXSA9IG5ld19wYXIuY2hpbGRyZW5baV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGRwY1twb3NdID0gb2JqLmlkO1xyXG5cdFx0XHRcdG5ld19wYXIuY2hpbGRyZW4gPSBkcGM7XHJcblx0XHRcdFx0bmV3X3Bhci5jaGlsZHJlbl9kLnB1c2gob2JqLmlkKTtcclxuXHRcdFx0XHRuZXdfcGFyLmNoaWxkcmVuX2QgPSBuZXdfcGFyLmNoaWxkcmVuX2QuY29uY2F0KG9iai5jaGlsZHJlbl9kKTtcclxuXHJcblx0XHRcdFx0Ly8gdXBkYXRlIG9iamVjdFxyXG5cdFx0XHRcdG9iai5wYXJlbnQgPSBuZXdfcGFyLmlkO1xyXG5cdFx0XHRcdHRtcCA9IG5ld19wYXIucGFyZW50cy5jb25jYXQoKTtcclxuXHRcdFx0XHR0bXAudW5zaGlmdChuZXdfcGFyLmlkKTtcclxuXHRcdFx0XHRwID0gb2JqLnBhcmVudHMubGVuZ3RoO1xyXG5cdFx0XHRcdG9iai5wYXJlbnRzID0gdG1wO1xyXG5cclxuXHRcdFx0XHQvLyB1cGRhdGUgb2JqZWN0IGNoaWxkcmVuXHJcblx0XHRcdFx0dG1wID0gdG1wLmNvbmNhdCgpO1xyXG5cdFx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5jaGlsZHJlbl9kLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0dGhpcy5fbW9kZWwuZGF0YVtvYmouY2hpbGRyZW5fZFtpXV0ucGFyZW50cyA9IHRoaXMuX21vZGVsLmRhdGFbb2JqLmNoaWxkcmVuX2RbaV1dLnBhcmVudHMuc2xpY2UoMCxwKi0xKTtcclxuXHRcdFx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuX21vZGVsLmRhdGFbb2JqLmNoaWxkcmVuX2RbaV1dLnBhcmVudHMsIHRtcCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aGlzLl9ub2RlX2NoYW5nZWQob2xkX3Bhcik7XHJcblx0XHRcdFx0dGhpcy5fbm9kZV9jaGFuZ2VkKG5ld19wYXIuaWQpO1xyXG5cdFx0XHRcdHRoaXMucmVkcmF3KG9sZF9wYXIgPT09ICcjJyB8fCBuZXdfcGFyLmlkID09PSAnIycpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKGNhbGxiYWNrKSB7IGNhbGxiYWNrLmNhbGwodGhpcywgb2JqLCBuZXdfcGFyLCBwb3MpOyB9XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgaXMgbW92ZWRcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIG1vdmVfbm9kZS5qc3RyZWVcclxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGVcclxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHBhcmVudCB0aGUgcGFyZW50J3MgSURcclxuXHRcdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSBhbW9uZyB0aGUgcGFyZW50J3MgY2hpbGRyZW5cclxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IG9sZF9wYXJlbnQgdGhlIG9sZCBwYXJlbnQgb2YgdGhlIG5vZGVcclxuXHRcdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc19tdWx0aSBkbyB0aGUgbm9kZSBhbmQgbmV3IHBhcmVudCBiZWxvbmcgdG8gZGlmZmVyZW50IGluc3RhbmNlc1xyXG5cdFx0XHQgKiBAcGFyYW0ge2pzVHJlZX0gb2xkX2luc3RhbmNlIHRoZSBpbnN0YW5jZSB0aGUgbm9kZSBjYW1lIGZyb21cclxuXHRcdFx0ICogQHBhcmFtIHtqc1RyZWV9IG5ld19pbnN0YW5jZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIG5ldyBwYXJlbnRcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignbW92ZV9ub2RlJywgeyBcIm5vZGVcIiA6IG9iaiwgXCJwYXJlbnRcIiA6IG5ld19wYXIuaWQsIFwicG9zaXRpb25cIiA6IHBvcywgXCJvbGRfcGFyZW50XCIgOiBvbGRfcGFyLCBcImlzX211bHRpXCIgOiBpc19tdWx0aSwgJ29sZF9pbnN0YW5jZScgOiBvbGRfaW5zLCAnbmV3X2luc3RhbmNlJyA6IHRoaXMgfSk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogY29weSBhIG5vZGUgdG8gYSBuZXcgcGFyZW50XHJcblx0XHQgKiBAbmFtZSBjb3B5X25vZGUob2JqLCBwYXIgWywgcG9zLCBjYWxsYmFjaywgaXNfbG9hZGVkXSlcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmogdGhlIG5vZGUgdG8gY29weSwgcGFzcyBhbiBhcnJheSB0byBjb3B5IG11bHRpcGxlIG5vZGVzXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gcGFyIHRoZSBuZXcgcGFyZW50XHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gcG9zIHRoZSBwb3NpdGlvbiB0byBpbnNlcnQgYXQgKFwiZmlyc3RcIiBhbmQgXCJsYXN0XCIgYXJlIHN1cHBvcnRlZCwgYXMgd2VsbCBhcyBcImJlZm9yZVwiIGFuZCBcImFmdGVyXCIpLCBkZWZhdWx0cyB0byBgMGBcclxuXHRcdCAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayBhIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSB0aGUgbW92ZSBpcyBjb21wbGV0ZWQsIHJlY2VpdmVzIDMgYXJndW1lbnRzIC0gdGhlIG5vZGUsIHRoZSBuZXcgcGFyZW50IGFuZCB0aGUgcG9zaXRpb25cclxuXHRcdCAqIEBwYXJhbSAge0Jvb2xlYW59IGludGVybmFsIHBhcmFtZXRlciBpbmRpY2F0aW5nIGlmIHRoZSBwYXJlbnQgbm9kZSBoYXMgYmVlbiBsb2FkZWRcclxuXHRcdCAqIEB0cmlnZ2VyIG1vZGVsLmpzdHJlZSBjb3B5X25vZGUuanN0cmVlXHJcblx0XHQgKi9cclxuXHRcdGNvcHlfbm9kZSA6IGZ1bmN0aW9uIChvYmosIHBhciwgcG9zLCBjYWxsYmFjaywgaXNfbG9hZGVkKSB7XHJcblx0XHRcdHZhciB0MSwgdDIsIGRwYywgdG1wLCBpLCBqLCBub2RlLCBvbGRfcGFyLCBuZXdfcGFyLCBvbGRfaW5zLCBpc19tdWx0aTtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmoucmV2ZXJzZSgpLnNsaWNlKCk7XHJcblx0XHRcdFx0Zm9yKHQxID0gMCwgdDIgPSBvYmoubGVuZ3RoOyB0MSA8IHQyOyB0MSsrKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvcHlfbm9kZShvYmpbdDFdLCBwYXIsIHBvcywgY2FsbGJhY2ssIGlzX2xvYWRlZCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdG9iaiA9IG9iaiAmJiBvYmouaWQgPyBvYmogOiB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdHBhciA9IHRoaXMuZ2V0X25vZGUocGFyKTtcclxuXHRcdFx0cG9zID0gcG9zID09PSB1bmRlZmluZWQgPyAwIDogcG9zO1xyXG5cclxuXHRcdFx0aWYoIXBhciB8fCAhb2JqIHx8IG9iai5pZCA9PT0gJyMnKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHRpZighcG9zLnRvU3RyaW5nKCkubWF0Y2goL14oYmVmb3JlfGFmdGVyKSQvKSAmJiAhaXNfbG9hZGVkICYmICF0aGlzLmlzX2xvYWRlZChwYXIpKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMubG9hZF9ub2RlKHBhciwgZnVuY3Rpb24gKCkgeyB0aGlzLmNvcHlfbm9kZShvYmosIHBhciwgcG9zLCBjYWxsYmFjaywgdHJ1ZSk7IH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRvbGRfcGFyID0gKG9iai5wYXJlbnQgfHwgJyMnKS50b1N0cmluZygpO1xyXG5cdFx0XHRuZXdfcGFyID0gKCFwb3MudG9TdHJpbmcoKS5tYXRjaCgvXihiZWZvcmV8YWZ0ZXIpJC8pIHx8IHBhci5pZCA9PT0gJyMnKSA/IHBhciA6IHRoaXMuZ2V0X25vZGUocGFyLnBhcmVudCk7XHJcblx0XHRcdG9sZF9pbnMgPSB0aGlzLl9tb2RlbC5kYXRhW29iai5pZF0gPyB0aGlzIDogJC5qc3RyZWUucmVmZXJlbmNlKG9iai5pZCk7XHJcblx0XHRcdGlzX211bHRpID0gIW9sZF9pbnMgfHwgIW9sZF9pbnMuX2lkIHx8ICh0aGlzLl9pZCAhPT0gb2xkX2lucy5faWQpO1xyXG5cdFx0XHRpZihuZXdfcGFyLmlkID09PSAnIycpIHtcclxuXHRcdFx0XHRpZihwb3MgPT09IFwiYmVmb3JlXCIpIHsgcG9zID0gXCJmaXJzdFwiOyB9XHJcblx0XHRcdFx0aWYocG9zID09PSBcImFmdGVyXCIpIHsgcG9zID0gXCJsYXN0XCI7IH1cclxuXHRcdFx0fVxyXG5cdFx0XHRzd2l0Y2gocG9zKSB7XHJcblx0XHRcdFx0Y2FzZSBcImJlZm9yZVwiOlxyXG5cdFx0XHRcdFx0cG9zID0gJC5pbkFycmF5KHBhci5pZCwgbmV3X3Bhci5jaGlsZHJlbik7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiYWZ0ZXJcIiA6XHJcblx0XHRcdFx0XHRwb3MgPSAkLmluQXJyYXkocGFyLmlkLCBuZXdfcGFyLmNoaWxkcmVuKSArIDE7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiaW5zaWRlXCI6XHJcblx0XHRcdFx0Y2FzZSBcImZpcnN0XCI6XHJcblx0XHRcdFx0XHRwb3MgPSAwO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcImxhc3RcIjpcclxuXHRcdFx0XHRcdHBvcyA9IG5ld19wYXIuY2hpbGRyZW4ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGlmKCFwb3MpIHsgcG9zID0gMDsgfVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYocG9zID4gbmV3X3Bhci5jaGlsZHJlbi5sZW5ndGgpIHsgcG9zID0gbmV3X3Bhci5jaGlsZHJlbi5sZW5ndGg7IH1cclxuXHRcdFx0aWYoIXRoaXMuY2hlY2soXCJjb3B5X25vZGVcIiwgb2JqLCBuZXdfcGFyLCBwb3MpKSB7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5jb3JlLmVycm9yLmNhbGwodGhpcywgdGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3IpO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRub2RlID0gb2xkX2lucyA/IG9sZF9pbnMuZ2V0X2pzb24ob2JqLCB7IG5vX2lkIDogdHJ1ZSwgbm9fZGF0YSA6IHRydWUsIG5vX3N0YXRlIDogdHJ1ZSB9KSA6IG9iajtcclxuXHRcdFx0aWYoIW5vZGUpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdGlmKG5vZGUuaWQgPT09IHRydWUpIHsgZGVsZXRlIG5vZGUuaWQ7IH1cclxuXHRcdFx0bm9kZSA9IHRoaXMuX3BhcnNlX21vZGVsX2Zyb21fanNvbihub2RlLCBuZXdfcGFyLmlkLCBuZXdfcGFyLnBhcmVudHMuY29uY2F0KCkpO1xyXG5cdFx0XHRpZighbm9kZSkgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShub2RlKTtcclxuXHRcdFx0ZHBjID0gW107XHJcblx0XHRcdGRwYy5wdXNoKG5vZGUpO1xyXG5cdFx0XHRkcGMgPSBkcGMuY29uY2F0KHRtcC5jaGlsZHJlbl9kKTtcclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdtb2RlbCcsIHsgXCJub2Rlc1wiIDogZHBjLCBcInBhcmVudFwiIDogbmV3X3Bhci5pZCB9KTtcclxuXHJcblx0XHRcdC8vIGluc2VydCBpbnRvIG5ldyBwYXJlbnQgYW5kIHVwXHJcblx0XHRcdGZvcihpID0gMCwgaiA9IG5ld19wYXIucGFyZW50cy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHR0aGlzLl9tb2RlbC5kYXRhW25ld19wYXIucGFyZW50c1tpXV0uY2hpbGRyZW5fZCA9IHRoaXMuX21vZGVsLmRhdGFbbmV3X3Bhci5wYXJlbnRzW2ldXS5jaGlsZHJlbl9kLmNvbmNhdChkcGMpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGRwYyA9IFtdO1xyXG5cdFx0XHRmb3IoaSA9IDAsIGogPSBuZXdfcGFyLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdGRwY1tpID49IHBvcyA/IGkrMSA6IGldID0gbmV3X3Bhci5jaGlsZHJlbltpXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRkcGNbcG9zXSA9IHRtcC5pZDtcclxuXHRcdFx0bmV3X3Bhci5jaGlsZHJlbiA9IGRwYztcclxuXHRcdFx0bmV3X3Bhci5jaGlsZHJlbl9kLnB1c2godG1wLmlkKTtcclxuXHRcdFx0bmV3X3Bhci5jaGlsZHJlbl9kID0gbmV3X3Bhci5jaGlsZHJlbl9kLmNvbmNhdCh0bXAuY2hpbGRyZW5fZCk7XHJcblxyXG5cdFx0XHR0aGlzLl9ub2RlX2NoYW5nZWQobmV3X3Bhci5pZCk7XHJcblx0XHRcdHRoaXMucmVkcmF3KG5ld19wYXIuaWQgPT09ICcjJyk7XHJcblx0XHRcdGlmKGNhbGxiYWNrKSB7IGNhbGxiYWNrLmNhbGwodGhpcywgdG1wLCBuZXdfcGFyLCBwb3MpOyB9XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIG5vZGUgaXMgY29waWVkXHJcblx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHQgKiBAbmFtZSBjb3B5X25vZGUuanN0cmVlXHJcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIHRoZSBjb3BpZWQgbm9kZVxyXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3JpZ2luYWwgdGhlIG9yaWdpbmFsIG5vZGVcclxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHBhcmVudCB0aGUgcGFyZW50J3MgSURcclxuXHRcdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSBhbW9uZyB0aGUgcGFyZW50J3MgY2hpbGRyZW5cclxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IG9sZF9wYXJlbnQgdGhlIG9sZCBwYXJlbnQgb2YgdGhlIG5vZGVcclxuXHRcdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc19tdWx0aSBkbyB0aGUgbm9kZSBhbmQgbmV3IHBhcmVudCBiZWxvbmcgdG8gZGlmZmVyZW50IGluc3RhbmNlc1xyXG5cdFx0XHQgKiBAcGFyYW0ge2pzVHJlZX0gb2xkX2luc3RhbmNlIHRoZSBpbnN0YW5jZSB0aGUgbm9kZSBjYW1lIGZyb21cclxuXHRcdFx0ICogQHBhcmFtIHtqc1RyZWV9IG5ld19pbnN0YW5jZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIG5ldyBwYXJlbnRcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignY29weV9ub2RlJywgeyBcIm5vZGVcIiA6IHRtcCwgXCJvcmlnaW5hbFwiIDogb2JqLCBcInBhcmVudFwiIDogbmV3X3Bhci5pZCwgXCJwb3NpdGlvblwiIDogcG9zLCBcIm9sZF9wYXJlbnRcIiA6IG9sZF9wYXIsIFwiaXNfbXVsdGlcIiA6IGlzX211bHRpLCAnb2xkX2luc3RhbmNlJyA6IG9sZF9pbnMsICduZXdfaW5zdGFuY2UnIDogdGhpcyB9KTtcclxuXHRcdFx0cmV0dXJuIHRtcC5pZDtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGN1dCBhIG5vZGUgKGEgbGF0ZXIgY2FsbCB0byBgcGFzdGUob2JqKWAgd291bGQgbW92ZSB0aGUgbm9kZSlcclxuXHRcdCAqIEBuYW1lIGN1dChvYmopXHJcblx0XHQgKiBAcGFyYW0gIHttaXhlZH0gb2JqIG11bHRpcGxlIG9iamVjdHMgY2FuIGJlIHBhc3NlZCB1c2luZyBhbiBhcnJheVxyXG5cdFx0ICogQHRyaWdnZXIgY3V0LmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRjdXQgOiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdGlmKCFvYmopIHsgb2JqID0gdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmNvbmNhdCgpOyB9XHJcblx0XHRcdGlmKCEkLmlzQXJyYXkob2JqKSkgeyBvYmogPSBbb2JqXTsgfVxyXG5cdFx0XHRpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0dmFyIHRtcCA9IFtdLCBvLCB0MSwgdDI7XHJcblx0XHRcdGZvcih0MSA9IDAsIHQyID0gb2JqLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xyXG5cdFx0XHRcdG8gPSB0aGlzLmdldF9ub2RlKG9ialt0MV0pO1xyXG5cdFx0XHRcdGlmKG8gJiYgby5pZCAmJiBvLmlkICE9PSAnIycpIHsgdG1wLnB1c2gobyk7IH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZighdG1wLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0Y2NwX25vZGUgPSB0bXA7XHJcblx0XHRcdGNjcF9pbnN0ID0gdGhpcztcclxuXHRcdFx0Y2NwX21vZGUgPSAnbW92ZV9ub2RlJztcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIG5vZGVzIGFyZSBhZGRlZCB0byB0aGUgYnVmZmVyIGZvciBtb3ZpbmdcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIGN1dC5qc3RyZWVcclxuXHRcdFx0ICogQHBhcmFtIHtBcnJheX0gbm9kZVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdjdXQnLCB7IFwibm9kZVwiIDogb2JqIH0pO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogY29weSBhIG5vZGUgKGEgbGF0ZXIgY2FsbCB0byBgcGFzdGUob2JqKWAgd291bGQgY29weSB0aGUgbm9kZSlcclxuXHRcdCAqIEBuYW1lIGNvcHkob2JqKVxyXG5cdFx0ICogQHBhcmFtICB7bWl4ZWR9IG9iaiBtdWx0aXBsZSBvYmplY3RzIGNhbiBiZSBwYXNzZWQgdXNpbmcgYW4gYXJyYXlcclxuXHRcdCAqIEB0cmlnZ2VyIGNvcHkuanN0cmVcclxuXHRcdCAqL1xyXG5cdFx0Y29weSA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0aWYoIW9iaikgeyBvYmogPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQuY29uY2F0KCk7IH1cclxuXHRcdFx0aWYoISQuaXNBcnJheShvYmopKSB7IG9iaiA9IFtvYmpdOyB9XHJcblx0XHRcdGlmKCFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHR2YXIgdG1wID0gW10sIG8sIHQxLCB0MjtcclxuXHRcdFx0Zm9yKHQxID0gMCwgdDIgPSBvYmoubGVuZ3RoOyB0MSA8IHQyOyB0MSsrKSB7XHJcblx0XHRcdFx0byA9IHRoaXMuZ2V0X25vZGUob2JqW3QxXSk7XHJcblx0XHRcdFx0aWYobyAmJiBvLmlkICYmIG8uaWQgIT09ICcjJykgeyB0bXAucHVzaChvKTsgfVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCF0bXAubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHRjY3Bfbm9kZSA9IHRtcDtcclxuXHRcdFx0Y2NwX2luc3QgPSB0aGlzO1xyXG5cdFx0XHRjY3BfbW9kZSA9ICdjb3B5X25vZGUnO1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gbm9kZXMgYXJlIGFkZGVkIHRvIHRoZSBidWZmZXIgZm9yIGNvcHlpbmdcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIGNvcHkuanN0cmVlXHJcblx0XHRcdCAqIEBwYXJhbSB7QXJyYXl9IG5vZGVcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignY29weScsIHsgXCJub2RlXCIgOiBvYmogfSk7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBnZXQgdGhlIGN1cnJlbnQgYnVmZmVyIChhbnkgbm9kZXMgdGhhdCBhcmUgd2FpdGluZyBmb3IgYSBwYXN0ZSBvcGVyYXRpb24pXHJcblx0XHQgKiBAbmFtZSBnZXRfYnVmZmVyKClcclxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gYW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYG1vZGVgIChcImNvcHlfbm9kZVwiIG9yIFwibW92ZV9ub2RlXCIpLCBgbm9kZWAgKGFuIGFycmF5IG9mIG9iamVjdHMpIGFuZCBgaW5zdGAgKHRoZSBpbnN0YW5jZSlcclxuXHRcdCAqL1xyXG5cdFx0Z2V0X2J1ZmZlciA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIHsgJ21vZGUnIDogY2NwX21vZGUsICdub2RlJyA6IGNjcF9ub2RlLCAnaW5zdCcgOiBjY3BfaW5zdCB9O1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogY2hlY2sgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgdG8gcGFzdGVcclxuXHRcdCAqIEBuYW1lIGNhbl9wYXN0ZSgpXHJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRjYW5fcGFzdGUgOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBjY3BfbW9kZSAhPT0gZmFsc2UgJiYgY2NwX25vZGUgIT09IGZhbHNlOyAvLyAmJiBjY3BfaW5zdC5fbW9kZWwuZGF0YVtjY3Bfbm9kZV07XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBjb3B5IG9yIG1vdmUgdGhlIHByZXZpb3VzbHkgY3V0IG9yIGNvcGllZCBub2RlcyB0byBhIG5ldyBwYXJlbnRcclxuXHRcdCAqIEBuYW1lIHBhc3RlKG9iailcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmogdGhlIG5ldyBwYXJlbnRcclxuXHRcdCAqIEB0cmlnZ2VyIHBhc3RlLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRwYXN0ZSA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZighb2JqIHx8ICFjY3BfbW9kZSB8fCAhY2NwX21vZGUubWF0Y2goL14oY29weV9ub2RlfG1vdmVfbm9kZSkkLykgfHwgIWNjcF9ub2RlKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHRpZih0aGlzW2NjcF9tb2RlXShjY3Bfbm9kZSwgb2JqKSkge1xyXG5cdFx0XHRcdC8qKlxyXG5cdFx0XHRcdCAqIHRyaWdnZXJlZCB3aGVuIHBhc3RlIGlzIGludm9rZWRcclxuXHRcdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0XHQgKiBAbmFtZSBwYXN0ZS5qc3RyZWVcclxuXHRcdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gcGFyZW50IHRoZSBJRCBvZiB0aGUgcmVjZWl2aW5nIG5vZGVcclxuXHRcdFx0XHQgKiBAcGFyYW0ge0FycmF5fSBub2RlIHRoZSBub2RlcyBpbiB0aGUgYnVmZmVyXHJcblx0XHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIHBlcmZvcm1lZCBvcGVyYXRpb24gLSBcImNvcHlfbm9kZVwiIG9yIFwibW92ZV9ub2RlXCJcclxuXHRcdFx0XHQgKi9cclxuXHRcdFx0XHR0aGlzLnRyaWdnZXIoJ3Bhc3RlJywgeyBcInBhcmVudFwiIDogb2JqLmlkLCBcIm5vZGVcIiA6IGNjcF9ub2RlLCBcIm1vZGVcIiA6IGNjcF9tb2RlIH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNjcF9ub2RlID0gZmFsc2U7XHJcblx0XHRcdGNjcF9tb2RlID0gZmFsc2U7XHJcblx0XHRcdGNjcF9pbnN0ID0gZmFsc2U7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBwdXQgYSBub2RlIGluIGVkaXQgbW9kZSAoaW5wdXQgZmllbGQgdG8gcmVuYW1lIHRoZSBub2RlKVxyXG5cdFx0ICogQG5hbWUgZWRpdChvYmogWywgZGVmYXVsdF90ZXh0XSlcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmpcclxuXHRcdCAqIEBwYXJhbSAge1N0cmluZ30gZGVmYXVsdF90ZXh0IHRoZSB0ZXh0IHRvIHBvcHVsYXRlIHRoZSBpbnB1dCB3aXRoIChpZiBvbWl0dGVkIHRoZSBub2RlIHRleHQgdmFsdWUgaXMgdXNlZClcclxuXHRcdCAqL1xyXG5cdFx0ZWRpdCA6IGZ1bmN0aW9uIChvYmosIGRlZmF1bHRfdGV4dCkge1xyXG5cdFx0XHRvYmogPSB0aGlzLl9vcGVuX3RvKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdHZhciBydGwgPSB0aGlzLl9kYXRhLmNvcmUucnRsLFxyXG5cdFx0XHRcdHcgID0gdGhpcy5lbGVtZW50LndpZHRoKCksXHJcblx0XHRcdFx0YSAgPSBvYmouY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJyksXHJcblx0XHRcdFx0cyAgPSAkKCc8c3Bhbj4nKSxcclxuXHRcdFx0XHQvKiFcclxuXHRcdFx0XHRvaSA9IG9iai5jaGlsZHJlbihcImk6dmlzaWJsZVwiKSxcclxuXHRcdFx0XHRhaSA9IGEuY2hpbGRyZW4oXCJpOnZpc2libGVcIiksXHJcblx0XHRcdFx0dzEgPSBvaS53aWR0aCgpICogb2kubGVuZ3RoLFxyXG5cdFx0XHRcdHcyID0gYWkud2lkdGgoKSAqIGFpLmxlbmd0aCxcclxuXHRcdFx0XHQqL1xyXG5cdFx0XHRcdHQgID0gdHlwZW9mIGRlZmF1bHRfdGV4dCA9PT0gJ3N0cmluZycgPyBkZWZhdWx0X3RleHQgOiB0aGlzLmdldF90ZXh0KG9iaiksXHJcblx0XHRcdFx0aDEgPSAkKFwiPFwiK1wiZGl2IC8+XCIsIHsgY3NzIDogeyBcInBvc2l0aW9uXCIgOiBcImFic29sdXRlXCIsIFwidG9wXCIgOiBcIi0yMDBweFwiLCBcImxlZnRcIiA6IChydGwgPyBcIjBweFwiIDogXCItMTAwMHB4XCIpLCBcInZpc2liaWxpdHlcIiA6IFwiaGlkZGVuXCIgfSB9KS5hcHBlbmRUbyhcImJvZHlcIiksXHJcblx0XHRcdFx0aDIgPSAkKFwiPFwiK1wiaW5wdXQgLz5cIiwge1xyXG5cdFx0XHRcdFx0XHRcInZhbHVlXCIgOiB0LFxyXG5cdFx0XHRcdFx0XHRcImNsYXNzXCIgOiBcImpzdHJlZS1yZW5hbWUtaW5wdXRcIixcclxuXHRcdFx0XHRcdFx0Ly8gXCJzaXplXCIgOiB0Lmxlbmd0aCxcclxuXHRcdFx0XHRcdFx0XCJjc3NcIiA6IHtcclxuXHRcdFx0XHRcdFx0XHRcInBhZGRpbmdcIiA6IFwiMFwiLFxyXG5cdFx0XHRcdFx0XHRcdFwiYm9yZGVyXCIgOiBcIjFweCBzb2xpZCBzaWx2ZXJcIixcclxuXHRcdFx0XHRcdFx0XHRcImJveC1zaXppbmdcIiA6IFwiYm9yZGVyLWJveFwiLFxyXG5cdFx0XHRcdFx0XHRcdFwiZGlzcGxheVwiIDogXCJpbmxpbmUtYmxvY2tcIixcclxuXHRcdFx0XHRcdFx0XHRcImhlaWdodFwiIDogKHRoaXMuX2RhdGEuY29yZS5saV9oZWlnaHQpICsgXCJweFwiLFxyXG5cdFx0XHRcdFx0XHRcdFwibGluZUhlaWdodFwiIDogKHRoaXMuX2RhdGEuY29yZS5saV9oZWlnaHQpICsgXCJweFwiLFxyXG5cdFx0XHRcdFx0XHRcdFwid2lkdGhcIiA6IFwiMTUwcHhcIiAvLyB3aWxsIGJlIHNldCBhIGJpdCBmdXJ0aGVyIGRvd25cclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XCJibHVyXCIgOiAkLnByb3h5KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgaSA9IHMuY2hpbGRyZW4oXCIuanN0cmVlLXJlbmFtZS1pbnB1dFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdHYgPSBpLnZhbCgpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKHYgPT09IFwiXCIpIHsgdiA9IHQ7IH1cclxuXHRcdFx0XHRcdFx0XHRoMS5yZW1vdmUoKTtcclxuXHRcdFx0XHRcdFx0XHRzLnJlcGxhY2VXaXRoKGEpO1xyXG5cdFx0XHRcdFx0XHRcdHMucmVtb3ZlKCk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zZXRfdGV4dChvYmosIHQpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMucmVuYW1lX25vZGUob2JqLCB2KSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc2V0X3RleHQob2JqLCB0KTsgLy8gbW92ZSB0aGlzIHVwPyBhbmQgZml4ICM0ODNcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0sIHRoaXMpLFxyXG5cdFx0XHRcdFx0XHRcImtleWRvd25cIiA6IGZ1bmN0aW9uIChldmVudCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBrZXkgPSBldmVudC53aGljaDtcclxuXHRcdFx0XHRcdFx0XHRpZihrZXkgPT09IDI3KSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnZhbHVlID0gdDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYoa2V5ID09PSAyNyB8fCBrZXkgPT09IDEzIHx8IGtleSA9PT0gMzcgfHwga2V5ID09PSAzOCB8fCBrZXkgPT09IDM5IHx8IGtleSA9PT0gNDAgfHwga2V5ID09PSAzMikge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGlmKGtleSA9PT0gMjcgfHwga2V5ID09PSAxMykge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYmx1cigpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XCJjbGlja1wiIDogZnVuY3Rpb24gKGUpIHsgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsgfSxcclxuXHRcdFx0XHRcdFx0XCJtb3VzZWRvd25cIiA6IGZ1bmN0aW9uIChlKSB7IGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IH0sXHJcblx0XHRcdFx0XHRcdFwia2V5dXBcIiA6IGZ1bmN0aW9uIChldmVudCkge1xyXG5cdFx0XHRcdFx0XHRcdGgyLndpZHRoKE1hdGgubWluKGgxLnRleHQoXCJwV1wiICsgdGhpcy52YWx1ZSkud2lkdGgoKSx3KSk7XHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFwia2V5cHJlc3NcIiA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0aWYoZXZlbnQud2hpY2ggPT09IDEzKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHRmbiA9IHtcclxuXHRcdFx0XHRcdFx0Zm9udEZhbWlseVx0XHQ6IGEuY3NzKCdmb250RmFtaWx5JylcdFx0fHwgJycsXHJcblx0XHRcdFx0XHRcdGZvbnRTaXplXHRcdDogYS5jc3MoJ2ZvbnRTaXplJylcdFx0XHR8fCAnJyxcclxuXHRcdFx0XHRcdFx0Zm9udFdlaWdodFx0XHQ6IGEuY3NzKCdmb250V2VpZ2h0JylcdFx0fHwgJycsXHJcblx0XHRcdFx0XHRcdGZvbnRTdHlsZVx0XHQ6IGEuY3NzKCdmb250U3R5bGUnKVx0XHR8fCAnJyxcclxuXHRcdFx0XHRcdFx0Zm9udFN0cmV0Y2hcdFx0OiBhLmNzcygnZm9udFN0cmV0Y2gnKVx0XHR8fCAnJyxcclxuXHRcdFx0XHRcdFx0Zm9udFZhcmlhbnRcdFx0OiBhLmNzcygnZm9udFZhcmlhbnQnKVx0XHR8fCAnJyxcclxuXHRcdFx0XHRcdFx0bGV0dGVyU3BhY2luZ1x0OiBhLmNzcygnbGV0dGVyU3BhY2luZycpXHR8fCAnJyxcclxuXHRcdFx0XHRcdFx0d29yZFNwYWNpbmdcdFx0OiBhLmNzcygnd29yZFNwYWNpbmcnKVx0XHR8fCAnJ1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdHRoaXMuc2V0X3RleHQob2JqLCBcIlwiKTtcclxuXHRcdFx0cy5hdHRyKCdjbGFzcycsIGEuYXR0cignY2xhc3MnKSkuYXBwZW5kKGEuY29udGVudHMoKS5jbG9uZSgpKS5hcHBlbmQoaDIpO1xyXG5cdFx0XHRhLnJlcGxhY2VXaXRoKHMpO1xyXG5cdFx0XHRoMS5jc3MoZm4pO1xyXG5cdFx0XHRoMi5jc3MoZm4pLndpZHRoKE1hdGgubWluKGgxLnRleHQoXCJwV1wiICsgaDJbMF0udmFsdWUpLndpZHRoKCksdykpWzBdLnNlbGVjdCgpO1xyXG5cdFx0fSxcclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBjaGFuZ2VzIHRoZSB0aGVtZVxyXG5cdFx0ICogQG5hbWUgc2V0X3RoZW1lKHRoZW1lX25hbWUgWywgdGhlbWVfdXJsXSlcclxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB0aGVtZV9uYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgdGhlbWUgdG8gYXBwbHlcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IHRoZW1lX3VybCAgdGhlIGxvY2F0aW9uIG9mIHRoZSBDU1MgZmlsZSBmb3IgdGhpcyB0aGVtZS4gT21pdCBvciBzZXQgdG8gYGZhbHNlYCBpZiB5b3UgbWFudWFsbHkgaW5jbHVkZWQgdGhlIGZpbGUuIFNldCB0byBgdHJ1ZWAgdG8gYXV0b2xvYWQgZnJvbSB0aGUgYGNvcmUudGhlbWVzLmRpcmAgZGlyZWN0b3J5LlxyXG5cdFx0ICogQHRyaWdnZXIgc2V0X3RoZW1lLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHRzZXRfdGhlbWUgOiBmdW5jdGlvbiAodGhlbWVfbmFtZSwgdGhlbWVfdXJsKSB7XHJcblx0XHRcdGlmKCF0aGVtZV9uYW1lKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHRpZih0aGVtZV91cmwgPT09IHRydWUpIHtcclxuXHRcdFx0XHR2YXIgZGlyID0gdGhpcy5zZXR0aW5ncy5jb3JlLnRoZW1lcy5kaXI7XHJcblx0XHRcdFx0aWYoIWRpcikgeyBkaXIgPSAkLmpzdHJlZS5wYXRoICsgJy90aGVtZXMnOyB9XHJcblx0XHRcdFx0dGhlbWVfdXJsID0gZGlyICsgJy8nICsgdGhlbWVfbmFtZSArICcvc3R5bGUuY3NzJztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZih0aGVtZV91cmwgJiYgJC5pbkFycmF5KHRoZW1lX3VybCwgdGhlbWVzX2xvYWRlZCkgPT09IC0xKSB7XHJcblx0XHRcdFx0JCgnaGVhZCcpLmFwcGVuZCgnPCcrJ2xpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCInICsgdGhlbWVfdXJsICsgJ1wiIHR5cGU9XCJ0ZXh0L2Nzc1wiIC8+Jyk7XHJcblx0XHRcdFx0dGhlbWVzX2xvYWRlZC5wdXNoKHRoZW1lX3VybCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYodGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5uYW1lKSB7XHJcblx0XHRcdFx0dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCdqc3RyZWUtJyArIHRoaXMuX2RhdGEuY29yZS50aGVtZXMubmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5uYW1lID0gdGhlbWVfbmFtZTtcclxuXHRcdFx0dGhpcy5lbGVtZW50LmFkZENsYXNzKCdqc3RyZWUtJyArIHRoZW1lX25hbWUpO1xyXG5cdFx0XHR0aGlzLmVsZW1lbnRbdGhpcy5zZXR0aW5ncy5jb3JlLnRoZW1lcy5yZXNwb25zaXZlID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcycgXSgnanN0cmVlLScgKyB0aGVtZV9uYW1lICsgJy1yZXNwb25zaXZlJyk7XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiB0cmlnZ2VyZWQgd2hlbiBhIHRoZW1lIGlzIHNldFxyXG5cdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0ICogQG5hbWUgc2V0X3RoZW1lLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdGhlbWUgdGhlIG5ldyB0aGVtZVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdzZXRfdGhlbWUnLCB7ICd0aGVtZScgOiB0aGVtZV9uYW1lIH0pO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0cyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFwcGxpZWQgdGhlbWUgbmFtZVxyXG5cdFx0ICogQG5hbWUgZ2V0X3RoZW1lKClcclxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0Z2V0X3RoZW1lIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5uYW1lOyB9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBjaGFuZ2VzIHRoZSB0aGVtZSB2YXJpYW50IChpZiB0aGUgdGhlbWUgaGFzIHZhcmlhbnRzKVxyXG5cdFx0ICogQG5hbWUgc2V0X3RoZW1lX3ZhcmlhbnQodmFyaWFudF9uYW1lKVxyXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd8Qm9vbGVhbn0gdmFyaWFudF9uYW1lIHRoZSB2YXJpYW50IHRvIGFwcGx5IChpZiBgZmFsc2VgIGlzIHVzZWQgdGhlIGN1cnJlbnQgdmFyaWFudCBpcyByZW1vdmVkKVxyXG5cdFx0ICovXHJcblx0XHRzZXRfdGhlbWVfdmFyaWFudCA6IGZ1bmN0aW9uICh2YXJpYW50X25hbWUpIHtcclxuXHRcdFx0aWYodGhpcy5fZGF0YS5jb3JlLnRoZW1lcy52YXJpYW50KSB7XHJcblx0XHRcdFx0dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCdqc3RyZWUtJyArIHRoaXMuX2RhdGEuY29yZS50aGVtZXMubmFtZSArICctJyArIHRoaXMuX2RhdGEuY29yZS50aGVtZXMudmFyaWFudCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5fZGF0YS5jb3JlLnRoZW1lcy52YXJpYW50ID0gdmFyaWFudF9uYW1lO1xyXG5cdFx0XHRpZih2YXJpYW50X25hbWUpIHtcclxuXHRcdFx0XHR0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoJ2pzdHJlZS0nICsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5uYW1lICsgJy0nICsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy52YXJpYW50KTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogZ2V0cyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFwcGxpZWQgdGhlbWUgdmFyaWFudFxyXG5cdFx0ICogQG5hbWUgZ2V0X3RoZW1lKClcclxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0Z2V0X3RoZW1lX3ZhcmlhbnQgOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLnZhcmlhbnQ7IH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHNob3dzIGEgc3RyaXBlZCBiYWNrZ3JvdW5kIG9uIHRoZSBjb250YWluZXIgKGlmIHRoZSB0aGVtZSBzdXBwb3J0cyBpdClcclxuXHRcdCAqIEBuYW1lIHNob3dfc3RyaXBlcygpXHJcblx0XHQgKi9cclxuXHRcdHNob3dfc3RyaXBlcyA6IGZ1bmN0aW9uICgpIHsgdGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5zdHJpcGVzID0gdHJ1ZTsgdGhpcy5nZXRfY29udGFpbmVyX3VsKCkuYWRkQ2xhc3MoXCJqc3RyZWUtc3RyaXBlZFwiKTsgfSxcclxuXHRcdC8qKlxyXG5cdFx0ICogaGlkZXMgdGhlIHN0cmlwZWQgYmFja2dyb3VuZCBvbiB0aGUgY29udGFpbmVyXHJcblx0XHQgKiBAbmFtZSBoaWRlX3N0cmlwZXMoKVxyXG5cdFx0ICovXHJcblx0XHRoaWRlX3N0cmlwZXMgOiBmdW5jdGlvbiAoKSB7IHRoaXMuX2RhdGEuY29yZS50aGVtZXMuc3RyaXBlcyA9IGZhbHNlOyB0aGlzLmdldF9jb250YWluZXJfdWwoKS5yZW1vdmVDbGFzcyhcImpzdHJlZS1zdHJpcGVkXCIpOyB9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiB0b2dnbGVzIHRoZSBzdHJpcGVkIGJhY2tncm91bmQgb24gdGhlIGNvbnRhaW5lclxyXG5cdFx0ICogQG5hbWUgdG9nZ2xlX3N0cmlwZXMoKVxyXG5cdFx0ICovXHJcblx0XHR0b2dnbGVfc3RyaXBlcyA6IGZ1bmN0aW9uICgpIHsgaWYodGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5zdHJpcGVzKSB7IHRoaXMuaGlkZV9zdHJpcGVzKCk7IH0gZWxzZSB7IHRoaXMuc2hvd19zdHJpcGVzKCk7IH0gfSxcclxuXHRcdC8qKlxyXG5cdFx0ICogc2hvd3MgdGhlIGNvbm5lY3RpbmcgZG90cyAoaWYgdGhlIHRoZW1lIHN1cHBvcnRzIGl0KVxyXG5cdFx0ICogQG5hbWUgc2hvd19kb3RzKClcclxuXHRcdCAqL1xyXG5cdFx0c2hvd19kb3RzIDogZnVuY3Rpb24gKCkgeyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmRvdHMgPSB0cnVlOyB0aGlzLmdldF9jb250YWluZXJfdWwoKS5yZW1vdmVDbGFzcyhcImpzdHJlZS1uby1kb3RzXCIpOyB9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBoaWRlcyB0aGUgY29ubmVjdGluZyBkb3RzXHJcblx0XHQgKiBAbmFtZSBoaWRlX2RvdHMoKVxyXG5cdFx0ICovXHJcblx0XHRoaWRlX2RvdHMgOiBmdW5jdGlvbiAoKSB7IHRoaXMuX2RhdGEuY29yZS50aGVtZXMuZG90cyA9IGZhbHNlOyB0aGlzLmdldF9jb250YWluZXJfdWwoKS5hZGRDbGFzcyhcImpzdHJlZS1uby1kb3RzXCIpOyB9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiB0b2dnbGVzIHRoZSBjb25uZWN0aW5nIGRvdHNcclxuXHRcdCAqIEBuYW1lIHRvZ2dsZV9kb3RzKClcclxuXHRcdCAqL1xyXG5cdFx0dG9nZ2xlX2RvdHMgOiBmdW5jdGlvbiAoKSB7IGlmKHRoaXMuX2RhdGEuY29yZS50aGVtZXMuZG90cykgeyB0aGlzLmhpZGVfZG90cygpOyB9IGVsc2UgeyB0aGlzLnNob3dfZG90cygpOyB9IH0sXHJcblx0XHQvKipcclxuXHRcdCAqIHNob3cgdGhlIG5vZGUgaWNvbnNcclxuXHRcdCAqIEBuYW1lIHNob3dfaWNvbnMoKVxyXG5cdFx0ICovXHJcblx0XHRzaG93X2ljb25zIDogZnVuY3Rpb24gKCkgeyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmljb25zID0gdHJ1ZTsgdGhpcy5nZXRfY29udGFpbmVyX3VsKCkucmVtb3ZlQ2xhc3MoXCJqc3RyZWUtbm8taWNvbnNcIik7IH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGhpZGUgdGhlIG5vZGUgaWNvbnNcclxuXHRcdCAqIEBuYW1lIGhpZGVfaWNvbnMoKVxyXG5cdFx0ICovXHJcblx0XHRoaWRlX2ljb25zIDogZnVuY3Rpb24gKCkgeyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmljb25zID0gZmFsc2U7IHRoaXMuZ2V0X2NvbnRhaW5lcl91bCgpLmFkZENsYXNzKFwianN0cmVlLW5vLWljb25zXCIpOyB9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiB0b2dnbGUgdGhlIG5vZGUgaWNvbnNcclxuXHRcdCAqIEBuYW1lIHRvZ2dsZV9pY29ucygpXHJcblx0XHQgKi9cclxuXHRcdHRvZ2dsZV9pY29ucyA6IGZ1bmN0aW9uICgpIHsgaWYodGhpcy5fZGF0YS5jb3JlLnRoZW1lcy5pY29ucykgeyB0aGlzLmhpZGVfaWNvbnMoKTsgfSBlbHNlIHsgdGhpcy5zaG93X2ljb25zKCk7IH0gfSxcclxuXHRcdC8qKlxyXG5cdFx0ICogc2V0IHRoZSBub2RlIGljb24gZm9yIGEgbm9kZVxyXG5cdFx0ICogQG5hbWUgc2V0X2ljb24ob2JqLCBpY29uKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqXHJcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gaWNvbiB0aGUgbmV3IGljb24gLSBjYW4gYmUgYSBwYXRoIHRvIGFuIGljb24gb3IgYSBjbGFzc05hbWUsIGlmIHVzaW5nIGFuIGltYWdlIHRoYXQgaXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVzZSBhIGAuL2AgcHJlZml4LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZXRlY3RlZCBhcyBhIGNsYXNzXHJcblx0XHQgKi9cclxuXHRcdHNldF9pY29uIDogZnVuY3Rpb24gKG9iaiwgaWNvbikge1xyXG5cdFx0XHR2YXIgdDEsIHQyLCBkb20sIG9sZDtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuc2V0X2ljb24ob2JqW3QxXSwgaWNvbik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcclxuXHRcdFx0aWYoIW9iaiB8fCBvYmouaWQgPT09ICcjJykgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0b2xkID0gb2JqLmljb247XHJcblx0XHRcdG9iai5pY29uID0gaWNvbjtcclxuXHRcdFx0ZG9tID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpLmNoaWxkcmVuKFwiLmpzdHJlZS1hbmNob3JcIikuY2hpbGRyZW4oXCIuanN0cmVlLXRoZW1laWNvblwiKTtcclxuXHRcdFx0aWYoaWNvbiA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHR0aGlzLmhpZGVfaWNvbihvYmopO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYoaWNvbiA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdGRvbS5yZW1vdmVDbGFzcygnanN0cmVlLXRoZW1laWNvbi1jdXN0b20gJyArIG9sZCkuY3NzKFwiYmFja2dyb3VuZFwiLFwiXCIpLnJlbW92ZUF0dHIoXCJyZWxcIik7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSBpZihpY29uLmluZGV4T2YoXCIvXCIpID09PSAtMSAmJiBpY29uLmluZGV4T2YoXCIuXCIpID09PSAtMSkge1xyXG5cdFx0XHRcdGRvbS5yZW1vdmVDbGFzcyhvbGQpLmNzcyhcImJhY2tncm91bmRcIixcIlwiKTtcclxuXHRcdFx0XHRkb20uYWRkQ2xhc3MoaWNvbiArICcganN0cmVlLXRoZW1laWNvbi1jdXN0b20nKS5hdHRyKFwicmVsXCIsaWNvbik7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0ZG9tLnJlbW92ZUNsYXNzKG9sZCkuY3NzKFwiYmFja2dyb3VuZFwiLFwiXCIpO1xyXG5cdFx0XHRcdGRvbS5hZGRDbGFzcygnanN0cmVlLXRoZW1laWNvbi1jdXN0b20nKS5jc3MoXCJiYWNrZ3JvdW5kXCIsIFwidXJsKCdcIiArIGljb24gKyBcIicpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0XCIpLmF0dHIoXCJyZWxcIixpY29uKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGdldCB0aGUgbm9kZSBpY29uIGZvciBhIG5vZGVcclxuXHRcdCAqIEBuYW1lIGdldF9pY29uKG9iailcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9ialxyXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRnZXRfaWNvbiA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRyZXR1cm4gKCFvYmogfHwgb2JqLmlkID09PSAnIycpID8gZmFsc2UgOiBvYmouaWNvbjtcclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIGhpZGUgdGhlIGljb24gb24gYW4gaW5kaXZpZHVhbCBub2RlXHJcblx0XHQgKiBAbmFtZSBoaWRlX2ljb24ob2JqKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqXHJcblx0XHQgKi9cclxuXHRcdGhpZGVfaWNvbiA6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0dmFyIHQxLCB0MjtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuaGlkZV9pY29uKG9ialt0MV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgb2JqID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdG9iai5pY29uID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKS5jaGlsZHJlbihcImFcIikuY2hpbGRyZW4oXCIuanN0cmVlLXRoZW1laWNvblwiKS5hZGRDbGFzcygnanN0cmVlLXRoZW1laWNvbi1oaWRkZW4nKTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9LFxyXG5cdFx0LyoqXHJcblx0XHQgKiBzaG93IHRoZSBpY29uIG9uIGFuIGluZGl2aWR1YWwgbm9kZVxyXG5cdFx0ICogQG5hbWUgc2hvd19pY29uKG9iailcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9ialxyXG5cdFx0ICovXHJcblx0XHRzaG93X2ljb24gOiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdHZhciB0MSwgdDIsIGRvbTtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuc2hvd19pY29uKG9ialt0MV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgb2JqID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdGRvbSA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKTtcclxuXHRcdFx0b2JqLmljb24gPSBkb20ubGVuZ3RoID8gZG9tLmNoaWxkcmVuKFwiYVwiKS5jaGlsZHJlbihcIi5qc3RyZWUtdGhlbWVpY29uXCIpLmF0dHIoJ3JlbCcpIDogdHJ1ZTtcclxuXHRcdFx0aWYoIW9iai5pY29uKSB7IG9iai5pY29uID0gdHJ1ZTsgfVxyXG5cdFx0XHRkb20uY2hpbGRyZW4oXCJhXCIpLmNoaWxkcmVuKFwiLmpzdHJlZS10aGVtZWljb25cIikucmVtb3ZlQ2xhc3MoJ2pzdHJlZS10aGVtZWljb24taGlkZGVuJyk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8vIGhlbHBlcnNcclxuXHQkLnZha2F0YSA9IHt9O1xyXG5cdC8vIHJldmVyc2VcclxuXHQkLmZuLnZha2F0YV9yZXZlcnNlID0gW10ucmV2ZXJzZTtcclxuXHQvLyBjb2xsZWN0IGF0dHJpYnV0ZXNcclxuXHQkLnZha2F0YS5hdHRyaWJ1dGVzID0gZnVuY3Rpb24obm9kZSwgd2l0aF92YWx1ZXMpIHtcclxuXHRcdG5vZGUgPSAkKG5vZGUpWzBdO1xyXG5cdFx0dmFyIGF0dHIgPSB3aXRoX3ZhbHVlcyA/IHt9IDogW107XHJcblx0XHRpZihub2RlICYmIG5vZGUuYXR0cmlidXRlcykge1xyXG5cdFx0XHQkLmVhY2gobm9kZS5hdHRyaWJ1dGVzLCBmdW5jdGlvbiAoaSwgdikge1xyXG5cdFx0XHRcdGlmKCQuaW5BcnJheSh2Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksWydzdHlsZScsJ2NvbnRlbnRlZGl0YWJsZScsJ2hhc2ZvY3VzJywndGFiaW5kZXgnXSkgIT09IC0xKSB7IHJldHVybjsgfVxyXG5cdFx0XHRcdGlmKHYubm9kZVZhbHVlICE9PSBudWxsICYmICQudHJpbSh2Lm5vZGVWYWx1ZSkgIT09ICcnKSB7XHJcblx0XHRcdFx0XHRpZih3aXRoX3ZhbHVlcykgeyBhdHRyW3Yubm9kZU5hbWVdID0gdi5ub2RlVmFsdWU7IH1cclxuXHRcdFx0XHRcdGVsc2UgeyBhdHRyLnB1c2godi5ub2RlTmFtZSk7IH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGF0dHI7XHJcblx0fTtcclxuXHQkLnZha2F0YS5hcnJheV91bmlxdWUgPSBmdW5jdGlvbihhcnJheSkge1xyXG5cdFx0dmFyIGEgPSBbXSwgaSwgaiwgbDtcclxuXHRcdGZvcihpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG5cdFx0XHRmb3IoaiA9IDA7IGogPD0gaTsgaisrKSB7XHJcblx0XHRcdFx0aWYoYXJyYXlbaV0gPT09IGFycmF5W2pdKSB7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoaiA9PT0gaSkgeyBhLnB1c2goYXJyYXlbaV0pOyB9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gYTtcclxuXHR9O1xyXG5cdC8vIHJlbW92ZSBpdGVtIGZyb20gYXJyYXlcclxuXHQkLnZha2F0YS5hcnJheV9yZW1vdmUgPSBmdW5jdGlvbihhcnJheSwgZnJvbSwgdG8pIHtcclxuXHRcdHZhciByZXN0ID0gYXJyYXkuc2xpY2UoKHRvIHx8IGZyb20pICsgMSB8fCBhcnJheS5sZW5ndGgpO1xyXG5cdFx0YXJyYXkubGVuZ3RoID0gZnJvbSA8IDAgPyBhcnJheS5sZW5ndGggKyBmcm9tIDogZnJvbTtcclxuXHRcdGFycmF5LnB1c2guYXBwbHkoYXJyYXksIHJlc3QpO1xyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cdH07XHJcblx0Ly8gcmVtb3ZlIGl0ZW0gZnJvbSBhcnJheVxyXG5cdCQudmFrYXRhLmFycmF5X3JlbW92ZV9pdGVtID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0pIHtcclxuXHRcdHZhciB0bXAgPSAkLmluQXJyYXkoaXRlbSwgYXJyYXkpO1xyXG5cdFx0cmV0dXJuIHRtcCAhPT0gLTEgPyAkLnZha2F0YS5hcnJheV9yZW1vdmUoYXJyYXksIHRtcCkgOiBhcnJheTtcclxuXHR9O1xyXG5cdC8vIGJyb3dzZXIgc25pZmZpbmdcclxuXHQoZnVuY3Rpb24gKCkge1xyXG5cdFx0dmFyIGJyb3dzZXIgPSB7fSxcclxuXHRcdFx0Yl9tYXRjaCA9IGZ1bmN0aW9uKHVhKSB7XHJcblx0XHRcdHVhID0gdWEudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdHZhciBtYXRjaCA9XHQvKGNocm9tZSlbIFxcL10oW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcclxuXHRcdFx0XHRcdFx0Lyh3ZWJraXQpWyBcXC9dKFtcXHcuXSspLy5leGVjKCB1YSApIHx8XHJcblx0XHRcdFx0XHRcdC8ob3BlcmEpKD86Lip2ZXJzaW9ufClbIFxcL10oW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcclxuXHRcdFx0XHRcdFx0Lyhtc2llKSAoW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcclxuXHRcdFx0XHRcdFx0KHVhLmluZGV4T2YoXCJjb21wYXRpYmxlXCIpIDwgMCAmJiAvKG1vemlsbGEpKD86Lio/IHJ2OihbXFx3Ll0rKXwpLy5leGVjKCB1YSApKSB8fFxyXG5cdFx0XHRcdFx0XHRbXTtcclxuXHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0YnJvd3NlcjogbWF0Y2hbMV0gfHwgXCJcIixcclxuXHRcdFx0XHRcdHZlcnNpb246IG1hdGNoWzJdIHx8IFwiMFwiXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fSxcclxuXHRcdFx0bWF0Y2hlZCA9IGJfbWF0Y2god2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xyXG5cdFx0aWYobWF0Y2hlZC5icm93c2VyKSB7XHJcblx0XHRcdGJyb3dzZXJbIG1hdGNoZWQuYnJvd3NlciBdID0gdHJ1ZTtcclxuXHRcdFx0YnJvd3Nlci52ZXJzaW9uID0gbWF0Y2hlZC52ZXJzaW9uO1xyXG5cdFx0fVxyXG5cdFx0aWYoYnJvd3Nlci5jaHJvbWUpIHtcclxuXHRcdFx0YnJvd3Nlci53ZWJraXQgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihicm93c2VyLndlYmtpdCkge1xyXG5cdFx0XHRicm93c2VyLnNhZmFyaSA9IHRydWU7XHJcblx0XHR9XHJcblx0XHQkLnZha2F0YS5icm93c2VyID0gYnJvd3NlcjtcclxuXHR9KCkpO1xyXG5cdGlmKCQudmFrYXRhLmJyb3dzZXIubXNpZSAmJiAkLnZha2F0YS5icm93c2VyLnZlcnNpb24gPCA4KSB7XHJcblx0XHQkLmpzdHJlZS5kZWZhdWx0cy5jb3JlLmFuaW1hdGlvbiA9IDA7XHJcblx0fVxyXG5cclxuLyoqXHJcbiAqICMjIyBDaGVja2JveCBwbHVnaW5cclxuICpcclxuICogVGhpcyBwbHVnaW4gcmVuZGVycyBjaGVja2JveCBpY29ucyBpbiBmcm9udCBvZiBlYWNoIG5vZGUsIG1ha2luZyBtdWx0aXBsZSBzZWxlY3Rpb24gbXVjaCBlYXNpZXIuIFxyXG4gKiBJdCBhbHNvIHN1cHBvcnRzIHRyaS1zdGF0ZSBiZWhhdmlvciwgbWVhbmluZyB0aGF0IGlmIGEgbm9kZSBoYXMgYSBmZXcgb2YgaXRzIGNoaWxkcmVuIGNoZWNrZWQgaXQgd2lsbCBiZSByZW5kZXJlZCBhcyB1bmRldGVybWluZWQsIGFuZCBzdGF0ZSB3aWxsIGJlIHByb3BhZ2F0ZWQgdXAuXHJcbiAqL1xyXG5cclxuXHR2YXIgX2kgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdJJyk7XHJcblx0X2kuY2xhc3NOYW1lID0gJ2pzdHJlZS1pY29uIGpzdHJlZS1jaGVja2JveCc7XHJcblx0LyoqXHJcblx0ICogc3RvcmVzIGFsbCBkZWZhdWx0cyBmb3IgdGhlIGNoZWNrYm94IHBsdWdpblxyXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNoZWNrYm94XHJcblx0ICogQHBsdWdpbiBjaGVja2JveFxyXG5cdCAqL1xyXG5cdCQuanN0cmVlLmRlZmF1bHRzLmNoZWNrYm94ID0ge1xyXG5cdFx0LyoqXHJcblx0XHQgKiBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBjaGVja2JveGVzIHNob3VsZCBiZSB2aXNpYmxlIChjYW4gYmUgY2hhbmdlZCBhdCBhIGxhdGVyIHRpbWUgdXNpbmcgYHNob3dfY2hlY2tib3hlcygpYCBhbmQgYGhpZGVfY2hlY2tib3hlc2ApLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jaGVja2JveC52aXNpYmxlXHJcblx0XHQgKiBAcGx1Z2luIGNoZWNrYm94XHJcblx0XHQgKi9cclxuXHRcdHZpc2libGVcdFx0XHRcdDogdHJ1ZSxcclxuXHRcdC8qKlxyXG5cdFx0ICogYSBib29sZWFuIGluZGljYXRpbmcgaWYgY2hlY2tib3hlcyBzaG91bGQgY2FzY2FkZSBkb3duIGFuZCBoYXZlIGFuIHVuZGV0ZXJtaW5lZCBzdGF0ZS4gRGVmYXVsdHMgdG8gYHRydWVgLlxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuY2hlY2tib3gudGhyZWVfc3RhdGVcclxuXHRcdCAqIEBwbHVnaW4gY2hlY2tib3hcclxuXHRcdCAqL1xyXG5cdFx0dGhyZWVfc3RhdGVcdFx0XHQ6IHRydWUsXHJcblx0XHQvKipcclxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNsaWNraW5nIGFueXdoZXJlIG9uIHRoZSBub2RlIHNob3VsZCBhY3QgYXMgY2xpY2tpbmcgb24gdGhlIGNoZWNrYm94LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jaGVja2JveC53aG9sZV9ub2RlXHJcblx0XHQgKiBAcGx1Z2luIGNoZWNrYm94XHJcblx0XHQgKi9cclxuXHRcdHdob2xlX25vZGVcdFx0XHQ6IHRydWUsXHJcblx0XHQvKipcclxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBzZWxlY3RlZCBzdHlsZSBvZiBhIG5vZGUgc2hvdWxkIGJlIGtlcHQsIG9yIHJlbW92ZWQuIERlZmF1bHRzIHRvIGB0cnVlYC5cclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNoZWNrYm94LmtlZXBfc2VsZWN0ZWRfc3R5bGVcclxuXHRcdCAqIEBwbHVnaW4gY2hlY2tib3hcclxuXHRcdCAqL1xyXG5cdFx0a2VlcF9zZWxlY3RlZF9zdHlsZVx0OiB0cnVlXHJcblx0fTtcclxuXHQkLmpzdHJlZS5wbHVnaW5zLmNoZWNrYm94ID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmVudCkge1xyXG5cdFx0dGhpcy5iaW5kID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRwYXJlbnQuYmluZC5jYWxsKHRoaXMpO1xyXG5cdFx0XHR0aGlzLl9kYXRhLmNoZWNrYm94LnV0byA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLmVsZW1lbnRcclxuXHRcdFx0XHQub24oXCJpbml0LmpzdHJlZVwiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jaGVja2JveC52aXNpYmxlID0gdGhpcy5zZXR0aW5ncy5jaGVja2JveC52aXNpYmxlO1xyXG5cdFx0XHRcdFx0XHRpZighdGhpcy5zZXR0aW5ncy5jaGVja2JveC5rZWVwX3NlbGVjdGVkX3N0eWxlKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5lbGVtZW50LmFkZENsYXNzKCdqc3RyZWUtY2hlY2tib3gtbm8tY2xpY2tlZCcpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHQub24oXCJsb2FkaW5nLmpzdHJlZVwiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0dGhpc1sgdGhpcy5fZGF0YS5jaGVja2JveC52aXNpYmxlID8gJ3Nob3dfY2hlY2tib3hlcycgOiAnaGlkZV9jaGVja2JveGVzJyBdKCk7XHJcblx0XHRcdFx0XHR9LCB0aGlzKSk7XHJcblx0XHRcdGlmKHRoaXMuc2V0dGluZ3MuY2hlY2tib3gudGhyZWVfc3RhdGUpIHtcclxuXHRcdFx0XHR0aGlzLmVsZW1lbnRcclxuXHRcdFx0XHRcdC5vbignY2hhbmdlZC5qc3RyZWUgbW92ZV9ub2RlLmpzdHJlZSBjb3B5X25vZGUuanN0cmVlIHJlZHJhdy5qc3RyZWUgb3Blbl9ub2RlLmpzdHJlZScsICQucHJveHkoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMuX2RhdGEuY2hlY2tib3gudXRvKSB7IGNsZWFyVGltZW91dCh0aGlzLl9kYXRhLmNoZWNrYm94LnV0byk7IH1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNoZWNrYm94LnV0byA9IHNldFRpbWVvdXQoJC5wcm94eSh0aGlzLl91bmRldGVybWluZWQsIHRoaXMpLCA1MCk7XHJcblx0XHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdFx0Lm9uKCdtb2RlbC5qc3RyZWUnLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxyXG5cdFx0XHRcdFx0XHRcdFx0cCA9IG1bZGF0YS5wYXJlbnRdLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZHBjID0gZGF0YS5ub2RlcyxcclxuXHRcdFx0XHRcdFx0XHRcdGNoZCA9IFtdLFxyXG5cdFx0XHRcdFx0XHRcdFx0YywgaSwgaiwgaywgbCwgdG1wO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBhcHBseSBkb3duXHJcblx0XHRcdFx0XHRcdFx0aWYocC5zdGF0ZS5zZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gZHBjLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRtW2RwY1tpXV0uc3RhdGUuc2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkID0gdGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmNvbmNhdChkcGMpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IGRwYy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYobVtkcGNbaV1dLnN0YXRlLnNlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yKGsgPSAwLCBsID0gbVtkcGNbaV1dLmNoaWxkcmVuX2QubGVuZ3RoOyBrIDwgbDsgaysrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtW21bZHBjW2ldXS5jaGlsZHJlbl9kW2tdXS5zdGF0ZS5zZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZC5jb25jYXQobVtkcGNbaV1dLmNoaWxkcmVuX2QpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBhcHBseSB1cFxyXG5cdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IHAuY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmKCFtW3AuY2hpbGRyZW5fZFtpXV0uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNoZC5wdXNoKG1bcC5jaGlsZHJlbl9kW2ldXS5wYXJlbnQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRjaGQgPSAkLnZha2F0YS5hcnJheV91bmlxdWUoY2hkKTtcclxuXHRcdFx0XHRcdFx0XHRmb3IoayA9IDAsIGwgPSBjaGQubGVuZ3RoOyBrIDwgbDsgaysrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwID0gbVtjaGRba11dO1xyXG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUocCAmJiBwLmlkICE9PSAnIycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YyA9IDA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IHAuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YyArPSBtW3AuY2hpbGRyZW5baV1dLnN0YXRlLnNlbGVjdGVkO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGMgPT09IGopIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwLnN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQucHVzaChwLmlkKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKHAsIHRydWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmKHRtcCAmJiB0bXAubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAuY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykuYWRkQ2xhc3MoJ2pzdHJlZS1jbGlja2VkJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdHAgPSB0aGlzLmdldF9ub2RlKHAucGFyZW50KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkID0gJC52YWthdGEuYXJyYXlfdW5pcXVlKHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCk7XHJcblx0XHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdFx0Lm9uKCdzZWxlY3Rfbm9kZS5qc3RyZWUnLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIG9iaiA9IGRhdGEubm9kZSxcclxuXHRcdFx0XHRcdFx0XHRcdG0gPSB0aGlzLl9tb2RlbC5kYXRhLFxyXG5cdFx0XHRcdFx0XHRcdFx0cGFyID0gdGhpcy5nZXRfbm9kZShvYmoucGFyZW50KSxcclxuXHRcdFx0XHRcdFx0XHRcdGRvbSA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKSxcclxuXHRcdFx0XHRcdFx0XHRcdGksIGosIGMsIHRtcDtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSAkLnZha2F0YS5hcnJheV91bmlxdWUodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLmNvbmNhdChvYmouY2hpbGRyZW5fZCkpO1xyXG5cdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5jaGlsZHJlbl9kLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0bVtvYmouY2hpbGRyZW5fZFtpXV0uc3RhdGUuc2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR3aGlsZShwYXIgJiYgcGFyLmlkICE9PSAnIycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGMgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gcGFyLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjICs9IG1bcGFyLmNoaWxkcmVuW2ldXS5zdGF0ZS5zZWxlY3RlZDtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGlmKGMgPT09IGopIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cGFyLnN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLnB1c2gocGFyLmlkKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShwYXIsIHRydWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZih0bXAgJiYgdG1wLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRtcC5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5hZGRDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0cGFyID0gdGhpcy5nZXRfbm9kZShwYXIucGFyZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYoZG9tLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZG9tLmZpbmQoJy5qc3RyZWUtYW5jaG9yJykuYWRkQ2xhc3MoJ2pzdHJlZS1jbGlja2VkJyk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHRcdC5vbignZGVzZWxlY3Rfbm9kZS5qc3RyZWUnLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIG9iaiA9IGRhdGEubm9kZSxcclxuXHRcdFx0XHRcdFx0XHRcdGRvbSA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKSxcclxuXHRcdFx0XHRcdFx0XHRcdGksIGosIHRtcDtcclxuXHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX21vZGVsLmRhdGFbb2JqLmNoaWxkcmVuX2RbaV1dLnN0YXRlLnNlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5wYXJlbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fbW9kZWwuZGF0YVtvYmoucGFyZW50c1tpXV0uc3RhdGUuc2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdHRtcCA9IHRoaXMuZ2V0X25vZGUob2JqLnBhcmVudHNbaV0sIHRydWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYodG1wICYmIHRtcC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dG1wLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLnJlbW92ZUNsYXNzKCdqc3RyZWUtY2xpY2tlZCcpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0bXAgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZigkLmluQXJyYXkodGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldLCBvYmouY2hpbGRyZW5fZCkgPT09IC0xICYmICQuaW5BcnJheSh0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWRbaV0sIG9iai5wYXJlbnRzKSA9PT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dG1wLnB1c2godGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkW2ldKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkID0gJC52YWthdGEuYXJyYXlfdW5pcXVlKHRtcCk7XHJcblx0XHRcdFx0XHRcdFx0aWYoZG9tLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZG9tLmZpbmQoJy5qc3RyZWUtYW5jaG9yJykucmVtb3ZlQ2xhc3MoJ2pzdHJlZS1jbGlja2VkJyk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHRcdC5vbignZGVsZXRlX25vZGUuanN0cmVlJywgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBwID0gdGhpcy5nZXRfbm9kZShkYXRhLnBhcmVudCksXHJcblx0XHRcdFx0XHRcdFx0XHRtID0gdGhpcy5fbW9kZWwuZGF0YSxcclxuXHRcdFx0XHRcdFx0XHRcdGksIGosIGMsIHRtcDtcclxuXHRcdFx0XHRcdFx0XHR3aGlsZShwICYmIHAuaWQgIT09ICcjJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0YyA9IDA7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBwLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjICs9IG1bcC5jaGlsZHJlbltpXV0uc3RhdGUuc2VsZWN0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZihjID09PSBqKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHAuc3RhdGUuc2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQucHVzaChwLmlkKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShwLCB0cnVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYodG1wICYmIHRtcC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAuY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykuYWRkQ2xhc3MoJ2pzdHJlZS1jbGlja2VkJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHAgPSB0aGlzLmdldF9ub2RlKHAucGFyZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdFx0Lm9uKCdtb3ZlX25vZGUuanN0cmVlJywgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBpc19tdWx0aSA9IGRhdGEuaXNfbXVsdGksXHJcblx0XHRcdFx0XHRcdFx0XHRvbGRfcGFyID0gZGF0YS5vbGRfcGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0bmV3X3BhciA9IHRoaXMuZ2V0X25vZGUoZGF0YS5wYXJlbnQpLFxyXG5cdFx0XHRcdFx0XHRcdFx0bSA9IHRoaXMuX21vZGVsLmRhdGEsXHJcblx0XHRcdFx0XHRcdFx0XHRwLCBjLCBpLCBqLCB0bXA7XHJcblx0XHRcdFx0XHRcdFx0aWYoIWlzX211bHRpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwID0gdGhpcy5nZXRfbm9kZShvbGRfcGFyKTtcclxuXHRcdFx0XHRcdFx0XHRcdHdoaWxlKHAgJiYgcC5pZCAhPT0gJyMnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGMgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBwLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGMgKz0gbVtwLmNoaWxkcmVuW2ldXS5zdGF0ZS5zZWxlY3RlZDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZihjID09PSBqKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cC5zdGF0ZS5zZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLnNlbGVjdGVkLnB1c2gocC5pZCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfbm9kZShwLCB0cnVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZih0bXAgJiYgdG1wLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dG1wLmNoaWxkcmVuKCcuanN0cmVlLWFuY2hvcicpLmFkZENsYXNzKCdqc3RyZWUtY2xpY2tlZCcpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwID0gdGhpcy5nZXRfbm9kZShwLnBhcmVudCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHAgPSBuZXdfcGFyO1xyXG5cdFx0XHRcdFx0XHRcdHdoaWxlKHAgJiYgcC5pZCAhPT0gJyMnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IHAuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGMgKz0gbVtwLmNoaWxkcmVuW2ldXS5zdGF0ZS5zZWxlY3RlZDtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGlmKGMgPT09IGopIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYoIXAuc3RhdGUuc2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwLnN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQucHVzaChwLmlkKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKHAsIHRydWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmKHRtcCAmJiB0bXAubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0bXAuY2hpbGRyZW4oJy5qc3RyZWUtYW5jaG9yJykuYWRkQ2xhc3MoJ2pzdHJlZS1jbGlja2VkJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYocC5zdGF0ZS5zZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHAuc3RhdGUuc2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQgPSAkLnZha2F0YS5hcnJheV9yZW1vdmVfaXRlbSh0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQsIHAuaWQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRtcCA9IHRoaXMuZ2V0X25vZGUocCwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYodG1wICYmIHRtcC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRtcC5jaGlsZHJlbignLmpzdHJlZS1hbmNob3InKS5yZW1vdmVDbGFzcygnanN0cmVlLWNsaWNrZWQnKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHAgPSB0aGlzLmdldF9ub2RlKHAucGFyZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0sIHRoaXMpKTtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdC8qKlxyXG5cdFx0ICogc2V0IHRoZSB1bmRldGVybWluZWQgc3RhdGUgd2hlcmUgYW5kIGlmIG5lY2Vzc2FyeS4gVXNlZCBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIF91bmRldGVybWluZWQoKVxyXG5cdFx0ICogQHBsdWdpbiBjaGVja2JveFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl91bmRldGVybWluZWQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHZhciBpLCBqLCBtID0gdGhpcy5fbW9kZWwuZGF0YSwgcyA9IHRoaXMuX2RhdGEuY29yZS5zZWxlY3RlZCwgcCA9IFtdLCB0ID0gdGhpcztcclxuXHRcdFx0Zm9yKGkgPSAwLCBqID0gcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRpZihtW3NbaV1dICYmIG1bc1tpXV0ucGFyZW50cykge1xyXG5cdFx0XHRcdFx0cCA9IHAuY29uY2F0KG1bc1tpXV0ucGFyZW50cyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8vIGF0dGVtcHQgZm9yIHNlcnZlciBzaWRlIHVuZGV0ZXJtaW5lZCBzdGF0ZVxyXG5cdFx0XHR0aGlzLmVsZW1lbnQuZmluZCgnLmpzdHJlZS1jbG9zZWQnKS5ub3QoJzpoYXModWwpJylcclxuXHRcdFx0XHQuZWFjaChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHR2YXIgdG1wID0gdC5nZXRfbm9kZSh0aGlzKTtcclxuXHRcdFx0XHRcdGlmKCF0bXAuc3RhdGUubG9hZGVkICYmIHRtcC5vcmlnaW5hbCAmJiB0bXAub3JpZ2luYWwuc3RhdGUgJiYgdG1wLm9yaWdpbmFsLnN0YXRlLnVuZGV0ZXJtaW5lZCAmJiB0bXAub3JpZ2luYWwuc3RhdGUudW5kZXRlcm1pbmVkID09PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdHAucHVzaCh0bXAuaWQpO1xyXG5cdFx0XHRcdFx0XHRwID0gcC5jb25jYXQodG1wLnBhcmVudHMpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRwID0gJC52YWthdGEuYXJyYXlfdW5pcXVlKHApO1xyXG5cdFx0XHRpID0gJC5pbkFycmF5KCcjJywgcCk7XHJcblx0XHRcdGlmKGkgIT09IC0xKSB7XHJcblx0XHRcdFx0cCA9ICQudmFrYXRhLmFycmF5X3JlbW92ZShwLCBpKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5lbGVtZW50LmZpbmQoJy5qc3RyZWUtdW5kZXRlcm1pbmVkJykucmVtb3ZlQ2xhc3MoJ2pzdHJlZS11bmRldGVybWluZWQnKTtcclxuXHRcdFx0Zm9yKGkgPSAwLCBqID0gcC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRpZighbVtwW2ldXS5zdGF0ZS5zZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0cyA9IHRoaXMuZ2V0X25vZGUocFtpXSwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRpZihzICYmIHMubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdHMuY2hpbGRyZW4oJ2EnKS5jaGlsZHJlbignLmpzdHJlZS1jaGVja2JveCcpLmFkZENsYXNzKCdqc3RyZWUtdW5kZXRlcm1pbmVkJyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0dGhpcy5yZWRyYXdfbm9kZSA9IGZ1bmN0aW9uKG9iaiwgZGVlcCwgaXNfY2FsbGJhY2spIHtcclxuXHRcdFx0b2JqID0gcGFyZW50LnJlZHJhd19ub2RlLmNhbGwodGhpcywgb2JqLCBkZWVwLCBpc19jYWxsYmFjayk7XHJcblx0XHRcdGlmKG9iaikge1xyXG5cdFx0XHRcdHZhciB0bXAgPSBvYmouZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0EnKVswXTtcclxuXHRcdFx0XHR0bXAuaW5zZXJ0QmVmb3JlKF9pLmNsb25lTm9kZSgpLCB0bXAuY2hpbGROb2Rlc1swXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIWlzX2NhbGxiYWNrICYmIHRoaXMuc2V0dGluZ3MuY2hlY2tib3gudGhyZWVfc3RhdGUpIHtcclxuXHRcdFx0XHRpZih0aGlzLl9kYXRhLmNoZWNrYm94LnV0bykgeyBjbGVhclRpbWVvdXQodGhpcy5fZGF0YS5jaGVja2JveC51dG8pOyB9XHJcblx0XHRcdFx0dGhpcy5fZGF0YS5jaGVja2JveC51dG8gPSBzZXRUaW1lb3V0KCQucHJveHkodGhpcy5fdW5kZXRlcm1pbmVkLCB0aGlzKSwgNTApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBvYmo7XHJcblx0XHR9O1xyXG5cdFx0dGhpcy5hY3RpdmF0ZV9ub2RlID0gZnVuY3Rpb24gKG9iaiwgZSkge1xyXG5cdFx0XHRpZih0aGlzLnNldHRpbmdzLmNoZWNrYm94Lndob2xlX25vZGUgfHwgJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2pzdHJlZS1jaGVja2JveCcpKSB7XHJcblx0XHRcdFx0ZS5jdHJsS2V5ID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcGFyZW50LmFjdGl2YXRlX25vZGUuY2FsbCh0aGlzLCBvYmosIGUpO1xyXG5cdFx0fTtcclxuXHRcdC8qKlxyXG5cdFx0ICogc2hvdyB0aGUgbm9kZSBjaGVja2JveCBpY29uc1xyXG5cdFx0ICogQG5hbWUgc2hvd19jaGVja2JveGVzKClcclxuXHRcdCAqIEBwbHVnaW4gY2hlY2tib3hcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaG93X2NoZWNrYm94ZXMgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX2RhdGEuY29yZS50aGVtZXMuY2hlY2tib3hlcyA9IHRydWU7IHRoaXMuZWxlbWVudC5jaGlsZHJlbihcInVsXCIpLnJlbW92ZUNsYXNzKFwianN0cmVlLW5vLWNoZWNrYm94ZXNcIik7IH07XHJcblx0XHQvKipcclxuXHRcdCAqIGhpZGUgdGhlIG5vZGUgY2hlY2tib3ggaWNvbnNcclxuXHRcdCAqIEBuYW1lIGhpZGVfY2hlY2tib3hlcygpXHJcblx0XHQgKiBAcGx1Z2luIGNoZWNrYm94XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaGlkZV9jaGVja2JveGVzID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9kYXRhLmNvcmUudGhlbWVzLmNoZWNrYm94ZXMgPSBmYWxzZTsgdGhpcy5lbGVtZW50LmNoaWxkcmVuKFwidWxcIikuYWRkQ2xhc3MoXCJqc3RyZWUtbm8tY2hlY2tib3hlc1wiKTsgfTtcclxuXHRcdC8qKlxyXG5cdFx0ICogdG9nZ2xlIHRoZSBub2RlIGljb25zXHJcblx0XHQgKiBAbmFtZSB0b2dnbGVfY2hlY2tib3hlcygpXHJcblx0XHQgKiBAcGx1Z2luIGNoZWNrYm94XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9nZ2xlX2NoZWNrYm94ZXMgPSBmdW5jdGlvbiAoKSB7IGlmKHRoaXMuX2RhdGEuY29yZS50aGVtZXMuY2hlY2tib3hlcykgeyB0aGlzLmhpZGVfY2hlY2tib3hlcygpOyB9IGVsc2UgeyB0aGlzLnNob3dfY2hlY2tib3hlcygpOyB9IH07XHJcblx0fTtcclxuXHJcblx0Ly8gaW5jbHVkZSB0aGUgY2hlY2tib3ggcGx1Z2luIGJ5IGRlZmF1bHRcclxuXHQvLyAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goXCJjaGVja2JveFwiKTtcclxuXHJcbi8qKlxyXG4gKiAjIyMgQ29udGV4dG1lbnUgcGx1Z2luXHJcbiAqXHJcbiAqIFNob3dzIGEgY29udGV4dCBtZW51IHdoZW4gYSBub2RlIGlzIHJpZ2h0LWNsaWNrZWQuXHJcbiAqL1xyXG4vLyBUT0RPOiBtb3ZlIGxvZ2ljIG91dHNpZGUgb2YgZnVuY3Rpb24gKyBjaGVjayBtdWx0aXBsZSBtb3ZlXHJcblxyXG5cdC8qKlxyXG5cdCAqIHN0b3JlcyBhbGwgZGVmYXVsdHMgZm9yIHRoZSBjb250ZXh0bWVudSBwbHVnaW5cclxuXHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb250ZXh0bWVudVxyXG5cdCAqIEBwbHVnaW4gY29udGV4dG1lbnVcclxuXHQgKi9cclxuXHQkLmpzdHJlZS5kZWZhdWx0cy5jb250ZXh0bWVudSA9IHtcclxuXHRcdC8qKlxyXG5cdFx0ICogYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGNvbnRleHQgbWVudSBpcyBpbnZva2VkIG9uIGl0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb250ZXh0bWVudS5zZWxlY3Rfbm9kZVxyXG5cdFx0ICogQHBsdWdpbiBjb250ZXh0bWVudVxyXG5cdFx0ICovXHJcblx0XHRzZWxlY3Rfbm9kZSA6IHRydWUsXHJcblx0XHQvKipcclxuXHRcdCAqIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBtZW51IHNob3VsZCBiZSBzaG93biBhbGlnbmVkIHdpdGggdGhlIG5vZGUuIERlZmF1bHRzIHRvIGB0cnVlYCwgb3RoZXJ3aXNlIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcmUgdXNlZC5cclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmNvbnRleHRtZW51LnNob3dfYXRfbm9kZVxyXG5cdFx0ICogQHBsdWdpbiBjb250ZXh0bWVudVxyXG5cdFx0ICovXHJcblx0XHRzaG93X2F0X25vZGUgOiB0cnVlLFxyXG5cdFx0LyoqXHJcblx0XHQgKiBhbiBvYmplY3Qgb2YgYWN0aW9ucywgb3IgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBub2RlIGFuZCBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBjYWxscyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBhbiBvYmplY3Qgb2YgYWN0aW9ucyBhdmFpbGFibGUgZm9yIHRoYXQgbm9kZSAoeW91IGNhbiBhbHNvIHJldHVybiB0aGUgaXRlbXMgdG9vKS5cclxuXHRcdCAqIFxyXG5cdFx0ICogRWFjaCBhY3Rpb24gY29uc2lzdHMgb2YgYSBrZXkgKGEgdW5pcXVlIG5hbWUpIGFuZCBhIHZhbHVlIHdoaWNoIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyAob25seSBsYWJlbCBhbmQgYWN0aW9uIGFyZSByZXF1aXJlZCk6XHJcblx0XHQgKiBcclxuXHRcdCAqICogYHNlcGFyYXRvcl9iZWZvcmVgIC0gYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlcmUgc2hvdWxkIGJlIGEgc2VwYXJhdG9yIGJlZm9yZSB0aGlzIGl0ZW1cclxuXHRcdCAqICogYHNlcGFyYXRvcl9hZnRlcmAgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGVyZSBzaG91bGQgYmUgYSBzZXBhcmF0b3IgYWZ0ZXIgdGhpcyBpdGVtXHJcblx0XHQgKiAqIGBfZGlzYWJsZWRgIC0gYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkXHJcblx0XHQgKiAqIGBsYWJlbGAgLSBhIHN0cmluZyAtIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cclxuXHRcdCAqICogYGFjdGlvbmAgLSBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmIHRoaXMgaXRlbSBpcyBjaG9zZW5cclxuXHRcdCAqICogYGljb25gIC0gYSBzdHJpbmcsIGNhbiBiZSBhIHBhdGggdG8gYW4gaWNvbiBvciBhIGNsYXNzTmFtZSwgaWYgdXNpbmcgYW4gaW1hZ2UgdGhhdCBpcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdXNlIGEgYC4vYCBwcmVmaXgsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRldGVjdGVkIGFzIGEgY2xhc3NcclxuXHRcdCAqICogYHNob3J0Y3V0YCAtIGtleUNvZGUgd2hpY2ggd2lsbCB0cmlnZ2VyIHRoZSBhY3Rpb24gaWYgdGhlIG1lbnUgaXMgb3BlbiAoZm9yIGV4YW1wbGUgYDExM2AgZm9yIHJlbmFtZSwgd2hpY2ggZXF1YWxzIEYyKVxyXG5cdFx0ICogKiBgc2hvcnRjdXRfbGFiZWxgIC0gc2hvcnRjdXQgbGFiZWwgKGxpa2UgZm9yIGV4YW1wbGUgYEYyYCBmb3IgcmVuYW1lKVxyXG5cdFx0ICogXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5jb250ZXh0bWVudS5pdGVtc1xyXG5cdFx0ICogQHBsdWdpbiBjb250ZXh0bWVudVxyXG5cdFx0ICovXHJcblx0XHRpdGVtcyA6IGZ1bmN0aW9uIChvLCBjYikgeyAvLyBDb3VsZCBiZSBhbiBvYmplY3QgZGlyZWN0bHlcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcImNyZWF0ZVwiIDoge1xyXG5cdFx0XHRcdFx0XCJzZXBhcmF0b3JfYmVmb3JlXCJcdDogZmFsc2UsXHJcblx0XHRcdFx0XHRcInNlcGFyYXRvcl9hZnRlclwiXHQ6IHRydWUsXHJcblx0XHRcdFx0XHRcIl9kaXNhYmxlZFwiXHRcdFx0OiBmYWxzZSwgLy8odGhpcy5jaGVjayhcImNyZWF0ZV9ub2RlXCIsIGRhdGEucmVmZXJlbmNlLCB7fSwgXCJsYXN0XCIpKSxcclxuXHRcdFx0XHRcdFwibGFiZWxcIlx0XHRcdFx0OiBcIkNyZWF0ZVwiLFxyXG5cdFx0XHRcdFx0XCJhY3Rpb25cIlx0XHRcdDogZnVuY3Rpb24gKGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0dmFyIGluc3QgPSAkLmpzdHJlZS5yZWZlcmVuY2UoZGF0YS5yZWZlcmVuY2UpLFxyXG5cdFx0XHRcdFx0XHRcdG9iaiA9IGluc3QuZ2V0X25vZGUoZGF0YS5yZWZlcmVuY2UpO1xyXG5cdFx0XHRcdFx0XHRpbnN0LmNyZWF0ZV9ub2RlKG9iaiwge30sIFwibGFzdFwiLCBmdW5jdGlvbiAobmV3X25vZGUpIHtcclxuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaW5zdC5lZGl0KG5ld19ub2RlKTsgfSwwKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRcInJlbmFtZVwiIDoge1xyXG5cdFx0XHRcdFx0XCJzZXBhcmF0b3JfYmVmb3JlXCJcdDogZmFsc2UsXHJcblx0XHRcdFx0XHRcInNlcGFyYXRvcl9hZnRlclwiXHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XCJfZGlzYWJsZWRcIlx0XHRcdDogZmFsc2UsIC8vKHRoaXMuY2hlY2soXCJyZW5hbWVfbm9kZVwiLCBkYXRhLnJlZmVyZW5jZSwgdGhpcy5nZXRfcGFyZW50KGRhdGEucmVmZXJlbmNlKSwgXCJcIikpLFxyXG5cdFx0XHRcdFx0XCJsYWJlbFwiXHRcdFx0XHQ6IFwiUmVuYW1lXCIsXHJcblx0XHRcdFx0XHQvKlxyXG5cdFx0XHRcdFx0XCJzaG9ydGN1dFwiXHRcdFx0OiAxMTMsXHJcblx0XHRcdFx0XHRcInNob3J0Y3V0X2xhYmVsXCJcdDogJ0YyJyxcclxuXHRcdFx0XHRcdFwiaWNvblwiXHRcdFx0XHQ6IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1sZWFmXCIsXHJcblx0XHRcdFx0XHQqL1xyXG5cdFx0XHRcdFx0XCJhY3Rpb25cIlx0XHRcdDogZnVuY3Rpb24gKGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0dmFyIGluc3QgPSAkLmpzdHJlZS5yZWZlcmVuY2UoZGF0YS5yZWZlcmVuY2UpLFxyXG5cdFx0XHRcdFx0XHRcdG9iaiA9IGluc3QuZ2V0X25vZGUoZGF0YS5yZWZlcmVuY2UpO1xyXG5cdFx0XHRcdFx0XHRpbnN0LmVkaXQob2JqKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFwicmVtb3ZlXCIgOiB7XHJcblx0XHRcdFx0XHRcInNlcGFyYXRvcl9iZWZvcmVcIlx0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFwiaWNvblwiXHRcdFx0XHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XCJzZXBhcmF0b3JfYWZ0ZXJcIlx0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFwiX2Rpc2FibGVkXCJcdFx0XHQ6IGZhbHNlLCAvLyh0aGlzLmNoZWNrKFwiZGVsZXRlX25vZGVcIiwgZGF0YS5yZWZlcmVuY2UsIHRoaXMuZ2V0X3BhcmVudChkYXRhLnJlZmVyZW5jZSksIFwiXCIpKSxcclxuXHRcdFx0XHRcdFwibGFiZWxcIlx0XHRcdFx0OiBcIkRlbGV0ZVwiLFxyXG5cdFx0XHRcdFx0XCJhY3Rpb25cIlx0XHRcdDogZnVuY3Rpb24gKGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0dmFyIGluc3QgPSAkLmpzdHJlZS5yZWZlcmVuY2UoZGF0YS5yZWZlcmVuY2UpLFxyXG5cdFx0XHRcdFx0XHRcdG9iaiA9IGluc3QuZ2V0X25vZGUoZGF0YS5yZWZlcmVuY2UpO1xyXG5cdFx0XHRcdFx0XHRpZihpbnN0LmlzX3NlbGVjdGVkKG9iaikpIHtcclxuXHRcdFx0XHRcdFx0XHRpbnN0LmRlbGV0ZV9ub2RlKGluc3QuZ2V0X3NlbGVjdGVkKCkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGluc3QuZGVsZXRlX25vZGUob2JqKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0XCJjY3BcIiA6IHtcclxuXHRcdFx0XHRcdFwic2VwYXJhdG9yX2JlZm9yZVwiXHQ6IHRydWUsXHJcblx0XHRcdFx0XHRcImljb25cIlx0XHRcdFx0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFwic2VwYXJhdG9yX2FmdGVyXCJcdDogZmFsc2UsXHJcblx0XHRcdFx0XHRcImxhYmVsXCJcdFx0XHRcdDogXCJFZGl0XCIsXHJcblx0XHRcdFx0XHRcImFjdGlvblwiXHRcdFx0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFwic3VibWVudVwiIDoge1xyXG5cdFx0XHRcdFx0XHRcImN1dFwiIDoge1xyXG5cdFx0XHRcdFx0XHRcdFwic2VwYXJhdG9yX2JlZm9yZVwiXHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFwic2VwYXJhdG9yX2FmdGVyXCJcdDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XCJsYWJlbFwiXHRcdFx0XHQ6IFwiQ3V0XCIsXHJcblx0XHRcdFx0XHRcdFx0XCJhY3Rpb25cIlx0XHRcdDogZnVuY3Rpb24gKGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBpbnN0ID0gJC5qc3RyZWUucmVmZXJlbmNlKGRhdGEucmVmZXJlbmNlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqID0gaW5zdC5nZXRfbm9kZShkYXRhLnJlZmVyZW5jZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZihpbnN0LmlzX3NlbGVjdGVkKG9iaikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zdC5jdXQoaW5zdC5nZXRfc2VsZWN0ZWQoKSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zdC5jdXQob2JqKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFwiY29weVwiIDoge1xyXG5cdFx0XHRcdFx0XHRcdFwic2VwYXJhdG9yX2JlZm9yZVwiXHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFwiaWNvblwiXHRcdFx0XHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFwic2VwYXJhdG9yX2FmdGVyXCJcdDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XCJsYWJlbFwiXHRcdFx0XHQ6IFwiQ29weVwiLFxyXG5cdFx0XHRcdFx0XHRcdFwiYWN0aW9uXCJcdFx0XHQ6IGZ1bmN0aW9uIChkYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgaW5zdCA9ICQuanN0cmVlLnJlZmVyZW5jZShkYXRhLnJlZmVyZW5jZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iaiA9IGluc3QuZ2V0X25vZGUoZGF0YS5yZWZlcmVuY2UpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYoaW5zdC5pc19zZWxlY3RlZChvYmopKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGluc3QuY29weShpbnN0LmdldF9zZWxlY3RlZCgpKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpbnN0LmNvcHkob2JqKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFwicGFzdGVcIiA6IHtcclxuXHRcdFx0XHRcdFx0XHRcInNlcGFyYXRvcl9iZWZvcmVcIlx0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcImljb25cIlx0XHRcdFx0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcIl9kaXNhYmxlZFwiXHRcdFx0OiBmdW5jdGlvbiAoZGF0YSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuICEkLmpzdHJlZS5yZWZlcmVuY2UoZGF0YS5yZWZlcmVuY2UpLmNhbl9wYXN0ZSgpO1xyXG5cdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XCJzZXBhcmF0b3JfYWZ0ZXJcIlx0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcImxhYmVsXCJcdFx0XHRcdDogXCJQYXN0ZVwiLFxyXG5cdFx0XHRcdFx0XHRcdFwiYWN0aW9uXCJcdFx0XHQ6IGZ1bmN0aW9uIChkYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgaW5zdCA9ICQuanN0cmVlLnJlZmVyZW5jZShkYXRhLnJlZmVyZW5jZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iaiA9IGluc3QuZ2V0X25vZGUoZGF0YS5yZWZlcmVuY2UpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aW5zdC5wYXN0ZShvYmopO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQkLmpzdHJlZS5wbHVnaW5zLmNvbnRleHRtZW51ID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmVudCkge1xyXG5cdFx0dGhpcy5iaW5kID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRwYXJlbnQuYmluZC5jYWxsKHRoaXMpO1xyXG5cclxuXHRcdFx0dGhpcy5lbGVtZW50XHJcblx0XHRcdFx0Lm9uKFwiY29udGV4dG1lbnUuanN0cmVlXCIsIFwiLmpzdHJlZS1hbmNob3JcIiwgJC5wcm94eShmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdGlmKCF0aGlzLmlzX2xvYWRpbmcoZS5jdXJyZW50VGFyZ2V0KSkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2hvd19jb250ZXh0bWVudShlLmN1cnJlbnRUYXJnZXQsIGUucGFnZVgsIGUucGFnZVksIGUpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHQub24oXCJjbGljay5qc3RyZWVcIiwgXCIuanN0cmVlLWFuY2hvclwiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRcdGlmKHRoaXMuX2RhdGEuY29udGV4dG1lbnUudmlzaWJsZSkge1xyXG5cdFx0XHRcdFx0XHRcdCQudmFrYXRhLmNvbnRleHQuaGlkZSgpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LCB0aGlzKSk7XHJcblx0XHRcdC8qXHJcblx0XHRcdGlmKCEoJ29uY29udGV4dG1lbnUnIGluIGRvY3VtZW50LmJvZHkpICYmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5ib2R5KSkge1xyXG5cdFx0XHRcdHZhciBlbCA9IG51bGwsIHRtID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLmVsZW1lbnRcclxuXHRcdFx0XHRcdC5vbihcInRvdWNoc3RhcnRcIiwgXCIuanN0cmVlLWFuY2hvclwiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0XHRlbCA9IGUuY3VycmVudFRhcmdldDtcclxuXHRcdFx0XHRcdFx0dG0gPSArbmV3IERhdGUoKTtcclxuXHRcdFx0XHRcdFx0JChkb2N1bWVudCkub25lKFwidG91Y2hlbmRcIiwgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdFx0XHRlLnRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5vcmlnaW5hbEV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQsIGUub3JpZ2luYWxFdmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VZIC0gd2luZG93LnBhZ2VZT2Zmc2V0KTtcclxuXHRcdFx0XHRcdFx0XHRlLmN1cnJlbnRUYXJnZXQgPSBlLnRhcmdldDtcclxuXHRcdFx0XHRcdFx0XHR0bSA9ICgoKyhuZXcgRGF0ZSgpKSkgLSB0bSk7XHJcblx0XHRcdFx0XHRcdFx0aWYoZS50YXJnZXQgPT09IGVsICYmIHRtID4gNjAwICYmIHRtIDwgMTAwMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0JChlbCkudHJpZ2dlcignY29udGV4dG1lbnUnLCBlKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0ZWwgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdHRtID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHQqL1xyXG5cdFx0XHQkKGRvY3VtZW50KS5vbihcImNvbnRleHRfaGlkZS52YWthdGFcIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7IHRoaXMuX2RhdGEuY29udGV4dG1lbnUudmlzaWJsZSA9IGZhbHNlOyB9LCB0aGlzKSk7XHJcblx0XHR9O1xyXG5cdFx0dGhpcy50ZWFyZG93biA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aWYodGhpcy5fZGF0YS5jb250ZXh0bWVudS52aXNpYmxlKSB7XHJcblx0XHRcdFx0JC52YWthdGEuY29udGV4dC5oaWRlKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0cGFyZW50LnRlYXJkb3duLmNhbGwodGhpcyk7XHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogcHJlcGFyZSBhbmQgc2hvdyB0aGUgY29udGV4dCBtZW51IGZvciBhIG5vZGVcclxuXHRcdCAqIEBuYW1lIHNob3dfY29udGV4dG1lbnUob2JqIFssIHgsIHldKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlXHJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCB0byBzaG93IHRoZSBtZW51IGF0XHJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0geSB0aGUgeS1jb29yZGluYXRlIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCB0byBzaG93IHRoZSBtZW51IGF0XHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZSB0aGUgZXZlbnQgaWYgYXZhaWxhYmxlIHRoYXQgdHJpZ2dlcmVkIHRoZSBjb250ZXh0bWVudVxyXG5cdFx0ICogQHBsdWdpbiBjb250ZXh0bWVudVxyXG5cdFx0ICogQHRyaWdnZXIgc2hvd19jb250ZXh0bWVudS5qc3RyZWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaG93X2NvbnRleHRtZW51ID0gZnVuY3Rpb24gKG9iaiwgeCwgeSwgZSkge1xyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCFvYmogfHwgb2JqLmlkID09PSAnIycpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdHZhciBzID0gdGhpcy5zZXR0aW5ncy5jb250ZXh0bWVudSxcclxuXHRcdFx0XHRkID0gdGhpcy5nZXRfbm9kZShvYmosIHRydWUpLFxyXG5cdFx0XHRcdGEgPSBkLmNoaWxkcmVuKFwiLmpzdHJlZS1hbmNob3JcIiksXHJcblx0XHRcdFx0byA9IGZhbHNlLFxyXG5cdFx0XHRcdGkgPSBmYWxzZTtcclxuXHRcdFx0aWYocy5zaG93X2F0X25vZGUgfHwgeCA9PT0gdW5kZWZpbmVkIHx8IHkgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdG8gPSBhLm9mZnNldCgpO1xyXG5cdFx0XHRcdHggPSBvLmxlZnQ7XHJcblx0XHRcdFx0eSA9IG8udG9wICsgdGhpcy5fZGF0YS5jb3JlLmxpX2hlaWdodDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZih0aGlzLnNldHRpbmdzLmNvbnRleHRtZW51LnNlbGVjdF9ub2RlICYmICF0aGlzLmlzX3NlbGVjdGVkKG9iaikpIHtcclxuXHRcdFx0XHR0aGlzLmRlc2VsZWN0X2FsbCgpO1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0X25vZGUob2JqLCBmYWxzZSwgZmFsc2UsIGUpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpID0gcy5pdGVtcztcclxuXHRcdFx0aWYoJC5pc0Z1bmN0aW9uKGkpKSB7XHJcblx0XHRcdFx0aSA9IGkuY2FsbCh0aGlzLCBvYmosICQucHJveHkoZnVuY3Rpb24gKGkpIHtcclxuXHRcdFx0XHRcdHRoaXMuX3Nob3dfY29udGV4dG1lbnUob2JqLCB4LCB5LCBpKTtcclxuXHRcdFx0XHR9LCB0aGlzKSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoJC5pc1BsYWluT2JqZWN0KGkpKSB7XHJcblx0XHRcdFx0dGhpcy5fc2hvd19jb250ZXh0bWVudShvYmosIHgsIHksIGkpO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBzaG93IHRoZSBwcmVwYXJlZCBjb250ZXh0IG1lbnUgZm9yIGEgbm9kZVxyXG5cdFx0ICogQG5hbWUgX3Nob3dfY29udGV4dG1lbnUob2JqLCB4LCB5LCBpKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlXHJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCB0byBzaG93IHRoZSBtZW51IGF0XHJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0geSB0aGUgeS1jb29yZGluYXRlIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCB0byBzaG93IHRoZSBtZW51IGF0XHJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gaSB0aGUgb2JqZWN0IG9mIGl0ZW1zIHRvIHNob3dcclxuXHRcdCAqIEBwbHVnaW4gY29udGV4dG1lbnVcclxuXHRcdCAqIEB0cmlnZ2VyIHNob3dfY29udGV4dG1lbnUuanN0cmVlXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9zaG93X2NvbnRleHRtZW51ID0gZnVuY3Rpb24gKG9iaiwgeCwgeSwgaSkge1xyXG5cdFx0XHR2YXIgZCA9IHRoaXMuZ2V0X25vZGUob2JqLCB0cnVlKSxcclxuXHRcdFx0XHRhID0gZC5jaGlsZHJlbihcIi5qc3RyZWUtYW5jaG9yXCIpO1xyXG5cdFx0XHQkKGRvY3VtZW50KS5vbmUoXCJjb250ZXh0X3Nob3cudmFrYXRhXCIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuXHRcdFx0XHR2YXIgY2xzID0gJ2pzdHJlZS1jb250ZXh0bWVudSBqc3RyZWUtJyArIHRoaXMuZ2V0X3RoZW1lKCkgKyAnLWNvbnRleHRtZW51JztcclxuXHRcdFx0XHQkKGRhdGEuZWxlbWVudCkuYWRkQ2xhc3MoY2xzKTtcclxuXHRcdFx0fSwgdGhpcykpO1xyXG5cdFx0XHR0aGlzLl9kYXRhLmNvbnRleHRtZW51LnZpc2libGUgPSB0cnVlO1xyXG5cdFx0XHQkLnZha2F0YS5jb250ZXh0LnNob3coYSwgeyAneCcgOiB4LCAneScgOiB5IH0sIGkpO1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIHdoZW4gdGhlIGNvbnRleHRtZW51IGlzIHNob3duIGZvciBhIG5vZGVcclxuXHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdCAqIEBuYW1lIHNob3dfY29udGV4dG1lbnUuanN0cmVlXHJcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIHRoZSBub2RlXHJcblx0XHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB4IHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50XHJcblx0XHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50XHJcblx0XHRcdCAqIEBwbHVnaW4gY29udGV4dG1lbnVcclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMudHJpZ2dlcignc2hvd19jb250ZXh0bWVudScsIHsgXCJub2RlXCIgOiBvYmosIFwieFwiIDogeCwgXCJ5XCIgOiB5IH0pO1xyXG5cdFx0fTtcclxuXHR9O1xyXG5cclxuXHQvLyBjb250ZXh0bWVudSBoZWxwZXJcclxuXHQoZnVuY3Rpb24gKCQpIHtcclxuXHRcdHZhciByaWdodF90b19sZWZ0ID0gZmFsc2UsXHJcblx0XHRcdHZha2F0YV9jb250ZXh0ID0ge1xyXG5cdFx0XHRcdGVsZW1lbnRcdFx0OiBmYWxzZSxcclxuXHRcdFx0XHRyZWZlcmVuY2VcdDogZmFsc2UsXHJcblx0XHRcdFx0cG9zaXRpb25feFx0OiAwLFxyXG5cdFx0XHRcdHBvc2l0aW9uX3lcdDogMCxcclxuXHRcdFx0XHRpdGVtc1x0XHQ6IFtdLFxyXG5cdFx0XHRcdGh0bWxcdFx0OiBcIlwiLFxyXG5cdFx0XHRcdGlzX3Zpc2libGVcdDogZmFsc2VcclxuXHRcdFx0fTtcclxuXHJcblx0XHQkLnZha2F0YS5jb250ZXh0ID0ge1xyXG5cdFx0XHRzZXR0aW5ncyA6IHtcclxuXHRcdFx0XHRoaWRlX29ubW91c2VsZWF2ZVx0OiAwLFxyXG5cdFx0XHRcdGljb25zXHRcdFx0XHQ6IHRydWVcclxuXHRcdFx0fSxcclxuXHRcdFx0X3RyaWdnZXIgOiBmdW5jdGlvbiAoZXZlbnRfbmFtZSkge1xyXG5cdFx0XHRcdCQoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKFwiY29udGV4dF9cIiArIGV2ZW50X25hbWUgKyBcIi52YWthdGFcIiwge1xyXG5cdFx0XHRcdFx0XCJyZWZlcmVuY2VcIlx0OiB2YWthdGFfY29udGV4dC5yZWZlcmVuY2UsXHJcblx0XHRcdFx0XHRcImVsZW1lbnRcIlx0OiB2YWthdGFfY29udGV4dC5lbGVtZW50LFxyXG5cdFx0XHRcdFx0XCJwb3NpdGlvblwiXHQ6IHtcclxuXHRcdFx0XHRcdFx0XCJ4XCIgOiB2YWthdGFfY29udGV4dC5wb3NpdGlvbl94LFxyXG5cdFx0XHRcdFx0XHRcInlcIiA6IHZha2F0YV9jb250ZXh0LnBvc2l0aW9uX3lcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSxcclxuXHRcdFx0X2V4ZWN1dGUgOiBmdW5jdGlvbiAoaSkge1xyXG5cdFx0XHRcdGkgPSB2YWthdGFfY29udGV4dC5pdGVtc1tpXTtcclxuXHRcdFx0XHRyZXR1cm4gaSAmJiAoIWkuX2Rpc2FibGVkIHx8ICgkLmlzRnVuY3Rpb24oaS5fZGlzYWJsZWQpICYmICFpLl9kaXNhYmxlZCh7IFwiaXRlbVwiIDogaSwgXCJyZWZlcmVuY2VcIiA6IHZha2F0YV9jb250ZXh0LnJlZmVyZW5jZSwgXCJlbGVtZW50XCIgOiB2YWthdGFfY29udGV4dC5lbGVtZW50IH0pKSkgJiYgaS5hY3Rpb24gPyBpLmFjdGlvbi5jYWxsKG51bGwsIHtcclxuXHRcdFx0XHRcdFx0XHRcIml0ZW1cIlx0XHQ6IGksXHJcblx0XHRcdFx0XHRcdFx0XCJyZWZlcmVuY2VcIlx0OiB2YWthdGFfY29udGV4dC5yZWZlcmVuY2UsXHJcblx0XHRcdFx0XHRcdFx0XCJlbGVtZW50XCJcdDogdmFrYXRhX2NvbnRleHQuZWxlbWVudCxcclxuXHRcdFx0XHRcdFx0XHRcInBvc2l0aW9uXCJcdDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XCJ4XCIgOiB2YWthdGFfY29udGV4dC5wb3NpdGlvbl94LFxyXG5cdFx0XHRcdFx0XHRcdFx0XCJ5XCIgOiB2YWthdGFfY29udGV4dC5wb3NpdGlvbl95XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KSA6IGZhbHNlO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRfcGFyc2UgOiBmdW5jdGlvbiAobywgaXNfY2FsbGJhY2spIHtcclxuXHRcdFx0XHRpZighbykgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0XHRpZighaXNfY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdHZha2F0YV9jb250ZXh0Lmh0bWxcdFx0PSBcIlwiO1xyXG5cdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuaXRlbXNcdD0gW107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBzdHIgPSBcIlwiLFxyXG5cdFx0XHRcdFx0c2VwID0gZmFsc2UsXHJcblx0XHRcdFx0XHR0bXA7XHJcblxyXG5cdFx0XHRcdGlmKGlzX2NhbGxiYWNrKSB7IHN0ciArPSBcIjxcIitcInVsPlwiOyB9XHJcblx0XHRcdFx0JC5lYWNoKG8sIGZ1bmN0aW9uIChpLCB2YWwpIHtcclxuXHRcdFx0XHRcdGlmKCF2YWwpIHsgcmV0dXJuIHRydWU7IH1cclxuXHRcdFx0XHRcdHZha2F0YV9jb250ZXh0Lml0ZW1zLnB1c2godmFsKTtcclxuXHRcdFx0XHRcdGlmKCFzZXAgJiYgdmFsLnNlcGFyYXRvcl9iZWZvcmUpIHtcclxuXHRcdFx0XHRcdFx0c3RyICs9IFwiPFwiK1wibGkgY2xhc3M9J3Zha2F0YS1jb250ZXh0LXNlcGFyYXRvcic+PFwiK1wiYSBocmVmPScjJyBcIiArICgkLnZha2F0YS5jb250ZXh0LnNldHRpbmdzLmljb25zID8gJycgOiAnc3R5bGU9XCJtYXJnaW4tbGVmdDowcHg7XCInKSArIFwiPiYjMTYwOzxcIitcIi9hPjxcIitcIi9saT5cIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHNlcCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0c3RyICs9IFwiPFwiK1wibGkgY2xhc3M9J1wiICsgKHZhbC5fY2xhc3MgfHwgXCJcIikgKyAodmFsLl9kaXNhYmxlZCA9PT0gdHJ1ZSB8fCAoJC5pc0Z1bmN0aW9uKHZhbC5fZGlzYWJsZWQpICYmIHZhbC5fZGlzYWJsZWQoeyBcIml0ZW1cIiA6IHZhbCwgXCJyZWZlcmVuY2VcIiA6IHZha2F0YV9jb250ZXh0LnJlZmVyZW5jZSwgXCJlbGVtZW50XCIgOiB2YWthdGFfY29udGV4dC5lbGVtZW50IH0pKSA/IFwiIHZha2F0YS1jb250ZXh0bWVudS1kaXNhYmxlZCBcIiA6IFwiXCIpICsgXCInIFwiKyh2YWwuc2hvcnRjdXQ/XCIgZGF0YS1zaG9ydGN1dD0nXCIrdmFsLnNob3J0Y3V0K1wiJyBcIjonJykrXCI+XCI7XHJcblx0XHRcdFx0XHRzdHIgKz0gXCI8XCIrXCJhIGhyZWY9JyMnIHJlbD0nXCIgKyAodmFrYXRhX2NvbnRleHQuaXRlbXMubGVuZ3RoIC0gMSkgKyBcIic+XCI7XHJcblx0XHRcdFx0XHRpZigkLnZha2F0YS5jb250ZXh0LnNldHRpbmdzLmljb25zKSB7XHJcblx0XHRcdFx0XHRcdHN0ciArPSBcIjxcIitcImkgXCI7XHJcblx0XHRcdFx0XHRcdGlmKHZhbC5pY29uKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYodmFsLmljb24uaW5kZXhPZihcIi9cIikgIT09IC0xIHx8IHZhbC5pY29uLmluZGV4T2YoXCIuXCIpICE9PSAtMSkgeyBzdHIgKz0gXCIgc3R5bGU9J2JhY2tncm91bmQ6dXJsKFxcXCJcIiArIHZhbC5pY29uICsgXCJcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdCcgXCI7IH1cclxuXHRcdFx0XHRcdFx0XHRlbHNlIHsgc3RyICs9IFwiIGNsYXNzPSdcIiArIHZhbC5pY29uICsgXCInIFwiOyB9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0c3RyICs9IFwiPjxcIitcIi9pPjxcIitcInNwYW4gY2xhc3M9J3Zha2F0YS1jb250ZXh0bWVudS1zZXAnPiYjMTYwOzxcIitcIi9zcGFuPlwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0c3RyICs9IHZhbC5sYWJlbCArICh2YWwuc2hvcnRjdXQ/JyA8c3BhbiBjbGFzcz1cInZha2F0YS1jb250ZXh0bWVudS1zaG9ydGN1dCB2YWthdGEtY29udGV4dG1lbnUtc2hvcnRjdXQtJyt2YWwuc2hvcnRjdXQrJ1wiPicrICh2YWwuc2hvcnRjdXRfbGFiZWwgfHwgJycpICsnPC9zcGFuPic6JycpICsgXCI8XCIrXCIvYT5cIjtcclxuXHRcdFx0XHRcdGlmKHZhbC5zdWJtZW51KSB7XHJcblx0XHRcdFx0XHRcdHRtcCA9ICQudmFrYXRhLmNvbnRleHQuX3BhcnNlKHZhbC5zdWJtZW51LCB0cnVlKTtcclxuXHRcdFx0XHRcdFx0aWYodG1wKSB7IHN0ciArPSB0bXA7IH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHN0ciArPSBcIjxcIitcIi9saT5cIjtcclxuXHRcdFx0XHRcdGlmKHZhbC5zZXBhcmF0b3JfYWZ0ZXIpIHtcclxuXHRcdFx0XHRcdFx0c3RyICs9IFwiPFwiK1wibGkgY2xhc3M9J3Zha2F0YS1jb250ZXh0LXNlcGFyYXRvcic+PFwiK1wiYSBocmVmPScjJyBcIiArICgkLnZha2F0YS5jb250ZXh0LnNldHRpbmdzLmljb25zID8gJycgOiAnc3R5bGU9XCJtYXJnaW4tbGVmdDowcHg7XCInKSArIFwiPiYjMTYwOzxcIitcIi9hPjxcIitcIi9saT5cIjtcclxuXHRcdFx0XHRcdFx0c2VwID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRzdHIgID0gc3RyLnJlcGxhY2UoLzxsaSBjbGFzc1xcPSd2YWthdGEtY29udGV4dC1zZXBhcmF0b3InXFw+PFxcL2xpXFw+JC8sXCJcIik7XHJcblx0XHRcdFx0aWYoaXNfY2FsbGJhY2spIHsgc3RyICs9IFwiPC91bD5cIjsgfVxyXG5cdFx0XHRcdC8qKlxyXG5cdFx0XHRcdCAqIHRyaWdnZXJlZCBvbiB0aGUgZG9jdW1lbnQgd2hlbiB0aGUgY29udGV4dG1lbnUgaXMgcGFyc2VkIChIVE1MIGlzIGJ1aWx0KVxyXG5cdFx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHRcdCAqIEBwbHVnaW4gY29udGV4dG1lbnVcclxuXHRcdFx0XHQgKiBAbmFtZSBjb250ZXh0X3BhcnNlLnZha2F0YVxyXG5cdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSByZWZlcmVuY2UgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmlnaHQgY2xpY2tlZFxyXG5cdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IHRoZSBET00gZWxlbWVudCBvZiB0aGUgbWVudSBpdHNlbGZcclxuXHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gdGhlIHggJiB5IGNvb3JkaW5hdGVzIG9mIHRoZSBtZW51XHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0aWYoIWlzX2NhbGxiYWNrKSB7IHZha2F0YV9jb250ZXh0Lmh0bWwgPSBzdHI7ICQudmFrYXRhLmNvbnRleHQuX3RyaWdnZXIoXCJwYXJzZVwiKTsgfVxyXG5cdFx0XHRcdHJldHVybiBzdHIubGVuZ3RoID4gMTAgPyBzdHIgOiBmYWxzZTtcclxuXHRcdFx0fSxcclxuXHRcdFx0X3Nob3dfc3VibWVudSA6IGZ1bmN0aW9uIChvKSB7XHJcblx0XHRcdFx0byA9ICQobyk7XHJcblx0XHRcdFx0aWYoIW8ubGVuZ3RoIHx8ICFvLmNoaWxkcmVuKFwidWxcIikubGVuZ3RoKSB7IHJldHVybjsgfVxyXG5cdFx0XHRcdHZhciBlID0gby5jaGlsZHJlbihcInVsXCIpLFxyXG5cdFx0XHRcdFx0eCA9IG8ub2Zmc2V0KCkubGVmdCArIG8ub3V0ZXJXaWR0aCgpLFxyXG5cdFx0XHRcdFx0eSA9IG8ub2Zmc2V0KCkudG9wLFxyXG5cdFx0XHRcdFx0dyA9IGUud2lkdGgoKSxcclxuXHRcdFx0XHRcdGggPSBlLmhlaWdodCgpLFxyXG5cdFx0XHRcdFx0ZHcgPSAkKHdpbmRvdykud2lkdGgoKSArICQod2luZG93KS5zY3JvbGxMZWZ0KCksXHJcblx0XHRcdFx0XHRkaCA9ICQod2luZG93KS5oZWlnaHQoKSArICQod2luZG93KS5zY3JvbGxUb3AoKTtcclxuXHRcdFx0XHQvLyDQvNC+0LbQtSDQtNCwINGB0LUg0YHQv9C10YHRgtC4INC1INC10LTQvdCwINC/0YDQvtCy0LXRgNC60LAgLSDQtNCw0LvQuCDQvdGP0LzQsCDQvdGP0LrQvtC5INC+0YIg0LrQu9Cw0YHQvtCy0LXRgtC1INCy0LXRh9C1INC90LDQs9C+0YDQtVxyXG5cdFx0XHRcdGlmKHJpZ2h0X3RvX2xlZnQpIHtcclxuXHRcdFx0XHRcdG9beCAtICh3ICsgMTAgKyBvLm91dGVyV2lkdGgoKSkgPCAwID8gXCJhZGRDbGFzc1wiIDogXCJyZW1vdmVDbGFzc1wiXShcInZha2F0YS1jb250ZXh0LWxlZnRcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0b1t4ICsgdyArIDEwID4gZHcgPyBcImFkZENsYXNzXCIgOiBcInJlbW92ZUNsYXNzXCJdKFwidmFrYXRhLWNvbnRleHQtcmlnaHRcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKHkgKyBoICsgMTAgPiBkaCkge1xyXG5cdFx0XHRcdFx0ZS5jc3MoXCJib3R0b21cIixcIi0xcHhcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGUuc2hvdygpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRzaG93IDogZnVuY3Rpb24gKHJlZmVyZW5jZSwgcG9zaXRpb24sIGRhdGEpIHtcclxuXHRcdFx0XHR2YXIgbywgZSwgeCwgeSwgdywgaCwgZHcsIGRoLCBjb25kID0gdHJ1ZTtcclxuXHRcdFx0XHRpZih2YWthdGFfY29udGV4dC5lbGVtZW50ICYmIHZha2F0YV9jb250ZXh0LmVsZW1lbnQubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50LndpZHRoKCcnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0c3dpdGNoKGNvbmQpIHtcclxuXHRcdFx0XHRcdGNhc2UgKCFwb3NpdGlvbiAmJiAhcmVmZXJlbmNlKTpcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0Y2FzZSAoISFwb3NpdGlvbiAmJiAhIXJlZmVyZW5jZSk6XHJcblx0XHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LnJlZmVyZW5jZVx0PSByZWZlcmVuY2U7XHJcblx0XHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LnBvc2l0aW9uX3hcdD0gcG9zaXRpb24ueDtcclxuXHRcdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQucG9zaXRpb25feVx0PSBwb3NpdGlvbi55O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgKCFwb3NpdGlvbiAmJiAhIXJlZmVyZW5jZSk6XHJcblx0XHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LnJlZmVyZW5jZVx0PSByZWZlcmVuY2U7XHJcblx0XHRcdFx0XHRcdG8gPSByZWZlcmVuY2Uub2Zmc2V0KCk7XHJcblx0XHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LnBvc2l0aW9uX3hcdD0gby5sZWZ0ICsgcmVmZXJlbmNlLm91dGVySGVpZ2h0KCk7XHJcblx0XHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LnBvc2l0aW9uX3lcdD0gby50b3A7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSAoISFwb3NpdGlvbiAmJiAhcmVmZXJlbmNlKTpcclxuXHRcdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQucG9zaXRpb25feFx0PSBwb3NpdGlvbi54O1xyXG5cdFx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5wb3NpdGlvbl95XHQ9IHBvc2l0aW9uLnk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZighIXJlZmVyZW5jZSAmJiAhZGF0YSAmJiAkKHJlZmVyZW5jZSkuZGF0YSgndmFrYXRhX2NvbnRleHRtZW51JykpIHtcclxuXHRcdFx0XHRcdGRhdGEgPSAkKHJlZmVyZW5jZSkuZGF0YSgndmFrYXRhX2NvbnRleHRtZW51Jyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKCQudmFrYXRhLmNvbnRleHQuX3BhcnNlKGRhdGEpKSB7XHJcblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50Lmh0bWwodmFrYXRhX2NvbnRleHQuaHRtbCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0Lml0ZW1zLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0ZSA9IHZha2F0YV9jb250ZXh0LmVsZW1lbnQ7XHJcblx0XHRcdFx0XHR4ID0gdmFrYXRhX2NvbnRleHQucG9zaXRpb25feDtcclxuXHRcdFx0XHRcdHkgPSB2YWthdGFfY29udGV4dC5wb3NpdGlvbl95O1xyXG5cdFx0XHRcdFx0dyA9IGUud2lkdGgoKTtcclxuXHRcdFx0XHRcdGggPSBlLmhlaWdodCgpO1xyXG5cdFx0XHRcdFx0ZHcgPSAkKHdpbmRvdykud2lkdGgoKSArICQod2luZG93KS5zY3JvbGxMZWZ0KCk7XHJcblx0XHRcdFx0XHRkaCA9ICQod2luZG93KS5oZWlnaHQoKSArICQod2luZG93KS5zY3JvbGxUb3AoKTtcclxuXHRcdFx0XHRcdGlmKHJpZ2h0X3RvX2xlZnQpIHtcclxuXHRcdFx0XHRcdFx0eCAtPSBlLm91dGVyV2lkdGgoKTtcclxuXHRcdFx0XHRcdFx0aWYoeCA8ICQod2luZG93KS5zY3JvbGxMZWZ0KCkgKyAyMCkge1xyXG5cdFx0XHRcdFx0XHRcdHggPSAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpICsgMjA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKHggKyB3ICsgMjAgPiBkdykge1xyXG5cdFx0XHRcdFx0XHR4ID0gZHcgLSAodyArIDIwKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKHkgKyBoICsgMjAgPiBkaCkge1xyXG5cdFx0XHRcdFx0XHR5ID0gZGggLSAoaCArIDIwKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5lbGVtZW50XHJcblx0XHRcdFx0XHRcdC5jc3MoeyBcImxlZnRcIiA6IHgsIFwidG9wXCIgOiB5IH0pXHJcblx0XHRcdFx0XHRcdC5zaG93KClcclxuXHRcdFx0XHRcdFx0LmZpbmQoJ2E6ZXEoMCknKS5mb2N1cygpLnBhcmVudCgpLmFkZENsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIik7XHJcblx0XHRcdFx0XHR2YWthdGFfY29udGV4dC5pc192aXNpYmxlID0gdHJ1ZTtcclxuXHRcdFx0XHRcdC8qKlxyXG5cdFx0XHRcdFx0ICogdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCB3aGVuIHRoZSBjb250ZXh0bWVudSBpcyBzaG93blxyXG5cdFx0XHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdFx0XHQgKiBAcGx1Z2luIGNvbnRleHRtZW51XHJcblx0XHRcdFx0XHQgKiBAbmFtZSBjb250ZXh0X3Nob3cudmFrYXRhXHJcblx0XHRcdFx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gcmVmZXJlbmNlIHRoZSBlbGVtZW50IHRoYXQgd2FzIHJpZ2h0IGNsaWNrZWRcclxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IHRoZSBET00gZWxlbWVudCBvZiB0aGUgbWVudSBpdHNlbGZcclxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiB0aGUgeCAmIHkgY29vcmRpbmF0ZXMgb2YgdGhlIG1lbnVcclxuXHRcdFx0XHRcdCAqL1xyXG5cdFx0XHRcdFx0JC52YWthdGEuY29udGV4dC5fdHJpZ2dlcihcInNob3dcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRoaWRlIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0LmlzX3Zpc2libGUpIHtcclxuXHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LmVsZW1lbnQuaGlkZSgpLmZpbmQoXCJ1bFwiKS5oaWRlKCkuZW5kKCkuZmluZCgnOmZvY3VzJykuYmx1cigpO1xyXG5cdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuaXNfdmlzaWJsZSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0LyoqXHJcblx0XHRcdFx0XHQgKiB0cmlnZ2VyZWQgb24gdGhlIGRvY3VtZW50IHdoZW4gdGhlIGNvbnRleHRtZW51IGlzIGhpZGRlblxyXG5cdFx0XHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdFx0XHQgKiBAcGx1Z2luIGNvbnRleHRtZW51XHJcblx0XHRcdFx0XHQgKiBAbmFtZSBjb250ZXh0X2hpZGUudmFrYXRhXHJcblx0XHRcdFx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gcmVmZXJlbmNlIHRoZSBlbGVtZW50IHRoYXQgd2FzIHJpZ2h0IGNsaWNrZWRcclxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50IHRoZSBET00gZWxlbWVudCBvZiB0aGUgbWVudSBpdHNlbGZcclxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiB0aGUgeCAmIHkgY29vcmRpbmF0ZXMgb2YgdGhlIG1lbnVcclxuXHRcdFx0XHRcdCAqL1xyXG5cdFx0XHRcdFx0JC52YWthdGEuY29udGV4dC5fdHJpZ2dlcihcImhpZGVcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0JChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJpZ2h0X3RvX2xlZnQgPSAkKFwiYm9keVwiKS5jc3MoXCJkaXJlY3Rpb25cIikgPT09IFwicnRsXCI7XHJcblx0XHRcdHZhciB0byA9IGZhbHNlO1xyXG5cclxuXHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudCA9ICQoXCI8dWwgY2xhc3M9J3Zha2F0YS1jb250ZXh0Jz48L3VsPlwiKTtcclxuXHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudFxyXG5cdFx0XHRcdC5vbihcIm1vdXNlZW50ZXJcIiwgXCJsaVwiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcblx0XHRcdFx0XHRpZigkLmNvbnRhaW5zKHRoaXMsIGUucmVsYXRlZFRhcmdldCkpIHtcclxuXHRcdFx0XHRcdFx0Ly8g0L/RgNC10LzQsNGF0L3QsNGC0L4g0LfQsNGA0LDQtNC4IGRlbGVnYXRlIG1vdXNlbGVhdmUg0L/Qvi3QtNC+0LvRg1xyXG5cdFx0XHRcdFx0XHQvLyAkKHRoaXMpLmZpbmQoXCIudmFrYXRhLWNvbnRleHQtaG92ZXJcIikucmVtb3ZlQ2xhc3MoXCJ2YWthdGEtY29udGV4dC1ob3ZlclwiKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmKHRvKSB7IGNsZWFyVGltZW91dCh0byk7IH1cclxuXHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LmVsZW1lbnQuZmluZChcIi52YWthdGEtY29udGV4dC1ob3ZlclwiKS5yZW1vdmVDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmVuZCgpO1xyXG5cclxuXHRcdFx0XHRcdCQodGhpcylcclxuXHRcdFx0XHRcdFx0LnNpYmxpbmdzKCkuZmluZChcInVsXCIpLmhpZGUoKS5lbmQoKS5lbmQoKVxyXG5cdFx0XHRcdFx0XHQucGFyZW50c1VudGlsKFwiLnZha2F0YS1jb250ZXh0XCIsIFwibGlcIikuYWRkQmFjaygpLmFkZENsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIik7XHJcblx0XHRcdFx0XHQkLnZha2F0YS5jb250ZXh0Ll9zaG93X3N1Ym1lbnUodGhpcyk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQvLyDRgtC10YHRgtC+0LLQviAtINC00LDQu9C4INC90LUg0L3QsNGC0L7QstCw0YDQstCwP1xyXG5cdFx0XHRcdC5vbihcIm1vdXNlbGVhdmVcIiwgXCJsaVwiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0aWYoJC5jb250YWlucyh0aGlzLCBlLnJlbGF0ZWRUYXJnZXQpKSB7IHJldHVybjsgfVxyXG5cdFx0XHRcdFx0JCh0aGlzKS5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmFkZEJhY2soKS5yZW1vdmVDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0Lm9uKFwibW91c2VsZWF2ZVwiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0JCh0aGlzKS5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLnJlbW92ZUNsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIik7XHJcblx0XHRcdFx0XHRpZigkLnZha2F0YS5jb250ZXh0LnNldHRpbmdzLmhpZGVfb25tb3VzZWxlYXZlKSB7XHJcblx0XHRcdFx0XHRcdHRvID0gc2V0VGltZW91dChcclxuXHRcdFx0XHRcdFx0XHQoZnVuY3Rpb24gKHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7ICQudmFrYXRhLmNvbnRleHQuaGlkZSgpOyB9O1xyXG5cdFx0XHRcdFx0XHRcdH0odGhpcykpLCAkLnZha2F0YS5jb250ZXh0LnNldHRpbmdzLmhpZGVfb25tb3VzZWxlYXZlKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5vbihcImNsaWNrXCIsIFwiYVwiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0Lm9uKFwibW91c2V1cFwiLCBcImFcIiwgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdGlmKCEkKHRoaXMpLmJsdXIoKS5wYXJlbnQoKS5oYXNDbGFzcyhcInZha2F0YS1jb250ZXh0LWRpc2FibGVkXCIpICYmICQudmFrYXRhLmNvbnRleHQuX2V4ZWN1dGUoJCh0aGlzKS5hdHRyKFwicmVsXCIpKSAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0JC52YWthdGEuY29udGV4dC5oaWRlKCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQub24oJ2tleWRvd24nLCAnYScsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRcdHZhciBvID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0c3dpdGNoKGUud2hpY2gpIHtcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDEzOlxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzI6XHJcblx0XHRcdFx0XHRcdFx0XHRlLnR5cGUgPSBcIm1vdXNldXBcIjtcclxuXHRcdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdCQoZS5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKGUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSAzNzpcclxuXHRcdFx0XHRcdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0LmlzX3Zpc2libGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmxhc3QoKS5wYXJlbnRzKFwibGk6ZXEoMClcIikuZmluZChcInVsXCIpLmhpZGUoKS5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLnJlbW92ZUNsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIikuZW5kKCkuZW5kKCkuY2hpbGRyZW4oJ2EnKS5mb2N1cygpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDM4OlxyXG5cdFx0XHRcdFx0XHRcdFx0aWYodmFrYXRhX2NvbnRleHQuaXNfdmlzaWJsZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRvID0gdmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwidWw6dmlzaWJsZVwiKS5hZGRCYWNrKCkubGFzdCgpLmNoaWxkcmVuKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLnJlbW92ZUNsYXNzKFwidmFrYXRhLWNvbnRleHQtaG92ZXJcIikucHJldkFsbChcImxpOm5vdCgudmFrYXRhLWNvbnRleHQtc2VwYXJhdG9yKVwiKS5maXJzdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZighby5sZW5ndGgpIHsgbyA9IHZha2F0YV9jb250ZXh0LmVsZW1lbnQuZmluZChcInVsOnZpc2libGVcIikuYWRkQmFjaygpLmxhc3QoKS5jaGlsZHJlbihcImxpOm5vdCgudmFrYXRhLWNvbnRleHQtc2VwYXJhdG9yKVwiKS5sYXN0KCk7IH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0by5hZGRDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmNoaWxkcmVuKCdhJykuZm9jdXMoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSAzOTpcclxuXHRcdFx0XHRcdFx0XHRcdGlmKHZha2F0YV9jb250ZXh0LmlzX3Zpc2libGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwiLnZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmxhc3QoKS5jaGlsZHJlbihcInVsXCIpLnNob3coKS5jaGlsZHJlbihcImxpOm5vdCgudmFrYXRhLWNvbnRleHQtc2VwYXJhdG9yKVwiKS5yZW1vdmVDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmZpcnN0KCkuYWRkQ2xhc3MoXCJ2YWthdGEtY29udGV4dC1ob3ZlclwiKS5jaGlsZHJlbignYScpLmZvY3VzKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDA6XHJcblx0XHRcdFx0XHRcdFx0XHRpZih2YWthdGFfY29udGV4dC5pc192aXNpYmxlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdG8gPSB2YWthdGFfY29udGV4dC5lbGVtZW50LmZpbmQoXCJ1bDp2aXNpYmxlXCIpLmFkZEJhY2soKS5sYXN0KCkuY2hpbGRyZW4oXCIudmFrYXRhLWNvbnRleHQtaG92ZXJcIikucmVtb3ZlQ2xhc3MoXCJ2YWthdGEtY29udGV4dC1ob3ZlclwiKS5uZXh0QWxsKFwibGk6bm90KC52YWthdGEtY29udGV4dC1zZXBhcmF0b3IpXCIpLmZpcnN0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmKCFvLmxlbmd0aCkgeyBvID0gdmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwidWw6dmlzaWJsZVwiKS5hZGRCYWNrKCkubGFzdCgpLmNoaWxkcmVuKFwibGk6bm90KC52YWthdGEtY29udGV4dC1zZXBhcmF0b3IpXCIpLmZpcnN0KCk7IH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0by5hZGRDbGFzcyhcInZha2F0YS1jb250ZXh0LWhvdmVyXCIpLmNoaWxkcmVuKCdhJykuZm9jdXMoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSAyNzpcclxuXHRcdFx0XHRcdFx0XHRcdCQudmFrYXRhLmNvbnRleHQuaGlkZSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0XHRcdC8vY29uc29sZS5sb2coZS53aGljaCk7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQub24oJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0dmFyIGEgPSB2YWthdGFfY29udGV4dC5lbGVtZW50LmZpbmQoJy52YWthdGEtY29udGV4dG1lbnUtc2hvcnRjdXQtJyArIGUud2hpY2gpLnBhcmVudCgpO1xyXG5cdFx0XHRcdFx0aWYoYS5wYXJlbnQoKS5ub3QoJy52YWthdGEtY29udGV4dC1kaXNhYmxlZCcpKSB7XHJcblx0XHRcdFx0XHRcdGEubW91c2V1cCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0LmFwcGVuZFRvKFwiYm9keVwiKTtcclxuXHJcblx0XHRcdCQoZG9jdW1lbnQpXHJcblx0XHRcdFx0Lm9uKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRpZih2YWthdGFfY29udGV4dC5pc192aXNpYmxlICYmICEkLmNvbnRhaW5zKHZha2F0YV9jb250ZXh0LmVsZW1lbnRbMF0sIGUudGFyZ2V0KSkgeyAkLnZha2F0YS5jb250ZXh0LmhpZGUoKTsgfVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0Lm9uKFwiY29udGV4dF9zaG93LnZha2F0YVwiLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0dmFrYXRhX2NvbnRleHQuZWxlbWVudC5maW5kKFwibGk6aGFzKHVsKVwiKS5jaGlsZHJlbihcImFcIikuYWRkQ2xhc3MoXCJ2YWthdGEtY29udGV4dC1wYXJlbnRcIik7XHJcblx0XHRcdFx0XHRpZihyaWdodF90b19sZWZ0KSB7XHJcblx0XHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LmVsZW1lbnQuYWRkQ2xhc3MoXCJ2YWthdGEtY29udGV4dC1ydGxcIikuY3NzKFwiZGlyZWN0aW9uXCIsIFwicnRsXCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8gYWxzbyBhcHBseSBhIFJUTCBjbGFzcz9cclxuXHRcdFx0XHRcdHZha2F0YV9jb250ZXh0LmVsZW1lbnQuZmluZChcInVsXCIpLmhpZGUoKS5lbmQoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH0oJCkpO1xyXG5cdC8vICQuanN0cmVlLmRlZmF1bHRzLnBsdWdpbnMucHVzaChcImNvbnRleHRtZW51XCIpO1xyXG5cclxuLyoqXHJcbiAqICMjIyBEcmFnJ24nZHJvcCBwbHVnaW5cclxuICpcclxuICogRW5hYmxlcyBkcmFnZ2luZyBhbmQgZHJvcHBpbmcgb2Ygbm9kZXMgaW4gdGhlIHRyZWUsIHJlc3VsdGluZyBpbiBhIG1vdmUgb3IgY29weSBvcGVyYXRpb25zLlxyXG4gKi9cclxuXHJcblx0LyoqXHJcblx0ICogc3RvcmVzIGFsbCBkZWZhdWx0cyBmb3IgdGhlIGRyYWcnbidkcm9wIHBsdWdpblxyXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmRuZFxyXG5cdCAqIEBwbHVnaW4gZG5kXHJcblx0ICovXHJcblx0JC5qc3RyZWUuZGVmYXVsdHMuZG5kID0ge1xyXG5cdFx0LyoqXHJcblx0XHQgKiBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhIGNvcHkgc2hvdWxkIGJlIHBvc3NpYmxlIHdoaWxlIGRyYWdnaW5nIChieSBwcmVzc2ludCB0aGUgbWV0YSBrZXkgb3IgQ3RybCkuIERlZmF1bHRzIHRvIGB0cnVlYC5cclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLmRuZC5jb3B5XHJcblx0XHQgKiBAcGx1Z2luIGRuZFxyXG5cdFx0ICovXHJcblx0XHRjb3B5IDogdHJ1ZSxcclxuXHRcdC8qKlxyXG5cdFx0ICogYSBudW1iZXIgaW5kaWNhdGluZyBob3cgbG9uZyBhIG5vZGUgc2hvdWxkIHJlbWFpbiBob3ZlcmVkIHdoaWxlIGRyYWdnaW5nIHRvIGJlIG9wZW5lZC4gRGVmYXVsdHMgdG8gYDUwMGAuXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5kbmQub3Blbl90aW1lb3V0XHJcblx0XHQgKiBAcGx1Z2luIGRuZFxyXG5cdFx0ICovXHJcblx0XHRvcGVuX3RpbWVvdXQgOiA1MDAsXHJcblx0XHQvKipcclxuXHRcdCAqIGEgZnVuY3Rpb24gaW52b2tlZCBlYWNoIHRpbWUgYSBub2RlIGlzIGFib3V0IHRvIGJlIGRyYWdnZWQsIGludm9rZWQgaW4gdGhlIHRyZWUncyBzY29wZSBhbmQgcmVjZWl2ZXMgdGhlIG5vZGUgYXMgYW4gYXJndW1lbnQgLSByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGRyYWdnaW5nXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5kbmQuaXNfZHJhZ2dhYmxlXHJcblx0XHQgKiBAcGx1Z2luIGRuZFxyXG5cdFx0ICovXHJcblx0XHRpc19kcmFnZ2FibGUgOiB0cnVlLFxyXG5cdFx0LyoqXHJcblx0XHQgKiBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBjaGVja3Mgc2hvdWxkIGNvbnN0YW50bHkgYmUgbWFkZSB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZyB0aGUgbm9kZSAoYXMgb3Bwb3NlZCB0byBjaGVja2luZyBvbmx5IG9uIGRyb3ApLCBkZWZhdWx0IGlzIGB0cnVlYFxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuZG5kLmNoZWNrX3doaWxlX2RyYWdnaW5nXHJcblx0XHQgKiBAcGx1Z2luIGRuZFxyXG5cdFx0ICovXHJcblx0XHRjaGVja193aGlsZV9kcmFnZ2luZyA6IHRydWVcclxuXHR9O1xyXG5cdC8vIFRPRE86IG5vdyBjaGVjayB3b3JrcyBieSBjaGVja2luZyBmb3IgZWFjaCBub2RlIGluZGl2aWR1YWxseSwgaG93IGFib3V0IG1heF9jaGlsZHJlbiwgdW5pcXVlLCBldGM/XHJcblx0Ly8gVE9ETzogZHJvcCBzb21ld2hlcmUgZWxzZSAtIG1heWJlIGRlbW8gb25seT9cclxuXHQkLmpzdHJlZS5wbHVnaW5zLmRuZCA9IGZ1bmN0aW9uIChvcHRpb25zLCBwYXJlbnQpIHtcclxuXHRcdHRoaXMuYmluZCA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cGFyZW50LmJpbmQuY2FsbCh0aGlzKTtcclxuXHJcblx0XHRcdHRoaXMuZWxlbWVudFxyXG5cdFx0XHRcdC5vbignbW91c2Vkb3duIHRvdWNoc3RhcnQnLCAnLmpzdHJlZS1hbmNob3InLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHR2YXIgb2JqID0gdGhpcy5nZXRfbm9kZShlLnRhcmdldCksXHJcblx0XHRcdFx0XHRcdG1sdCA9IHRoaXMuaXNfc2VsZWN0ZWQob2JqKSA/IHRoaXMuZ2V0X3NlbGVjdGVkKCkubGVuZ3RoIDogMTtcclxuXHRcdFx0XHRcdGlmKG9iaiAmJiBvYmouaWQgJiYgb2JqLmlkICE9PSBcIiNcIiAmJiAoZS53aGljaCA9PT0gMSB8fCBlLnR5cGUgPT09IFwidG91Y2hzdGFydFwiKSAmJlxyXG5cdFx0XHRcdFx0XHQodGhpcy5zZXR0aW5ncy5kbmQuaXNfZHJhZ2dhYmxlID09PSB0cnVlIHx8ICgkLmlzRnVuY3Rpb24odGhpcy5zZXR0aW5ncy5kbmQuaXNfZHJhZ2dhYmxlKSAmJiB0aGlzLnNldHRpbmdzLmRuZC5pc19kcmFnZ2FibGUuY2FsbCh0aGlzLCBvYmopKSlcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlcignbW91c2Vkb3duLmpzdHJlZScpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJC52YWthdGEuZG5kLnN0YXJ0KGUsIHsgJ2pzdHJlZScgOiB0cnVlLCAnb3JpZ2luJyA6IHRoaXMsICdvYmonIDogdGhpcy5nZXRfbm9kZShvYmosdHJ1ZSksICdub2RlcycgOiBtbHQgPiAxID8gdGhpcy5nZXRfc2VsZWN0ZWQoKSA6IFtvYmouaWRdIH0sICc8ZGl2IGlkPVwianN0cmVlLWRuZFwiIGNsYXNzPVwianN0cmVlLScgKyB0aGlzLmdldF90aGVtZSgpICsgJ1wiPjxpIGNsYXNzPVwianN0cmVlLWljb24ganN0cmVlLWVyXCI+PC9pPicgKyAobWx0ID4gMSA/IG1sdCArICcgJyArIHRoaXMuZ2V0X3N0cmluZygnbm9kZXMnKSA6IHRoaXMuZ2V0X3RleHQoZS5jdXJyZW50VGFyZ2V0LCB0cnVlKSkgKyAnPGlucyBjbGFzcz1cImpzdHJlZS1jb3B5XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+KzwvaW5zPjwvZGl2PicpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sIHRoaXMpKTtcclxuXHRcdH07XHJcblx0fTtcclxuXHJcblx0JChmdW5jdGlvbigpIHtcclxuXHRcdC8vIGJpbmQgb25seSBvbmNlIGZvciBhbGwgaW5zdGFuY2VzXHJcblx0XHR2YXIgbGFzdG12ID0gZmFsc2UsXHJcblx0XHRcdGxhc3RlciA9IGZhbHNlLFxyXG5cdFx0XHRvcGVudG8gPSBmYWxzZSxcclxuXHRcdFx0bWFya2VyID0gJCgnPGRpdiBpZD1cImpzdHJlZS1tYXJrZXJcIj4mIzE2MDs8L2Rpdj4nKS5oaWRlKCkuYXBwZW5kVG8oJ2JvZHknKTtcclxuXHJcblx0XHQkKGRvY3VtZW50KVxyXG5cdFx0XHQuYmluZCgnZG5kX3N0YXJ0LnZha2F0YScsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcblx0XHRcdFx0bGFzdG12ID0gZmFsc2U7XHJcblx0XHRcdH0pXHJcblx0XHRcdC5iaW5kKCdkbmRfbW92ZS52YWthdGEnLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdGlmKG9wZW50bykgeyBjbGVhclRpbWVvdXQob3BlbnRvKTsgfVxyXG5cdFx0XHRcdGlmKCFkYXRhLmRhdGEuanN0cmVlKSB7IHJldHVybjsgfVxyXG5cclxuXHRcdFx0XHQvLyBpZiB3ZSBhcmUgaG92ZXJpbmcgdGhlIG1hcmtlciBpbWFnZSBkbyBub3RoaW5nIChjYW4gaGFwcGVuIG9uIFwiaW5zaWRlXCIgZHJhZ3MpXHJcblx0XHRcdFx0aWYoZGF0YS5ldmVudC50YXJnZXQuaWQgJiYgZGF0YS5ldmVudC50YXJnZXQuaWQgPT09ICdqc3RyZWUtbWFya2VyJykge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dmFyIGlucyA9ICQuanN0cmVlLnJlZmVyZW5jZShkYXRhLmV2ZW50LnRhcmdldCksXHJcblx0XHRcdFx0XHRyZWYgPSBmYWxzZSxcclxuXHRcdFx0XHRcdG9mZiA9IGZhbHNlLFxyXG5cdFx0XHRcdFx0cmVsID0gZmFsc2UsXHJcblx0XHRcdFx0XHRsLCB0LCBoLCBwLCBpLCBvLCBvaywgdDEsIHQyLCBvcCwgcHMsIHByO1xyXG5cdFx0XHRcdC8vIGlmIHdlIGFyZSBvdmVyIGFuIGluc3RhbmNlXHJcblx0XHRcdFx0aWYoaW5zICYmIGlucy5fZGF0YSAmJiBpbnMuX2RhdGEuZG5kKSB7XHJcblx0XHRcdFx0XHRtYXJrZXIuYXR0cignY2xhc3MnLCAnanN0cmVlLScgKyBpbnMuZ2V0X3RoZW1lKCkpO1xyXG5cdFx0XHRcdFx0ZGF0YS5oZWxwZXJcclxuXHRcdFx0XHRcdFx0LmNoaWxkcmVuKCkuYXR0cignY2xhc3MnLCAnanN0cmVlLScgKyBpbnMuZ2V0X3RoZW1lKCkpXHJcblx0XHRcdFx0XHRcdC5maW5kKCcuanN0cmVlLWNvcHk6ZXEoMCknKVsgZGF0YS5kYXRhLm9yaWdpbiAmJiBkYXRhLmRhdGEub3JpZ2luLnNldHRpbmdzLmRuZC5jb3B5ICYmIChkYXRhLmV2ZW50Lm1ldGFLZXkgfHwgZGF0YS5ldmVudC5jdHJsS2V5KSA/ICdzaG93JyA6ICdoaWRlJyBdKCk7XHJcblxyXG5cclxuXHRcdFx0XHRcdC8vIGlmIGFyZSBob3ZlcmluZyB0aGUgY29udGFpbmVyIGl0c2VsZiBhZGQgYSBuZXcgcm9vdCBub2RlXHJcblx0XHRcdFx0XHRpZiggKGRhdGEuZXZlbnQudGFyZ2V0ID09PSBpbnMuZWxlbWVudFswXSB8fCBkYXRhLmV2ZW50LnRhcmdldCA9PT0gaW5zLmdldF9jb250YWluZXJfdWwoKVswXSkgJiYgaW5zLmdldF9jb250YWluZXJfdWwoKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHRvayA9IHRydWU7XHJcblx0XHRcdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gZGF0YS5kYXRhLm5vZGVzLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xyXG5cdFx0XHRcdFx0XHRcdG9rID0gb2sgJiYgaW5zLmNoZWNrKCAoZGF0YS5kYXRhLm9yaWdpbiAmJiBkYXRhLmRhdGEub3JpZ2luLnNldHRpbmdzLmRuZC5jb3B5ICYmIChkYXRhLmV2ZW50Lm1ldGFLZXkgfHwgZGF0YS5ldmVudC5jdHJsS2V5KSA/IFwiY29weV9ub2RlXCIgOiBcIm1vdmVfbm9kZVwiKSwgKGRhdGEuZGF0YS5vcmlnaW4gJiYgZGF0YS5kYXRhLm9yaWdpbiAhPT0gaW5zID8gZGF0YS5kYXRhLm9yaWdpbi5nZXRfbm9kZShkYXRhLmRhdGEubm9kZXNbdDFdKSA6IGRhdGEuZGF0YS5ub2Rlc1t0MV0pLCAnIycsICdsYXN0Jyk7XHJcblx0XHRcdFx0XHRcdFx0aWYoIW9rKSB7IGJyZWFrOyB9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYob2spIHtcclxuXHRcdFx0XHRcdFx0XHRsYXN0bXYgPSB7ICdpbnMnIDogaW5zLCAncGFyJyA6ICcjJywgJ3BvcycgOiAnbGFzdCcgfTtcclxuXHRcdFx0XHRcdFx0XHRtYXJrZXIuaGlkZSgpO1xyXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVscGVyLmZpbmQoJy5qc3RyZWUtaWNvbjplcSgwKScpLnJlbW92ZUNsYXNzKCdqc3RyZWUtZXInKS5hZGRDbGFzcygnanN0cmVlLW9rJyk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gaWYgd2UgYXJlIGhvdmVyaW5nIGEgdHJlZSBub2RlXHJcblx0XHRcdFx0XHRcdHJlZiA9ICQoZGF0YS5ldmVudC50YXJnZXQpLmNsb3Nlc3QoJ2EnKTtcclxuXHRcdFx0XHRcdFx0aWYocmVmICYmIHJlZi5sZW5ndGggJiYgcmVmLnBhcmVudCgpLmlzKCcuanN0cmVlLWNsb3NlZCwgLmpzdHJlZS1vcGVuLCAuanN0cmVlLWxlYWYnKSkge1xyXG5cdFx0XHRcdFx0XHRcdG9mZiA9IHJlZi5vZmZzZXQoKTtcclxuXHRcdFx0XHRcdFx0XHRyZWwgPSBkYXRhLmV2ZW50LnBhZ2VZIC0gb2ZmLnRvcDtcclxuXHRcdFx0XHRcdFx0XHRoID0gcmVmLmhlaWdodCgpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKHJlbCA8IGggLyAzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRvID0gWydiJywgJ2knLCAnYSddO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRlbHNlIGlmKHJlbCA+IGggLSBoIC8gMykge1xyXG5cdFx0XHRcdFx0XHRcdFx0byA9IFsnYScsICdpJywgJ2InXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRvID0gcmVsID4gaCAvIDIgPyBbJ2knLCAnYScsICdiJ10gOiBbJ2knLCAnYicsICdhJ107XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdCQuZWFjaChvLCBmdW5jdGlvbiAoaiwgdikge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoKHYpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAnYic6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bCA9IG9mZi5sZWZ0IC0gNjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ID0gb2ZmLnRvcCAtIDU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cCA9IGlucy5nZXRfcGFyZW50KHJlZik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aSA9IHJlZi5wYXJlbnQoKS5pbmRleCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlICdpJzpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsID0gb2ZmLmxlZnQgLSAyO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHQgPSBvZmYudG9wIC0gNSArIGggLyAyICsgMTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwID0gcmVmLnBhcmVudCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGkgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlICdhJzpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsID0gb2ZmLmxlZnQgLSA2O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHQgPSBvZmYudG9wIC0gNSArIGg7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cCA9IGlucy5nZXRfcGFyZW50KHJlZik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aSA9IHJlZi5wYXJlbnQoKS5pbmRleCgpICsgMTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdC8qIVxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogbW92aW5nIGluc2lkZSwgYnV0IHRoZSBub2RlIGlzIG5vdCB5ZXQgbG9hZGVkP1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGNoZWNrIHdpbGwgd29yayBhbnl3YXksIGFzIHdoZW4gbW92aW5nIHRoZSBub2RlIHdpbGwgYmUgbG9hZGVkIGZpcnN0IGFuZCBjaGVja2VkIGFnYWluXHJcblx0XHRcdFx0XHRcdFx0XHRpZih2ID09PSAnaScgJiYgIWlucy5pc19sb2FkZWQocCkpIHsgfVxyXG5cdFx0XHRcdFx0XHRcdFx0Ki9cclxuXHRcdFx0XHRcdFx0XHRcdG9rID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdGZvcih0MSA9IDAsIHQyID0gZGF0YS5kYXRhLm5vZGVzLmxlbmd0aDsgdDEgPCB0MjsgdDErKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRvcCA9IGRhdGEuZGF0YS5vcmlnaW4gJiYgZGF0YS5kYXRhLm9yaWdpbi5zZXR0aW5ncy5kbmQuY29weSAmJiAoZGF0YS5ldmVudC5tZXRhS2V5IHx8IGRhdGEuZXZlbnQuY3RybEtleSkgPyBcImNvcHlfbm9kZVwiIDogXCJtb3ZlX25vZGVcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cHMgPSBpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZihvcCA9PT0gXCJtb3ZlX25vZGVcIiAmJiB2ID09PSAnYScgJiYgKGRhdGEuZGF0YS5vcmlnaW4gJiYgZGF0YS5kYXRhLm9yaWdpbiA9PT0gaW5zKSAmJiBwID09PSBpbnMuZ2V0X3BhcmVudChkYXRhLmRhdGEubm9kZXNbdDFdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByID0gaW5zLmdldF9ub2RlKHApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmKHBzID4gJC5pbkFycmF5KGRhdGEuZGF0YS5ub2Rlc1t0MV0sIHByLmNoaWxkcmVuKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHMgLT0gMTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0b2sgPSBvayAmJiAoIChpbnMgJiYgaW5zLnNldHRpbmdzICYmIGlucy5zZXR0aW5ncy5kbmQgJiYgaW5zLnNldHRpbmdzLmRuZC5jaGVja193aGlsZV9kcmFnZ2luZyA9PT0gZmFsc2UpIHx8IGlucy5jaGVjayhvcCwgKGRhdGEuZGF0YS5vcmlnaW4gJiYgZGF0YS5kYXRhLm9yaWdpbiAhPT0gaW5zID8gZGF0YS5kYXRhLm9yaWdpbi5nZXRfbm9kZShkYXRhLmRhdGEubm9kZXNbdDFdKSA6IGRhdGEuZGF0YS5ub2Rlc1t0MV0pLCBwLCBwcykgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYoIW9rKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYoaW5zICYmIGlucy5sYXN0X2Vycm9yKSB7IGxhc3RlciA9IGlucy5sYXN0X2Vycm9yKCk7IH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYob2spIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYodiA9PT0gJ2knICYmIHJlZi5wYXJlbnQoKS5pcygnLmpzdHJlZS1jbG9zZWQnKSAmJiBpbnMuc2V0dGluZ3MuZG5kLm9wZW5fdGltZW91dCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9wZW50byA9IHNldFRpbWVvdXQoKGZ1bmN0aW9uICh4LCB6KSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHgub3Blbl9ub2RlKHopOyB9OyB9KGlucywgcmVmKSksIGlucy5zZXR0aW5ncy5kbmQub3Blbl90aW1lb3V0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsYXN0bXYgPSB7ICdpbnMnIDogaW5zLCAncGFyJyA6IHAsICdwb3MnIDogaSB9O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRtYXJrZXIuY3NzKHsgJ2xlZnQnIDogbCArICdweCcsICd0b3AnIDogdCArICdweCcgfSkuc2hvdygpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhLmhlbHBlci5maW5kKCcuanN0cmVlLWljb246ZXEoMCknKS5yZW1vdmVDbGFzcygnanN0cmVlLWVyJykuYWRkQ2xhc3MoJ2pzdHJlZS1vaycpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRsYXN0ZXIgPSB7fTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0byA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRpZihvID09PSB0cnVlKSB7IHJldHVybjsgfVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGxhc3RtdiA9IGZhbHNlO1xyXG5cdFx0XHRcdGRhdGEuaGVscGVyLmZpbmQoJy5qc3RyZWUtaWNvbicpLnJlbW92ZUNsYXNzKCdqc3RyZWUtb2snKS5hZGRDbGFzcygnanN0cmVlLWVyJyk7XHJcblx0XHRcdFx0bWFya2VyLmhpZGUoKTtcclxuXHRcdFx0fSlcclxuXHRcdFx0LmJpbmQoJ2RuZF9zY3JvbGwudmFrYXRhJywgZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuXHRcdFx0XHRpZighZGF0YS5kYXRhLmpzdHJlZSkgeyByZXR1cm47IH1cclxuXHRcdFx0XHRtYXJrZXIuaGlkZSgpO1xyXG5cdFx0XHRcdGxhc3RtdiA9IGZhbHNlO1xyXG5cdFx0XHRcdGRhdGEuaGVscGVyLmZpbmQoJy5qc3RyZWUtaWNvbjplcSgwKScpLnJlbW92ZUNsYXNzKCdqc3RyZWUtb2snKS5hZGRDbGFzcygnanN0cmVlLWVyJyk7XHJcblx0XHRcdH0pXHJcblx0XHRcdC5iaW5kKCdkbmRfc3RvcC52YWthdGEnLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdGlmKG9wZW50bykgeyBjbGVhclRpbWVvdXQob3BlbnRvKTsgfVxyXG5cdFx0XHRcdGlmKCFkYXRhLmRhdGEuanN0cmVlKSB7IHJldHVybjsgfVxyXG5cdFx0XHRcdG1hcmtlci5oaWRlKCk7XHJcblx0XHRcdFx0dmFyIGksIGosIG5vZGVzID0gW107XHJcblx0XHRcdFx0aWYobGFzdG12KSB7XHJcblx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkYXRhLmRhdGEubm9kZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdG5vZGVzW2ldID0gZGF0YS5kYXRhLm9yaWdpbiA/IGRhdGEuZGF0YS5vcmlnaW4uZ2V0X25vZGUoZGF0YS5kYXRhLm5vZGVzW2ldKSA6IGRhdGEuZGF0YS5ub2Rlc1tpXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxhc3Rtdi5pbnNbIGRhdGEuZGF0YS5vcmlnaW4gJiYgZGF0YS5kYXRhLm9yaWdpbi5zZXR0aW5ncy5kbmQuY29weSAmJiAoZGF0YS5ldmVudC5tZXRhS2V5IHx8IGRhdGEuZXZlbnQuY3RybEtleSkgPyAnY29weV9ub2RlJyA6ICdtb3ZlX25vZGUnIF0obm9kZXMsIGxhc3Rtdi5wYXIsIGxhc3Rtdi5wb3MpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdGkgPSAkKGRhdGEuZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuanN0cmVlJyk7XHJcblx0XHRcdFx0XHRpZihpLmxlbmd0aCAmJiBsYXN0ZXIgJiYgbGFzdGVyLmVycm9yICYmIGxhc3Rlci5lcnJvciA9PT0gJ2NoZWNrJykge1xyXG5cdFx0XHRcdFx0XHRpID0gaS5qc3RyZWUodHJ1ZSk7XHJcblx0XHRcdFx0XHRcdGlmKGkpIHtcclxuXHRcdFx0XHRcdFx0XHRpLnNldHRpbmdzLmNvcmUuZXJyb3IuY2FsbCh0aGlzLCBsYXN0ZXIpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0XHQuYmluZCgna2V5dXAga2V5ZG93bicsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcblx0XHRcdFx0ZGF0YSA9ICQudmFrYXRhLmRuZC5fZ2V0KCk7XHJcblx0XHRcdFx0aWYoZGF0YS5kYXRhICYmIGRhdGEuZGF0YS5qc3RyZWUpIHtcclxuXHRcdFx0XHRcdGRhdGEuaGVscGVyLmZpbmQoJy5qc3RyZWUtY29weTplcSgwKScpWyBkYXRhLmRhdGEub3JpZ2luICYmIGRhdGEuZGF0YS5vcmlnaW4uc2V0dGluZ3MuZG5kLmNvcHkgJiYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpID8gJ3Nob3cnIDogJ2hpZGUnIF0oKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBoZWxwZXJzXHJcblx0KGZ1bmN0aW9uICgkKSB7XHJcblx0XHQkLmZuLnZha2F0YV9yZXZlcnNlID0gW10ucmV2ZXJzZTtcclxuXHRcdC8vIHByaXZhdGUgdmFyaWFibGVcclxuXHRcdHZhciB2YWthdGFfZG5kID0ge1xyXG5cdFx0XHRlbGVtZW50XHQ6IGZhbHNlLFxyXG5cdFx0XHRpc19kb3duXHQ6IGZhbHNlLFxyXG5cdFx0XHRpc19kcmFnXHQ6IGZhbHNlLFxyXG5cdFx0XHRoZWxwZXJcdDogZmFsc2UsXHJcblx0XHRcdGhlbHBlcl93OiAwLFxyXG5cdFx0XHRkYXRhXHQ6IGZhbHNlLFxyXG5cdFx0XHRpbml0X3hcdDogMCxcclxuXHRcdFx0aW5pdF95XHQ6IDAsXHJcblx0XHRcdHNjcm9sbF9sOiAwLFxyXG5cdFx0XHRzY3JvbGxfdDogMCxcclxuXHRcdFx0c2Nyb2xsX2U6IGZhbHNlLFxyXG5cdFx0XHRzY3JvbGxfaTogZmFsc2VcclxuXHRcdH07XHJcblx0XHQkLnZha2F0YS5kbmQgPSB7XHJcblx0XHRcdHNldHRpbmdzIDoge1xyXG5cdFx0XHRcdHNjcm9sbF9zcGVlZFx0XHQ6IDEwLFxyXG5cdFx0XHRcdHNjcm9sbF9wcm94aW1pdHlcdDogMjAsXHJcblx0XHRcdFx0aGVscGVyX2xlZnRcdFx0XHQ6IDUsXHJcblx0XHRcdFx0aGVscGVyX3RvcFx0XHRcdDogMTAsXHJcblx0XHRcdFx0dGhyZXNob2xkXHRcdFx0OiA1XHJcblx0XHRcdH0sXHJcblx0XHRcdF90cmlnZ2VyIDogZnVuY3Rpb24gKGV2ZW50X25hbWUsIGUpIHtcclxuXHRcdFx0XHR2YXIgZGF0YSA9ICQudmFrYXRhLmRuZC5fZ2V0KCk7XHJcblx0XHRcdFx0ZGF0YS5ldmVudCA9IGU7XHJcblx0XHRcdFx0JChkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoXCJkbmRfXCIgKyBldmVudF9uYW1lICsgXCIudmFrYXRhXCIsIGRhdGEpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRfZ2V0IDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcImRhdGFcIlx0XHQ6IHZha2F0YV9kbmQuZGF0YSxcclxuXHRcdFx0XHRcdFwiZWxlbWVudFwiXHQ6IHZha2F0YV9kbmQuZWxlbWVudCxcclxuXHRcdFx0XHRcdFwiaGVscGVyXCJcdDogdmFrYXRhX2RuZC5oZWxwZXJcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRfY2xlYW4gOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0aWYodmFrYXRhX2RuZC5oZWxwZXIpIHsgdmFrYXRhX2RuZC5oZWxwZXIucmVtb3ZlKCk7IH1cclxuXHRcdFx0XHRpZih2YWthdGFfZG5kLnNjcm9sbF9pKSB7IGNsZWFySW50ZXJ2YWwodmFrYXRhX2RuZC5zY3JvbGxfaSk7IHZha2F0YV9kbmQuc2Nyb2xsX2kgPSBmYWxzZTsgfVxyXG5cdFx0XHRcdHZha2F0YV9kbmQgPSB7XHJcblx0XHRcdFx0XHRlbGVtZW50XHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0aXNfZG93blx0OiBmYWxzZSxcclxuXHRcdFx0XHRcdGlzX2RyYWdcdDogZmFsc2UsXHJcblx0XHRcdFx0XHRoZWxwZXJcdDogZmFsc2UsXHJcblx0XHRcdFx0XHRoZWxwZXJfdzogMCxcclxuXHRcdFx0XHRcdGRhdGFcdDogZmFsc2UsXHJcblx0XHRcdFx0XHRpbml0X3hcdDogMCxcclxuXHRcdFx0XHRcdGluaXRfeVx0OiAwLFxyXG5cdFx0XHRcdFx0c2Nyb2xsX2w6IDAsXHJcblx0XHRcdFx0XHRzY3JvbGxfdDogMCxcclxuXHRcdFx0XHRcdHNjcm9sbF9lOiBmYWxzZSxcclxuXHRcdFx0XHRcdHNjcm9sbF9pOiBmYWxzZVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0JChkb2N1bWVudCkub2ZmKFwibW91c2Vtb3ZlIHRvdWNobW92ZVwiLCAkLnZha2F0YS5kbmQuZHJhZyk7XHJcblx0XHRcdFx0JChkb2N1bWVudCkub2ZmKFwibW91c2V1cCB0b3VjaGVuZFwiLCAkLnZha2F0YS5kbmQuc3RvcCk7XHJcblx0XHRcdH0sXHJcblx0XHRcdF9zY3JvbGwgOiBmdW5jdGlvbiAoaW5pdF9vbmx5KSB7XHJcblx0XHRcdFx0aWYoIXZha2F0YV9kbmQuc2Nyb2xsX2UgfHwgKCF2YWthdGFfZG5kLnNjcm9sbF9sICYmICF2YWthdGFfZG5kLnNjcm9sbF90KSkge1xyXG5cdFx0XHRcdFx0aWYodmFrYXRhX2RuZC5zY3JvbGxfaSkgeyBjbGVhckludGVydmFsKHZha2F0YV9kbmQuc2Nyb2xsX2kpOyB2YWthdGFfZG5kLnNjcm9sbF9pID0gZmFsc2U7IH1cclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoIXZha2F0YV9kbmQuc2Nyb2xsX2kpIHtcclxuXHRcdFx0XHRcdHZha2F0YV9kbmQuc2Nyb2xsX2kgPSBzZXRJbnRlcnZhbCgkLnZha2F0YS5kbmQuX3Njcm9sbCwgMTAwKTtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoaW5pdF9vbmx5ID09PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cclxuXHRcdFx0XHR2YXIgaSA9IHZha2F0YV9kbmQuc2Nyb2xsX2Uuc2Nyb2xsVG9wKCksXHJcblx0XHRcdFx0XHRqID0gdmFrYXRhX2RuZC5zY3JvbGxfZS5zY3JvbGxMZWZ0KCk7XHJcblx0XHRcdFx0dmFrYXRhX2RuZC5zY3JvbGxfZS5zY3JvbGxUb3AoaSArIHZha2F0YV9kbmQuc2Nyb2xsX3QgKiAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3NwZWVkKTtcclxuXHRcdFx0XHR2YWthdGFfZG5kLnNjcm9sbF9lLnNjcm9sbExlZnQoaiArIHZha2F0YV9kbmQuc2Nyb2xsX2wgKiAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3NwZWVkKTtcclxuXHRcdFx0XHRpZihpICE9PSB2YWthdGFfZG5kLnNjcm9sbF9lLnNjcm9sbFRvcCgpIHx8IGogIT09IHZha2F0YV9kbmQuc2Nyb2xsX2Uuc2Nyb2xsTGVmdCgpKSB7XHJcblx0XHRcdFx0XHQvKipcclxuXHRcdFx0XHRcdCAqIHRyaWdnZXJlZCBvbiB0aGUgZG9jdW1lbnQgd2hlbiBhIGRyYWcgY2F1c2VzIGFuIGVsZW1lbnQgdG8gc2Nyb2xsXHJcblx0XHRcdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0XHRcdCAqIEBwbHVnaW4gZG5kXHJcblx0XHRcdFx0XHQgKiBAbmFtZSBkbmRfc2Nyb2xsLnZha2F0YVxyXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtNaXhlZH0gZGF0YSBhbnkgZGF0YSBzdXBwbGllZCB3aXRoIHRoZSBjYWxsIHRvICQudmFrYXRhLmRuZC5zdGFydFxyXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtET019IGVsZW1lbnQgdGhlIERPTSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcclxuXHRcdFx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBoZWxwZXIgdGhlIGhlbHBlciBzaG93biBuZXh0IHRvIHRoZSBtb3VzZVxyXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGV2ZW50IHRoZSBlbGVtZW50IHRoYXQgaXMgc2Nyb2xsaW5nXHJcblx0XHRcdFx0XHQgKi9cclxuXHRcdFx0XHRcdCQudmFrYXRhLmRuZC5fdHJpZ2dlcihcInNjcm9sbFwiLCB2YWthdGFfZG5kLnNjcm9sbF9lKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdHN0YXJ0IDogZnVuY3Rpb24gKGUsIGRhdGEsIGh0bWwpIHtcclxuXHRcdFx0XHRpZihlLnR5cGUgPT09IFwidG91Y2hzdGFydFwiICYmIGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKSB7XHJcblx0XHRcdFx0XHRlLnBhZ2VYID0gZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO1xyXG5cdFx0XHRcdFx0ZS5wYWdlWSA9IGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWTtcclxuXHRcdFx0XHRcdGUudGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQsIGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKHZha2F0YV9kbmQuaXNfZHJhZykgeyAkLnZha2F0YS5kbmQuc3RvcCh7fSk7IH1cclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0ZS5jdXJyZW50VGFyZ2V0LnVuc2VsZWN0YWJsZSA9IFwib25cIjtcclxuXHRcdFx0XHRcdGUuY3VycmVudFRhcmdldC5vbnNlbGVjdHN0YXJ0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfTtcclxuXHRcdFx0XHRcdGlmKGUuY3VycmVudFRhcmdldC5zdHlsZSkgeyBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuTW96VXNlclNlbGVjdCA9IFwibm9uZVwiOyB9XHJcblx0XHRcdFx0fSBjYXRjaChpZ25vcmUpIHsgfVxyXG5cdFx0XHRcdHZha2F0YV9kbmQuaW5pdF94XHQ9IGUucGFnZVg7XHJcblx0XHRcdFx0dmFrYXRhX2RuZC5pbml0X3lcdD0gZS5wYWdlWTtcclxuXHRcdFx0XHR2YWthdGFfZG5kLmRhdGFcdFx0PSBkYXRhO1xyXG5cdFx0XHRcdHZha2F0YV9kbmQuaXNfZG93blx0PSB0cnVlO1xyXG5cdFx0XHRcdHZha2F0YV9kbmQuZWxlbWVudFx0PSBlLmN1cnJlbnRUYXJnZXQ7XHJcblx0XHRcdFx0aWYoaHRtbCAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdHZha2F0YV9kbmQuaGVscGVyID0gJChcIjxkaXYgaWQ9J3Zha2F0YS1kbmQnPjwvZGl2PlwiKS5odG1sKGh0bWwpLmNzcyh7XHJcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiXHRcdDogXCJibG9ja1wiLFxyXG5cdFx0XHRcdFx0XHRcIm1hcmdpblwiXHRcdDogXCIwXCIsXHJcblx0XHRcdFx0XHRcdFwicGFkZGluZ1wiXHRcdDogXCIwXCIsXHJcblx0XHRcdFx0XHRcdFwicG9zaXRpb25cIlx0XHQ6IFwiYWJzb2x1dGVcIixcclxuXHRcdFx0XHRcdFx0XCJ0b3BcIlx0XHRcdDogXCItMjAwMHB4XCIsXHJcblx0XHRcdFx0XHRcdFwibGluZUhlaWdodFwiXHQ6IFwiMTZweFwiLFxyXG5cdFx0XHRcdFx0XHRcInpJbmRleFwiXHRcdDogXCIxMDAwMFwiXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0JChkb2N1bWVudCkuYmluZChcIm1vdXNlbW92ZSB0b3VjaG1vdmVcIiwgJC52YWthdGEuZG5kLmRyYWcpO1xyXG5cdFx0XHRcdCQoZG9jdW1lbnQpLmJpbmQoXCJtb3VzZXVwIHRvdWNoZW5kXCIsICQudmFrYXRhLmRuZC5zdG9wKTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH0sXHJcblx0XHRcdGRyYWcgOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGlmKGUudHlwZSA9PT0gXCJ0b3VjaG1vdmVcIiAmJiBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXSkge1xyXG5cdFx0XHRcdFx0ZS5wYWdlWCA9IGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDtcclxuXHRcdFx0XHRcdGUucGFnZVkgPSBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVk7XHJcblx0XHRcdFx0XHRlLnRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0LCBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZighdmFrYXRhX2RuZC5pc19kb3duKSB7IHJldHVybjsgfVxyXG5cdFx0XHRcdGlmKCF2YWthdGFfZG5kLmlzX2RyYWcpIHtcclxuXHRcdFx0XHRcdGlmKFxyXG5cdFx0XHRcdFx0XHRNYXRoLmFicyhlLnBhZ2VYIC0gdmFrYXRhX2RuZC5pbml0X3gpID4gJC52YWthdGEuZG5kLnNldHRpbmdzLnRocmVzaG9sZCB8fFxyXG5cdFx0XHRcdFx0XHRNYXRoLmFicyhlLnBhZ2VZIC0gdmFrYXRhX2RuZC5pbml0X3kpID4gJC52YWthdGEuZG5kLnNldHRpbmdzLnRocmVzaG9sZFxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdGlmKHZha2F0YV9kbmQuaGVscGVyKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFrYXRhX2RuZC5oZWxwZXIuYXBwZW5kVG8oXCJib2R5XCIpO1xyXG5cdFx0XHRcdFx0XHRcdHZha2F0YV9kbmQuaGVscGVyX3cgPSB2YWthdGFfZG5kLmhlbHBlci5vdXRlcldpZHRoKCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0dmFrYXRhX2RuZC5pc19kcmFnID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0LyoqXHJcblx0XHRcdFx0XHRcdCAqIHRyaWdnZXJlZCBvbiB0aGUgZG9jdW1lbnQgd2hlbiBhIGRyYWcgc3RhcnRzXHJcblx0XHRcdFx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHRcdFx0XHQgKiBAcGx1Z2luIGRuZFxyXG5cdFx0XHRcdFx0XHQgKiBAbmFtZSBkbmRfc3RhcnQudmFrYXRhXHJcblx0XHRcdFx0XHRcdCAqIEBwYXJhbSB7TWl4ZWR9IGRhdGEgYW55IGRhdGEgc3VwcGxpZWQgd2l0aCB0aGUgY2FsbCB0byAkLnZha2F0YS5kbmQuc3RhcnRcclxuXHRcdFx0XHRcdFx0ICogQHBhcmFtIHtET019IGVsZW1lbnQgdGhlIERPTSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcclxuXHRcdFx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGhlbHBlciB0aGUgaGVscGVyIHNob3duIG5leHQgdG8gdGhlIG1vdXNlXHJcblx0XHRcdFx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCB0aGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhlIHN0YXJ0IChwcm9iYWJseSBtb3VzZW1vdmUpXHJcblx0XHRcdFx0XHRcdCAqL1xyXG5cdFx0XHRcdFx0XHQkLnZha2F0YS5kbmQuX3RyaWdnZXIoXCJzdGFydFwiLCBlKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsc2UgeyByZXR1cm47IH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHZhciBkICA9IGZhbHNlLCB3ICA9IGZhbHNlLFxyXG5cdFx0XHRcdFx0ZGggPSBmYWxzZSwgd2ggPSBmYWxzZSxcclxuXHRcdFx0XHRcdGR3ID0gZmFsc2UsIHd3ID0gZmFsc2UsXHJcblx0XHRcdFx0XHRkdCA9IGZhbHNlLCBkbCA9IGZhbHNlLFxyXG5cdFx0XHRcdFx0aHQgPSBmYWxzZSwgaGwgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0dmFrYXRhX2RuZC5zY3JvbGxfdCA9IDA7XHJcblx0XHRcdFx0dmFrYXRhX2RuZC5zY3JvbGxfbCA9IDA7XHJcblx0XHRcdFx0dmFrYXRhX2RuZC5zY3JvbGxfZSA9IGZhbHNlO1xyXG5cdFx0XHRcdCQoZS50YXJnZXQpXHJcblx0XHRcdFx0XHQucGFyZW50c1VudGlsKFwiYm9keVwiKS5hZGRCYWNrKCkudmFrYXRhX3JldmVyc2UoKVxyXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdHJldHVyblx0KC9eYXV0b3xzY3JvbGwkLykudGVzdCgkKHRoaXMpLmNzcyhcIm92ZXJmbG93XCIpKSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0KHRoaXMuc2Nyb2xsSGVpZ2h0ID4gdGhpcy5vZmZzZXRIZWlnaHQgfHwgdGhpcy5zY3JvbGxXaWR0aCA+IHRoaXMub2Zmc2V0V2lkdGgpO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdC5lYWNoKGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0dmFyIHQgPSAkKHRoaXMpLCBvID0gdC5vZmZzZXQoKTtcclxuXHRcdFx0XHRcdFx0aWYodGhpcy5zY3JvbGxIZWlnaHQgPiB0aGlzLm9mZnNldEhlaWdodCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmKG8udG9wICsgdC5oZWlnaHQoKSAtIGUucGFnZVkgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdHsgdmFrYXRhX2RuZC5zY3JvbGxfdCA9IDE7IH1cclxuXHRcdFx0XHRcdFx0XHRpZihlLnBhZ2VZIC0gby50b3AgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdFx0XHRcdHsgdmFrYXRhX2RuZC5zY3JvbGxfdCA9IC0xOyB9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYodGhpcy5zY3JvbGxXaWR0aCA+IHRoaXMub2Zmc2V0V2lkdGgpIHtcclxuXHRcdFx0XHRcdFx0XHRpZihvLmxlZnQgKyB0LndpZHRoKCkgLSBlLnBhZ2VYIDwgJC52YWthdGEuZG5kLnNldHRpbmdzLnNjcm9sbF9wcm94aW1pdHkpXHR7IHZha2F0YV9kbmQuc2Nyb2xsX2wgPSAxOyB9XHJcblx0XHRcdFx0XHRcdFx0aWYoZS5wYWdlWCAtIG8ubGVmdCA8ICQudmFrYXRhLmRuZC5zZXR0aW5ncy5zY3JvbGxfcHJveGltaXR5KVx0XHRcdFx0eyB2YWthdGFfZG5kLnNjcm9sbF9sID0gLTE7IH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZih2YWthdGFfZG5kLnNjcm9sbF90IHx8IHZha2F0YV9kbmQuc2Nyb2xsX2wpIHtcclxuXHRcdFx0XHRcdFx0XHR2YWthdGFfZG5kLnNjcm9sbF9lID0gJCh0aGlzKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRpZighdmFrYXRhX2RuZC5zY3JvbGxfZSkge1xyXG5cdFx0XHRcdFx0ZCAgPSAkKGRvY3VtZW50KTsgdyA9ICQod2luZG93KTtcclxuXHRcdFx0XHRcdGRoID0gZC5oZWlnaHQoKTsgd2ggPSB3LmhlaWdodCgpO1xyXG5cdFx0XHRcdFx0ZHcgPSBkLndpZHRoKCk7IHd3ID0gdy53aWR0aCgpO1xyXG5cdFx0XHRcdFx0ZHQgPSBkLnNjcm9sbFRvcCgpOyBkbCA9IGQuc2Nyb2xsTGVmdCgpO1xyXG5cdFx0XHRcdFx0aWYoZGggPiB3aCAmJiBlLnBhZ2VZIC0gZHQgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdFx0eyB2YWthdGFfZG5kLnNjcm9sbF90ID0gLTE7ICB9XHJcblx0XHRcdFx0XHRpZihkaCA+IHdoICYmIHdoIC0gKGUucGFnZVkgLSBkdCkgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdHsgdmFrYXRhX2RuZC5zY3JvbGxfdCA9IDE7IH1cclxuXHRcdFx0XHRcdGlmKGR3ID4gd3cgJiYgZS5wYWdlWCAtIGRsIDwgJC52YWthdGEuZG5kLnNldHRpbmdzLnNjcm9sbF9wcm94aW1pdHkpXHRcdHsgdmFrYXRhX2RuZC5zY3JvbGxfbCA9IC0xOyB9XHJcblx0XHRcdFx0XHRpZihkdyA+IHd3ICYmIHd3IC0gKGUucGFnZVggLSBkbCkgPCAkLnZha2F0YS5kbmQuc2V0dGluZ3Muc2Nyb2xsX3Byb3hpbWl0eSlcdHsgdmFrYXRhX2RuZC5zY3JvbGxfbCA9IDE7IH1cclxuXHRcdFx0XHRcdGlmKHZha2F0YV9kbmQuc2Nyb2xsX3QgfHwgdmFrYXRhX2RuZC5zY3JvbGxfbCkge1xyXG5cdFx0XHRcdFx0XHR2YWthdGFfZG5kLnNjcm9sbF9lID0gZDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYodmFrYXRhX2RuZC5zY3JvbGxfZSkgeyAkLnZha2F0YS5kbmQuX3Njcm9sbCh0cnVlKTsgfVxyXG5cclxuXHRcdFx0XHRpZih2YWthdGFfZG5kLmhlbHBlcikge1xyXG5cdFx0XHRcdFx0aHQgPSBwYXJzZUludChlLnBhZ2VZICsgJC52YWthdGEuZG5kLnNldHRpbmdzLmhlbHBlcl90b3AsIDEwKTtcclxuXHRcdFx0XHRcdGhsID0gcGFyc2VJbnQoZS5wYWdlWCArICQudmFrYXRhLmRuZC5zZXR0aW5ncy5oZWxwZXJfbGVmdCwgMTApO1xyXG5cdFx0XHRcdFx0aWYoZGggJiYgaHQgKyAyNSA+IGRoKSB7IGh0ID0gZGggLSA1MDsgfVxyXG5cdFx0XHRcdFx0aWYoZHcgJiYgaGwgKyB2YWthdGFfZG5kLmhlbHBlcl93ID4gZHcpIHsgaGwgPSBkdyAtICh2YWthdGFfZG5kLmhlbHBlcl93ICsgMik7IH1cclxuXHRcdFx0XHRcdHZha2F0YV9kbmQuaGVscGVyLmNzcyh7XHJcblx0XHRcdFx0XHRcdGxlZnRcdDogaGwgKyBcInB4XCIsXHJcblx0XHRcdFx0XHRcdHRvcFx0XHQ6IGh0ICsgXCJweFwiXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0LyoqXHJcblx0XHRcdFx0ICogdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCB3aGVuIGEgZHJhZyBpcyBpbiBwcm9ncmVzc1xyXG5cdFx0XHRcdCAqIEBldmVudFxyXG5cdFx0XHRcdCAqIEBwbHVnaW4gZG5kXHJcblx0XHRcdFx0ICogQG5hbWUgZG5kX21vdmUudmFrYXRhXHJcblx0XHRcdFx0ICogQHBhcmFtIHtNaXhlZH0gZGF0YSBhbnkgZGF0YSBzdXBwbGllZCB3aXRoIHRoZSBjYWxsIHRvICQudmFrYXRhLmRuZC5zdGFydFxyXG5cdFx0XHRcdCAqIEBwYXJhbSB7RE9NfSBlbGVtZW50IHRoZSBET00gZWxlbWVudCBiZWluZyBkcmFnZ2VkXHJcblx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGhlbHBlciB0aGUgaGVscGVyIHNob3duIG5leHQgdG8gdGhlIG1vdXNlXHJcblx0XHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IHRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHRyaWdnZXIgKG1vc3QgbGlrZWx5IG1vdXNlbW92ZSlcclxuXHRcdFx0XHQgKi9cclxuXHRcdFx0XHQkLnZha2F0YS5kbmQuX3RyaWdnZXIoXCJtb3ZlXCIsIGUpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRzdG9wIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRpZihlLnR5cGUgPT09IFwidG91Y2hlbmRcIiAmJiBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXSkge1xyXG5cdFx0XHRcdFx0ZS5wYWdlWCA9IGUub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDtcclxuXHRcdFx0XHRcdGUucGFnZVkgPSBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVk7XHJcblx0XHRcdFx0XHRlLnRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0LCBlLm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZih2YWthdGFfZG5kLmlzX2RyYWcpIHtcclxuXHRcdFx0XHRcdC8qKlxyXG5cdFx0XHRcdFx0ICogdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCB3aGVuIGEgZHJhZyBzdG9wcyAodGhlIGRyYWdnZWQgZWxlbWVudCBpcyBkcm9wcGVkKVxyXG5cdFx0XHRcdFx0ICogQGV2ZW50XHJcblx0XHRcdFx0XHQgKiBAcGx1Z2luIGRuZFxyXG5cdFx0XHRcdFx0ICogQG5hbWUgZG5kX3N0b3AudmFrYXRhXHJcblx0XHRcdFx0XHQgKiBAcGFyYW0ge01peGVkfSBkYXRhIGFueSBkYXRhIHN1cHBsaWVkIHdpdGggdGhlIGNhbGwgdG8gJC52YWthdGEuZG5kLnN0YXJ0XHJcblx0XHRcdFx0XHQgKiBAcGFyYW0ge0RPTX0gZWxlbWVudCB0aGUgRE9NIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxyXG5cdFx0XHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9IGhlbHBlciB0aGUgaGVscGVyIHNob3duIG5leHQgdG8gdGhlIG1vdXNlXHJcblx0XHRcdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgdGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoZSBzdG9wXHJcblx0XHRcdFx0XHQgKi9cclxuXHRcdFx0XHRcdCQudmFrYXRhLmRuZC5fdHJpZ2dlcihcInN0b3BcIiwgZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdCQudmFrYXRhLmRuZC5fY2xlYW4oKTtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHR9KGpRdWVyeSkpO1xyXG5cclxuXHQvLyBpbmNsdWRlIHRoZSBkbmQgcGx1Z2luIGJ5IGRlZmF1bHRcclxuXHQvLyAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goXCJkbmRcIik7XHJcblxyXG5cclxuLyoqXHJcbiAqICMjIyBTZWFyY2ggcGx1Z2luXHJcbiAqXHJcbiAqIEFkZHMgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgdG8ganNUcmVlLlxyXG4gKi9cclxuXHJcblx0LyoqXHJcblx0ICogc3RvcmVzIGFsbCBkZWZhdWx0cyBmb3IgdGhlIHNlYXJjaCBwbHVnaW5cclxuXHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5zZWFyY2hcclxuXHQgKiBAcGx1Z2luIHNlYXJjaFxyXG5cdCAqL1xyXG5cdCQuanN0cmVlLmRlZmF1bHRzLnNlYXJjaCA9IHtcclxuXHRcdC8qKlxyXG5cdFx0ICogYSBqUXVlcnktbGlrZSBBSkFYIGNvbmZpZywgd2hpY2gganN0cmVlIHVzZXMgaWYgYSBzZXJ2ZXIgc2hvdWxkIGJlIHF1ZXJpZWQgZm9yIHJlc3VsdHMuIFxyXG5cdFx0ICogXHJcblx0XHQgKiBBIGBzdHJgICh3aGljaCBpcyB0aGUgc2VhcmNoIHN0cmluZykgcGFyYW1ldGVyIHdpbGwgYmUgYWRkZWQgd2l0aCB0aGUgcmVxdWVzdC4gVGhlIGV4cGVjdGVkIHJlc3VsdCBpcyBhIEpTT04gYXJyYXkgd2l0aCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgb3BlbmVkIHNvIHRoYXQgbWF0Y2hpbmcgbm9kZXMgd2lsbCBiZSByZXZlYWxlZC5cclxuXHRcdCAqIExlYXZlIHRoaXMgc2V0dGluZyBhcyBgZmFsc2VgIHRvIG5vdCBxdWVyeSB0aGUgc2VydmVyLlxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuc2VhcmNoLmFqYXhcclxuXHRcdCAqIEBwbHVnaW4gc2VhcmNoXHJcblx0XHQgKi9cclxuXHRcdGFqYXggOiBmYWxzZSxcclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGZ1enp5IG9yIG5vdCAoc2hvdWxkIGBjaG5kM2AgbWF0Y2ggYGNoaWxkIG5vZGUgM2ApLiBEZWZhdWx0IGlzIGB0cnVlYC5cclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnNlYXJjaC5mdXp6eVxyXG5cdFx0ICogQHBsdWdpbiBzZWFyY2hcclxuXHRcdCAqL1xyXG5cdFx0ZnV6enkgOiB0cnVlLFxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbmRpY2F0ZXMgaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUuIERlZmF1bHQgaXMgYGZhbHNlYC5cclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnNlYXJjaC5jYXNlX3NlbnNpdGl2ZVxyXG5cdFx0ICogQHBsdWdpbiBzZWFyY2hcclxuXHRcdCAqL1xyXG5cdFx0Y2FzZV9zZW5zaXRpdmUgOiBmYWxzZSxcclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIGlmIHRoZSB0cmVlIHNob3VsZCBiZSBmaWx0ZXJlZCB0byBzaG93IG9ubHkgbWF0Y2hpbmcgbm9kZXMgKGtlZXAgaW4gbWluZCB0aGlzIGNhbiBiZSBhIGhlYXZ5IG9uIGxhcmdlIHRyZWVzIGluIG9sZCBicm93c2VycykuIERlZmF1bHQgaXMgYGZhbHNlYC5cclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnNlYXJjaC5zaG93X29ubHlfbWF0Y2hlc1xyXG5cdFx0ICogQHBsdWdpbiBzZWFyY2hcclxuXHRcdCAqL1xyXG5cdFx0c2hvd19vbmx5X21hdGNoZXMgOiBmYWxzZSxcclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIGlmIGFsbCBub2RlcyBvcGVuZWQgdG8gcmV2ZWFsIHRoZSBzZWFyY2ggcmVzdWx0LCBzaG91bGQgYmUgY2xvc2VkIHdoZW4gdGhlIHNlYXJjaCBpcyBjbGVhcmVkIG9yIGEgbmV3IHNlYXJjaCBpcyBwZXJmb3JtZWQuIERlZmF1bHQgaXMgYHRydWVgLlxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuc2VhcmNoLmNsb3NlX29wZW5lZF9vbmNsZWFyXHJcblx0XHQgKiBAcGx1Z2luIHNlYXJjaFxyXG5cdFx0ICovXHJcblx0XHRjbG9zZV9vcGVuZWRfb25jbGVhciA6IHRydWVcclxuXHR9O1xyXG5cclxuXHQkLmpzdHJlZS5wbHVnaW5zLnNlYXJjaCA9IGZ1bmN0aW9uIChvcHRpb25zLCBwYXJlbnQpIHtcclxuXHRcdHRoaXMuYmluZCA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cGFyZW50LmJpbmQuY2FsbCh0aGlzKTtcclxuXHJcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnN0ciA9IFwiXCI7XHJcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLmRvbSA9ICQoKTtcclxuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2gucmVzID0gW107XHJcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLm9wbiA9IFtdO1xyXG5cdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5zbG4gPSBudWxsO1xyXG5cclxuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy5zZWFyY2guc2hvd19vbmx5X21hdGNoZXMpIHtcclxuXHRcdFx0XHR0aGlzLmVsZW1lbnRcclxuXHRcdFx0XHRcdC5vbihcInNlYXJjaC5qc3RyZWVcIiwgZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0aWYoZGF0YS5ub2Rlcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHQkKHRoaXMpLmZpbmQoXCJsaVwiKS5oaWRlKCkuZmlsdGVyKCcuanN0cmVlLWxhc3QnKS5maWx0ZXIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLm5leHRTaWJsaW5nOyB9KS5yZW1vdmVDbGFzcygnanN0cmVlLWxhc3QnKTtcclxuXHRcdFx0XHRcdFx0XHRkYXRhLm5vZGVzLnBhcmVudHNVbnRpbChcIi5qc3RyZWVcIikuYWRkQmFjaygpLnNob3coKVxyXG5cdFx0XHRcdFx0XHRcdFx0LmZpbHRlcihcInVsXCIpLmVhY2goZnVuY3Rpb24gKCkgeyAkKHRoaXMpLmNoaWxkcmVuKFwibGk6dmlzaWJsZVwiKS5lcSgtMSkuYWRkQ2xhc3MoXCJqc3RyZWUtbGFzdFwiKTsgfSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQub24oXCJjbGVhcl9zZWFyY2guanN0cmVlXCIsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcblx0XHRcdFx0XHRcdGlmKGRhdGEubm9kZXMubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0JCh0aGlzKS5maW5kKFwibGlcIikuY3NzKFwiZGlzcGxheVwiLFwiXCIpLmZpbHRlcignLmpzdHJlZS1sYXN0JykuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5uZXh0U2libGluZzsgfSkucmVtb3ZlQ2xhc3MoJ2pzdHJlZS1sYXN0Jyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0LyoqXHJcblx0XHQgKiB1c2VkIHRvIHNlYXJjaCB0aGUgdHJlZSBub2RlcyBmb3IgYSBnaXZlbiBzdHJpbmdcclxuXHRcdCAqIEBuYW1lIHNlYXJjaChzdHIgWywgc2tpcF9hc3luY10pXHJcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzZWFyY2ggc3RyaW5nXHJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IHNraXBfYXN5bmMgaWYgc2V0IHRvIHRydWUgc2VydmVyIHdpbGwgbm90IGJlIHF1ZXJpZWQgZXZlbiBpZiBjb25maWd1cmVkXHJcblx0XHQgKiBAcGx1Z2luIHNlYXJjaFxyXG5cdFx0ICogQHRyaWdnZXIgc2VhcmNoLmpzdHJlZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNlYXJjaCA9IGZ1bmN0aW9uIChzdHIsIHNraXBfYXN5bmMpIHtcclxuXHRcdFx0aWYoc3RyID09PSBmYWxzZSB8fCAkLnRyaW0oc3RyKSA9PT0gXCJcIikge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNsZWFyX3NlYXJjaCgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhciBzID0gdGhpcy5zZXR0aW5ncy5zZWFyY2gsXHJcblx0XHRcdFx0YSA9IHMuYWpheCA/ICQuZXh0ZW5kKHt9LCBzLmFqYXgpIDogZmFsc2UsXHJcblx0XHRcdFx0ZiA9IG51bGwsXHJcblx0XHRcdFx0ciA9IFtdLFxyXG5cdFx0XHRcdHAgPSBbXSwgaSwgajtcclxuXHRcdFx0aWYodGhpcy5fZGF0YS5zZWFyY2gucmVzLmxlbmd0aCkge1xyXG5cdFx0XHRcdHRoaXMuY2xlYXJfc2VhcmNoKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIXNraXBfYXN5bmMgJiYgYSAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHRpZighYS5kYXRhKSB7IGEuZGF0YSA9IHt9OyB9XHJcblx0XHRcdFx0YS5kYXRhLnN0ciA9IHN0cjtcclxuXHRcdFx0XHRyZXR1cm4gJC5hamF4KGEpXHJcblx0XHRcdFx0XHQuZmFpbCgkLnByb3h5KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fZGF0YS5jb3JlLmxhc3RfZXJyb3IgPSB7ICdlcnJvcicgOiAnYWpheCcsICdwbHVnaW4nIDogJ3NlYXJjaCcsICdpZCcgOiAnc2VhcmNoXzAxJywgJ3JlYXNvbicgOiAnQ291bGQgbm90IGxvYWQgc2VhcmNoIHBhcmVudHMnLCAnZGF0YScgOiBKU09OLnN0cmluZ2lmeShhKSB9O1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldHRpbmdzLmNvcmUuZXJyb3IuY2FsbCh0aGlzLCB0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvcik7XHJcblx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHRcdC5kb25lKCQucHJveHkoZnVuY3Rpb24gKGQpIHtcclxuXHRcdFx0XHRcdFx0aWYoZCAmJiBkLmQpIHsgZCA9IGQuZDsgfVxyXG5cdFx0XHRcdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5zbG4gPSAhJC5pc0FycmF5KGQpID8gW10gOiBkO1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9zZWFyY2hfbG9hZChzdHIpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnN0ciA9IHN0cjtcclxuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2guZG9tID0gJCgpO1xyXG5cdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5yZXMgPSBbXTtcclxuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2gub3BuID0gW107XHJcblxyXG5cdFx0XHRmID0gbmV3ICQudmFrYXRhLnNlYXJjaChzdHIsIHRydWUsIHsgY2FzZVNlbnNpdGl2ZSA6IHMuY2FzZV9zZW5zaXRpdmUsIGZ1enp5IDogcy5mdXp6eSB9KTtcclxuXHJcblx0XHRcdCQuZWFjaCh0aGlzLl9tb2RlbC5kYXRhLCBmdW5jdGlvbiAoaSwgdikge1xyXG5cdFx0XHRcdGlmKHYudGV4dCAmJiBmLnNlYXJjaCh2LnRleHQpLmlzTWF0Y2gpIHtcclxuXHRcdFx0XHRcdHIucHVzaChpKTtcclxuXHRcdFx0XHRcdHAgPSBwLmNvbmNhdCh2LnBhcmVudHMpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmKHIubGVuZ3RoKSB7XHJcblx0XHRcdFx0cCA9ICQudmFrYXRhLmFycmF5X3VuaXF1ZShwKTtcclxuXHRcdFx0XHR0aGlzLl9zZWFyY2hfb3BlbihwKTtcclxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSByLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0ZiA9IHRoaXMuZ2V0X25vZGUocltpXSwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRpZihmKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLmRvbSA9IHRoaXMuX2RhdGEuc2VhcmNoLmRvbS5hZGQoZik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnJlcyA9IHI7XHJcblx0XHRcdFx0dGhpcy5fZGF0YS5zZWFyY2guZG9tLmNoaWxkcmVuKFwiLmpzdHJlZS1hbmNob3JcIikuYWRkQ2xhc3MoJ2pzdHJlZS1zZWFyY2gnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIHNlYXJjaCBpcyBjb21wbGV0ZVxyXG5cdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0ICogQG5hbWUgc2VhcmNoLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gbm9kZXMgYSBqUXVlcnkgY29sbGVjdGlvbiBvZiBtYXRjaGluZyBub2Rlc1xyXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzZWFyY2ggc3RyaW5nXHJcblx0XHRcdCAqIEBwYXJhbSB7QXJyYXl9IHJlcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyByZXByZXNlaW5nIHRoZSBtYXRjaGluZyBub2Rlc1xyXG5cdFx0XHQgKiBAcGx1Z2luIHNlYXJjaFxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdzZWFyY2gnLCB7IG5vZGVzIDogdGhpcy5fZGF0YS5zZWFyY2guZG9tLCBzdHIgOiBzdHIsIHJlcyA6IHRoaXMuX2RhdGEuc2VhcmNoLnJlcyB9KTtcclxuXHRcdH07XHJcblx0XHQvKipcclxuXHRcdCAqIHVzZWQgdG8gY2xlYXIgdGhlIGxhc3Qgc2VhcmNoIChyZW1vdmVzIGNsYXNzZXMgYW5kIHNob3dzIGFsbCBub2RlcyBpZiBmaWx0ZXJpbmcgaXMgb24pXHJcblx0XHQgKiBAbmFtZSBjbGVhcl9zZWFyY2goKVxyXG5cdFx0ICogQHBsdWdpbiBzZWFyY2hcclxuXHRcdCAqIEB0cmlnZ2VyIGNsZWFyX3NlYXJjaC5qc3RyZWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcl9zZWFyY2ggPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLmRvbS5jaGlsZHJlbihcIi5qc3RyZWUtYW5jaG9yXCIpLnJlbW92ZUNsYXNzKFwianN0cmVlLXNlYXJjaFwiKTtcclxuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy5zZWFyY2guY2xvc2Vfb3BlbmVkX29uY2xlYXIpIHtcclxuXHRcdFx0XHR0aGlzLmNsb3NlX25vZGUodGhpcy5fZGF0YS5zZWFyY2gub3BuLCAwKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogdHJpZ2dlcmVkIGFmdGVyIHNlYXJjaCBpcyBjb21wbGV0ZVxyXG5cdFx0XHQgKiBAZXZlbnRcclxuXHRcdFx0ICogQG5hbWUgY2xlYXJfc2VhcmNoLmpzdHJlZVxyXG5cdFx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gbm9kZXMgYSBqUXVlcnkgY29sbGVjdGlvbiBvZiBtYXRjaGluZyBub2RlcyAodGhlIHJlc3VsdCBmcm9tIHRoZSBsYXN0IHNlYXJjaClcclxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc2VhcmNoIHN0cmluZyAodGhlIGxhc3Qgc2VhcmNoIHN0cmluZylcclxuXHRcdFx0ICogQHBhcmFtIHtBcnJheX0gcmVzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHJlcHJlc2VpbmcgdGhlIG1hdGNoaW5nIG5vZGVzICh0aGUgcmVzdWx0IGZyb20gdGhlIGxhc3Qgc2VhcmNoKVxyXG5cdFx0XHQgKiBAcGx1Z2luIHNlYXJjaFxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dGhpcy50cmlnZ2VyKCdjbGVhcl9zZWFyY2gnLCB7ICdub2RlcycgOiB0aGlzLl9kYXRhLnNlYXJjaC5kb20sIHN0ciA6IHRoaXMuX2RhdGEuc2VhcmNoLnN0ciwgcmVzIDogdGhpcy5fZGF0YS5zZWFyY2gucmVzIH0pO1xyXG5cdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5zdHIgPSBcIlwiO1xyXG5cdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5yZXMgPSBbXTtcclxuXHRcdFx0dGhpcy5fZGF0YS5zZWFyY2gub3BuID0gW107XHJcblx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLmRvbSA9ICQoKTtcclxuXHRcdH07XHJcblx0XHQvKipcclxuXHRcdCAqIG9wZW5zIG5vZGVzIHRoYXQgbmVlZCB0byBiZSBvcGVuZWQgdG8gcmV2ZWFsIHRoZSBzZWFyY2ggcmVzdWx0cy4gVXNlZCBvbmx5IGludGVybmFsbHkuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQG5hbWUgX3NlYXJjaF9vcGVuKGQpXHJcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBkIGFuIGFycmF5IG9mIG5vZGUgSURzXHJcblx0XHQgKiBAcGx1Z2luIHNlYXJjaFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9zZWFyY2hfb3BlbiA9IGZ1bmN0aW9uIChkKSB7XHJcblx0XHRcdHZhciB0ID0gdGhpcztcclxuXHRcdFx0JC5lYWNoKGQuY29uY2F0KFtdKSwgZnVuY3Rpb24gKGksIHYpIHtcclxuXHRcdFx0XHR2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodik7XHJcblx0XHRcdFx0aWYodikge1xyXG5cdFx0XHRcdFx0aWYodC5pc19jbG9zZWQodikpIHtcclxuXHRcdFx0XHRcdFx0dC5fZGF0YS5zZWFyY2gub3BuLnB1c2godi5pZCk7XHJcblx0XHRcdFx0XHRcdHQub3Blbl9ub2RlKHYsIGZ1bmN0aW9uICgpIHsgdC5fc2VhcmNoX29wZW4oZCk7IH0sIDApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9O1xyXG5cdFx0LyoqXHJcblx0XHQgKiBsb2FkcyBub2RlcyB0aGF0IG5lZWQgdG8gYmUgb3BlbmVkIHRvIHJldmVhbCB0aGUgc2VhcmNoIHJlc3VsdHMuIFVzZWQgb25seSBpbnRlcm5hbGx5LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBuYW1lIF9zZWFyY2hfbG9hZChkLCBzdHIpXHJcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzZWFyY2ggc3RyaW5nXHJcblx0XHQgKiBAcGx1Z2luIHNlYXJjaFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9zZWFyY2hfbG9hZCA9IGZ1bmN0aW9uIChzdHIpIHtcclxuXHRcdFx0dmFyIHJlcyA9IHRydWUsXHJcblx0XHRcdFx0dCA9IHRoaXMsXHJcblx0XHRcdFx0bSA9IHQuX21vZGVsLmRhdGE7XHJcblx0XHRcdGlmKCQuaXNBcnJheSh0aGlzLl9kYXRhLnNlYXJjaC5zbG4pKSB7XHJcblx0XHRcdFx0aWYoIXRoaXMuX2RhdGEuc2VhcmNoLnNsbi5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdHRoaXMuX2RhdGEuc2VhcmNoLnNsbiA9IG51bGw7XHJcblx0XHRcdFx0XHR0aGlzLnNlYXJjaChzdHIsIHRydWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdCQuZWFjaCh0aGlzLl9kYXRhLnNlYXJjaC5zbG4sIGZ1bmN0aW9uIChpLCB2KSB7XHJcblx0XHRcdFx0XHRcdGlmKG1bdl0pIHtcclxuXHRcdFx0XHRcdFx0XHQkLnZha2F0YS5hcnJheV9yZW1vdmVfaXRlbSh0Ll9kYXRhLnNlYXJjaC5zbG4sIHYpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKCFtW3ZdLnN0YXRlLmxvYWRlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dC5sb2FkX25vZGUodiwgZnVuY3Rpb24gKG8sIHMpIHsgaWYocykgeyB0Ll9zZWFyY2hfbG9hZChzdHIpOyB9IH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmVzID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGlmKHJlcykge1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9kYXRhLnNlYXJjaC5zbG4gPSBbXTtcclxuXHRcdFx0XHRcdFx0dGhpcy5fc2VhcmNoX2xvYWQoc3RyKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fTtcclxuXHJcblx0Ly8gaGVscGVyc1xyXG5cdChmdW5jdGlvbiAoJCkge1xyXG5cdFx0Ly8gZnJvbSBodHRwOi8va2lyby5tZS9wcm9qZWN0cy9mdXNlLmh0bWxcclxuXHRcdCQudmFrYXRhLnNlYXJjaCA9IGZ1bmN0aW9uKHBhdHRlcm4sIHR4dCwgb3B0aW9ucykge1xyXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuXHRcdFx0aWYob3B0aW9ucy5mdXp6eSAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHRvcHRpb25zLmZ1enp5ID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRwYXR0ZXJuID0gb3B0aW9ucy5jYXNlU2Vuc2l0aXZlID8gcGF0dGVybiA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0dmFyIE1BVENIX0xPQ0FUSU9OXHQ9IG9wdGlvbnMubG9jYXRpb24gfHwgMCxcclxuXHRcdFx0XHRNQVRDSF9ESVNUQU5DRVx0PSBvcHRpb25zLmRpc3RhbmNlIHx8IDEwMCxcclxuXHRcdFx0XHRNQVRDSF9USFJFU0hPTERcdD0gb3B0aW9ucy50aHJlc2hvbGQgfHwgMC42LFxyXG5cdFx0XHRcdHBhdHRlcm5MZW4gPSBwYXR0ZXJuLmxlbmd0aCxcclxuXHRcdFx0XHRtYXRjaG1hc2ssIHBhdHRlcm5fYWxwaGFiZXQsIG1hdGNoX2JpdGFwU2NvcmUsIHNlYXJjaDtcclxuXHRcdFx0aWYocGF0dGVybkxlbiA+IDMyKSB7XHJcblx0XHRcdFx0b3B0aW9ucy5mdXp6eSA9IGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKG9wdGlvbnMuZnV6enkpIHtcclxuXHRcdFx0XHRtYXRjaG1hc2sgPSAxIDw8IChwYXR0ZXJuTGVuIC0gMSk7XHJcblx0XHRcdFx0cGF0dGVybl9hbHBoYWJldCA9IChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHR2YXIgbWFzayA9IHt9LFxyXG5cdFx0XHRcdFx0XHRpID0gMDtcclxuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuTGVuOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0bWFza1twYXR0ZXJuLmNoYXJBdChpKV0gPSAwO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHBhdHRlcm5MZW47IGkrKykge1xyXG5cdFx0XHRcdFx0XHRtYXNrW3BhdHRlcm4uY2hhckF0KGkpXSB8PSAxIDw8IChwYXR0ZXJuTGVuIC0gaSAtIDEpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIG1hc2s7XHJcblx0XHRcdFx0fSgpKTtcclxuXHRcdFx0XHRtYXRjaF9iaXRhcFNjb3JlID0gZnVuY3Rpb24gKGUsIHgpIHtcclxuXHRcdFx0XHRcdHZhciBhY2N1cmFjeSA9IGUgLyBwYXR0ZXJuTGVuLFxyXG5cdFx0XHRcdFx0XHRwcm94aW1pdHkgPSBNYXRoLmFicyhNQVRDSF9MT0NBVElPTiAtIHgpO1xyXG5cdFx0XHRcdFx0aWYoIU1BVENIX0RJU1RBTkNFKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBwcm94aW1pdHkgPyAxLjAgOiBhY2N1cmFjeTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiBhY2N1cmFjeSArIChwcm94aW1pdHkgLyBNQVRDSF9ESVNUQU5DRSk7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRzZWFyY2ggPSBmdW5jdGlvbiAodGV4dCkge1xyXG5cdFx0XHRcdHRleHQgPSBvcHRpb25zLmNhc2VTZW5zaXRpdmUgPyB0ZXh0IDogdGV4dC50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdGlmKHBhdHRlcm4gPT09IHRleHQgfHwgdGV4dC5pbmRleE9mKHBhdHRlcm4pICE9PSAtMSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0aXNNYXRjaDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0c2NvcmU6IDBcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKCFvcHRpb25zLmZ1enp5KSB7XHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRpc01hdGNoOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0c2NvcmU6IDFcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBpLCBqLFxyXG5cdFx0XHRcdFx0dGV4dExlbiA9IHRleHQubGVuZ3RoLFxyXG5cdFx0XHRcdFx0c2NvcmVUaHJlc2hvbGQgPSBNQVRDSF9USFJFU0hPTEQsXHJcblx0XHRcdFx0XHRiZXN0TG9jID0gdGV4dC5pbmRleE9mKHBhdHRlcm4sIE1BVENIX0xPQ0FUSU9OKSxcclxuXHRcdFx0XHRcdGJpbk1pbiwgYmluTWlkLFxyXG5cdFx0XHRcdFx0YmluTWF4ID0gcGF0dGVybkxlbiArIHRleHRMZW4sXHJcblx0XHRcdFx0XHRsYXN0UmQsIHN0YXJ0LCBmaW5pc2gsIHJkLCBjaGFyTWF0Y2gsXHJcblx0XHRcdFx0XHRzY29yZSA9IDEsXHJcblx0XHRcdFx0XHRsb2NhdGlvbnMgPSBbXTtcclxuXHRcdFx0XHRpZiAoYmVzdExvYyAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdHNjb3JlVGhyZXNob2xkID0gTWF0aC5taW4obWF0Y2hfYml0YXBTY29yZSgwLCBiZXN0TG9jKSwgc2NvcmVUaHJlc2hvbGQpO1xyXG5cdFx0XHRcdFx0YmVzdExvYyA9IHRleHQubGFzdEluZGV4T2YocGF0dGVybiwgTUFUQ0hfTE9DQVRJT04gKyBwYXR0ZXJuTGVuKTtcclxuXHRcdFx0XHRcdGlmIChiZXN0TG9jICE9PSAtMSkge1xyXG5cdFx0XHRcdFx0XHRzY29yZVRocmVzaG9sZCA9IE1hdGgubWluKG1hdGNoX2JpdGFwU2NvcmUoMCwgYmVzdExvYyksIHNjb3JlVGhyZXNob2xkKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YmVzdExvYyA9IC0xO1xyXG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuTGVuOyBpKyspIHtcclxuXHRcdFx0XHRcdGJpbk1pbiA9IDA7XHJcblx0XHRcdFx0XHRiaW5NaWQgPSBiaW5NYXg7XHJcblx0XHRcdFx0XHR3aGlsZSAoYmluTWluIDwgYmluTWlkKSB7XHJcblx0XHRcdFx0XHRcdGlmIChtYXRjaF9iaXRhcFNjb3JlKGksIE1BVENIX0xPQ0FUSU9OICsgYmluTWlkKSA8PSBzY29yZVRocmVzaG9sZCkge1xyXG5cdFx0XHRcdFx0XHRcdGJpbk1pbiA9IGJpbk1pZDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRiaW5NYXggPSBiaW5NaWQ7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0YmluTWlkID0gTWF0aC5mbG9vcigoYmluTWF4IC0gYmluTWluKSAvIDIgKyBiaW5NaW4pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YmluTWF4ID0gYmluTWlkO1xyXG5cdFx0XHRcdFx0c3RhcnQgPSBNYXRoLm1heCgxLCBNQVRDSF9MT0NBVElPTiAtIGJpbk1pZCArIDEpO1xyXG5cdFx0XHRcdFx0ZmluaXNoID0gTWF0aC5taW4oTUFUQ0hfTE9DQVRJT04gKyBiaW5NaWQsIHRleHRMZW4pICsgcGF0dGVybkxlbjtcclxuXHRcdFx0XHRcdHJkID0gbmV3IEFycmF5KGZpbmlzaCArIDIpO1xyXG5cdFx0XHRcdFx0cmRbZmluaXNoICsgMV0gPSAoMSA8PCBpKSAtIDE7XHJcblx0XHRcdFx0XHRmb3IgKGogPSBmaW5pc2g7IGogPj0gc3RhcnQ7IGotLSkge1xyXG5cdFx0XHRcdFx0XHRjaGFyTWF0Y2ggPSBwYXR0ZXJuX2FscGhhYmV0W3RleHQuY2hhckF0KGogLSAxKV07XHJcblx0XHRcdFx0XHRcdGlmIChpID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0cmRbal0gPSAoKHJkW2ogKyAxXSA8PCAxKSB8IDEpICYgY2hhck1hdGNoO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHJkW2pdID0gKChyZFtqICsgMV0gPDwgMSkgfCAxKSAmIGNoYXJNYXRjaCB8ICgoKGxhc3RSZFtqICsgMV0gfCBsYXN0UmRbal0pIDw8IDEpIHwgMSkgfCBsYXN0UmRbaiArIDFdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChyZFtqXSAmIG1hdGNobWFzaykge1xyXG5cdFx0XHRcdFx0XHRcdHNjb3JlID0gbWF0Y2hfYml0YXBTY29yZShpLCBqIC0gMSk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHNjb3JlIDw9IHNjb3JlVGhyZXNob2xkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzY29yZVRocmVzaG9sZCA9IHNjb3JlO1xyXG5cdFx0XHRcdFx0XHRcdFx0YmVzdExvYyA9IGogLSAxO1xyXG5cdFx0XHRcdFx0XHRcdFx0bG9jYXRpb25zLnB1c2goYmVzdExvYyk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoYmVzdExvYyA+IE1BVENIX0xPQ0FUSU9OKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0ID0gTWF0aC5tYXgoMSwgMiAqIE1BVENIX0xPQ0FUSU9OIC0gYmVzdExvYyk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChtYXRjaF9iaXRhcFNjb3JlKGkgKyAxLCBNQVRDSF9MT0NBVElPTikgPiBzY29yZVRocmVzaG9sZCkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxhc3RSZCA9IHJkO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0aXNNYXRjaDogYmVzdExvYyA+PSAwLFxyXG5cdFx0XHRcdFx0c2NvcmU6IHNjb3JlXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fTtcclxuXHRcdFx0cmV0dXJuIHR4dCA9PT0gdHJ1ZSA/IHsgJ3NlYXJjaCcgOiBzZWFyY2ggfSA6IHNlYXJjaCh0eHQpO1xyXG5cdFx0fTtcclxuXHR9KGpRdWVyeSkpO1xyXG5cclxuXHQvLyBpbmNsdWRlIHRoZSBzZWFyY2ggcGx1Z2luIGJ5IGRlZmF1bHRcclxuXHQvLyAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goXCJzZWFyY2hcIik7XHJcblxyXG4vKipcclxuICogIyMjIFNvcnQgcGx1Z2luXHJcbiAqXHJcbiAqIEF1dG1hdGljYWxseSBzb3J0cyBhbGwgc2libGluZ3MgaW4gdGhlIHRyZWUgYWNjb3JkaW5nIHRvIGEgc29ydGluZyBmdW5jdGlvbi5cclxuICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIHRoZSBzZXR0aW5ncyBmdW5jdGlvbiB1c2VkIHRvIHNvcnQgdGhlIG5vZGVzLlxyXG5cdCAqIEl0IGlzIGV4ZWN1dGVkIGluIHRoZSB0cmVlJ3MgY29udGV4dCwgYWNjZXB0cyB0d28gbm9kZXMgYXMgYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIGAxYCBvciBgLTFgLlxyXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnNvcnRcclxuXHQgKiBAcGx1Z2luIHNvcnRcclxuXHQgKi9cclxuXHQkLmpzdHJlZS5kZWZhdWx0cy5zb3J0ID0gZnVuY3Rpb24gKGEsIGIpIHtcclxuXHRcdC8vcmV0dXJuIHRoaXMuZ2V0X3R5cGUoYSkgPT09IHRoaXMuZ2V0X3R5cGUoYikgPyAodGhpcy5nZXRfdGV4dChhKSA+IHRoaXMuZ2V0X3RleHQoYikgPyAxIDogLTEpIDogdGhpcy5nZXRfdHlwZShhKSA+PSB0aGlzLmdldF90eXBlKGIpO1xyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0X3RleHQoYSkgPiB0aGlzLmdldF90ZXh0KGIpID8gMSA6IC0xO1xyXG5cdH07XHJcblx0JC5qc3RyZWUucGx1Z2lucy5zb3J0ID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmVudCkge1xyXG5cdFx0dGhpcy5iaW5kID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRwYXJlbnQuYmluZC5jYWxsKHRoaXMpO1xyXG5cdFx0XHR0aGlzLmVsZW1lbnRcclxuXHRcdFx0XHQub24oXCJtb2RlbC5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNvcnQoZGF0YS5wYXJlbnQsIHRydWUpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKFwicmVuYW1lX25vZGUuanN0cmVlIGNyZWF0ZV9ub2RlLmpzdHJlZVwiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc29ydChkYXRhLnBhcmVudCB8fCBkYXRhLm5vZGUucGFyZW50LCBmYWxzZSk7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVkcmF3X25vZGUoZGF0YS5wYXJlbnQgfHwgZGF0YS5ub2RlLnBhcmVudCwgdHJ1ZSk7XHJcblx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHQub24oXCJtb3ZlX25vZGUuanN0cmVlIGNvcHlfbm9kZS5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNvcnQoZGF0YS5wYXJlbnQsIGZhbHNlKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWRyYXdfbm9kZShkYXRhLnBhcmVudCwgdHJ1ZSk7XHJcblx0XHRcdFx0XHR9LCB0aGlzKSk7XHJcblx0XHR9O1xyXG5cdFx0LyoqXHJcblx0XHQgKiB1c2VkIHRvIHNvcnQgYSBub2RlJ3MgY2hpbGRyZW5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAbmFtZSBzb3J0KG9iaiBbLCBkZWVwXSlcclxuXHRcdCAqIEBwYXJhbSAge21peGVkfSBvYmogdGhlIG5vZGVcclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcCBpZiBzZXQgdG8gYHRydWVgIG5vZGVzIGFyZSBzb3J0ZWQgcmVjdXJzaXZlbHkuXHJcblx0XHQgKiBAcGx1Z2luIHNvcnRcclxuXHRcdCAqIEB0cmlnZ2VyIHNlYXJjaC5qc3RyZWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3J0ID0gZnVuY3Rpb24gKG9iaiwgZGVlcCkge1xyXG5cdFx0XHR2YXIgaSwgajtcclxuXHRcdFx0b2JqID0gdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRpZihvYmogJiYgb2JqLmNoaWxkcmVuICYmIG9iai5jaGlsZHJlbi5sZW5ndGgpIHtcclxuXHRcdFx0XHRvYmouY2hpbGRyZW4uc29ydCgkLnByb3h5KHRoaXMuc2V0dGluZ3Muc29ydCwgdGhpcykpO1xyXG5cdFx0XHRcdGlmKGRlZXApIHtcclxuXHRcdFx0XHRcdGZvcihpID0gMCwgaiA9IG9iai5jaGlsZHJlbl9kLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNvcnQob2JqLmNoaWxkcmVuX2RbaV0sIGZhbHNlKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fTtcclxuXHJcblx0Ly8gaW5jbHVkZSB0aGUgc29ydCBwbHVnaW4gYnkgZGVmYXVsdFxyXG5cdC8vICQuanN0cmVlLmRlZmF1bHRzLnBsdWdpbnMucHVzaChcInNvcnRcIik7XHJcblxyXG4vKipcclxuICogIyMjIFN0YXRlIHBsdWdpblxyXG4gKlxyXG4gKiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIHRyZWUgKHNlbGVjdGVkIG5vZGVzLCBvcGVuZWQgbm9kZXMpIG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgdXNpbmcgYXZhaWxhYmxlIG9wdGlvbnMgKGxvY2FsU3RvcmFnZSwgY29va2llcywgZXRjKVxyXG4gKi9cclxuXHJcblx0dmFyIHRvID0gZmFsc2U7XHJcblx0LyoqXHJcblx0ICogc3RvcmVzIGFsbCBkZWZhdWx0cyBmb3IgdGhlIHN0YXRlIHBsdWdpblxyXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnN0YXRlXHJcblx0ICogQHBsdWdpbiBzdGF0ZVxyXG5cdCAqL1xyXG5cdCQuanN0cmVlLmRlZmF1bHRzLnN0YXRlID0ge1xyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHN0cmluZyBmb3IgdGhlIGtleSB0byB1c2Ugd2hlbiBzYXZpbmcgdGhlIGN1cnJlbnQgdHJlZSAoY2hhbmdlIGlmIHVzaW5nIG11bHRpcGxlIHRyZWVzIGluIHlvdXIgcHJvamVjdCkuIERlZmF1bHRzIHRvIGBqc3RyZWVgLlxyXG5cdFx0ICogQG5hbWUgJC5qc3RyZWUuZGVmYXVsdHMuc3RhdGUua2V5XHJcblx0XHQgKiBAcGx1Z2luIHN0YXRlXHJcblx0XHQgKi9cclxuXHRcdGtleVx0XHQ6ICdqc3RyZWUnLFxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50cyB0aGF0IHRyaWdnZXIgYSBzdGF0ZSBzYXZlLiBEZWZhdWx0cyB0byBgY2hhbmdlZC5qc3RyZWUgb3Blbl9ub2RlLmpzdHJlZSBjbG9zZV9ub2RlLmpzdHJlZWAuXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5zdGF0ZS5ldmVudHNcclxuXHRcdCAqIEBwbHVnaW4gc3RhdGVcclxuXHRcdCAqL1xyXG5cdFx0ZXZlbnRzXHQ6ICdjaGFuZ2VkLmpzdHJlZSBvcGVuX25vZGUuanN0cmVlIGNsb3NlX25vZGUuanN0cmVlJyxcclxuXHRcdC8qKlxyXG5cdFx0ICogVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHN0YXRlIHdpbGwgZXhwaXJlLiBEZWZhdWx0cyB0byAnZmFsc2UnIG1lYW5pbmcgLSBubyBleHBpcmUuXHJcblx0XHQgKiBAbmFtZSAkLmpzdHJlZS5kZWZhdWx0cy5zdGF0ZS50dGxcclxuXHRcdCAqIEBwbHVnaW4gc3RhdGVcclxuXHRcdCAqL1xyXG5cdFx0dHRsXHRcdDogZmFsc2UsXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHByaW9yIHRvIHJlc3RvcmluZyBzdGF0ZSB3aXRoIG9uZSBhcmd1bWVudCAtIHRoZSBzdGF0ZSBvYmplY3QuIENhbiBiZSB1c2VkIHRvIGNsZWFyIHVud2FudGVkIHBhcnRzIG9mIHRoZSBzdGF0ZS5cclxuXHRcdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnN0YXRlLmZpbHRlclxyXG5cdFx0ICogQHBsdWdpbiBzdGF0ZVxyXG5cdFx0ICovXHJcblx0XHRmaWx0ZXJcdDogZmFsc2VcclxuXHR9O1xyXG5cdCQuanN0cmVlLnBsdWdpbnMuc3RhdGUgPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyZW50KSB7XHJcblx0XHR0aGlzLmJpbmQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHBhcmVudC5iaW5kLmNhbGwodGhpcyk7XHJcblx0XHRcdHZhciBiaW5kID0gJC5wcm94eShmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0dGhpcy5lbGVtZW50Lm9uKHRoaXMuc2V0dGluZ3Muc3RhdGUuZXZlbnRzLCAkLnByb3h5KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdGlmKHRvKSB7IGNsZWFyVGltZW91dCh0byk7IH1cclxuXHRcdFx0XHRcdHRvID0gc2V0VGltZW91dCgkLnByb3h5KGZ1bmN0aW9uICgpIHsgdGhpcy5zYXZlX3N0YXRlKCk7IH0sIHRoaXMpLCAxMDApO1xyXG5cdFx0XHRcdH0sIHRoaXMpKTtcclxuXHRcdFx0fSwgdGhpcyk7XHJcblx0XHRcdHRoaXMuZWxlbWVudFxyXG5cdFx0XHRcdC5vbihcInJlYWR5LmpzdHJlZVwiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZWxlbWVudC5vbmUoXCJyZXN0b3JlX3N0YXRlLmpzdHJlZVwiLCBiaW5kKTtcclxuXHRcdFx0XHRcdFx0aWYoIXRoaXMucmVzdG9yZV9zdGF0ZSgpKSB7IGJpbmQoKTsgfVxyXG5cdFx0XHRcdFx0fSwgdGhpcykpO1xyXG5cdFx0fTtcclxuXHRcdC8qKlxyXG5cdFx0ICogc2F2ZSB0aGUgc3RhdGVcclxuXHRcdCAqIEBuYW1lIHNhdmVfc3RhdGUoKVxyXG5cdFx0ICogQHBsdWdpbiBzdGF0ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNhdmVfc3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHZhciBzdCA9IHsgJ3N0YXRlJyA6IHRoaXMuZ2V0X3N0YXRlKCksICd0dGwnIDogdGhpcy5zZXR0aW5ncy5zdGF0ZS50dGwsICdzZWMnIDogKyhuZXcgRGF0ZSgpKSB9O1xyXG5cdFx0XHQkLnZha2F0YS5zdG9yYWdlLnNldCh0aGlzLnNldHRpbmdzLnN0YXRlLmtleSwgSlNPTi5zdHJpbmdpZnkoc3QpKTtcclxuXHRcdH07XHJcblx0XHQvKipcclxuXHRcdCAqIHJlc3RvcmUgdGhlIHN0YXRlIGZyb20gdGhlIHVzZXIncyBjb21wdXRlclxyXG5cdFx0ICogQG5hbWUgcmVzdG9yZV9zdGF0ZSgpXHJcblx0XHQgKiBAcGx1Z2luIHN0YXRlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVzdG9yZV9zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0dmFyIGsgPSAkLnZha2F0YS5zdG9yYWdlLmdldCh0aGlzLnNldHRpbmdzLnN0YXRlLmtleSk7XHJcblx0XHRcdGlmKCEhaykgeyB0cnkgeyBrID0gSlNPTi5wYXJzZShrKTsgfSBjYXRjaChleCkgeyByZXR1cm4gZmFsc2U7IH0gfVxyXG5cdFx0XHRpZighIWsgJiYgay50dGwgJiYgay5zZWMgJiYgKyhuZXcgRGF0ZSgpKSAtIGsuc2VjID4gay50dGwpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdGlmKCEhayAmJiBrLnN0YXRlKSB7IGsgPSBrLnN0YXRlOyB9XHJcblx0XHRcdGlmKCEhayAmJiAkLmlzRnVuY3Rpb24odGhpcy5zZXR0aW5ncy5zdGF0ZS5maWx0ZXIpKSB7IGsgPSB0aGlzLnNldHRpbmdzLnN0YXRlLmZpbHRlci5jYWxsKHRoaXMsIGspOyB9XHJcblx0XHRcdGlmKCEhaykge1xyXG5cdFx0XHRcdHRoaXMuZWxlbWVudC5vbmUoXCJzZXRfc3RhdGUuanN0cmVlXCIsIGZ1bmN0aW9uIChlLCBkYXRhKSB7IGRhdGEuaW5zdGFuY2UudHJpZ2dlcigncmVzdG9yZV9zdGF0ZScsIHsgJ3N0YXRlJyA6ICQuZXh0ZW5kKHRydWUsIHt9LCBrKSB9KTsgfSk7XHJcblx0XHRcdFx0dGhpcy5zZXRfc3RhdGUoayk7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fTtcclxuXHRcdC8qKlxyXG5cdFx0ICogY2xlYXIgdGhlIHN0YXRlIG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXJcclxuXHRcdCAqIEBuYW1lIGNsZWFyX3N0YXRlKClcclxuXHRcdCAqIEBwbHVnaW4gc3RhdGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcl9zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuICQudmFrYXRhLnN0b3JhZ2UuZGVsKHRoaXMuc2V0dGluZ3Muc3RhdGUua2V5KTtcclxuXHRcdH07XHJcblx0fTtcclxuXHJcblx0KGZ1bmN0aW9uICgkLCB1bmRlZmluZWQpIHtcclxuXHRcdCQudmFrYXRhLnN0b3JhZ2UgPSB7XHJcblx0XHRcdC8vIHNpbXBseSBzcGVjaWZ5aW5nIHRoZSBmdW5jdGlvbnMgaW4gRkYgdGhyb3dzIGFuIGVycm9yXHJcblx0XHRcdHNldCA6IGZ1bmN0aW9uIChrZXksIHZhbCkgeyByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsKTsgfSxcclxuXHRcdFx0Z2V0IDogZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7IH0sXHJcblx0XHRcdGRlbCA6IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9XHJcblx0XHR9O1xyXG5cdH0oalF1ZXJ5KSk7XHJcblxyXG5cdC8vIGluY2x1ZGUgdGhlIHN0YXRlIHBsdWdpbiBieSBkZWZhdWx0XHJcblx0Ly8gJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKFwic3RhdGVcIik7XHJcblxyXG4vKipcclxuICogIyMjIFR5cGVzIHBsdWdpblxyXG4gKlxyXG4gKiBNYWtlcyBpdCBwb3NzaWJsZSB0byBhZGQgcHJlZGVmaW5lZCB0eXBlcyBmb3IgZ3JvdXBzIG9mIG5vZGVzLCB3aGljaCBtYWtlIGl0IHBvc3NpYmxlIHRvIGVhc2lseSBjb250cm9sIG5lc3RpbmcgcnVsZXMgYW5kIGljb24gZm9yIGVhY2ggZ3JvdXAuXHJcbiAqL1xyXG5cclxuXHQvKipcclxuXHQgKiBBbiBvYmplY3Qgc3RvcmluZyBhbGwgdHlwZXMgYXMga2V5IHZhbHVlIHBhaXJzLCB3aGVyZSB0aGUga2V5IGlzIHRoZSB0eXBlIG5hbWUgYW5kIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QgdGhhdCBjb3VsZCBjb250YWluIGZvbGxvd2luZyBrZXlzIChhbGwgb3B0aW9uYWwpLlxyXG5cdCAqIFxyXG5cdCAqICogYG1heF9jaGlsZHJlbmAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGltbWVkaWF0ZSBjaGlsZHJlbiB0aGlzIG5vZGUgdHlwZSBjYW4gaGF2ZS4gRG8gbm90IHNwZWNpZnkgb3Igc2V0IHRvIGAtMWAgZm9yIHVubGltaXRlZC5cclxuXHQgKiAqIGBtYXhfZGVwdGhgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0aW5nIHRoaXMgbm9kZSB0eXBlIGNhbiBoYXZlLiBBIHZhbHVlIG9mIGAxYCB3b3VsZCBtZWFuIHRoYXQgdGhlIG5vZGUgY2FuIGhhdmUgY2hpbGRyZW4sIGJ1dCBubyBncmFuZGNoaWxkcmVuLiBEbyBub3Qgc3BlY2lmeSBvciBzZXQgdG8gYC0xYCBmb3IgdW5saW1pdGVkLlxyXG5cdCAqICogYHZhbGlkX2NoaWxkcmVuYCBhbiBhcnJheSBvZiBub2RlIHR5cGUgc3RyaW5ncywgdGhhdCBub2RlcyBvZiB0aGlzIHR5cGUgY2FuIGhhdmUgYXMgY2hpbGRyZW4uIERvIG5vdCBzcGVjaWZ5IG9yIHNldCB0byBgLTFgIGZvciBubyBsaW1pdHMuXHJcblx0ICogKiBgaWNvbmAgYSBzdHJpbmcgLSBjYW4gYmUgYSBwYXRoIHRvIGFuIGljb24gb3IgYSBjbGFzc05hbWUsIGlmIHVzaW5nIGFuIGltYWdlIHRoYXQgaXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVzZSBhIGAuL2AgcHJlZml4LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZXRlY3RlZCBhcyBhIGNsYXNzLiBPbWl0IHRvIHVzZSB0aGUgZGVmYXVsdCBpY29uIGZyb20geW91ciB0aGVtZS5cclxuXHQgKlxyXG5cdCAqIFRoZXJlIGFyZSB0d28gcHJlZGVmaW5lZCB0eXBlczpcclxuXHQgKiBcclxuXHQgKiAqIGAjYCByZXByZXNlbnRzIHRoZSByb290IG9mIHRoZSB0cmVlLCBmb3IgZXhhbXBsZSBgbWF4X2NoaWxkcmVuYCB3b3VsZCBjb250cm9sIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb290IG5vZGVzLlxyXG5cdCAqICogYGRlZmF1bHRgIHJlcHJlc2VudHMgdGhlIGRlZmF1bHQgbm9kZSAtIGFueSBzZXR0aW5ncyBoZXJlIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgbm9kZXMgdGhhdCBkbyBub3QgaGF2ZSBhIHR5cGUgc3BlY2lmaWVkLlxyXG5cdCAqIFxyXG5cdCAqIEBuYW1lICQuanN0cmVlLmRlZmF1bHRzLnR5cGVzXHJcblx0ICogQHBsdWdpbiB0eXBlc1xyXG5cdCAqL1xyXG5cdCQuanN0cmVlLmRlZmF1bHRzLnR5cGVzID0ge1xyXG5cdFx0JyMnIDoge30sXHJcblx0XHQnZGVmYXVsdCcgOiB7fVxyXG5cdH07XHJcblxyXG5cdCQuanN0cmVlLnBsdWdpbnMudHlwZXMgPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyZW50KSB7XHJcblx0XHR0aGlzLmluaXQgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHtcclxuXHRcdFx0dmFyIGksIGo7XHJcblx0XHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy50eXBlcyAmJiBvcHRpb25zLnR5cGVzWydkZWZhdWx0J10pIHtcclxuXHRcdFx0XHRmb3IoaSBpbiBvcHRpb25zLnR5cGVzKSB7XHJcblx0XHRcdFx0XHRpZihpICE9PSBcImRlZmF1bHRcIiAmJiBpICE9PSBcIiNcIiAmJiBvcHRpb25zLnR5cGVzLmhhc093blByb3BlcnR5KGkpKSB7XHJcblx0XHRcdFx0XHRcdGZvcihqIGluIG9wdGlvbnMudHlwZXNbJ2RlZmF1bHQnXSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmKG9wdGlvbnMudHlwZXNbJ2RlZmF1bHQnXS5oYXNPd25Qcm9wZXJ0eShqKSAmJiBvcHRpb25zLnR5cGVzW2ldW2pdID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudHlwZXNbaV1bal0gPSBvcHRpb25zLnR5cGVzWydkZWZhdWx0J11bal07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHBhcmVudC5pbml0LmNhbGwodGhpcywgZWwsIG9wdGlvbnMpO1xyXG5cdFx0XHR0aGlzLl9tb2RlbC5kYXRhWycjJ10udHlwZSA9ICcjJztcclxuXHRcdH07XHJcblx0XHR0aGlzLmJpbmQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHBhcmVudC5iaW5kLmNhbGwodGhpcyk7XHJcblx0XHRcdHRoaXMuZWxlbWVudFxyXG5cdFx0XHRcdC5vbignbW9kZWwuanN0cmVlJywgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHR2YXIgbSA9IHRoaXMuX21vZGVsLmRhdGEsXHJcblx0XHRcdFx0XHRcdFx0ZHBjID0gZGF0YS5ub2RlcyxcclxuXHRcdFx0XHRcdFx0XHR0ID0gdGhpcy5zZXR0aW5ncy50eXBlcyxcclxuXHRcdFx0XHRcdFx0XHRpLCBqLCBjID0gJ2RlZmF1bHQnO1xyXG5cdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBkcGMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0YyA9ICdkZWZhdWx0JztcclxuXHRcdFx0XHRcdFx0XHRpZihtW2RwY1tpXV0ub3JpZ2luYWwgJiYgbVtkcGNbaV1dLm9yaWdpbmFsLnR5cGUgJiYgdFttW2RwY1tpXV0ub3JpZ2luYWwudHlwZV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdGMgPSBtW2RwY1tpXV0ub3JpZ2luYWwudHlwZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYobVtkcGNbaV1dLmRhdGEgJiYgbVtkcGNbaV1dLmRhdGEuanN0cmVlICYmIG1bZHBjW2ldXS5kYXRhLmpzdHJlZS50eXBlICYmIHRbbVtkcGNbaV1dLmRhdGEuanN0cmVlLnR5cGVdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjID0gbVtkcGNbaV1dLmRhdGEuanN0cmVlLnR5cGU7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdG1bZHBjW2ldXS50eXBlID0gYztcclxuXHRcdFx0XHRcdFx0XHRpZihtW2RwY1tpXV0uaWNvbiA9PT0gdHJ1ZSAmJiB0W2NdLmljb24gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0bVtkcGNbaV1dLmljb24gPSB0W2NdLmljb247XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LCB0aGlzKSk7XHJcblx0XHR9O1xyXG5cdFx0dGhpcy5nZXRfanNvbiA9IGZ1bmN0aW9uIChvYmosIG9wdGlvbnMsIGZsYXQpIHtcclxuXHRcdFx0dmFyIGksIGosXHJcblx0XHRcdFx0bSA9IHRoaXMuX21vZGVsLmRhdGEsXHJcblx0XHRcdFx0b3B0ID0gb3B0aW9ucyA/ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRpb25zLCB7bm9faWQ6ZmFsc2V9KSA6IHt9LFxyXG5cdFx0XHRcdHRtcCA9IHBhcmVudC5nZXRfanNvbi5jYWxsKHRoaXMsIG9iaiwgb3B0LCBmbGF0KTtcclxuXHRcdFx0aWYodG1wID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0aWYoJC5pc0FycmF5KHRtcCkpIHtcclxuXHRcdFx0XHRmb3IoaSA9IDAsIGogPSB0bXAubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcblx0XHRcdFx0XHR0bXBbaV0udHlwZSA9IHRtcFtpXS5pZCAmJiBtW3RtcFtpXS5pZF0gJiYgbVt0bXBbaV0uaWRdLnR5cGUgPyBtW3RtcFtpXS5pZF0udHlwZSA6IFwiZGVmYXVsdFwiO1xyXG5cdFx0XHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLm5vX2lkKSB7XHJcblx0XHRcdFx0XHRcdGRlbGV0ZSB0bXBbaV0uaWQ7XHJcblx0XHRcdFx0XHRcdGlmKHRtcFtpXS5saV9hdHRyICYmIHRtcFtpXS5saV9hdHRyLmlkKSB7XHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRtcFtpXS5saV9hdHRyLmlkO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdHRtcC50eXBlID0gdG1wLmlkICYmIG1bdG1wLmlkXSAmJiBtW3RtcC5pZF0udHlwZSA/IG1bdG1wLmlkXS50eXBlIDogXCJkZWZhdWx0XCI7XHJcblx0XHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLm5vX2lkKSB7XHJcblx0XHRcdFx0XHR0bXAgPSB0aGlzLl9kZWxldGVfaWRzKHRtcCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0bXA7XHJcblx0XHR9O1xyXG5cdFx0dGhpcy5fZGVsZXRlX2lkcyA9IGZ1bmN0aW9uICh0bXApIHtcclxuXHRcdFx0aWYoJC5pc0FycmF5KHRtcCkpIHtcclxuXHRcdFx0XHRmb3IodmFyIGkgPSAwLCBqID0gdG1wLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdFx0dG1wW2ldID0gdGhpcy5fZGVsZXRlX2lkcyh0bXBbaV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdG1wO1xyXG5cdFx0XHR9XHJcblx0XHRcdGRlbGV0ZSB0bXAuaWQ7XHJcblx0XHRcdGlmKHRtcC5saV9hdHRyICYmIHRtcC5saV9hdHRyLmlkKSB7XHJcblx0XHRcdFx0ZGVsZXRlIHRtcC5saV9hdHRyLmlkO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHRtcC5jaGlsZHJlbiAmJiAkLmlzQXJyYXkodG1wLmNoaWxkcmVuKSkge1xyXG5cdFx0XHRcdHRtcC5jaGlsZHJlbiA9IHRoaXMuX2RlbGV0ZV9pZHModG1wLmNoaWxkcmVuKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdG1wO1xyXG5cdFx0fTtcclxuXHRcdHRoaXMuY2hlY2sgPSBmdW5jdGlvbiAoY2hrLCBvYmosIHBhciwgcG9zKSB7XHJcblx0XHRcdGlmKHBhcmVudC5jaGVjay5jYWxsKHRoaXMsIGNoaywgb2JqLCBwYXIsIHBvcykgPT09IGZhbHNlKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHRvYmogPSBvYmogJiYgb2JqLmlkID8gb2JqIDogdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRwYXIgPSBwYXIgJiYgcGFyLmlkID8gcGFyIDogdGhpcy5nZXRfbm9kZShwYXIpO1xyXG5cdFx0XHR2YXIgbSA9IG9iaiAmJiBvYmouaWQgPyAkLmpzdHJlZS5yZWZlcmVuY2Uob2JqLmlkKSA6IG51bGwsIHRtcCwgZCwgaSwgajtcclxuXHRcdFx0bSA9IG0gJiYgbS5fbW9kZWwgJiYgbS5fbW9kZWwuZGF0YSA/IG0uX21vZGVsLmRhdGEgOiBudWxsO1xyXG5cdFx0XHRzd2l0Y2goY2hrKSB7XHJcblx0XHRcdFx0Y2FzZSBcImNyZWF0ZV9ub2RlXCI6XHJcblx0XHRcdFx0Y2FzZSBcIm1vdmVfbm9kZVwiOlxyXG5cdFx0XHRcdGNhc2UgXCJjb3B5X25vZGVcIjpcclxuXHRcdFx0XHRcdGlmKGNoayAhPT0gJ21vdmVfbm9kZScgfHwgJC5pbkFycmF5KG9iai5pZCwgcGFyLmNoaWxkcmVuKSA9PT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfcnVsZXMocGFyKTtcclxuXHRcdFx0XHRcdFx0aWYodG1wLm1heF9jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICYmIHRtcC5tYXhfY2hpbGRyZW4gIT09IC0xICYmIHRtcC5tYXhfY2hpbGRyZW4gPT09IHBhci5jaGlsZHJlbi5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvciA9IHsgJ2Vycm9yJyA6ICdjaGVjaycsICdwbHVnaW4nIDogJ3R5cGVzJywgJ2lkJyA6ICd0eXBlc18wMScsICdyZWFzb24nIDogJ21heF9jaGlsZHJlbiBwcmV2ZW50cyBmdW5jdGlvbjogJyArIGNoaywgJ2RhdGEnIDogSlNPTi5zdHJpbmdpZnkoeyAnY2hrJyA6IGNoaywgJ3BvcycgOiBwb3MsICdvYmonIDogb2JqICYmIG9iai5pZCA/IG9iai5pZCA6IGZhbHNlLCAncGFyJyA6IHBhciAmJiBwYXIuaWQgPyBwYXIuaWQgOiBmYWxzZSB9KSB9O1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZih0bXAudmFsaWRfY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiB0bXAudmFsaWRfY2hpbGRyZW4gIT09IC0xICYmICQuaW5BcnJheShvYmoudHlwZSwgdG1wLnZhbGlkX2NoaWxkcmVuKSA9PT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLl9kYXRhLmNvcmUubGFzdF9lcnJvciA9IHsgJ2Vycm9yJyA6ICdjaGVjaycsICdwbHVnaW4nIDogJ3R5cGVzJywgJ2lkJyA6ICd0eXBlc18wMicsICdyZWFzb24nIDogJ3ZhbGlkX2NoaWxkcmVuIHByZXZlbnRzIGZ1bmN0aW9uOiAnICsgY2hrLCAnZGF0YScgOiBKU09OLnN0cmluZ2lmeSh7ICdjaGsnIDogY2hrLCAncG9zJyA6IHBvcywgJ29iaicgOiBvYmogJiYgb2JqLmlkID8gb2JqLmlkIDogZmFsc2UsICdwYXInIDogcGFyICYmIHBhci5pZCA/IHBhci5pZCA6IGZhbHNlIH0pIH07XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmKG0gJiYgb2JqLmNoaWxkcmVuX2QgJiYgb2JqLnBhcmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRkID0gMDtcclxuXHRcdFx0XHRcdFx0XHRmb3IoaSA9IDAsIGogPSBvYmouY2hpbGRyZW5fZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGQgPSBNYXRoLm1heChkLCBtW29iai5jaGlsZHJlbl9kW2ldXS5wYXJlbnRzLmxlbmd0aCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGQgPSBkIC0gb2JqLnBhcmVudHMubGVuZ3RoICsgMTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZihkIDw9IDAgfHwgZCA9PT0gdW5kZWZpbmVkKSB7IGQgPSAxOyB9XHJcblx0XHRcdFx0XHRcdGRvIHtcclxuXHRcdFx0XHRcdFx0XHRpZih0bXAubWF4X2RlcHRoICE9PSB1bmRlZmluZWQgJiYgdG1wLm1heF9kZXB0aCAhPT0gLTEgJiYgdG1wLm1heF9kZXB0aCA8IGQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2NoZWNrJywgJ3BsdWdpbicgOiAndHlwZXMnLCAnaWQnIDogJ3R5cGVzXzAzJywgJ3JlYXNvbicgOiAnbWF4X2RlcHRoIHByZXZlbnRzIGZ1bmN0aW9uOiAnICsgY2hrLCAnZGF0YScgOiBKU09OLnN0cmluZ2lmeSh7ICdjaGsnIDogY2hrLCAncG9zJyA6IHBvcywgJ29iaicgOiBvYmogJiYgb2JqLmlkID8gb2JqLmlkIDogZmFsc2UsICdwYXInIDogcGFyICYmIHBhci5pZCA/IHBhci5pZCA6IGZhbHNlIH0pIH07XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHBhciA9IHRoaXMuZ2V0X25vZGUocGFyLnBhcmVudCk7XHJcblx0XHRcdFx0XHRcdFx0dG1wID0gdGhpcy5nZXRfcnVsZXMocGFyKTtcclxuXHRcdFx0XHRcdFx0XHRkKys7XHJcblx0XHRcdFx0XHRcdH0gd2hpbGUocGFyKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fTtcclxuXHRcdC8qKlxyXG5cdFx0ICogdXNlZCB0byByZXRyaWV2ZSB0aGUgdHlwZSBzZXR0aW5ncyBvYmplY3QgZm9yIGEgbm9kZVxyXG5cdFx0ICogQG5hbWUgZ2V0X3J1bGVzKG9iailcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBmaW5kIHRoZSBydWxlcyBmb3JcclxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cclxuXHRcdCAqIEBwbHVnaW4gdHlwZXNcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRfcnVsZXMgPSBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcclxuXHRcdFx0aWYoIW9iaikgeyByZXR1cm4gZmFsc2U7IH1cclxuXHRcdFx0dmFyIHRtcCA9IHRoaXMuZ2V0X3R5cGUob2JqLCB0cnVlKTtcclxuXHRcdFx0aWYodG1wLm1heF9kZXB0aCA9PT0gdW5kZWZpbmVkKSB7IHRtcC5tYXhfZGVwdGggPSAtMTsgfVxyXG5cdFx0XHRpZih0bXAubWF4X2NoaWxkcmVuID09PSB1bmRlZmluZWQpIHsgdG1wLm1heF9jaGlsZHJlbiA9IC0xOyB9XHJcblx0XHRcdGlmKHRtcC52YWxpZF9jaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7IHRtcC52YWxpZF9jaGlsZHJlbiA9IC0xOyB9XHJcblx0XHRcdHJldHVybiB0bXA7XHJcblx0XHR9O1xyXG5cdFx0LyoqXHJcblx0XHQgKiB1c2VkIHRvIHJldHJpZXZlIHRoZSB0eXBlIHN0cmluZyBvciBzZXR0aW5ncyBvYmplY3QgZm9yIGEgbm9kZVxyXG5cdFx0ICogQG5hbWUgZ2V0X3R5cGUob2JqIFssIHJ1bGVzXSlcclxuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IG9iaiB0aGUgbm9kZSB0byBmaW5kIHRoZSBydWxlcyBmb3JcclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gcnVsZXMgaWYgc2V0IHRvIGB0cnVlYCBpbnN0ZWFkIG9mIGEgc3RyaW5nIHRoZSBzZXR0aW5ncyBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZFxyXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfE9iamVjdH1cclxuXHRcdCAqIEBwbHVnaW4gdHlwZXNcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRfdHlwZSA9IGZ1bmN0aW9uIChvYmosIHJ1bGVzKSB7XHJcblx0XHRcdG9iaiA9IHRoaXMuZ2V0X25vZGUob2JqKTtcclxuXHRcdFx0cmV0dXJuICghb2JqKSA/IGZhbHNlIDogKCBydWxlcyA/ICQuZXh0ZW5kKHsgJ3R5cGUnIDogb2JqLnR5cGUgfSwgdGhpcy5zZXR0aW5ncy50eXBlc1tvYmoudHlwZV0pIDogb2JqLnR5cGUpO1xyXG5cdFx0fTtcclxuXHRcdC8qKlxyXG5cdFx0ICogdXNlZCB0byBjaGFuZ2UgYSBub2RlJ3MgdHlwZVxyXG5cdFx0ICogQG5hbWUgc2V0X3R5cGUob2JqLCB0eXBlKVxyXG5cdFx0ICogQHBhcmFtIHttaXhlZH0gb2JqIHRoZSBub2RlIHRvIGNoYW5nZVxyXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIG5ldyB0eXBlXHJcblx0XHQgKiBAcGx1Z2luIHR5cGVzXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0X3R5cGUgPSBmdW5jdGlvbiAob2JqLCB0eXBlKSB7XHJcblx0XHRcdHZhciB0LCB0MSwgdDIsIG9sZF90eXBlLCBvbGRfaWNvbjtcclxuXHRcdFx0aWYoJC5pc0FycmF5KG9iaikpIHtcclxuXHRcdFx0XHRvYmogPSBvYmouc2xpY2UoKTtcclxuXHRcdFx0XHRmb3IodDEgPSAwLCB0MiA9IG9iai5sZW5ndGg7IHQxIDwgdDI7IHQxKyspIHtcclxuXHRcdFx0XHRcdHRoaXMuc2V0X3R5cGUob2JqW3QxXSwgdHlwZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHQgPSB0aGlzLnNldHRpbmdzLnR5cGVzO1xyXG5cdFx0XHRvYmogPSB0aGlzLmdldF9ub2RlKG9iaik7XHJcblx0XHRcdGlmKCF0W3R5cGVdIHx8ICFvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcblx0XHRcdG9sZF90eXBlID0gb2JqLnR5cGU7XHJcblx0XHRcdG9sZF9pY29uID0gdGhpcy5nZXRfaWNvbihvYmopO1xyXG5cdFx0XHRvYmoudHlwZSA9IHR5cGU7XHJcblx0XHRcdGlmKG9sZF9pY29uID09PSB0cnVlIHx8ICh0W29sZF90eXBlXSAmJiB0W29sZF90eXBlXS5pY29uICYmIG9sZF9pY29uID09PSB0W29sZF90eXBlXS5pY29uKSkge1xyXG5cdFx0XHRcdHRoaXMuc2V0X2ljb24ob2JqLCB0W3R5cGVdLmljb24gIT09IHVuZGVmaW5lZCA/IHRbdHlwZV0uaWNvbiA6IHRydWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fTtcclxuXHR9O1xyXG5cdC8vIGluY2x1ZGUgdGhlIHR5cGVzIHBsdWdpbiBieSBkZWZhdWx0XHJcblx0Ly8gJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKFwidHlwZXNcIik7XHJcblxyXG4vKipcclxuICogIyMjIFVuaXF1ZSBwbHVnaW5cclxuICpcclxuICogRW5mb3JjZXMgdGhhdCBubyBub2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgY2FuIGNvZXhpc3QgYXMgc2libGluZ3MuXHJcbiAqL1xyXG5cclxuXHQkLmpzdHJlZS5wbHVnaW5zLnVuaXF1ZSA9IGZ1bmN0aW9uIChvcHRpb25zLCBwYXJlbnQpIHtcclxuXHRcdHRoaXMuY2hlY2sgPSBmdW5jdGlvbiAoY2hrLCBvYmosIHBhciwgcG9zKSB7XHJcblx0XHRcdGlmKHBhcmVudC5jaGVjay5jYWxsKHRoaXMsIGNoaywgb2JqLCBwYXIsIHBvcykgPT09IGZhbHNlKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cdFx0XHRvYmogPSBvYmogJiYgb2JqLmlkID8gb2JqIDogdGhpcy5nZXRfbm9kZShvYmopO1xyXG5cdFx0XHRwYXIgPSBwYXIgJiYgcGFyLmlkID8gcGFyIDogdGhpcy5nZXRfbm9kZShwYXIpO1xyXG5cdFx0XHRpZighcGFyIHx8ICFwYXIuY2hpbGRyZW4pIHsgcmV0dXJuIHRydWU7IH1cclxuXHRcdFx0dmFyIG4gPSBjaGsgPT09IFwicmVuYW1lX25vZGVcIiA/IHBvcyA6IG9iai50ZXh0LFxyXG5cdFx0XHRcdGMgPSBbXSxcclxuXHRcdFx0XHRtID0gdGhpcy5fbW9kZWwuZGF0YSwgaSwgajtcclxuXHRcdFx0Zm9yKGkgPSAwLCBqID0gcGFyLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG5cdFx0XHRcdGMucHVzaChtW3Bhci5jaGlsZHJlbltpXV0udGV4dCk7XHJcblx0XHRcdH1cclxuXHRcdFx0c3dpdGNoKGNoaykge1xyXG5cdFx0XHRcdGNhc2UgXCJkZWxldGVfbm9kZVwiOlxyXG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0Y2FzZSBcInJlbmFtZV9ub2RlXCI6XHJcblx0XHRcdFx0Y2FzZSBcImNvcHlfbm9kZVwiOlxyXG5cdFx0XHRcdFx0aSA9ICgkLmluQXJyYXkobiwgYykgPT09IC0xKTtcclxuXHRcdFx0XHRcdGlmKCFpKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2NoZWNrJywgJ3BsdWdpbicgOiAndW5pcXVlJywgJ2lkJyA6ICd1bmlxdWVfMDEnLCAncmVhc29uJyA6ICdDaGlsZCB3aXRoIG5hbWUgJyArIG4gKyAnIGFscmVhZHkgZXhpc3RzLiBQcmV2ZW50aW5nOiAnICsgY2hrLCAnZGF0YScgOiBKU09OLnN0cmluZ2lmeSh7ICdjaGsnIDogY2hrLCAncG9zJyA6IHBvcywgJ29iaicgOiBvYmogJiYgb2JqLmlkID8gb2JqLmlkIDogZmFsc2UsICdwYXInIDogcGFyICYmIHBhci5pZCA/IHBhci5pZCA6IGZhbHNlIH0pIH07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gaTtcclxuXHRcdFx0XHRjYXNlIFwibW92ZV9ub2RlXCI6XHJcblx0XHRcdFx0XHRpID0gKG9iai5wYXJlbnQgPT09IHBhci5pZCB8fCAkLmluQXJyYXkobiwgYykgPT09IC0xKTtcclxuXHRcdFx0XHRcdGlmKCFpKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGEuY29yZS5sYXN0X2Vycm9yID0geyAnZXJyb3InIDogJ2NoZWNrJywgJ3BsdWdpbicgOiAndW5pcXVlJywgJ2lkJyA6ICd1bmlxdWVfMDEnLCAncmVhc29uJyA6ICdDaGlsZCB3aXRoIG5hbWUgJyArIG4gKyAnIGFscmVhZHkgZXhpc3RzLiBQcmV2ZW50aW5nOiAnICsgY2hrLCAnZGF0YScgOiBKU09OLnN0cmluZ2lmeSh7ICdjaGsnIDogY2hrLCAncG9zJyA6IHBvcywgJ29iaicgOiBvYmogJiYgb2JqLmlkID8gb2JqLmlkIDogZmFsc2UsICdwYXInIDogcGFyICYmIHBhci5pZCA/IHBhci5pZCA6IGZhbHNlIH0pIH07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gaTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH07XHJcblx0fTtcclxuXHJcblx0Ly8gaW5jbHVkZSB0aGUgdW5pcXVlIHBsdWdpbiBieSBkZWZhdWx0XHJcblx0Ly8gJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKFwidW5pcXVlXCIpO1xyXG5cclxuXHJcbi8qKlxyXG4gKiAjIyMgV2hvbGVyb3cgcGx1Z2luXHJcbiAqXHJcbiAqIE1ha2VzIGVhY2ggbm9kZSBhcHBlYXIgYmxvY2sgbGV2ZWwuIE1ha2luZyBzZWxlY3Rpb24gZWFzaWVyLiBNYXkgY2F1c2Ugc2xvdyBkb3duIGZvciBsYXJnZSB0cmVlcyBpbiBvbGQgYnJvd3NlcnMuXHJcbiAqL1xyXG5cclxuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcblx0ZGl2LnNldEF0dHJpYnV0ZSgndW5zZWxlY3RhYmxlJywnb24nKTtcclxuXHRkaXYuY2xhc3NOYW1lID0gJ2pzdHJlZS13aG9sZXJvdyc7XHJcblx0ZGl2LmlubmVySFRNTCA9ICcmIzE2MDsnO1xyXG5cdCQuanN0cmVlLnBsdWdpbnMud2hvbGVyb3cgPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyZW50KSB7XHJcblx0XHR0aGlzLmJpbmQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHBhcmVudC5iaW5kLmNhbGwodGhpcyk7XHJcblxyXG5cdFx0XHR0aGlzLmVsZW1lbnRcclxuXHRcdFx0XHQub24oJ2xvYWRpbmcnLCAkLnByb3h5KGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0ZGl2LnN0eWxlLmhlaWdodCA9IHRoaXMuX2RhdGEuY29yZS5saV9oZWlnaHQgKyAncHgnO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKCdyZWFkeS5qc3RyZWUgc2V0X3N0YXRlLmpzdHJlZScsICQucHJveHkoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmhpZGVfZG90cygpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKFwicmVhZHkuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmdldF9jb250YWluZXJfdWwoKS5hZGRDbGFzcygnanN0cmVlLXdob2xlcm93LXVsJyk7XHJcblx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHQub24oXCJkZXNlbGVjdF9hbGwuanN0cmVlXCIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5lbGVtZW50LmZpbmQoJy5qc3RyZWUtd2hvbGVyb3ctY2xpY2tlZCcpLnJlbW92ZUNsYXNzKCdqc3RyZWUtd2hvbGVyb3ctY2xpY2tlZCcpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKFwiY2hhbmdlZC5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmVsZW1lbnQuZmluZCgnLmpzdHJlZS13aG9sZXJvdy1jbGlja2VkJykucmVtb3ZlQ2xhc3MoJ2pzdHJlZS13aG9sZXJvdy1jbGlja2VkJyk7XHJcblx0XHRcdFx0XHRcdHZhciB0bXAgPSBmYWxzZSwgaSwgajtcclxuXHRcdFx0XHRcdFx0Zm9yKGkgPSAwLCBqID0gZGF0YS5zZWxlY3RlZC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHR0bXAgPSB0aGlzLmdldF9ub2RlKGRhdGEuc2VsZWN0ZWRbaV0sIHRydWUpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKHRtcCAmJiB0bXAubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0bXAuY2hpbGRyZW4oJy5qc3RyZWUtd2hvbGVyb3cnKS5hZGRDbGFzcygnanN0cmVlLXdob2xlcm93LWNsaWNrZWQnKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdC5vbihcIm9wZW5fbm9kZS5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmdldF9ub2RlKGRhdGEubm9kZSwgdHJ1ZSkuZmluZCgnLmpzdHJlZS1jbGlja2VkJykucGFyZW50KCkuY2hpbGRyZW4oJy5qc3RyZWUtd2hvbGVyb3cnKS5hZGRDbGFzcygnanN0cmVlLXdob2xlcm93LWNsaWNrZWQnKTtcclxuXHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdC5vbihcImhvdmVyX25vZGUuanN0cmVlIGRlaG92ZXJfbm9kZS5qc3RyZWVcIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmdldF9ub2RlKGRhdGEubm9kZSwgdHJ1ZSkuY2hpbGRyZW4oJy5qc3RyZWUtd2hvbGVyb3cnKVtlLnR5cGUgPT09IFwiaG92ZXJfbm9kZVwiP1wiYWRkQ2xhc3NcIjpcInJlbW92ZUNsYXNzXCJdKCdqc3RyZWUtd2hvbGVyb3ctaG92ZXJlZCcpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKFwiY29udGV4dG1lbnUuanN0cmVlXCIsIFwiLmpzdHJlZS13aG9sZXJvd1wiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0JChlLmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoXCJsaVwiKS5jaGlsZHJlbihcImE6ZXEoMClcIikudHJpZ2dlcignY29udGV4dG1lbnUnLGUpO1xyXG5cdFx0XHRcdFx0fSwgdGhpcykpXHJcblx0XHRcdFx0Lm9uKFwiY2xpY2suanN0cmVlXCIsIFwiLmpzdHJlZS13aG9sZXJvd1wiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdFx0XHR2YXIgdG1wID0gJC5FdmVudCgnY2xpY2snLCB7IG1ldGFLZXkgOiBlLm1ldGFLZXksIGN0cmxLZXkgOiBlLmN0cmxLZXksIGFsdEtleSA6IGUuYWx0S2V5LCBzaGlmdEtleSA6IGUuc2hpZnRLZXkgfSk7XHJcblx0XHRcdFx0XHRcdCQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KFwibGlcIikuY2hpbGRyZW4oXCJhOmVxKDApXCIpLnRyaWdnZXIodG1wKS5mb2N1cygpO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQub24oXCJjbGljay5qc3RyZWVcIiwgXCIuanN0cmVlLWxlYWYgPiAuanN0cmVlLW9jbFwiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRcdHZhciB0bXAgPSAkLkV2ZW50KCdjbGljaycsIHsgbWV0YUtleSA6IGUubWV0YUtleSwgY3RybEtleSA6IGUuY3RybEtleSwgYWx0S2V5IDogZS5hbHRLZXksIHNoaWZ0S2V5IDogZS5zaGlmdEtleSB9KTtcclxuXHRcdFx0XHRcdFx0JChlLmN1cnJlbnRUYXJnZXQpLmNsb3Nlc3QoXCJsaVwiKS5jaGlsZHJlbihcImE6ZXEoMClcIikudHJpZ2dlcih0bXApLmZvY3VzKCk7XHJcblx0XHRcdFx0XHR9LCB0aGlzKSlcclxuXHRcdFx0XHQub24oXCJtb3VzZW92ZXIuanN0cmVlXCIsIFwiLmpzdHJlZS13aG9sZXJvdywgLmpzdHJlZS1pY29uXCIsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5ob3Zlcl9ub2RlKGUuY3VycmVudFRhcmdldCk7XHJcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdH0sIHRoaXMpKVxyXG5cdFx0XHRcdC5vbihcIm1vdXNlbGVhdmUuanN0cmVlXCIsIFwiLmpzdHJlZS1ub2RlXCIsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5kZWhvdmVyX25vZGUoZS5jdXJyZW50VGFyZ2V0KTtcclxuXHRcdFx0XHRcdH0sIHRoaXMpKTtcclxuXHRcdH07XHJcblx0XHR0aGlzLnRlYXJkb3duID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRpZih0aGlzLnNldHRpbmdzLndob2xlcm93KSB7XHJcblx0XHRcdFx0dGhpcy5lbGVtZW50LmZpbmQoXCIuanN0cmVlLXdob2xlcm93XCIpLnJlbW92ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHBhcmVudC50ZWFyZG93bi5jYWxsKHRoaXMpO1xyXG5cdFx0fTtcclxuXHRcdHRoaXMucmVkcmF3X25vZGUgPSBmdW5jdGlvbihvYmosIGRlZXAsIGNhbGxiYWNrKSB7XHJcblx0XHRcdG9iaiA9IHBhcmVudC5yZWRyYXdfbm9kZS5jYWxsKHRoaXMsIG9iaiwgZGVlcCwgY2FsbGJhY2spO1xyXG5cdFx0XHRpZihvYmopIHtcclxuXHRcdFx0XHR2YXIgdG1wID0gZGl2LmNsb25lTm9kZSh0cnVlKTtcclxuXHRcdFx0XHQvL3RtcC5zdHlsZS5oZWlnaHQgPSB0aGlzLl9kYXRhLmNvcmUubGlfaGVpZ2h0ICsgJ3B4JztcclxuXHRcdFx0XHRpZigkLmluQXJyYXkob2JqLmlkLCB0aGlzLl9kYXRhLmNvcmUuc2VsZWN0ZWQpICE9PSAtMSkgeyB0bXAuY2xhc3NOYW1lICs9ICcganN0cmVlLXdob2xlcm93LWNsaWNrZWQnOyB9XHJcblx0XHRcdFx0b2JqLmluc2VydEJlZm9yZSh0bXAsIG9iai5jaGlsZE5vZGVzWzBdKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gb2JqO1xyXG5cdFx0fTtcclxuXHR9O1xyXG5cdC8vIGluY2x1ZGUgdGhlIHdob2xlcm93IHBsdWdpbiBieSBkZWZhdWx0XHJcblx0Ly8gJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKFwid2hvbGVyb3dcIik7XHJcblxyXG59KSk7Il0sImZpbGUiOiJqc3RyZWUuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/moment.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/moment.js index 7a86d42c0..aaab654c6 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/moment.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/moment.js @@ -2427,4 +2427,4 @@ } }).call(this); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJtb21lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qc1xuLy8hIHZlcnNpb24gOiAyLjUuMVxuLy8hIGF1dGhvcnMgOiBUaW0gV29vZCwgSXNrcmVuIENoZXJuZXYsIE1vbWVudC5qcyBjb250cmlidXRvcnNcbi8vISBsaWNlbnNlIDogTUlUXG4vLyEgbW9tZW50anMuY29tXG5cbihmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIENvbnN0YW50c1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIHZhciBtb21lbnQsXG4gICAgICAgIFZFUlNJT04gPSBcIjIuNS4xXCIsXG4gICAgICAgIGdsb2JhbCA9IHRoaXMsXG4gICAgICAgIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgICAgaSxcblxuICAgICAgICBZRUFSID0gMCxcbiAgICAgICAgTU9OVEggPSAxLFxuICAgICAgICBEQVRFID0gMixcbiAgICAgICAgSE9VUiA9IDMsXG4gICAgICAgIE1JTlVURSA9IDQsXG4gICAgICAgIFNFQ09ORCA9IDUsXG4gICAgICAgIE1JTExJU0VDT05EID0gNixcblxuICAgICAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsYW5ndWFnZSBjb25maWcgZmlsZXNcbiAgICAgICAgbGFuZ3VhZ2VzID0ge30sXG5cbiAgICAgICAgLy8gbW9tZW50IGludGVybmFsIHByb3BlcnRpZXNcbiAgICAgICAgbW9tZW50UHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgIF9pc0FNb21lbnRPYmplY3Q6IG51bGwsXG4gICAgICAgICAgICBfaSA6IG51bGwsXG4gICAgICAgICAgICBfZiA6IG51bGwsXG4gICAgICAgICAgICBfbCA6IG51bGwsXG4gICAgICAgICAgICBfc3RyaWN0IDogbnVsbCxcbiAgICAgICAgICAgIF9pc1VUQyA6IG51bGwsXG4gICAgICAgICAgICBfb2Zmc2V0IDogbnVsbCwgIC8vIG9wdGlvbmFsLiBDb21iaW5lIHdpdGggX2lzVVRDXG4gICAgICAgICAgICBfcGYgOiBudWxsLFxuICAgICAgICAgICAgX2xhbmcgOiBudWxsICAvLyBvcHRpb25hbFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIGNoZWNrIGZvciBub2RlSlNcbiAgICAgICAgaGFzTW9kdWxlID0gKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzICYmIHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyksXG5cbiAgICAgICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgICAgIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoXFwtP1xcZCspL2ksXG4gICAgICAgIGFzcE5ldFRpbWVTcGFuSnNvblJlZ2V4ID0gLyhcXC0pPyg/OihcXGQqKVxcLik/KFxcZCspXFw6KFxcZCspKD86XFw6KFxcZCspXFwuPyhcXGR7M30pPyk/LyxcblxuICAgICAgICAvLyBmcm9tIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvY2xvc3VyZV9nb29nX2RhdGVfZGF0ZS5qcy5zb3VyY2UuaHRtbFxuICAgICAgICAvLyBzb21ld2hhdCBtb3JlIGluIGxpbmUgd2l0aCA0LjQuMy4yIDIwMDQgc3BlYywgYnV0IGFsbG93cyBkZWNpbWFsIGFueXdoZXJlXG4gICAgICAgIGlzb0R1cmF0aW9uUmVnZXggPSAvXigtKT9QKD86KD86KFswLTksLl0qKVkpPyg/OihbMC05LC5dKilNKT8oPzooWzAtOSwuXSopRCk/KD86VCg/OihbMC05LC5dKilIKT8oPzooWzAtOSwuXSopTSk/KD86KFswLTksLl0qKVMpPyk/fChbMC05LC5dKilXKSQvLFxuXG4gICAgICAgIC8vIGZvcm1hdCB0b2tlbnNcbiAgICAgICAgZm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xZWVlZWVl8WVlZWVl8WVlZWXxZWXxnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xtbT98c3M/fFN7MSw0fXxYfHp6P3xaWj98LikvZyxcbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KExUfExMP0w/TD98bHsxLDR9KS9nLFxuXG4gICAgICAgIC8vIHBhcnNpbmcgdG9rZW4gcmVnZXhlc1xuICAgICAgICBwYXJzZVRva2VuT25lT3JUd29EaWdpdHMgPSAvXFxkXFxkPy8sIC8vIDAgLSA5OVxuICAgICAgICBwYXJzZVRva2VuT25lVG9UaHJlZURpZ2l0cyA9IC9cXGR7MSwzfS8sIC8vIDAgLSA5OTlcbiAgICAgICAgcGFyc2VUb2tlbk9uZVRvRm91ckRpZ2l0cyA9IC9cXGR7MSw0fS8sIC8vIDAgLSA5OTk5XG4gICAgICAgIHBhcnNlVG9rZW5PbmVUb1NpeERpZ2l0cyA9IC9bK1xcLV0/XFxkezEsNn0vLCAvLyAtOTk5LDk5OSAtIDk5OSw5OTlcbiAgICAgICAgcGFyc2VUb2tlbkRpZ2l0cyA9IC9cXGQrLywgLy8gbm9uemVybyBudW1iZXIgb2YgZGlnaXRzXG4gICAgICAgIHBhcnNlVG9rZW5Xb3JkID0gL1swLTldKlsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSt8W1xcdTA2MDAtXFx1MDZGRlxcL10rKFxccyo/W1xcdTA2MDAtXFx1MDZGRl0rKXsxLDJ9L2ksIC8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxuICAgICAgICBwYXJzZVRva2VuVGltZXpvbmUgPSAvWnxbXFwrXFwtXVxcZFxcZDo/XFxkXFxkL2dpLCAvLyArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbiAgICAgICAgcGFyc2VUb2tlblQgPSAvVC9pLCAvLyBUIChJU08gc2VwYXJhdG9yKVxuICAgICAgICBwYXJzZVRva2VuVGltZXN0YW1wTXMgPSAvW1xcK1xcLV0/XFxkKyhcXC5cXGR7MSwzfSk/LywgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcbiAgICAgICAgcGFyc2VUb2tlbk9yZGluYWwgPSAvXFxkezEsMn0vLFxuXG4gICAgICAgIC8vc3RyaWN0IHBhcnNpbmcgcmVnZXhlc1xuICAgICAgICBwYXJzZVRva2VuT25lRGlnaXQgPSAvXFxkLywgLy8gMCAtIDlcbiAgICAgICAgcGFyc2VUb2tlblR3b0RpZ2l0cyA9IC9cXGRcXGQvLCAvLyAwMCAtIDk5XG4gICAgICAgIHBhcnNlVG9rZW5UaHJlZURpZ2l0cyA9IC9cXGR7M30vLCAvLyAwMDAgLSA5OTlcbiAgICAgICAgcGFyc2VUb2tlbkZvdXJEaWdpdHMgPSAvXFxkezR9LywgLy8gMDAwMCAtIDk5OTlcbiAgICAgICAgcGFyc2VUb2tlblNpeERpZ2l0cyA9IC9bKy1dP1xcZHs2fS8sIC8vIC05OTksOTk5IC0gOTk5LDk5OVxuICAgICAgICBwYXJzZVRva2VuU2lnbmVkTnVtYmVyID0gL1srLV0/XFxkKy8sIC8vIC1pbmYgLSBpbmZcblxuICAgICAgICAvLyBpc28gODYwMSByZWdleFxuICAgICAgICAvLyAwMDAwLTAwLTAwIDAwMDAtVzAwIG9yIDAwMDAtVzAwLTAgKyBUICsgMDAgb3IgMDA6MDAgb3IgMDA6MDA6MDAgb3IgMDA6MDA6MDAuMDAwICsgKzAwOjAwIG9yICswMDAwIG9yICswMClcbiAgICAgICAgaXNvUmVnZXggPSAvXlxccyooPzpbKy1dXFxkezZ9fFxcZHs0fSktKD86KFxcZFxcZC1cXGRcXGQpfChXXFxkXFxkJCl8KFdcXGRcXGQtXFxkKXwoXFxkXFxkXFxkKSkoKFR8ICkoXFxkXFxkKDpcXGRcXGQoOlxcZFxcZChcXC5cXGQrKT8pPyk/KT8oW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLFxuXG4gICAgICAgIGlzb0Zvcm1hdCA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWicsXG5cbiAgICAgICAgaXNvRGF0ZXMgPSBbXG4gICAgICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZHsyfS1cXGR7Mn0vXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTS1ERCcsIC9cXGR7NH0tXFxkezJ9LVxcZHsyfS9dLFxuICAgICAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGR7Mn0tXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGR7Mn0vXSxcbiAgICAgICAgICAgIFsnWVlZWS1EREQnLCAvXFxkezR9LVxcZHszfS9dXG4gICAgICAgIF0sXG5cbiAgICAgICAgLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xuICAgICAgICBpc29UaW1lcyA9IFtcbiAgICAgICAgICAgIFsnSEg6bW06c3MuU1NTUycsIC8oVHwgKVxcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkezEsM30vXSxcbiAgICAgICAgICAgIFsnSEg6bW06c3MnLCAvKFR8IClcXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISDptbScsIC8oVHwgKVxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEgnLCAvKFR8IClcXGRcXGQvXVxuICAgICAgICBdLFxuXG4gICAgICAgIC8vIHRpbWV6b25lIGNodW5rZXIgXCIrMTA6MDBcIiA+IFtcIjEwXCIsIFwiMDBcIl0gb3IgXCItMTUzMFwiID4gW1wiLTE1XCIsIFwiMzBcIl1cbiAgICAgICAgcGFyc2VUaW1lem9uZUNodW5rZXIgPSAvKFtcXCtcXC1dfFxcZFxcZCkvZ2ksXG5cbiAgICAgICAgLy8gZ2V0dGVyIGFuZCBzZXR0ZXIgbmFtZXNcbiAgICAgICAgcHJveHlHZXR0ZXJzQW5kU2V0dGVycyA9ICdEYXRlfEhvdXJzfE1pbnV0ZXN8U2Vjb25kc3xNaWxsaXNlY29uZHMnLnNwbGl0KCd8JyksXG4gICAgICAgIHVuaXRNaWxsaXNlY29uZEZhY3RvcnMgPSB7XG4gICAgICAgICAgICAnTWlsbGlzZWNvbmRzJyA6IDEsXG4gICAgICAgICAgICAnU2Vjb25kcycgOiAxZTMsXG4gICAgICAgICAgICAnTWludXRlcycgOiA2ZTQsXG4gICAgICAgICAgICAnSG91cnMnIDogMzZlNSxcbiAgICAgICAgICAgICdEYXlzJyA6IDg2NGU1LFxuICAgICAgICAgICAgJ01vbnRocycgOiAyNTkyZTYsXG4gICAgICAgICAgICAnWWVhcnMnIDogMzE1MzZlNlxuICAgICAgICB9LFxuXG4gICAgICAgIHVuaXRBbGlhc2VzID0ge1xuICAgICAgICAgICAgbXMgOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICAgICAgcyA6ICdzZWNvbmQnLFxuICAgICAgICAgICAgbSA6ICdtaW51dGUnLFxuICAgICAgICAgICAgaCA6ICdob3VyJyxcbiAgICAgICAgICAgIGQgOiAnZGF5JyxcbiAgICAgICAgICAgIEQgOiAnZGF0ZScsXG4gICAgICAgICAgICB3IDogJ3dlZWsnLFxuICAgICAgICAgICAgVyA6ICdpc29XZWVrJyxcbiAgICAgICAgICAgIE0gOiAnbW9udGgnLFxuICAgICAgICAgICAgeSA6ICd5ZWFyJyxcbiAgICAgICAgICAgIERERCA6ICdkYXlPZlllYXInLFxuICAgICAgICAgICAgZSA6ICd3ZWVrZGF5JyxcbiAgICAgICAgICAgIEUgOiAnaXNvV2Vla2RheScsXG4gICAgICAgICAgICBnZzogJ3dlZWtZZWFyJyxcbiAgICAgICAgICAgIEdHOiAnaXNvV2Vla1llYXInXG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FtZWxGdW5jdGlvbnMgPSB7XG4gICAgICAgICAgICBkYXlvZnllYXIgOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgICAgIGlzb3dlZWtkYXkgOiAnaXNvV2Vla2RheScsXG4gICAgICAgICAgICBpc293ZWVrIDogJ2lzb1dlZWsnLFxuICAgICAgICAgICAgd2Vla3llYXIgOiAnd2Vla1llYXInLFxuICAgICAgICAgICAgaXNvd2Vla3llYXIgOiAnaXNvV2Vla1llYXInXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gZm9ybWF0IGZ1bmN0aW9uIHN0cmluZ3NcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zID0ge30sXG5cbiAgICAgICAgLy8gdG9rZW5zIHRvIG9yZGluYWxpemUgYW5kIHBhZFxuICAgICAgICBvcmRpbmFsaXplVG9rZW5zID0gJ0RERCB3IFcgTSBEIGQnLnNwbGl0KCcgJyksXG4gICAgICAgIHBhZGRlZFRva2VucyA9ICdNIEQgSCBoIG0gcyB3IFcnLnNwbGl0KCcgJyksXG5cbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7XG4gICAgICAgICAgICBNICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE1NTSAgOiBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgTU1NTSA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nKCkubW9udGhzKHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgRCAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgREREICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXlPZlllYXIoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRkICAgOiBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLndlZWtkYXlzTWluKHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGRkICA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nKCkud2Vla2RheXNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRkZGQgOiBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53ZWVrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgVyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWVkgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMueWVhcigpICUgMTAwLCAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBZWVlZIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy55ZWFyKCksIDQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFlZWVlZIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy55ZWFyKCksIDUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFlZWVlZWSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgeSA9IHRoaXMueWVhcigpLCBzaWduID0geSA+PSAwID8gJysnIDogJy0nO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaWduICsgbGVmdFplcm9GaWxsKE1hdGguYWJzKHkpLCA2KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZyAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy53ZWVrWWVhcigpICUgMTAwLCAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZ2dnIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy53ZWVrWWVhcigpLCA0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZ2dnZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMud2Vla1llYXIoKSwgNSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgR0cgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMCwgMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgR0dHRyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMuaXNvV2Vla1llYXIoKSwgNCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgR0dHR0cgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLmlzb1dlZWtZZWFyKCksIDUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2Vla2RheSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla2RheSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGEgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEEgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBIICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaCAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbSAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmRzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgUyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9JbnQodGhpcy5taWxsaXNlY29uZHMoKSAvIDEwMCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgU1MgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRvSW50KHRoaXMubWlsbGlzZWNvbmRzKCkgLyAxMCksIDIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFNTUyAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLm1pbGxpc2Vjb25kcygpLCAzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBTU1NTIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy5taWxsaXNlY29uZHMoKSwgMyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWiAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IC10aGlzLnpvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgYiA9IFwiK1wiO1xuICAgICAgICAgICAgICAgIGlmIChhIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhID0gLWE7XG4gICAgICAgICAgICAgICAgICAgIGIgPSBcIi1cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGIgKyBsZWZ0WmVyb0ZpbGwodG9JbnQoYSAvIDYwKSwgMikgKyBcIjpcIiArIGxlZnRaZXJvRmlsbCh0b0ludChhKSAlIDYwLCAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBaWiAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhID0gLXRoaXMuem9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBiID0gXCIrXCI7XG4gICAgICAgICAgICAgICAgaWYgKGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSAtYTtcbiAgICAgICAgICAgICAgICAgICAgYiA9IFwiLVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYiArIGxlZnRaZXJvRmlsbCh0b0ludChhIC8gNjApLCAyKSArIGxlZnRaZXJvRmlsbCh0b0ludChhKSAlIDYwLCAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB6IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnpvbmVBYmJyKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgenogOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuem9uZU5hbWUoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBYICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVuaXgoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBRIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnF1YXJ0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBsaXN0cyA9IFsnbW9udGhzJywgJ21vbnRoc1Nob3J0JywgJ3dlZWtkYXlzJywgJ3dlZWtkYXlzU2hvcnQnLCAnd2Vla2RheXNNaW4nXTtcblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdCwgYW5kIGVzNSBzdGFuZGFyZCBpcyBub3QgdmVyeVxuICAgICAgICAvLyBoZWxwZnVsLlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW1wdHkgOiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VucyA6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQgOiBbXSxcbiAgICAgICAgICAgIG92ZXJmbG93IDogLTIsXG4gICAgICAgICAgICBjaGFyc0xlZnRPdmVyIDogMCxcbiAgICAgICAgICAgIG51bGxJbnB1dCA6IGZhbHNlLFxuICAgICAgICAgICAgaW52YWxpZE1vbnRoIDogbnVsbCxcbiAgICAgICAgICAgIGludmFsaWRGb3JtYXQgOiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxuICAgICAgICAgICAgaXNvOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhZFRva2VuKGZ1bmMsIGNvdW50KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbChmdW5jLmNhbGwodGhpcywgYSksIGNvdW50KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb3JkaW5hbGl6ZVRva2VuKGZ1bmMsIHBlcmlvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS5vcmRpbmFsKGZ1bmMuY2FsbCh0aGlzLCBhKSwgcGVyaW9kKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB3aGlsZSAob3JkaW5hbGl6ZVRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgaSA9IG9yZGluYWxpemVUb2tlbnMucG9wKCk7XG4gICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW2kgKyAnbyddID0gb3JkaW5hbGl6ZVRva2VuKGZvcm1hdFRva2VuRnVuY3Rpb25zW2ldLCBpKTtcbiAgICB9XG4gICAgd2hpbGUgKHBhZGRlZFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgaSA9IHBhZGRlZFRva2Vucy5wb3AoKTtcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbaSArIGldID0gcGFkVG9rZW4oZm9ybWF0VG9rZW5GdW5jdGlvbnNbaV0sIDIpO1xuICAgIH1cbiAgICBmb3JtYXRUb2tlbkZ1bmN0aW9ucy5EREREID0gcGFkVG9rZW4oZm9ybWF0VG9rZW5GdW5jdGlvbnMuRERELCAzKTtcblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBDb25zdHJ1Y3RvcnNcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBmdW5jdGlvbiBMYW5ndWFnZSgpIHtcblxuICAgIH1cblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgICAgIGV4dGVuZCh0aGlzLCBjb25maWcpO1xuICAgIH1cblxuICAgIC8vIER1cmF0aW9uIENvbnN0cnVjdG9yXG4gICAgZnVuY3Rpb24gRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGR1cmF0aW9uKSxcbiAgICAgICAgICAgIHllYXJzID0gbm9ybWFsaXplZElucHV0LnllYXIgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxuICAgICAgICAgICAgd2Vla3MgPSBub3JtYWxpemVkSW5wdXQud2VlayB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBub3JtYWxpemVkSW5wdXQubWludXRlIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XG5cbiAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGRhdGVBZGRSZW1vdmVcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gK21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICBzZWNvbmRzICogMWUzICsgLy8gMTAwMFxuICAgICAgICAgICAgbWludXRlcyAqIDZlNCArIC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgaG91cnMgKiAzNmU1OyAvLyAxMDAwICogNjAgKiA2MFxuICAgICAgICAvLyBCZWNhdXNlIG9mIGRhdGVBZGRSZW1vdmUgdHJlYXRzIDI0IGhvdXJzIGFzIGRpZmZlcmVudCBmcm9tIGFcbiAgICAgICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICB0aGlzLl9kYXlzID0gK2RheXMgK1xuICAgICAgICAgICAgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICtcbiAgICAgICAgICAgIHllYXJzICogMTI7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgSGVscGVyc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIGFbaV0gPSBiW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoXCJ0b1N0cmluZ1wiKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlT2ZcIikpIHtcbiAgICAgICAgICAgIGEudmFsdWVPZiA9IGIudmFsdWVPZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lTW9tZW50KG0pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9LCBpO1xuICAgICAgICBmb3IgKGkgaW4gbSkge1xuICAgICAgICAgICAgaWYgKG0uaGFzT3duUHJvcGVydHkoaSkgJiYgbW9tZW50UHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG1baV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxlZnQgemVybyBmaWxsIGEgbnVtYmVyXG4gICAgLy8gc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2xlZnQtemVyby1maWxsaW5nIGZvciBwZXJmb3JtYW5jZSBjb21wYXJpc29uXG4gICAgZnVuY3Rpb24gbGVmdFplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICAgICAgdmFyIG91dHB1dCA9ICcnICsgTWF0aC5hYnMobnVtYmVyKSxcbiAgICAgICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcblxuICAgICAgICB3aGlsZSAob3V0cHV0Lmxlbmd0aCA8IHRhcmdldExlbmd0aCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gJzAnICsgb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoc2lnbiA/IChmb3JjZVNpZ24gPyAnKycgOiAnJykgOiAnLScpICsgb3V0cHV0O1xuICAgIH1cblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgXy5hZGRUaW1lIGFuZCBfLnN1YnRyYWN0VGltZVxuICAgIGZ1bmN0aW9uIGFkZE9yU3VidHJhY3REdXJhdGlvbkZyb21Nb21lbnQobW9tLCBkdXJhdGlvbiwgaXNBZGRpbmcsIGlnbm9yZVVwZGF0ZU9mZnNldCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGRheXMgPSBkdXJhdGlvbi5fZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyA9IGR1cmF0aW9uLl9tb250aHMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnM7XG5cbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgbW9tLl9kLnNldFRpbWUoK21vbS5fZCArIG1pbGxpc2Vjb25kcyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdG9yZSB0aGUgbWludXRlcyBhbmQgaG91cnMgc28gd2UgY2FuIHJlc3RvcmUgdGhlbVxuICAgICAgICBpZiAoZGF5cyB8fCBtb250aHMpIHtcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBtb20ubWludXRlKCk7XG4gICAgICAgICAgICBob3VycyA9IG1vbS5ob3VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIG1vbS5kYXRlKG1vbS5kYXRlKCkgKyBkYXlzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIG1vbS5tb250aChtb20ubW9udGgoKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzICYmICFpZ25vcmVVcGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQobW9tLCBkYXlzIHx8IG1vbnRocyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzdG9yZSB0aGUgbWludXRlcyBhbmQgaG91cnMgYWZ0ZXIgcG9zc2libHkgY2hhbmdpbmcgZHN0XG4gICAgICAgIGlmIChkYXlzIHx8IG1vbnRocykge1xuICAgICAgICAgICAgbW9tLm1pbnV0ZShtaW51dGVzKTtcbiAgICAgICAgICAgIG1vbS5ob3VyKGhvdXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGlzIGFuIGFycmF5XG4gICAgZnVuY3Rpb24gaXNBcnJheShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXScgfHxcbiAgICAgICAgICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuXG4gICAgLy8gY29tcGFyZSB0d28gYXJyYXlzLCByZXR1cm4gdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlc1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBcnJheXMoYXJyYXkxLCBhcnJheTIsIGRvbnRDb252ZXJ0KSB7XG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGxlbmd0aERpZmYgPSBNYXRoLmFicyhhcnJheTEubGVuZ3RoIC0gYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBkaWZmcyA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgoZG9udENvbnZlcnQgJiYgYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHx8XG4gICAgICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKSkge1xuICAgICAgICAgICAgICAgIGRpZmZzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpZmZzICsgbGVuZ3RoRGlmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVVbml0cyh1bml0cykge1xuICAgICAgICBpZiAodW5pdHMpIHtcbiAgICAgICAgICAgIHZhciBsb3dlcmVkID0gdW5pdHMudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oLilzJC8sICckMScpO1xuICAgICAgICAgICAgdW5pdHMgPSB1bml0QWxpYXNlc1t1bml0c10gfHwgY2FtZWxGdW5jdGlvbnNbbG93ZXJlZF0gfHwgbG93ZXJlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pdHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IHt9LFxuICAgICAgICAgICAgbm9ybWFsaXplZFByb3AsXG4gICAgICAgICAgICBwcm9wO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBpbnB1dE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGlucHV0T2JqZWN0Lmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVVbml0cyhwcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0W25vcm1hbGl6ZWRQcm9wXSA9IGlucHV0T2JqZWN0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkSW5wdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUxpc3QoZmllbGQpIHtcbiAgICAgICAgdmFyIGNvdW50LCBzZXR0ZXI7XG5cbiAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJ3dlZWsnKSA9PT0gMCkge1xuICAgICAgICAgICAgY291bnQgPSA3O1xuICAgICAgICAgICAgc2V0dGVyID0gJ2RheSc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZmllbGQuaW5kZXhPZignbW9udGgnKSA9PT0gMCkge1xuICAgICAgICAgICAgY291bnQgPSAxMjtcbiAgICAgICAgICAgIHNldHRlciA9ICdtb250aCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtb21lbnRbZmllbGRdID0gZnVuY3Rpb24gKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBpLCBnZXR0ZXIsXG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbW9tZW50LmZuLl9sYW5nW2ZpZWxkXSxcbiAgICAgICAgICAgICAgICByZXN1bHRzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9ybWF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2V0dGVyID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbSA9IG1vbWVudCgpLnV0YygpLnNldChzZXR0ZXIsIGkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuY2FsbChtb21lbnQuZm4uX2xhbmcsIG0sIGZvcm1hdCB8fCAnJyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXIoaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGdldHRlcihpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgaWYgKGNvZXJjZWROdW1iZXIgPj0gMCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBNYXRoLmNlaWwoY29lcmNlZE51bWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoICsgMSwgMCkpLmdldFVUQ0RhdGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb21lbnQoW3llYXIsIDExLCAzMSArIGRvdyAtIGRveV0pLCBkb3csIGRveSkud2VlaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkgfHwgeWVhciAlIDQwMCA9PT0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93KG0pIHtcbiAgICAgICAgdmFyIG92ZXJmbG93O1xuICAgICAgICBpZiAobS5fYSAmJiBtLl9wZi5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBtLl9hW01PTlRIXSA8IDAgfHwgbS5fYVtNT05USF0gPiAxMSA/IE1PTlRIIDpcbiAgICAgICAgICAgICAgICBtLl9hW0RBVEVdIDwgMSB8fCBtLl9hW0RBVEVdID4gZGF5c0luTW9udGgobS5fYVtZRUFSXSwgbS5fYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICAgICAgbS5fYVtIT1VSXSA8IDAgfHwgbS5fYVtIT1VSXSA+IDIzID8gSE9VUiA6XG4gICAgICAgICAgICAgICAgbS5fYVtNSU5VVEVdIDwgMCB8fCBtLl9hW01JTlVURV0gPiA1OSA/IE1JTlVURSA6XG4gICAgICAgICAgICAgICAgbS5fYVtTRUNPTkRdIDwgMCB8fCBtLl9hW1NFQ09ORF0gPiA1OSA/IFNFQ09ORCA6XG4gICAgICAgICAgICAgICAgbS5fYVtNSUxMSVNFQ09ORF0gPCAwIHx8IG0uX2FbTUlMTElTRUNPTkRdID4gOTk5ID8gTUlMTElTRUNPTkQgOlxuICAgICAgICAgICAgICAgIC0xO1xuXG4gICAgICAgICAgICBpZiAobS5fcGYuX292ZXJmbG93RGF5T2ZZZWFyICYmIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gREFURTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbS5fcGYub3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQobSkge1xuICAgICAgICBpZiAobS5faXNWYWxpZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBtLl9pc1ZhbGlkID0gIWlzTmFOKG0uX2QuZ2V0VGltZSgpKSAmJlxuICAgICAgICAgICAgICAgIG0uX3BmLm92ZXJmbG93IDwgMCAmJlxuICAgICAgICAgICAgICAgICFtLl9wZi5lbXB0eSAmJlxuICAgICAgICAgICAgICAgICFtLl9wZi5pbnZhbGlkTW9udGggJiZcbiAgICAgICAgICAgICAgICAhbS5fcGYubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIW0uX3BmLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhbS5fcGYudXNlckludmFsaWRhdGVkO1xuXG4gICAgICAgICAgICBpZiAobS5fc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgbS5faXNWYWxpZCA9IG0uX2lzVmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbS5fcGYuY2hhcnNMZWZ0T3ZlciA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBtLl9wZi51bnVzZWRUb2tlbnMubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxhbmd1YWdlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgbW9tZW50IGZyb20gaW5wdXQsIHRoYXQgaXMgbG9jYWwvdXRjL3pvbmUgZXF1aXZhbGVudCB0byBtb2RlbC5cbiAgICBmdW5jdGlvbiBtYWtlQXMoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHJldHVybiBtb2RlbC5faXNVVEMgPyBtb21lbnQoaW5wdXQpLnpvbmUobW9kZWwuX29mZnNldCB8fCAwKSA6XG4gICAgICAgICAgICBtb21lbnQoaW5wdXQpLmxvY2FsKCk7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBMYW5ndWFnZXNcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIGV4dGVuZChMYW5ndWFnZS5wcm90b3R5cGUsIHtcblxuICAgICAgICBzZXQgOiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICB2YXIgcHJvcCwgaTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX21vbnRocyA6IFwiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlclwiLnNwbGl0KFwiX1wiKSxcbiAgICAgICAgbW9udGhzIDogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNbbS5tb250aCgpXTtcbiAgICAgICAgfSxcblxuICAgICAgICBfbW9udGhzU2hvcnQgOiBcIkphbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjXCIuc3BsaXQoXCJfXCIpLFxuICAgICAgICBtb250aHNTaG9ydCA6IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICAgICAgfSxcblxuICAgICAgICBtb250aHNQYXJzZSA6IGZ1bmN0aW9uIChtb250aE5hbWUpIHtcbiAgICAgICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbSA9IG1vbWVudC51dGMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKSArICd8XicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfd2Vla2RheXMgOiBcIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5XCIuc3BsaXQoXCJfXCIpLFxuICAgICAgICB3ZWVrZGF5cyA6IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNbbS5kYXkoKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3dlZWtkYXlzU2hvcnQgOiBcIlN1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdFwiLnNwbGl0KFwiX1wiKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXTtcbiAgICAgICAgfSxcblxuICAgICAgICBfd2Vla2RheXNNaW4gOiBcIlN1X01vX1R1X1dlX1RoX0ZyX1NhXCIuc3BsaXQoXCJfXCIpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5bbS5kYXkoKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2Vla2RheXNQYXJzZSA6IGZ1bmN0aW9uICh3ZWVrZGF5TmFtZSkge1xuICAgICAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICBtb20gPSBtb21lbnQoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2xvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiBcImg6bW0gQVwiLFxuICAgICAgICAgICAgTCA6IFwiTU0vREQvWVlZWVwiLFxuICAgICAgICAgICAgTEwgOiBcIk1NTU0gRCBZWVlZXCIsXG4gICAgICAgICAgICBMTEwgOiBcIk1NTU0gRCBZWVlZIExUXCIsXG4gICAgICAgICAgICBMTExMIDogXCJkZGRkLCBNTU1NIEQgWVlZWSBMVFwiXG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgICAgICAgICBpZiAoIW91dHB1dCAmJiB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV0pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV0ucmVwbGFjZSgvTU1NTXxNTXxERHxkZGRkL2csIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbC5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldID0gb3V0cHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfSxcblxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICAvLyBJRTggUXVpcmtzIE1vZGUgJiBJRTcgU3RhbmRhcmRzIE1vZGUgZG8gbm90IGFsbG93IGFjY2Vzc2luZyBzdHJpbmdzIGxpa2UgYXJyYXlzXG4gICAgICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgICAgIHJldHVybiAoKGlucHV0ICsgJycpLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApID09PSAncCcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9tZXJpZGllbVBhcnNlIDogL1thcF1cXC4/bT9cXC4/L2ksXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BtJyA6ICdQTSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2FtJyA6ICdBTSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2NhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDogZnVuY3Rpb24gKGtleSwgbW9tKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygb3V0cHV0ID09PSAnZnVuY3Rpb24nID8gb3V0cHV0LmFwcGx5KG1vbSkgOiBvdXRwdXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3JlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6IFwiaW4gJXNcIixcbiAgICAgICAgICAgIHBhc3QgOiBcIiVzIGFnb1wiLFxuICAgICAgICAgICAgcyA6IFwiYSBmZXcgc2Vjb25kc1wiLFxuICAgICAgICAgICAgbSA6IFwiYSBtaW51dGVcIixcbiAgICAgICAgICAgIG1tIDogXCIlZCBtaW51dGVzXCIsXG4gICAgICAgICAgICBoIDogXCJhbiBob3VyXCIsXG4gICAgICAgICAgICBoaCA6IFwiJWQgaG91cnNcIixcbiAgICAgICAgICAgIGQgOiBcImEgZGF5XCIsXG4gICAgICAgICAgICBkZCA6IFwiJWQgZGF5c1wiLFxuICAgICAgICAgICAgTSA6IFwiYSBtb250aFwiLFxuICAgICAgICAgICAgTU0gOiBcIiVkIG1vbnRoc1wiLFxuICAgICAgICAgICAgeSA6IFwiYSB5ZWFyXCIsXG4gICAgICAgICAgICB5eSA6IFwiJWQgeWVhcnNcIlxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBvdXRwdXQgPT09ICdmdW5jdGlvbicpID9cbiAgICAgICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICAgICAgb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgIH0sXG4gICAgICAgIHBhc3RGdXR1cmUgOiBmdW5jdGlvbiAoZGlmZiwgb3V0cHV0KSB7XG4gICAgICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW2RpZmYgPiAwID8gJ2Z1dHVyZScgOiAncGFzdCddO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBmb3JtYXQgPT09ICdmdW5jdGlvbicgPyBmb3JtYXQob3V0cHV0KSA6IGZvcm1hdC5yZXBsYWNlKC8lcy9pLCBvdXRwdXQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKFwiJWRcIiwgbnVtYmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgX29yZGluYWwgOiBcIiVkXCIsXG5cbiAgICAgICAgcHJlcGFyc2UgOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIHBvc3Rmb3JtYXQgOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIHdlZWsgOiBmdW5jdGlvbiAobW9tKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2VlaztcbiAgICAgICAgfSxcblxuICAgICAgICBfd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuXG4gICAgICAgIF9pbnZhbGlkRGF0ZTogJ0ludmFsaWQgZGF0ZScsXG4gICAgICAgIGludmFsaWREYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExvYWRzIGEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBpbnRvIHRoZSBgbGFuZ3VhZ2VzYCBjYWNoZS4gIFRoZSBmdW5jdGlvblxuICAgIC8vIHRha2VzIGEga2V5IGFuZCBvcHRpb25hbGx5IHZhbHVlcy4gIElmIG5vdCBpbiB0aGUgYnJvd3NlciBhbmQgbm8gdmFsdWVzXG4gICAgLy8gYXJlIHByb3ZpZGVkLCBpdCB3aWxsIGxvYWQgdGhlIGxhbmd1YWdlIGZpbGUgbW9kdWxlLiAgQXMgYSBjb252ZW5pZW5jZSxcbiAgICAvLyB0aGlzIGZ1bmN0aW9uIGFsc28gcmV0dXJucyB0aGUgbGFuZ3VhZ2UgdmFsdWVzLlxuICAgIGZ1bmN0aW9uIGxvYWRMYW5nKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcy5hYmJyID0ga2V5O1xuICAgICAgICBpZiAoIWxhbmd1YWdlc1trZXldKSB7XG4gICAgICAgICAgICBsYW5ndWFnZXNba2V5XSA9IG5ldyBMYW5ndWFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxhbmd1YWdlc1trZXldLnNldCh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gbGFuZ3VhZ2VzW2tleV07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgbGFuZ3VhZ2UgZnJvbSB0aGUgYGxhbmd1YWdlc2AgY2FjaGUuIE1vc3RseSB1c2VmdWwgaW4gdGVzdHMuXG4gICAgZnVuY3Rpb24gdW5sb2FkTGFuZyhrZXkpIHtcbiAgICAgICAgZGVsZXRlIGxhbmd1YWdlc1trZXldO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZXMgd2hpY2ggbGFuZ3VhZ2UgZGVmaW5pdGlvbiB0byB1c2UgYW5kIHJldHVybnMgaXQuXG4gICAgLy9cbiAgICAvLyBXaXRoIG5vIHBhcmFtZXRlcnMsIGl0IHdpbGwgcmV0dXJuIHRoZSBnbG9iYWwgbGFuZ3VhZ2UuICBJZiB5b3VcbiAgICAvLyBwYXNzIGluIGEgbGFuZ3VhZ2Uga2V5LCBzdWNoIGFzICdlbicsIGl0IHdpbGwgcmV0dXJuIHRoZVxuICAgIC8vIGRlZmluaXRpb24gZm9yICdlbicsIHNvIGxvbmcgYXMgJ2VuJyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCB1c2luZ1xuICAgIC8vIG1vbWVudC5sYW5nLlxuICAgIGZ1bmN0aW9uIGdldExhbmdEZWZpbml0aW9uKGtleSkge1xuICAgICAgICB2YXIgaSA9IDAsIGosIGxhbmcsIG5leHQsIHNwbGl0LFxuICAgICAgICAgICAgZ2V0ID0gZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxhbmd1YWdlc1trXSAmJiBoYXNNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJy4vbGFuZy8nICsgayk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGFuZ3VhZ2VzW2tdO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudC5mbi5fbGFuZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsYW5nID0gZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAobGFuZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvL3BpY2sgdGhlIGxhbmd1YWdlIGZyb20gdGhlIGFycmF5XG4gICAgICAgIC8vdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAgICAgLy9zdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgICAgIHdoaWxlIChpIDwga2V5Lmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMYW5ndWFnZShrZXlbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxhbmd1YWdlKGtleVtpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbGFuZyA9IGdldChzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0Lmxlbmd0aCA+PSBqICYmIGNvbXBhcmVBcnJheXMoc3BsaXQsIG5leHQsIHRydWUpID49IGogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgYXJyYXkgaXRlbSBpcyBiZXR0ZXIgdGhhbiBhIHNoYWxsb3dlciBzdWJzdHJpbmcgb2YgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9tZW50LmZuLl9sYW5nO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgRm9ybWF0dGluZ1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xcW1tcXHNcXFNdLykpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgXCJcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksIGksIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGFycmF5W2ldIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KSA6IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcbiAgICBmdW5jdGlvbiBmb3JtYXRNb21lbnQobSwgZm9ybWF0KSB7XG5cbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubGFuZygpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxhbmcoKSk7XG5cbiAgICAgICAgaWYgKCFmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSkge1xuICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gPSBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XShtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBhbmRGb3JtYXQoZm9ybWF0LCBsYW5nKSB7XG4gICAgICAgIHZhciBpID0gNTtcblxuICAgICAgICBmdW5jdGlvbiByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBsYW5nLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgUGFyc2luZ1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgLy8gZ2V0IHRoZSByZWdleCB0byBmaW5kIHRoZSBuZXh0IHRva2VuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpIHtcbiAgICAgICAgdmFyIGEsIHN0cmljdCA9IGNvbmZpZy5fc3RyaWN0O1xuICAgICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIGNhc2UgJ0REREQnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5UaHJlZURpZ2l0cztcbiAgICAgICAgY2FzZSAnWVlZWSc6XG4gICAgICAgIGNhc2UgJ0dHR0cnOlxuICAgICAgICBjYXNlICdnZ2dnJzpcbiAgICAgICAgICAgIHJldHVybiBzdHJpY3QgPyBwYXJzZVRva2VuRm91ckRpZ2l0cyA6IHBhcnNlVG9rZW5PbmVUb0ZvdXJEaWdpdHM7XG4gICAgICAgIGNhc2UgJ1knOlxuICAgICAgICBjYXNlICdHJzpcbiAgICAgICAgY2FzZSAnZyc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlblNpZ25lZE51bWJlcjtcbiAgICAgICAgY2FzZSAnWVlZWVlZJzpcbiAgICAgICAgY2FzZSAnWVlZWVknOlxuICAgICAgICBjYXNlICdHR0dHRyc6XG4gICAgICAgIGNhc2UgJ2dnZ2dnJzpcbiAgICAgICAgICAgIHJldHVybiBzdHJpY3QgPyBwYXJzZVRva2VuU2l4RGlnaXRzIDogcGFyc2VUb2tlbk9uZVRvU2l4RGlnaXRzO1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgIGlmIChzdHJpY3QpIHsgcmV0dXJuIHBhcnNlVG9rZW5PbmVEaWdpdDsgfVxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICdTUyc6XG4gICAgICAgICAgICBpZiAoc3RyaWN0KSB7IHJldHVybiBwYXJzZVRva2VuVHdvRGlnaXRzOyB9XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJ1NTUyc6XG4gICAgICAgICAgICBpZiAoc3RyaWN0KSB7IHJldHVybiBwYXJzZVRva2VuVGhyZWVEaWdpdHM7IH1cbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuT25lVG9UaHJlZURpZ2l0cztcbiAgICAgICAgY2FzZSAnTU1NJzpcbiAgICAgICAgY2FzZSAnTU1NTSc6XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgY2FzZSAnZGRkJzpcbiAgICAgICAgY2FzZSAnZGRkZCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbldvcmQ7XG4gICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICAgIHJldHVybiBnZXRMYW5nRGVmaW5pdGlvbihjb25maWcuX2wpLl9tZXJpZGllbVBhcnNlO1xuICAgICAgICBjYXNlICdYJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuVGltZXN0YW1wTXM7XG4gICAgICAgIGNhc2UgJ1onOlxuICAgICAgICBjYXNlICdaWic6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlblRpbWV6b25lO1xuICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuVDtcbiAgICAgICAgY2FzZSAnU1NTUyc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbkRpZ2l0cztcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICBjYXNlICdERCc6XG4gICAgICAgIGNhc2UgJ1lZJzpcbiAgICAgICAgY2FzZSAnR0cnOlxuICAgICAgICBjYXNlICdnZyc6XG4gICAgICAgIGNhc2UgJ0hIJzpcbiAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgY2FzZSAnd3cnOlxuICAgICAgICBjYXNlICdXVyc6XG4gICAgICAgICAgICByZXR1cm4gc3RyaWN0ID8gcGFyc2VUb2tlblR3b0RpZ2l0cyA6IHBhcnNlVG9rZW5PbmVPclR3b0RpZ2l0cztcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgY2FzZSAnZSc6XG4gICAgICAgIGNhc2UgJ0UnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5PbmVPclR3b0RpZ2l0cztcbiAgICAgICAgY2FzZSAnRG8nOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5PcmRpbmFsO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIGEgPSBuZXcgUmVnRXhwKHJlZ2V4cEVzY2FwZSh1bmVzY2FwZUZvcm1hdCh0b2tlbi5yZXBsYWNlKCdcXFxcJywgJycpKSwgXCJpXCIpKTtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGltZXpvbmVNaW51dGVzRnJvbVN0cmluZyhzdHJpbmcpIHtcbiAgICAgICAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCI7XG4gICAgICAgIHZhciBwb3NzaWJsZVR6TWF0Y2hlcyA9IChzdHJpbmcubWF0Y2gocGFyc2VUb2tlblRpbWV6b25lKSB8fCBbXSksXG4gICAgICAgICAgICB0ekNodW5rID0gcG9zc2libGVUek1hdGNoZXNbcG9zc2libGVUek1hdGNoZXMubGVuZ3RoIC0gMV0gfHwgW10sXG4gICAgICAgICAgICBwYXJ0cyA9ICh0ekNodW5rICsgJycpLm1hdGNoKHBhcnNlVGltZXpvbmVDaHVua2VyKSB8fCBbJy0nLCAwLCAwXSxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBwYXJ0c1swXSA9PT0gJysnID8gLW1pbnV0ZXMgOiBtaW51dGVzO1xuICAgIH1cblxuICAgIC8vIGZ1bmN0aW9uIHRvIGNvbnZlcnQgc3RyaW5nIGlucHV0IHRvIGRhdGVcbiAgICBmdW5jdGlvbiBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgaW5wdXQsIGNvbmZpZykge1xuICAgICAgICB2YXIgYSwgZGF0ZVBhcnRBcnJheSA9IGNvbmZpZy5fYTtcblxuICAgICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIC8vIE1PTlRIXG4gICAgICAgIGNhc2UgJ00nIDogLy8gZmFsbCB0aHJvdWdoIHRvIE1NXG4gICAgICAgIGNhc2UgJ01NJyA6XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbTU9OVEhdID0gdG9JbnQoaW5wdXQpIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdNTU0nIDogLy8gZmFsbCB0aHJvdWdoIHRvIE1NTU1cbiAgICAgICAgY2FzZSAnTU1NTScgOlxuICAgICAgICAgICAgYSA9IGdldExhbmdEZWZpbml0aW9uKGNvbmZpZy5fbCkubW9udGhzUGFyc2UoaW5wdXQpO1xuICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbmQgYSBtb250aCBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWQuXG4gICAgICAgICAgICBpZiAoYSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtNT05USF0gPSBhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX3BmLmludmFsaWRNb250aCA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIERBWSBPRiBNT05USFxuICAgICAgICBjYXNlICdEJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBERFxuICAgICAgICBjYXNlICdERCcgOlxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkYXRlUGFydEFycmF5W0RBVEVdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RvJyA6XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbREFURV0gPSB0b0ludChwYXJzZUludChpbnB1dCwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBEQVkgT0YgWUVBUlxuICAgICAgICBjYXNlICdEREQnIDogLy8gZmFsbCB0aHJvdWdoIHRvIERERERcbiAgICAgICAgY2FzZSAnRERERCcgOlxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFlFQVJcbiAgICAgICAgY2FzZSAnWVknIDpcbiAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbWUVBUl0gPSB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVlZWScgOlxuICAgICAgICBjYXNlICdZWVlZWScgOlxuICAgICAgICBjYXNlICdZWVlZWVknIDpcbiAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbWUVBUl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gQU0gLyBQTVxuICAgICAgICBjYXNlICdhJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBBXG4gICAgICAgIGNhc2UgJ0EnIDpcbiAgICAgICAgICAgIGNvbmZpZy5faXNQbSA9IGdldExhbmdEZWZpbml0aW9uKGNvbmZpZy5fbCkuaXNQTShpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gMjQgSE9VUlxuICAgICAgICBjYXNlICdIJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBoaFxuICAgICAgICBjYXNlICdISCcgOiAvLyBmYWxsIHRocm91Z2ggdG8gaGhcbiAgICAgICAgY2FzZSAnaCcgOiAvLyBmYWxsIHRocm91Z2ggdG8gaGhcbiAgICAgICAgY2FzZSAnaGgnIDpcbiAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gTUlOVVRFXG4gICAgICAgIGNhc2UgJ20nIDogLy8gZmFsbCB0aHJvdWdoIHRvIG1tXG4gICAgICAgIGNhc2UgJ21tJyA6XG4gICAgICAgICAgICBkYXRlUGFydEFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gU0VDT05EXG4gICAgICAgIGNhc2UgJ3MnIDogLy8gZmFsbCB0aHJvdWdoIHRvIHNzXG4gICAgICAgIGNhc2UgJ3NzJyA6XG4gICAgICAgICAgICBkYXRlUGFydEFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gTUlMTElTRUNPTkRcbiAgICAgICAgY2FzZSAnUycgOlxuICAgICAgICBjYXNlICdTUycgOlxuICAgICAgICBjYXNlICdTU1MnIDpcbiAgICAgICAgY2FzZSAnU1NTUycgOlxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFVOSVggVElNRVNUQU1QIFdJVEggTVNcbiAgICAgICAgY2FzZSAnWCc6XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShwYXJzZUZsb2F0KGlucHV0KSAqIDEwMDApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFRJTUVaT05FXG4gICAgICAgIGNhc2UgJ1onIDogLy8gZmFsbCB0aHJvdWdoIHRvIFpaXG4gICAgICAgIGNhc2UgJ1paJyA6XG4gICAgICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX3R6bSA9IHRpbWV6b25lTWludXRlc0Zyb21TdHJpbmcoaW5wdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICBjYXNlICd3dyc6XG4gICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICBjYXNlICdXVyc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgIGNhc2UgJ2RkZCc6XG4gICAgICAgIGNhc2UgJ2RkZGQnOlxuICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgY2FzZSAnRSc6XG4gICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cigwLCAxKTtcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnZ2cnOlxuICAgICAgICBjYXNlICdnZ2dnJzpcbiAgICAgICAgY2FzZSAnR0cnOlxuICAgICAgICBjYXNlICdHR0dHJzpcbiAgICAgICAgY2FzZSAnR0dHR0cnOlxuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoMCwgMik7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICAgICAgY29uZmlnLl93W3Rva2VuXSA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGRhdGVGcm9tQ29uZmlnKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsXG4gICAgICAgICAgICB5ZWFyVG9Vc2UsIGZpeFllYXIsIHcsIHRlbXAsIGxhbmcsIHdlZWtkYXksIHdlZWs7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZyk7XG5cbiAgICAgICAgLy9jb21wdXRlIGRheSBvZiB0aGUgeWVhciBmcm9tIHdlZWtzIGFuZCB3ZWVrZGF5c1xuICAgICAgICBpZiAoY29uZmlnLl93ICYmIGNvbmZpZy5fYVtEQVRFXSA9PSBudWxsICYmIGNvbmZpZy5fYVtNT05USF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgZml4WWVhciA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW50X3ZhbCA9IHBhcnNlSW50KHZhbCwgMTApO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWwgP1xuICAgICAgICAgICAgICAgICAgKHZhbC5sZW5ndGggPCAzID8gKGludF92YWwgPiA2OCA/IDE5MDAgKyBpbnRfdmFsIDogMjAwMCArIGludF92YWwpIDogaW50X3ZhbCkgOlxuICAgICAgICAgICAgICAgICAgKGNvbmZpZy5fYVtZRUFSXSA9PSBudWxsID8gbW9tZW50KCkud2Vla1llYXIoKSA6IGNvbmZpZy5fYVtZRUFSXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB3ID0gY29uZmlnLl93O1xuICAgICAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbXAgPSBkYXlPZlllYXJGcm9tV2Vla3MoZml4WWVhcih3LkdHKSwgdy5XIHx8IDEsIHcuRSwgNCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYW5nID0gZ2V0TGFuZ0RlZmluaXRpb24oY29uZmlnLl9sKTtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5kICE9IG51bGwgPyAgcGFyc2VXZWVrZGF5KHcuZCwgbGFuZykgOlxuICAgICAgICAgICAgICAgICAgKHcuZSAhPSBudWxsID8gIHBhcnNlSW50KHcuZSwgMTApICsgbGFuZy5fd2Vlay5kb3cgOiAwKTtcblxuICAgICAgICAgICAgICAgIHdlZWsgPSBwYXJzZUludCh3LncsIDEwKSB8fCAxO1xuXG4gICAgICAgICAgICAgICAgLy9pZiB3ZSdyZSBwYXJzaW5nICdkJywgdGhlbiB0aGUgbG93IGRheSBudW1iZXJzIG1heSBiZSBuZXh0IHdlZWtcbiAgICAgICAgICAgICAgICBpZiAody5kICE9IG51bGwgJiYgd2Vla2RheSA8IGxhbmcuX3dlZWsuZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWsrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKGZpeFllYXIody5nZyksIHdlZWssIHdlZWtkYXksIGxhbmcuX3dlZWsuZG95LCBsYW5nLl93ZWVrLmRvdyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdGVtcC5kYXlPZlllYXI7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSBkYXkgb2YgdGhlIHllYXIgaXMgc2V0LCBmaWd1cmUgb3V0IHdoYXQgaXQgaXNcbiAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBjb25maWcuX2FbWUVBUl0gPT0gbnVsbCA/IGN1cnJlbnREYXRlW1lFQVJdIDogY29uZmlnLl9hW1lFQVJdO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXJUb1VzZSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX3BmLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGUgPSBtYWtlVVRDRGF0ZSh5ZWFyVG9Vc2UsIDAsIGNvbmZpZy5fZGF5T2ZZZWFyKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNT05USF0gPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgICAgICAgICBjb25maWcuX2FbREFURV0gPSBkYXRlLmdldFVUQ0RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCBkYXRlLlxuICAgICAgICAvLyAqIGlmIG5vIHllYXIsIG1vbnRoLCBkYXkgb2YgbW9udGggYXJlIGdpdmVuLCBkZWZhdWx0IHRvIHRvZGF5XG4gICAgICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXG4gICAgICAgIC8vICogaWYgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgb25seSB5ZWFyXG4gICAgICAgIC8vICogaWYgeWVhciBpcyBnaXZlbiwgZG9uJ3QgZGVmYXVsdCBhbnl0aGluZ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IGN1cnJlbnREYXRlW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWmVybyBvdXQgd2hhdGV2ZXIgd2FzIG5vdCBkZWZhdWx0ZWQsIGluY2x1ZGluZyB0aW1lXG4gICAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IChjb25maWcuX2FbaV0gPT0gbnVsbCkgPyAoaSA9PT0gMiA/IDEgOiAwKSA6IGNvbmZpZy5fYVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCB0aGUgb2Zmc2V0cyB0byB0aGUgdGltZSB0byBiZSBwYXJzZWQgc28gdGhhdCB3ZSBjYW4gaGF2ZSBhIGNsZWFuIGFycmF5IGZvciBjaGVja2luZyBpc1ZhbGlkXG4gICAgICAgIGlucHV0W0hPVVJdICs9IHRvSW50KChjb25maWcuX3R6bSB8fCAwKSAvIDYwKTtcbiAgICAgICAgaW5wdXRbTUlOVVRFXSArPSB0b0ludCgoY29uZmlnLl90em0gfHwgMCkgJSA2MCk7XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gbWFrZVVUQ0RhdGUgOiBtYWtlRGF0ZSkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRhdGVGcm9tT2JqZWN0KGNvbmZpZykge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0O1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSk7XG4gICAgICAgIGNvbmZpZy5fYSA9IFtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC55ZWFyLFxuICAgICAgICAgICAgbm9ybWFsaXplZElucHV0Lm1vbnRoLFxuICAgICAgICAgICAgbm9ybWFsaXplZElucHV0LmRheSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5ob3VyLFxuICAgICAgICAgICAgbm9ybWFsaXplZElucHV0Lm1pbnV0ZSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQsXG4gICAgICAgICAgICBub3JtYWxpemVkSW5wdXQubWlsbGlzZWNvbmRcbiAgICAgICAgXTtcblxuICAgICAgICBkYXRlRnJvbUNvbmZpZyhjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbm93LmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgbm93LmdldFVUQ01vbnRoKCksXG4gICAgICAgICAgICAgICAgbm93LmdldFVUQ0RhdGUoKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbbm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCBub3cuZ2V0RGF0ZSgpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmdcbiAgICBmdW5jdGlvbiBtYWtlRGF0ZUZyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG5cbiAgICAgICAgY29uZmlnLl9hID0gW107XG4gICAgICAgIGNvbmZpZy5fcGYuZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBtYWtlIGEgRGF0ZSwgZWl0aGVyIHdpdGggYG5ldyBEYXRlYCBvciBgRGF0ZS5VVENgXG4gICAgICAgIHZhciBsYW5nID0gZ2V0TGFuZ0RlZmluaXRpb24oY29uZmlnLl9sKSxcbiAgICAgICAgICAgIHN0cmluZyA9ICcnICsgY29uZmlnLl9pLFxuICAgICAgICAgICAgaSwgcGFyc2VkSW5wdXQsIHRva2VucywgdG9rZW4sIHNraXBwZWQsXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCA9IDA7XG5cbiAgICAgICAgdG9rZW5zID0gZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgbGFuZykubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICBwYXJzZWRJbnB1dCA9IChzdHJpbmcubWF0Y2goZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKSB8fCBbXSlbMF07XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9wZi51bnVzZWRJbnB1dC5wdXNoKHNraXBwZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2Uoc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpICsgcGFyc2VkSW5wdXQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoICs9IHBhcnNlZElucHV0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRvbid0IHBhcnNlIGlmIGl0J3Mgbm90IGEga25vd24gdG9rZW5cbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9wZi5lbXB0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9wZi51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZy5fc3RyaWN0ICYmICFwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5fcGYudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHJlbWFpbmluZyB1bnBhcnNlZCBpbnB1dCBsZW5ndGggdG8gdGhlIHN0cmluZ1xuICAgICAgICBjb25maWcuX3BmLmNoYXJzTGVmdE92ZXIgPSBzdHJpbmdMZW5ndGggLSB0b3RhbFBhcnNlZElucHV0TGVuZ3RoO1xuICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fcGYudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGFtIHBtXG4gICAgICAgIGlmIChjb25maWcuX2lzUG0gJiYgY29uZmlnLl9hW0hPVVJdIDwgMTIpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSArPSAxMjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBpcyAxMiBhbSwgY2hhbmdlIGhvdXJzIHRvIDBcbiAgICAgICAgaWYgKGNvbmZpZy5faXNQbSA9PT0gZmFsc2UgJiYgY29uZmlnLl9hW0hPVVJdID09PSAxMikge1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGVGcm9tQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bmVzY2FwZUZvcm1hdChzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcbiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIG1ha2VEYXRlRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIGJlc3RNb21lbnQsXG5cbiAgICAgICAgICAgIHNjb3JlVG9CZWF0LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9mLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uZmlnLl9wZi5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLl9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSAwO1xuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGV4dGVuZCh7fSwgY29uZmlnKTtcbiAgICAgICAgICAgIHRlbXBDb25maWcuX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIG1ha2VEYXRlRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKHRlbXBDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gdGVtcENvbmZpZy5fcGYuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSB0ZW1wQ29uZmlnLl9wZi51bnVzZWRUb2tlbnMubGVuZ3RoICogMTA7XG5cbiAgICAgICAgICAgIHRlbXBDb25maWcuX3BmLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgICAgICBpZiAoc2NvcmVUb0JlYXQgPT0gbnVsbCB8fCBjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdFxuICAgIGZ1bmN0aW9uIG1ha2VEYXRlRnJvbVN0cmluZyhjb25maWcpIHtcbiAgICAgICAgdmFyIGksIGwsXG4gICAgICAgICAgICBzdHJpbmcgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoc3RyaW5nKTtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fcGYuaXNvID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29EYXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNvRGF0ZXNbaV1bMV0uZXhlYyhzdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzVdIHNob3VsZCBiZSBcIlRcIiBvciB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9mID0gaXNvRGF0ZXNbaV1bMF0gKyAobWF0Y2hbNl0gfHwgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvVGltZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMoc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2YgKz0gaXNvVGltZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdHJpbmcubWF0Y2gocGFyc2VUb2tlblRpbWV6b25lKSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5fZiArPSBcIlpcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1ha2VEYXRlRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoc3RyaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VEYXRlRnJvbUlucHV0KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBtYXRjaGVkID0gYXNwTmV0SnNvblJlZ2V4LmV4ZWMoaW5wdXQpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCttYXRjaGVkWzFdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBtYWtlRGF0ZUZyb21TdHJpbmcoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9hID0gaW5wdXQuc2xpY2UoMCk7XG4gICAgICAgICAgICBkYXRlRnJvbUNvbmZpZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCtpbnB1dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGlucHV0KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGRhdGVGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvL2Nhbid0IGp1c3QgYXBwbHkoKSB0byBjcmVhdGUgYSBkYXRlOlxuICAgICAgICAvL2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTgxMzQ4L2luc3RhbnRpYXRpbmctYS1qYXZhc2NyaXB0LW9iamVjdC1ieS1jYWxsaW5nLXByb3RvdHlwZS1jb25zdHJ1Y3Rvci1hcHBseVxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcblxuICAgICAgICAvL3RoZSBkYXRlIGNvbnN0cnVjdG9yIGRvZXNuJ3QgYWNjZXB0IHllYXJzIDwgMTk3MFxuICAgICAgICBpZiAoeSA8IDE5NzApIHtcbiAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZVVUQ0RhdGUoeSkge1xuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuICAgICAgICBpZiAoeSA8IDE5NzApIHtcbiAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGlucHV0LCBsYW5ndWFnZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGxhbmd1YWdlLndlZWtkYXlzUGFyc2UoaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBSZWxhdGl2ZSBUaW1lXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbGFuZykge1xuICAgICAgICByZXR1cm4gbGFuZy5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lKG1pbGxpc2Vjb25kcywgd2l0aG91dFN1ZmZpeCwgbGFuZykge1xuICAgICAgICB2YXIgc2Vjb25kcyA9IHJvdW5kKE1hdGguYWJzKG1pbGxpc2Vjb25kcykgLyAxMDAwKSxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSByb3VuZChzZWNvbmRzIC8gNjApLFxuICAgICAgICAgICAgaG91cnMgPSByb3VuZChtaW51dGVzIC8gNjApLFxuICAgICAgICAgICAgZGF5cyA9IHJvdW5kKGhvdXJzIC8gMjQpLFxuICAgICAgICAgICAgeWVhcnMgPSByb3VuZChkYXlzIC8gMzY1KSxcbiAgICAgICAgICAgIGFyZ3MgPSBzZWNvbmRzIDwgNDUgJiYgWydzJywgc2Vjb25kc10gfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzID09PSAxICYmIFsnbSddIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA8IDQ1ICYmIFsnbW0nLCBtaW51dGVzXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzID09PSAxICYmIFsnaCddIHx8XG4gICAgICAgICAgICAgICAgaG91cnMgPCAyMiAmJiBbJ2hoJywgaG91cnNdIHx8XG4gICAgICAgICAgICAgICAgZGF5cyA9PT0gMSAmJiBbJ2QnXSB8fFxuICAgICAgICAgICAgICAgIGRheXMgPD0gMjUgJiYgWydkZCcsIGRheXNdIHx8XG4gICAgICAgICAgICAgICAgZGF5cyA8PSA0NSAmJiBbJ00nXSB8fFxuICAgICAgICAgICAgICAgIGRheXMgPCAzNDUgJiYgWydNTScsIHJvdW5kKGRheXMgLyAzMCldIHx8XG4gICAgICAgICAgICAgICAgeWVhcnMgPT09IDEgJiYgWyd5J10gfHwgWyd5eScsIHllYXJzXTtcbiAgICAgICAgYXJnc1syXSA9IHdpdGhvdXRTdWZmaXg7XG4gICAgICAgIGFyZ3NbM10gPSBtaWxsaXNlY29uZHMgPiAwO1xuICAgICAgICBhcmdzWzRdID0gbGFuZztcbiAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGVUaW1lQWdvLmFwcGx5KHt9LCBhcmdzKTtcbiAgICB9XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgV2VlayBvZiBZZWFyXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICAvLyBmaXJzdERheU9mV2VlayAgICAgICAwID0gc3VuLCA2ID0gc2F0XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgd2VlayB0aGF0IHN0YXJ0cyB0aGUgd2Vla1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IHN1bmRheSBvciBtb25kYXkpXG4gICAgLy8gZmlyc3REYXlPZldlZWtPZlllYXIgMCA9IHN1biwgNiA9IHNhdFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCB3ZWVrIGlzIHRoZSB3ZWVrIHRoYXQgY29udGFpbnMgdGhlIGZpcnN0XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBkYXkgb2YgdGhlIHdlZWtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAoZWcuIElTTyB3ZWVrcyB1c2UgdGh1cnNkYXkgKDQpKVxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBmaXJzdERheU9mV2VlaywgZmlyc3REYXlPZldlZWtPZlllYXIpIHtcbiAgICAgICAgdmFyIGVuZCA9IGZpcnN0RGF5T2ZXZWVrT2ZZZWFyIC0gZmlyc3REYXlPZldlZWssXG4gICAgICAgICAgICBkYXlzVG9EYXlPZldlZWsgPSBmaXJzdERheU9mV2Vla09mWWVhciAtIG1vbS5kYXkoKSxcbiAgICAgICAgICAgIGFkanVzdGVkTW9tZW50O1xuXG5cbiAgICAgICAgaWYgKGRheXNUb0RheU9mV2VlayA+IGVuZCkge1xuICAgICAgICAgICAgZGF5c1RvRGF5T2ZXZWVrIC09IDc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF5c1RvRGF5T2ZXZWVrIDwgZW5kIC0gNykge1xuICAgICAgICAgICAgZGF5c1RvRGF5T2ZXZWVrICs9IDc7XG4gICAgICAgIH1cblxuICAgICAgICBhZGp1c3RlZE1vbWVudCA9IG1vbWVudChtb20pLmFkZCgnZCcsIGRheXNUb0RheU9mV2Vlayk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiBNYXRoLmNlaWwoYWRqdXN0ZWRNb21lbnQuZGF5T2ZZZWFyKCkgLyA3KSxcbiAgICAgICAgICAgIHllYXI6IGFkanVzdGVkTW9tZW50LnllYXIoKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlI0NhbGN1bGF0aW5nX2FfZGF0ZV9naXZlbl90aGVfeWVhci4yQ193ZWVrX251bWJlcl9hbmRfd2Vla2RheVxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrcyh5ZWFyLCB3ZWVrLCB3ZWVrZGF5LCBmaXJzdERheU9mV2Vla09mWWVhciwgZmlyc3REYXlPZldlZWspIHtcbiAgICAgICAgdmFyIGQgPSBtYWtlVVRDRGF0ZSh5ZWFyLCAwLCAxKS5nZXRVVENEYXkoKSwgZGF5c1RvQWRkLCBkYXlPZlllYXI7XG5cbiAgICAgICAgd2Vla2RheSA9IHdlZWtkYXkgIT0gbnVsbCA/IHdlZWtkYXkgOiBmaXJzdERheU9mV2VlaztcbiAgICAgICAgZGF5c1RvQWRkID0gZmlyc3REYXlPZldlZWsgLSBkICsgKGQgPiBmaXJzdERheU9mV2Vla09mWWVhciA/IDcgOiAwKSAtIChkIDwgZmlyc3REYXlPZldlZWsgPyA3IDogMCk7XG4gICAgICAgIGRheU9mWWVhciA9IDcgKiAod2VlayAtIDEpICsgKHdlZWtkYXkgLSBmaXJzdERheU9mV2VlaykgKyBkYXlzVG9BZGQgKyAxO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiBkYXlPZlllYXIgPiAwID8geWVhciA6IHllYXIgLSAxLFxuICAgICAgICAgICAgZGF5T2ZZZWFyOiBkYXlPZlllYXIgPiAwID8gIGRheU9mWWVhciA6IGRheXNJblllYXIoeWVhciAtIDEpICsgZGF5T2ZZZWFyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBUb3AgTGV2ZWwgRnVuY3Rpb25zXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgZnVuY3Rpb24gbWFrZU1vbWVudChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgZm9ybWF0ID0gY29uZmlnLl9mO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudC5pbnZhbGlkKHtudWxsSW5wdXQ6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGdldExhbmdEZWZpbml0aW9uKCkucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudC5pc01vbWVudChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZyA9IGNsb25lTW9tZW50KGlucHV0KTtcblxuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK2lucHV0Ll9kKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBtYWtlRGF0ZUZyb21TdHJpbmdBbmRBcnJheShjb25maWcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWtlRGF0ZUZyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1ha2VEYXRlRnJvbUlucHV0KGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjb25maWcpO1xuICAgIH1cblxuICAgIG1vbWVudCA9IGZ1bmN0aW9uIChpbnB1dCwgZm9ybWF0LCBsYW5nLCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGM7XG5cbiAgICAgICAgaWYgKHR5cGVvZihsYW5nKSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxhbmc7XG4gICAgICAgICAgICBsYW5nID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjID0ge307XG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fbCA9IGxhbmc7XG4gICAgICAgIGMuX3N0cmljdCA9IHN0cmljdDtcbiAgICAgICAgYy5faXNVVEMgPSBmYWxzZTtcbiAgICAgICAgYy5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XG5cbiAgICAgICAgcmV0dXJuIG1ha2VNb21lbnQoYyk7XG4gICAgfTtcblxuICAgIC8vIGNyZWF0aW5nIHdpdGggdXRjXG4gICAgbW9tZW50LnV0YyA9IGZ1bmN0aW9uIChpbnB1dCwgZm9ybWF0LCBsYW5nLCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGM7XG5cbiAgICAgICAgaWYgKHR5cGVvZihsYW5nKSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxhbmc7XG4gICAgICAgICAgICBsYW5nID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjID0ge307XG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgICAgIGMuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgIGMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgYy5fbCA9IGxhbmc7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuICAgICAgICBjLl9wZiA9IGRlZmF1bHRQYXJzaW5nRmxhZ3MoKTtcblxuICAgICAgICByZXR1cm4gbWFrZU1vbWVudChjKS51dGMoKTtcbiAgICB9O1xuXG4gICAgLy8gY3JlYXRpbmcgd2l0aCB1bml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcylcbiAgICBtb21lbnQudW5peCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gbW9tZW50KGlucHV0ICogMTAwMCk7XG4gICAgfTtcblxuICAgIC8vIGR1cmF0aW9uXG4gICAgbW9tZW50LmR1cmF0aW9uID0gZnVuY3Rpb24gKGlucHV0LCBrZXkpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gaW5wdXQsXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBhZ2FpbnN0IHJlZ2V4cCBpcyBleHBlbnNpdmUsIGRvIGl0IG9uIGRlbWFuZFxuICAgICAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICAgICAgc2lnbixcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIHBhcnNlSXNvO1xuXG4gICAgICAgIGlmIChtb21lbnQuaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQ6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE06IGlucHV0Ll9tb250aHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gaW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gYXNwTmV0VGltZVNwYW5Kc29uUmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSBcIi1cIikgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgIGQ6IHRvSW50KG1hdGNoW0RBVEVdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgaDogdG9JbnQobWF0Y2hbSE9VUl0pICogc2lnbixcbiAgICAgICAgICAgICAgICBtOiB0b0ludChtYXRjaFtNSU5VVEVdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgczogdG9JbnQobWF0Y2hbU0VDT05EXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIG1zOiB0b0ludChtYXRjaFtNSUxMSVNFQ09ORF0pICogc2lnblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGlzb0R1cmF0aW9uUmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSBcIi1cIikgPyAtMSA6IDE7XG4gICAgICAgICAgICBwYXJzZUlzbyA9IGZ1bmN0aW9uIChpbnApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnRzIGZsb2F0cyB0byBpbnRzLlxuICAgICAgICAgICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgICAgICAgICAvLyBhcHBseSBzaWduIHdoaWxlIHdlJ3JlIGF0IGl0XG4gICAgICAgICAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IHBhcnNlSXNvKG1hdGNoWzJdKSxcbiAgICAgICAgICAgICAgICBNOiBwYXJzZUlzbyhtYXRjaFszXSksXG4gICAgICAgICAgICAgICAgZDogcGFyc2VJc28obWF0Y2hbNF0pLFxuICAgICAgICAgICAgICAgIGg6IHBhcnNlSXNvKG1hdGNoWzVdKSxcbiAgICAgICAgICAgICAgICBtOiBwYXJzZUlzbyhtYXRjaFs2XSksXG4gICAgICAgICAgICAgICAgczogcGFyc2VJc28obWF0Y2hbN10pLFxuICAgICAgICAgICAgICAgIHc6IHBhcnNlSXNvKG1hdGNoWzhdKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldCA9IG5ldyBEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgaWYgKG1vbWVudC5pc0R1cmF0aW9uKGlucHV0KSAmJiBpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnX2xhbmcnKSkge1xuICAgICAgICAgICAgcmV0Ll9sYW5nID0gaW5wdXQuX2xhbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICAvLyB2ZXJzaW9uIG51bWJlclxuICAgIG1vbWVudC52ZXJzaW9uID0gVkVSU0lPTjtcblxuICAgIC8vIGRlZmF1bHQgZm9ybWF0XG4gICAgbW9tZW50LmRlZmF1bHRGb3JtYXQgPSBpc29Gb3JtYXQ7XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9tZW50IGlzIG11dGF0ZWQuXG4gICAgLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG4gICAgbW9tZW50LnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgbGFuZ3VhZ2VzIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGxhbmd1YWdlLiAgSWZcbiAgICAvLyBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiwgaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIC8vIGxhbmd1YWdlIGtleS5cbiAgICBtb21lbnQubGFuZyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlcykge1xuICAgICAgICB2YXIgcjtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQuZm4uX2xhbmcuX2FiYnI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICAgICAgbG9hZExhbmcobm9ybWFsaXplTGFuZ3VhZ2Uoa2V5KSwgdmFsdWVzKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHVubG9hZExhbmcoa2V5KTtcbiAgICAgICAgICAgIGtleSA9ICdlbic7XG4gICAgICAgIH0gZWxzZSBpZiAoIWxhbmd1YWdlc1trZXldKSB7XG4gICAgICAgICAgICBnZXRMYW5nRGVmaW5pdGlvbihrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHIgPSBtb21lbnQuZHVyYXRpb24uZm4uX2xhbmcgPSBtb21lbnQuZm4uX2xhbmcgPSBnZXRMYW5nRGVmaW5pdGlvbihrZXkpO1xuICAgICAgICByZXR1cm4gci5fYWJicjtcbiAgICB9O1xuXG4gICAgLy8gcmV0dXJucyBsYW5ndWFnZSBkYXRhXG4gICAgbW9tZW50LmxhbmdEYXRhID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoa2V5ICYmIGtleS5fbGFuZyAmJiBrZXkuX2xhbmcuX2FiYnIpIHtcbiAgICAgICAgICAgIGtleSA9IGtleS5fbGFuZy5fYWJicjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0TGFuZ0RlZmluaXRpb24oa2V5KTtcbiAgICB9O1xuXG4gICAgLy8gY29tcGFyZSBtb21lbnQgb2JqZWN0XG4gICAgbW9tZW50LmlzTW9tZW50ID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgTW9tZW50IHx8XG4gICAgICAgICAgICAob2JqICE9IG51bGwgJiYgIG9iai5oYXNPd25Qcm9wZXJ0eSgnX2lzQU1vbWVudE9iamVjdCcpKTtcbiAgICB9O1xuXG4gICAgLy8gZm9yIHR5cGVjaGVja2luZyBEdXJhdGlvbiBvYmplY3RzXG4gICAgbW9tZW50LmlzRHVyYXRpb24gPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9O1xuXG4gICAgZm9yIChpID0gbGlzdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbWFrZUxpc3QobGlzdHNbaV0pO1xuICAgIH1cblxuICAgIG1vbWVudC5ub3JtYWxpemVVbml0cyA9IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgIH07XG5cbiAgICBtb21lbnQuaW52YWxpZCA9IGZ1bmN0aW9uIChmbGFncykge1xuICAgICAgICB2YXIgbSA9IG1vbWVudC51dGMoTmFOKTtcbiAgICAgICAgaWYgKGZsYWdzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dGVuZChtLl9wZiwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbS5fcGYudXNlckludmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH07XG5cbiAgICBtb21lbnQucGFyc2Vab25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbW9tZW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgTW9tZW50IFByb3RvdHlwZVxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgZXh0ZW5kKG1vbWVudC5mbiA9IE1vbWVudC5wcm90b3R5cGUsIHtcblxuICAgICAgICBjbG9uZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQodGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdmFsdWVPZiA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiArdGhpcy5fZCArICgodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDApO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVuaXggOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigrdGhpcyAvIDEwMDApO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5sYW5nKCdlbicpLmZvcm1hdChcImRkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvRGF0ZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXQgPyBuZXcgRGF0ZSgrdGhpcykgOiB0aGlzLl9kO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvSVNPU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG0gPSBtb21lbnQodGhpcykudXRjKCk7XG4gICAgICAgICAgICBpZiAoMCA8IG0ueWVhcigpICYmIG0ueWVhcigpIDw9IDk5OTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQobSwgJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHRvQXJyYXkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIG0ueWVhcigpLFxuICAgICAgICAgICAgICAgIG0ubW9udGgoKSxcbiAgICAgICAgICAgICAgICBtLmRhdGUoKSxcbiAgICAgICAgICAgICAgICBtLmhvdXJzKCksXG4gICAgICAgICAgICAgICAgbS5taW51dGVzKCksXG4gICAgICAgICAgICAgICAgbS5zZWNvbmRzKCksXG4gICAgICAgICAgICAgICAgbS5taWxsaXNlY29uZHMoKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc1ZhbGlkIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNEU1RTaGlmdGVkIDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSAmJiBjb21wYXJlQXJyYXlzKHRoaXMuX2EsICh0aGlzLl9pc1VUQyA/IG1vbWVudC51dGModGhpcy5fYSkgOiBtb21lbnQodGhpcy5fYSkpLnRvQXJyYXkoKSkgPiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2luZ0ZsYWdzIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgdGhpcy5fcGYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGludmFsaWRBdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BmLm92ZXJmbG93O1xuICAgICAgICB9LFxuXG4gICAgICAgIHV0YyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnpvbmUoMCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbG9jYWwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUoMCk7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9ybWF0IDogZnVuY3Rpb24gKGlucHV0U3RyaW5nKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nIHx8IG1vbWVudC5kZWZhdWx0Rm9ybWF0KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWRkIDogZnVuY3Rpb24gKGlucHV0LCB2YWwpIHtcbiAgICAgICAgICAgIHZhciBkdXI7XG4gICAgICAgICAgICAvLyBzd2l0Y2ggYXJncyB0byBzdXBwb3J0IGFkZCgncycsIDEpIGFuZCBhZGQoMSwgJ3MnKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24oK3ZhbCwgaW5wdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQsIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRPclN1YnRyYWN0RHVyYXRpb25Gcm9tTW9tZW50KHRoaXMsIGR1ciwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICBzdWJ0cmFjdCA6IGZ1bmN0aW9uIChpbnB1dCwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgZHVyO1xuICAgICAgICAgICAgLy8gc3dpdGNoIGFyZ3MgdG8gc3VwcG9ydCBzdWJ0cmFjdCgncycsIDEpIGFuZCBzdWJ0cmFjdCgxLCAncycpXG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGR1ciA9IG1vbWVudC5kdXJhdGlvbigrdmFsLCBpbnB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1ciA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCwgdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE9yU3VidHJhY3REdXJhdGlvbkZyb21Nb21lbnQodGhpcywgZHVyLCAtMSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICBkaWZmIDogZnVuY3Rpb24gKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSBtYWtlQXMoaW5wdXQsIHRoaXMpLFxuICAgICAgICAgICAgICAgIHpvbmVEaWZmID0gKHRoaXMuem9uZSgpIC0gdGhhdC56b25lKCkpICogNmU0LFxuICAgICAgICAgICAgICAgIGRpZmYsIG91dHB1dDtcblxuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgICAgIGlmICh1bml0cyA9PT0gJ3llYXInIHx8IHVuaXRzID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAgICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgZGF5cyBpbiB0aGUgbW9udGhzIGluIHRoZSBnaXZlbiBkYXRlc1xuICAgICAgICAgICAgICAgIGRpZmYgPSAodGhpcy5kYXlzSW5Nb250aCgpICsgdGhhdC5kYXlzSW5Nb250aCgpKSAqIDQzMmU1OyAvLyAyNCAqIDYwICogNjAgKiAxMDAwIC8gMlxuICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKCh0aGlzLnllYXIoKSAtIHRoYXQueWVhcigpKSAqIDEyKSArICh0aGlzLm1vbnRoKCkgLSB0aGF0Lm1vbnRoKCkpO1xuICAgICAgICAgICAgICAgIC8vIGFkanVzdCBieSB0YWtpbmcgZGlmZmVyZW5jZSBpbiBkYXlzLCBhdmVyYWdlIG51bWJlciBvZiBkYXlzXG4gICAgICAgICAgICAgICAgLy8gYW5kIGRzdCBpbiB0aGUgZ2l2ZW4gbW9udGhzLlxuICAgICAgICAgICAgICAgIG91dHB1dCArPSAoKHRoaXMgLSBtb21lbnQodGhpcykuc3RhcnRPZignbW9udGgnKSkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoYXQgLSBtb21lbnQodGhhdCkuc3RhcnRPZignbW9udGgnKSkpIC8gZGlmZjtcbiAgICAgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aXRoIHpvbmVzLCB0byBuZWdhdGUgYWxsIGRzdFxuICAgICAgICAgICAgICAgIG91dHB1dCAtPSAoKHRoaXMuem9uZSgpIC0gbW9tZW50KHRoaXMpLnN0YXJ0T2YoJ21vbnRoJykuem9uZSgpKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhhdC56b25lKCkgLSBtb21lbnQodGhhdCkuc3RhcnRPZignbW9udGgnKS56b25lKCkpKSAqIDZlNCAvIGRpZmY7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0IC8gMTI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaWZmID0gKHRoaXMgLSB0aGF0KTtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB1bml0cyA9PT0gJ3NlY29uZCcgPyBkaWZmIC8gMWUzIDogLy8gMTAwMFxuICAgICAgICAgICAgICAgICAgICB1bml0cyA9PT0gJ21pbnV0ZScgPyBkaWZmIC8gNmU0IDogLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnaG91cicgPyBkaWZmIC8gMzZlNSA6IC8vIDEwMDAgKiA2MCAqIDYwXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnZGF5JyA/IChkaWZmIC0gem9uZURpZmYpIC8gODY0ZTUgOiAvLyAxMDAwICogNjAgKiA2MCAqIDI0LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnd2VlaycgPyAoZGlmZiAtIHpvbmVEaWZmKSAvIDYwNDhlNSA6IC8vIDEwMDAgKiA2MCAqIDYwICogMjQgKiA3LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICAgICAgICAgIGRpZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic1JvdW5kKG91dHB1dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbSA6IGZ1bmN0aW9uICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50LmR1cmF0aW9uKHRoaXMuZGlmZih0aW1lKSkubGFuZyh0aGlzLmxhbmcoKS5fYWJicikuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZyb21Ob3cgOiBmdW5jdGlvbiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJvbShtb21lbnQoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FsZW5kYXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgem9uZSdkIG9yIG5vdC5cbiAgICAgICAgICAgIHZhciBzb2QgPSBtYWtlQXMobW9tZW50KCksIHRoaXMpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgICAgIGRpZmYgPSB0aGlzLmRpZmYoc29kLCAnZGF5cycsIHRydWUpLFxuICAgICAgICAgICAgICAgIGZvcm1hdCA9IGRpZmYgPCAtNiA/ICdzYW1lRWxzZScgOlxuICAgICAgICAgICAgICAgICAgICBkaWZmIDwgLTEgPyAnbGFzdFdlZWsnIDpcbiAgICAgICAgICAgICAgICAgICAgZGlmZiA8IDAgPyAnbGFzdERheScgOlxuICAgICAgICAgICAgICAgICAgICBkaWZmIDwgMSA/ICdzYW1lRGF5JyA6XG4gICAgICAgICAgICAgICAgICAgIGRpZmYgPCAyID8gJ25leHREYXknIDpcbiAgICAgICAgICAgICAgICAgICAgZGlmZiA8IDcgPyAnbmV4dFdlZWsnIDogJ3NhbWVFbHNlJztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdCh0aGlzLmxhbmcoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0xlYXBZZWFyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzRFNUIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnpvbmUoKSA8IHRoaXMuY2xvbmUoKS5tb250aCgwKS56b25lKCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUoKSA8IHRoaXMuY2xvbmUoKS5tb250aCg1KS56b25lKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRheSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIGRheSA9IHRoaXMuX2lzVVRDID8gdGhpcy5fZC5nZXRVVENEYXkoKSA6IHRoaXMuX2QuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gcGFyc2VXZWVrZGF5KGlucHV0LCB0aGlzLmxhbmcoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKHsgZCA6IGlucHV0IC0gZGF5IH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgdXRjID0gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnLFxuICAgICAgICAgICAgICAgIGRheU9mTW9udGg7XG5cbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSB0aGlzLmxhbmcoKS5tb250aHNQYXJzZShpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRheU9mTW9udGggPSBNYXRoLm1pbih0aGlzLmRhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCBpbnB1dCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RbJ3NldCcgKyB1dGMgKyAnTW9udGgnXShpbnB1dCwgZGF5T2ZNb250aCk7XG4gICAgICAgICAgICAgICAgbW9tZW50LnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RbJ2dldCcgKyB1dGMgKyAnTW9udGgnXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHN0YXJ0T2Y6IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHN3aXRjaCBpbnRlbnRpb25hbGx5IG9taXRzIGJyZWFrIGtleXdvcmRzXG4gICAgICAgICAgICAvLyB0byB1dGlsaXplIGZhbGxpbmcgdGhyb3VnaCB0aGUgY2FzZXMuXG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGUoMSk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNlY29uZHMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHdlZWtzIGFyZSBhIHNwZWNpYWwgY2FzZVxuICAgICAgICAgICAgaWYgKHVuaXRzID09PSAnd2VlaycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXkoMCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVuaXRzID09PSAnaXNvV2VlaycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVuZE9mOiBmdW5jdGlvbiAodW5pdHMpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0cykuYWRkKCh1bml0cyA9PT0gJ2lzb1dlZWsnID8gJ3dlZWsnIDogdW5pdHMpLCAxKS5zdWJ0cmFjdCgnbXMnLCAxKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0FmdGVyOiBmdW5jdGlvbiAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgICAgICB1bml0cyA9IHR5cGVvZiB1bml0cyAhPT0gJ3VuZGVmaW5lZCcgPyB1bml0cyA6ICdtaWxsaXNlY29uZCc7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKSA+ICttb21lbnQoaW5wdXQpLnN0YXJ0T2YodW5pdHMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzQmVmb3JlOiBmdW5jdGlvbiAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgICAgICB1bml0cyA9IHR5cGVvZiB1bml0cyAhPT0gJ3VuZGVmaW5lZCcgPyB1bml0cyA6ICdtaWxsaXNlY29uZCc7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKSA8ICttb21lbnQoaW5wdXQpLnN0YXJ0T2YodW5pdHMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzU2FtZTogZnVuY3Rpb24gKGlucHV0LCB1bml0cykge1xuICAgICAgICAgICAgdW5pdHMgPSB1bml0cyB8fCAnbXMnO1xuICAgICAgICAgICAgcmV0dXJuICt0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykgPT09ICttYWtlQXMoaW5wdXQsIHRoaXMpLnN0YXJ0T2YodW5pdHMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1pbjogZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgICAgICAgICBvdGhlciA9IG1vbWVudC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuIG90aGVyIDwgdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgfSxcblxuICAgICAgICBtYXg6IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICAgICAgb3RoZXIgPSBtb21lbnQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgem9uZSA6IGZ1bmN0aW9uIChpbnB1dCwgYWRqdXN0KSB7XG4gICAgICAgICAgICBhZGp1c3QgPSAoYWRqdXN0ID09IG51bGwgPyB0cnVlIDogZmFsc2UpO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwO1xuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gdGltZXpvbmVNaW51dGVzRnJvbVN0cmluZyhpbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNikge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IGlucHV0O1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCAmJiBhZGp1c3QpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkT3JTdWJ0cmFjdER1cmF0aW9uRnJvbU1vbWVudCh0aGlzLCBtb21lbnQuZHVyYXRpb24ob2Zmc2V0IC0gaW5wdXQsICdtJyksIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogdGhpcy5fZC5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgem9uZUFiYnIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBcIlVUQ1wiIDogXCJcIjtcbiAgICAgICAgfSxcblxuICAgICAgICB6b25lTmFtZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IFwiQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWVcIiA6IFwiXCI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2Vab25lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3R6bSkge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZSh0aGlzLl90em0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUodGhpcy5faSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICBoYXNBbGlnbmVkSG91ck9mZnNldCA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gbW9tZW50KGlucHV0KS56b25lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAodGhpcy56b25lKCkgLSBpbnB1dCkgJSA2MCA9PT0gMDtcbiAgICAgICAgfSxcblxuICAgICAgICBkYXlzSW5Nb250aCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBkYXlPZlllYXIgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciBkYXlPZlllYXIgPSByb3VuZCgobW9tZW50KHRoaXMpLnN0YXJ0T2YoJ2RheScpIC0gbW9tZW50KHRoaXMpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNSkgKyAxO1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBkYXlPZlllYXIgOiB0aGlzLmFkZChcImRcIiwgKGlucHV0IC0gZGF5T2ZZZWFyKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcXVhcnRlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEuMCkgLyAzLjApO1xuICAgICAgICB9LFxuXG4gICAgICAgIHdlZWtZZWFyIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgeWVhciA9IHdlZWtPZlllYXIodGhpcywgdGhpcy5sYW5nKCkuX3dlZWsuZG93LCB0aGlzLmxhbmcoKS5fd2Vlay5kb3kpLnllYXI7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHllYXIgOiB0aGlzLmFkZChcInlcIiwgKGlucHV0IC0geWVhcikpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzb1dlZWtZZWFyIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgeWVhciA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkueWVhcjtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8geWVhciA6IHRoaXMuYWRkKFwieVwiLCAoaW5wdXQgLSB5ZWFyKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2VlayA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHdlZWsgPSB0aGlzLmxhbmcoKS53ZWVrKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoXCJkXCIsIChpbnB1dCAtIHdlZWspICogNyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNvV2VlayA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHdlZWsgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLndlZWs7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZChcImRcIiwgKGlucHV0IC0gd2VlaykgKiA3KTtcbiAgICAgICAgfSxcblxuICAgICAgICB3ZWVrZGF5IDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubGFuZygpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrZGF5IDogdGhpcy5hZGQoXCJkXCIsIGlucHV0IC0gd2Vla2RheSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNvV2Vla2RheSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgLy8gYmVoYXZlcyB0aGUgc2FtZSBhcyBtb21lbnQjZGF5IGV4Y2VwdFxuICAgICAgICAgICAgLy8gYXMgYSBnZXR0ZXIsIHJldHVybnMgNyBpbnN0ZWFkIG9mIDAgKDEtNyByYW5nZSBpbnN0ZWFkIG9mIDAtNilcbiAgICAgICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gdGhpcy5kYXkoKSB8fCA3IDogdGhpcy5kYXkodGhpcy5kYXkoKSAlIDcgPyBpbnB1dCA6IGlucHV0IC0gNyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNvV2Vla3NJblllYXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIDEsIDQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHdlZWtzSW5ZZWFyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5fbGFuZy5fd2VlaztcbiAgICAgICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCA6IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQgOiBmdW5jdGlvbiAodW5pdHMsIHZhbHVlKSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1t1bml0c10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzW3VuaXRzXSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBJZiBwYXNzZWQgYSBsYW5ndWFnZSBrZXksIGl0IHdpbGwgc2V0IHRoZSBsYW5ndWFnZSBmb3IgdGhpc1xuICAgICAgICAvLyBpbnN0YW5jZS4gIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAgICBsYW5nIDogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhbmcgPSBnZXRMYW5nRGVmaW5pdGlvbihrZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBoZWxwZXIgZm9yIGFkZGluZyBzaG9ydGN1dHNcbiAgICBmdW5jdGlvbiBtYWtlR2V0dGVyQW5kU2V0dGVyKG5hbWUsIGtleSkge1xuICAgICAgICAvLyBpZ25vcmVPZmZzZXRUcmFuc2l0aW9ucyBwcm92aWRlcyBhIGhpbnQgdG8gdXBkYXRlT2Zmc2V0IHRvIG5vdFxuICAgICAgICAvLyBjaGFuZ2UgaG91cnMvbWludXRlcyB3aGVuIGNyb3NzaW5nIGEgdHogYm91bmRhcnkuICBUaGlzIGlzIGZyZXF1ZW50bHlcbiAgICAgICAgLy8gZGVzaXJhYmxlIHdoZW4gbW9kaWZ5aW5nIHBhcnQgb2YgYW4gZXhpc3RpbmcgbW9tZW50IG9iamVjdCBkaXJlY3RseS5cbiAgICAgICAgdmFyIGRlZmF1bHRJZ25vcmVPZmZzZXRUcmFuc2l0aW9ucyA9IGtleSA9PT0gJ2RhdGUnIHx8IGtleSA9PT0gJ21vbnRoJyB8fCBrZXkgPT09ICd5ZWFyJztcbiAgICAgICAgbW9tZW50LmZuW25hbWVdID0gbW9tZW50LmZuW25hbWUgKyAncyddID0gZnVuY3Rpb24gKGlucHV0LCBpZ25vcmVPZmZzZXRUcmFuc2l0aW9ucykge1xuICAgICAgICAgICAgdmFyIHV0YyA9IHRoaXMuX2lzVVRDID8gJ1VUQycgOiAnJztcbiAgICAgICAgICAgIGlmIChpZ25vcmVPZmZzZXRUcmFuc2l0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWdub3JlT2Zmc2V0VHJhbnNpdGlvbnMgPSBkZWZhdWx0SWdub3JlT2Zmc2V0VHJhbnNpdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RbJ3NldCcgKyB1dGMgKyBrZXldKGlucHV0KTtcbiAgICAgICAgICAgICAgICBtb21lbnQudXBkYXRlT2Zmc2V0KHRoaXMsIGlnbm9yZU9mZnNldFRyYW5zaXRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RbJ2dldCcgKyB1dGMgKyBrZXldKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGFuZCBhZGQgc2hvcnRjdXRzIChEYXRlLCBIb3VycywgTWludXRlcywgU2Vjb25kcywgTWlsbGlzZWNvbmRzKVxuICAgIC8vIE1vbnRoIGhhcyBhIGN1c3RvbSBnZXR0ZXIvc2V0dGVyLlxuICAgIGZvciAoaSA9IDA7IGkgPCBwcm94eUdldHRlcnNBbmRTZXR0ZXJzLmxlbmd0aDsgaSArKykge1xuICAgICAgICBtYWtlR2V0dGVyQW5kU2V0dGVyKHByb3h5R2V0dGVyc0FuZFNldHRlcnNbaV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9zJC8sICcnKSwgcHJveHlHZXR0ZXJzQW5kU2V0dGVyc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIHNob3J0Y3V0IGZvciB5ZWFyICh1c2VzIGRpZmZlcmVudCBzeW50YXggdGhhbiB0aGUgZ2V0dGVyL3NldHRlciAneWVhcicgPT0gJ0Z1bGxZZWFyJylcbiAgICBtYWtlR2V0dGVyQW5kU2V0dGVyKCd5ZWFyJywgJ0Z1bGxZZWFyJyk7XG5cbiAgICAvLyBhZGQgcGx1cmFsIG1ldGhvZHNcbiAgICBtb21lbnQuZm4uZGF5cyA9IG1vbWVudC5mbi5kYXk7XG4gICAgbW9tZW50LmZuLm1vbnRocyA9IG1vbWVudC5mbi5tb250aDtcbiAgICBtb21lbnQuZm4ud2Vla3MgPSBtb21lbnQuZm4ud2VlaztcbiAgICBtb21lbnQuZm4uaXNvV2Vla3MgPSBtb21lbnQuZm4uaXNvV2VlaztcblxuICAgIC8vIGFkZCBhbGlhc2VkIGZvcm1hdCBtZXRob2RzXG4gICAgbW9tZW50LmZuLnRvSlNPTiA9IG1vbWVudC5mbi50b0lTT1N0cmluZztcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgRHVyYXRpb24gUHJvdG90eXBlXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICBleHRlbmQobW9tZW50LmR1cmF0aW9uLmZuID0gRHVyYXRpb24ucHJvdG90eXBlLCB7XG5cbiAgICAgICAgX2J1YmJsZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMsXG4gICAgICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzLFxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgICAgIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycztcblxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMgJSAxMDAwO1xuXG4gICAgICAgICAgICBzZWNvbmRzID0gYWJzUm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgICAgICBkYXRhLnNlY29uZHMgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgICAgIG1pbnV0ZXMgPSBhYnNSb3VuZChzZWNvbmRzIC8gNjApO1xuICAgICAgICAgICAgZGF0YS5taW51dGVzID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgICAgICBob3VycyA9IGFic1JvdW5kKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgICAgICBkYXRhLmhvdXJzID0gaG91cnMgJSAyNDtcblxuICAgICAgICAgICAgZGF5cyArPSBhYnNSb3VuZChob3VycyAvIDI0KTtcbiAgICAgICAgICAgIGRhdGEuZGF5cyA9IGRheXMgJSAzMDtcblxuICAgICAgICAgICAgbW9udGhzICs9IGFic1JvdW5kKGRheXMgLyAzMCk7XG4gICAgICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocyAlIDEyO1xuXG4gICAgICAgICAgICB5ZWFycyA9IGFic1JvdW5kKG1vbnRocyAvIDEyKTtcbiAgICAgICAgICAgIGRhdGEueWVhcnMgPSB5ZWFycztcbiAgICAgICAgfSxcblxuICAgICAgICB3ZWVrcyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBhYnNSb3VuZCh0aGlzLmRheXMoKSAvIDcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHZhbHVlT2YgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgICAgdGhpcy5fZGF5cyAqIDg2NGU1ICtcbiAgICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICAgIHRvSW50KHRoaXMuX21vbnRocyAvIDEyKSAqIDMxNTM2ZTY7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaHVtYW5pemUgOiBmdW5jdGlvbiAod2l0aFN1ZmZpeCkge1xuICAgICAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSArdGhpcyxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSByZWxhdGl2ZVRpbWUoZGlmZmVyZW5jZSwgIXdpdGhTdWZmaXgsIHRoaXMubGFuZygpKTtcblxuICAgICAgICAgICAgaWYgKHdpdGhTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzLmxhbmcoKS5wYXN0RnV0dXJlKGRpZmZlcmVuY2UsIG91dHB1dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWRkIDogZnVuY3Rpb24gKGlucHV0LCB2YWwpIHtcbiAgICAgICAgICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChtb21lbnQpXG4gICAgICAgICAgICB2YXIgZHVyID0gbW9tZW50LmR1cmF0aW9uKGlucHV0LCB2YWwpO1xuXG4gICAgICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgKz0gZHVyLl9taWxsaXNlY29uZHM7XG4gICAgICAgICAgICB0aGlzLl9kYXlzICs9IGR1ci5fZGF5cztcbiAgICAgICAgICAgIHRoaXMuX21vbnRocyArPSBkdXIuX21vbnRocztcblxuICAgICAgICAgICAgdGhpcy5fYnViYmxlKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIHN1YnRyYWN0IDogZnVuY3Rpb24gKGlucHV0LCB2YWwpIHtcbiAgICAgICAgICAgIHZhciBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQsIHZhbCk7XG5cbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyAtPSBkdXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHRoaXMuX2RheXMgLT0gZHVyLl9kYXlzO1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzIC09IGR1ci5fbW9udGhzO1xuXG4gICAgICAgICAgICB0aGlzLl9idWJibGUoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IDogZnVuY3Rpb24gKHVuaXRzKSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzLnRvTG93ZXJDYXNlKCkgKyAncyddKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXMgOiBmdW5jdGlvbiAodW5pdHMpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbJ2FzJyArIHVuaXRzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdW5pdHMuc2xpY2UoMSkgKyAncyddKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbGFuZyA6IG1vbWVudC5mbi5sYW5nLFxuXG4gICAgICAgIHRvSXNvU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gaW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2RvcmRpbGxlL21vbWVudC1pc29kdXJhdGlvbi9ibG9iL21hc3Rlci9tb21lbnQuaXNvZHVyYXRpb24uanNcbiAgICAgICAgICAgIHZhciB5ZWFycyA9IE1hdGguYWJzKHRoaXMueWVhcnMoKSksXG4gICAgICAgICAgICAgICAgbW9udGhzID0gTWF0aC5hYnModGhpcy5tb250aHMoKSksXG4gICAgICAgICAgICAgICAgZGF5cyA9IE1hdGguYWJzKHRoaXMuZGF5cygpKSxcbiAgICAgICAgICAgICAgICBob3VycyA9IE1hdGguYWJzKHRoaXMuaG91cnMoKSksXG4gICAgICAgICAgICAgICAgbWludXRlcyA9IE1hdGguYWJzKHRoaXMubWludXRlcygpKSxcbiAgICAgICAgICAgICAgICBzZWNvbmRzID0gTWF0aC5hYnModGhpcy5zZWNvbmRzKCkgKyB0aGlzLm1pbGxpc2Vjb25kcygpIC8gMTAwMCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5hc1NlY29uZHMoKSkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHNhbWUgYXMgQyMncyAoTm9kYSkgYW5kIHB5dGhvbiAoaXNvZGF0ZSkuLi5cbiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyIEpTIChnb29nLmRhdGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuYXNTZWNvbmRzKCkgPCAwID8gJy0nIDogJycpICtcbiAgICAgICAgICAgICAgICAnUCcgK1xuICAgICAgICAgICAgICAgICh5ZWFycyA/IHllYXJzICsgJ1knIDogJycpICtcbiAgICAgICAgICAgICAgICAobW9udGhzID8gbW9udGhzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgICAgICAoZGF5cyA/IGRheXMgKyAnRCcgOiAnJykgK1xuICAgICAgICAgICAgICAgICgoaG91cnMgfHwgbWludXRlcyB8fCBzZWNvbmRzKSA/ICdUJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgKGhvdXJzID8gaG91cnMgKyAnSCcgOiAnJykgK1xuICAgICAgICAgICAgICAgIChtaW51dGVzID8gbWludXRlcyArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgKHNlY29uZHMgPyBzZWNvbmRzICsgJ1MnIDogJycpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtYWtlRHVyYXRpb25HZXR0ZXIobmFtZSkge1xuICAgICAgICBtb21lbnQuZHVyYXRpb24uZm5bbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtuYW1lXTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRHVyYXRpb25Bc0dldHRlcihuYW1lLCBmYWN0b3IpIHtcbiAgICAgICAgbW9tZW50LmR1cmF0aW9uLmZuWydhcycgKyBuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiArdGhpcyAvIGZhY3RvcjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKGkgaW4gdW5pdE1pbGxpc2Vjb25kRmFjdG9ycykge1xuICAgICAgICBpZiAodW5pdE1pbGxpc2Vjb25kRmFjdG9ycy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgbWFrZUR1cmF0aW9uQXNHZXR0ZXIoaSwgdW5pdE1pbGxpc2Vjb25kRmFjdG9yc1tpXSk7XG4gICAgICAgICAgICBtYWtlRHVyYXRpb25HZXR0ZXIoaS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1ha2VEdXJhdGlvbkFzR2V0dGVyKCdXZWVrcycsIDYwNDhlNSk7XG4gICAgbW9tZW50LmR1cmF0aW9uLmZuLmFzTW9udGhzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKCt0aGlzIC0gdGhpcy55ZWFycygpICogMzE1MzZlNikgLyAyNTkyZTYgKyB0aGlzLnllYXJzKCkgKiAxMjtcbiAgICB9O1xuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIERlZmF1bHQgTGFuZ1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbGFuZ3VhZ2UsIG90aGVyIGxhbmd1YWdlcyB3aWxsIGluaGVyaXQgZnJvbSBFbmdsaXNoLlxuICAgIG1vbWVudC5sYW5nKCdlbicsIHtcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRvSW50KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qIEVNQkVEX0xBTkdVQUdFUyAqL1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBFeHBvc2luZyBNb21lbnRcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBmdW5jdGlvbiBtYWtlR2xvYmFsKGRlcHJlY2F0ZSkge1xuICAgICAgICB2YXIgd2FybmVkID0gZmFsc2UsIGxvY2FsX21vbWVudCA9IG1vbWVudDtcbiAgICAgICAgLypnbG9iYWwgZW5kZXI6ZmFsc2UgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBlbmRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBoZXJlLCBgdGhpc2AgbWVhbnMgYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIG9yIGBnbG9iYWxgIG9uIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gYWRkIGBtb21lbnRgIGFzIGEgZ2xvYmFsIG9iamVjdCB2aWEgYSBzdHJpbmcgaWRlbnRpZmllcixcbiAgICAgICAgLy8gZm9yIENsb3N1cmUgQ29tcGlsZXIgXCJhZHZhbmNlZFwiIG1vZGVcbiAgICAgICAgaWYgKGRlcHJlY2F0ZSkge1xuICAgICAgICAgICAgZ2xvYmFsLm1vbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXdhcm5lZCAmJiBjb25zb2xlICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICB3YXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBY2Nlc3NpbmcgTW9tZW50IHRocm91Z2ggdGhlIGdsb2JhbCBzY29wZSBpcyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXByZWNhdGVkLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlbGVhc2UuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfbW9tZW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZXh0ZW5kKGdsb2JhbC5tb21lbnQsIGxvY2FsX21vbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWxbJ21vbWVudCddID0gbW9tZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tbW9uSlMgbW9kdWxlIGlzIGRlZmluZWRcbiAgICBpZiAoaGFzTW9kdWxlKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gbW9tZW50O1xuICAgICAgICBtYWtlR2xvYmFsKHRydWUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFwibW9tZW50XCIsIGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcbiAgICAgICAgICAgIGlmIChtb2R1bGUuY29uZmlnICYmIG1vZHVsZS5jb25maWcoKSAmJiBtb2R1bGUuY29uZmlnKCkubm9HbG9iYWwgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB1c2VyIHByb3ZpZGVkIG5vR2xvYmFsLCBoZSBpcyBhd2FyZSBvZiBnbG9iYWxcbiAgICAgICAgICAgICAgICBtYWtlR2xvYmFsKG1vZHVsZS5jb25maWcoKS5ub0dsb2JhbCA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1vbWVudDtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbWFrZUdsb2JhbCgpO1xuICAgIH1cbn0pLmNhbGwodGhpcyk7XG4iXSwiZmlsZSI6Im1vbWVudC5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJtb21lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qc1xyXG4vLyEgdmVyc2lvbiA6IDIuNS4xXHJcbi8vISBhdXRob3JzIDogVGltIFdvb2QsIElza3JlbiBDaGVybmV2LCBNb21lbnQuanMgY29udHJpYnV0b3JzXHJcbi8vISBsaWNlbnNlIDogTUlUXHJcbi8vISBtb21lbnRqcy5jb21cclxuXHJcbihmdW5jdGlvbiAodW5kZWZpbmVkKSB7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgIENvbnN0YW50c1xyXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuICAgIHZhciBtb21lbnQsXHJcbiAgICAgICAgVkVSU0lPTiA9IFwiMi41LjFcIixcclxuICAgICAgICBnbG9iYWwgPSB0aGlzLFxyXG4gICAgICAgIHJvdW5kID0gTWF0aC5yb3VuZCxcclxuICAgICAgICBpLFxyXG5cclxuICAgICAgICBZRUFSID0gMCxcclxuICAgICAgICBNT05USCA9IDEsXHJcbiAgICAgICAgREFURSA9IDIsXHJcbiAgICAgICAgSE9VUiA9IDMsXHJcbiAgICAgICAgTUlOVVRFID0gNCxcclxuICAgICAgICBTRUNPTkQgPSA1LFxyXG4gICAgICAgIE1JTExJU0VDT05EID0gNixcclxuXHJcbiAgICAgICAgLy8gaW50ZXJuYWwgc3RvcmFnZSBmb3IgbGFuZ3VhZ2UgY29uZmlnIGZpbGVzXHJcbiAgICAgICAgbGFuZ3VhZ2VzID0ge30sXHJcblxyXG4gICAgICAgIC8vIG1vbWVudCBpbnRlcm5hbCBwcm9wZXJ0aWVzXHJcbiAgICAgICAgbW9tZW50UHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgX2lzQU1vbWVudE9iamVjdDogbnVsbCxcclxuICAgICAgICAgICAgX2kgOiBudWxsLFxyXG4gICAgICAgICAgICBfZiA6IG51bGwsXHJcbiAgICAgICAgICAgIF9sIDogbnVsbCxcclxuICAgICAgICAgICAgX3N0cmljdCA6IG51bGwsXHJcbiAgICAgICAgICAgIF9pc1VUQyA6IG51bGwsXHJcbiAgICAgICAgICAgIF9vZmZzZXQgOiBudWxsLCAgLy8gb3B0aW9uYWwuIENvbWJpbmUgd2l0aCBfaXNVVENcclxuICAgICAgICAgICAgX3BmIDogbnVsbCxcclxuICAgICAgICAgICAgX2xhbmcgOiBudWxsICAvLyBvcHRpb25hbFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGZvciBub2RlSlNcclxuICAgICAgICBoYXNNb2R1bGUgPSAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMgJiYgdHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnKSxcclxuXHJcbiAgICAgICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XHJcbiAgICAgICAgYXNwTmV0SnNvblJlZ2V4ID0gL15cXC8/RGF0ZVxcKChcXC0/XFxkKykvaSxcclxuICAgICAgICBhc3BOZXRUaW1lU3Bhbkpzb25SZWdleCA9IC8oXFwtKT8oPzooXFxkKilcXC4pPyhcXGQrKVxcOihcXGQrKSg/OlxcOihcXGQrKVxcLj8oXFxkezN9KT8pPy8sXHJcblxyXG4gICAgICAgIC8vIGZyb20gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfZGF0ZV9kYXRlLmpzLnNvdXJjZS5odG1sXHJcbiAgICAgICAgLy8gc29tZXdoYXQgbW9yZSBpbiBsaW5lIHdpdGggNC40LjMuMiAyMDA0IHNwZWMsIGJ1dCBhbGxvd3MgZGVjaW1hbCBhbnl3aGVyZVxyXG4gICAgICAgIGlzb0R1cmF0aW9uUmVnZXggPSAvXigtKT9QKD86KD86KFswLTksLl0qKVkpPyg/OihbMC05LC5dKilNKT8oPzooWzAtOSwuXSopRCk/KD86VCg/OihbMC05LC5dKilIKT8oPzooWzAtOSwuXSopTSk/KD86KFswLTksLl0qKVMpPyk/fChbMC05LC5dKilXKSQvLFxyXG5cclxuICAgICAgICAvLyBmb3JtYXQgdG9rZW5zXHJcbiAgICAgICAgZm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xZWVlZWVl8WVlZWVl8WVlZWXxZWXxnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xtbT98c3M/fFN7MSw0fXxYfHp6P3xaWj98LikvZyxcclxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oTFR8TEw/TD9MP3xsezEsNH0pL2csXHJcblxyXG4gICAgICAgIC8vIHBhcnNpbmcgdG9rZW4gcmVnZXhlc1xyXG4gICAgICAgIHBhcnNlVG9rZW5PbmVPclR3b0RpZ2l0cyA9IC9cXGRcXGQ/LywgLy8gMCAtIDk5XHJcbiAgICAgICAgcGFyc2VUb2tlbk9uZVRvVGhyZWVEaWdpdHMgPSAvXFxkezEsM30vLCAvLyAwIC0gOTk5XHJcbiAgICAgICAgcGFyc2VUb2tlbk9uZVRvRm91ckRpZ2l0cyA9IC9cXGR7MSw0fS8sIC8vIDAgLSA5OTk5XHJcbiAgICAgICAgcGFyc2VUb2tlbk9uZVRvU2l4RGlnaXRzID0gL1srXFwtXT9cXGR7MSw2fS8sIC8vIC05OTksOTk5IC0gOTk5LDk5OVxyXG4gICAgICAgIHBhcnNlVG9rZW5EaWdpdHMgPSAvXFxkKy8sIC8vIG5vbnplcm8gbnVtYmVyIG9mIGRpZ2l0c1xyXG4gICAgICAgIHBhcnNlVG9rZW5Xb3JkID0gL1swLTldKlsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSt8W1xcdTA2MDAtXFx1MDZGRlxcL10rKFxccyo/W1xcdTA2MDAtXFx1MDZGRl0rKXsxLDJ9L2ksIC8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxyXG4gICAgICAgIHBhcnNlVG9rZW5UaW1lem9uZSA9IC9afFtcXCtcXC1dXFxkXFxkOj9cXGRcXGQvZ2ksIC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxyXG4gICAgICAgIHBhcnNlVG9rZW5UID0gL1QvaSwgLy8gVCAoSVNPIHNlcGFyYXRvcilcclxuICAgICAgICBwYXJzZVRva2VuVGltZXN0YW1wTXMgPSAvW1xcK1xcLV0/XFxkKyhcXC5cXGR7MSwzfSk/LywgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcclxuICAgICAgICBwYXJzZVRva2VuT3JkaW5hbCA9IC9cXGR7MSwyfS8sXHJcblxyXG4gICAgICAgIC8vc3RyaWN0IHBhcnNpbmcgcmVnZXhlc1xyXG4gICAgICAgIHBhcnNlVG9rZW5PbmVEaWdpdCA9IC9cXGQvLCAvLyAwIC0gOVxyXG4gICAgICAgIHBhcnNlVG9rZW5Ud29EaWdpdHMgPSAvXFxkXFxkLywgLy8gMDAgLSA5OVxyXG4gICAgICAgIHBhcnNlVG9rZW5UaHJlZURpZ2l0cyA9IC9cXGR7M30vLCAvLyAwMDAgLSA5OTlcclxuICAgICAgICBwYXJzZVRva2VuRm91ckRpZ2l0cyA9IC9cXGR7NH0vLCAvLyAwMDAwIC0gOTk5OVxyXG4gICAgICAgIHBhcnNlVG9rZW5TaXhEaWdpdHMgPSAvWystXT9cXGR7Nn0vLCAvLyAtOTk5LDk5OSAtIDk5OSw5OTlcclxuICAgICAgICBwYXJzZVRva2VuU2lnbmVkTnVtYmVyID0gL1srLV0/XFxkKy8sIC8vIC1pbmYgLSBpbmZcclxuXHJcbiAgICAgICAgLy8gaXNvIDg2MDEgcmVnZXhcclxuICAgICAgICAvLyAwMDAwLTAwLTAwIDAwMDAtVzAwIG9yIDAwMDAtVzAwLTAgKyBUICsgMDAgb3IgMDA6MDAgb3IgMDA6MDA6MDAgb3IgMDA6MDA6MDAuMDAwICsgKzAwOjAwIG9yICswMDAwIG9yICswMClcclxuICAgICAgICBpc29SZWdleCA9IC9eXFxzKig/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzooXFxkXFxkLVxcZFxcZCl8KFdcXGRcXGQkKXwoV1xcZFxcZC1cXGQpfChcXGRcXGRcXGQpKSgoVHwgKShcXGRcXGQoOlxcZFxcZCg6XFxkXFxkKFxcLlxcZCspPyk/KT8pPyhbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sXHJcblxyXG4gICAgICAgIGlzb0Zvcm1hdCA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWicsXHJcblxyXG4gICAgICAgIGlzb0RhdGVzID0gW1xyXG4gICAgICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZHsyfS1cXGR7Mn0vXSxcclxuICAgICAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGR7Mn0tXFxkezJ9L10sXHJcbiAgICAgICAgICAgIFsnR0dHRy1bV11XVy1FJywgL1xcZHs0fS1XXFxkezJ9LVxcZC9dLFxyXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGR7Mn0vXSxcclxuICAgICAgICAgICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L11cclxuICAgICAgICBdLFxyXG5cclxuICAgICAgICAvLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXHJcbiAgICAgICAgaXNvVGltZXMgPSBbXHJcbiAgICAgICAgICAgIFsnSEg6bW06c3MuU1NTUycsIC8oVHwgKVxcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkezEsM30vXSxcclxuICAgICAgICAgICAgWydISDptbTpzcycsIC8oVHwgKVxcZFxcZDpcXGRcXGQ6XFxkXFxkL10sXHJcbiAgICAgICAgICAgIFsnSEg6bW0nLCAvKFR8IClcXGRcXGQ6XFxkXFxkL10sXHJcbiAgICAgICAgICAgIFsnSEgnLCAvKFR8IClcXGRcXGQvXVxyXG4gICAgICAgIF0sXHJcblxyXG4gICAgICAgIC8vIHRpbWV6b25lIGNodW5rZXIgXCIrMTA6MDBcIiA+IFtcIjEwXCIsIFwiMDBcIl0gb3IgXCItMTUzMFwiID4gW1wiLTE1XCIsIFwiMzBcIl1cclxuICAgICAgICBwYXJzZVRpbWV6b25lQ2h1bmtlciA9IC8oW1xcK1xcLV18XFxkXFxkKS9naSxcclxuXHJcbiAgICAgICAgLy8gZ2V0dGVyIGFuZCBzZXR0ZXIgbmFtZXNcclxuICAgICAgICBwcm94eUdldHRlcnNBbmRTZXR0ZXJzID0gJ0RhdGV8SG91cnN8TWludXRlc3xTZWNvbmRzfE1pbGxpc2Vjb25kcycuc3BsaXQoJ3wnKSxcclxuICAgICAgICB1bml0TWlsbGlzZWNvbmRGYWN0b3JzID0ge1xyXG4gICAgICAgICAgICAnTWlsbGlzZWNvbmRzJyA6IDEsXHJcbiAgICAgICAgICAgICdTZWNvbmRzJyA6IDFlMyxcclxuICAgICAgICAgICAgJ01pbnV0ZXMnIDogNmU0LFxyXG4gICAgICAgICAgICAnSG91cnMnIDogMzZlNSxcclxuICAgICAgICAgICAgJ0RheXMnIDogODY0ZTUsXHJcbiAgICAgICAgICAgICdNb250aHMnIDogMjU5MmU2LFxyXG4gICAgICAgICAgICAnWWVhcnMnIDogMzE1MzZlNlxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHVuaXRBbGlhc2VzID0ge1xyXG4gICAgICAgICAgICBtcyA6ICdtaWxsaXNlY29uZCcsXHJcbiAgICAgICAgICAgIHMgOiAnc2Vjb25kJyxcclxuICAgICAgICAgICAgbSA6ICdtaW51dGUnLFxyXG4gICAgICAgICAgICBoIDogJ2hvdXInLFxyXG4gICAgICAgICAgICBkIDogJ2RheScsXHJcbiAgICAgICAgICAgIEQgOiAnZGF0ZScsXHJcbiAgICAgICAgICAgIHcgOiAnd2VlaycsXHJcbiAgICAgICAgICAgIFcgOiAnaXNvV2VlaycsXHJcbiAgICAgICAgICAgIE0gOiAnbW9udGgnLFxyXG4gICAgICAgICAgICB5IDogJ3llYXInLFxyXG4gICAgICAgICAgICBEREQgOiAnZGF5T2ZZZWFyJyxcclxuICAgICAgICAgICAgZSA6ICd3ZWVrZGF5JyxcclxuICAgICAgICAgICAgRSA6ICdpc29XZWVrZGF5JyxcclxuICAgICAgICAgICAgZ2c6ICd3ZWVrWWVhcicsXHJcbiAgICAgICAgICAgIEdHOiAnaXNvV2Vla1llYXInXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgY2FtZWxGdW5jdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGRheW9meWVhciA6ICdkYXlPZlllYXInLFxyXG4gICAgICAgICAgICBpc293ZWVrZGF5IDogJ2lzb1dlZWtkYXknLFxyXG4gICAgICAgICAgICBpc293ZWVrIDogJ2lzb1dlZWsnLFxyXG4gICAgICAgICAgICB3ZWVreWVhciA6ICd3ZWVrWWVhcicsXHJcbiAgICAgICAgICAgIGlzb3dlZWt5ZWFyIDogJ2lzb1dlZWtZZWFyJ1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGZvcm1hdCBmdW5jdGlvbiBzdHJpbmdzXHJcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zID0ge30sXHJcblxyXG4gICAgICAgIC8vIHRva2VucyB0byBvcmRpbmFsaXplIGFuZCBwYWRcclxuICAgICAgICBvcmRpbmFsaXplVG9rZW5zID0gJ0RERCB3IFcgTSBEIGQnLnNwbGl0KCcgJyksXHJcbiAgICAgICAgcGFkZGVkVG9rZW5zID0gJ00gRCBIIGggbSBzIHcgVycuc3BsaXQoJyAnKSxcclxuXHJcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIE0gICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgTU1NICA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBNTU1NIDogZnVuY3Rpb24gKGZvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLm1vbnRocyh0aGlzLCBmb3JtYXQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBEICAgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZSgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBEREQgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5T2ZZZWFyKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGQgICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGQgICA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkZGQgIDogZnVuY3Rpb24gKGZvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGRkZCA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS53ZWVrZGF5cyh0aGlzLCBmb3JtYXQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB3ICAgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2VlaygpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBXICAgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2VlaygpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBZWSAgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLnllYXIoKSAlIDEwMCwgMik7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFlZWVkgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMueWVhcigpLCA0KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgWVlZWVkgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMueWVhcigpLCA1KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgWVlZWVlZIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHkgPSB0aGlzLnllYXIoKSwgc2lnbiA9IHkgPj0gMCA/ICcrJyA6ICctJztcclxuICAgICAgICAgICAgICAgIHJldHVybiBzaWduICsgbGVmdFplcm9GaWxsKE1hdGguYWJzKHkpLCA2KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2cgICA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy53ZWVrWWVhcigpICUgMTAwLCAyKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2dnZyA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy53ZWVrWWVhcigpLCA0KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2dnZ2cgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMud2Vla1llYXIoKSwgNSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEdHICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMCwgMik7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEdHR0cgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMuaXNvV2Vla1llYXIoKSwgNCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEdHR0dHIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLmlzb1dlZWtZZWFyKCksIDUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2Vla2RheSgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBFIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla2RheSgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhICAgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRydWUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBBICAgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgSCAgICA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGggICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG0gICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHMgICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmRzKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFMgICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9JbnQodGhpcy5taWxsaXNlY29uZHMoKSAvIDEwMCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFNTICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRvSW50KHRoaXMubWlsbGlzZWNvbmRzKCkgLyAxMCksIDIpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBTU1MgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLm1pbGxpc2Vjb25kcygpLCAzKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgU1NTUyA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy5taWxsaXNlY29uZHMoKSwgMyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFogICAgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYSA9IC10aGlzLnpvbmUoKSxcclxuICAgICAgICAgICAgICAgICAgICBiID0gXCIrXCI7XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhID0gLWE7XHJcbiAgICAgICAgICAgICAgICAgICAgYiA9IFwiLVwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGIgKyBsZWZ0WmVyb0ZpbGwodG9JbnQoYSAvIDYwKSwgMikgKyBcIjpcIiArIGxlZnRaZXJvRmlsbCh0b0ludChhKSAlIDYwLCAyKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgWlogICA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBhID0gLXRoaXMuem9uZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGIgPSBcIitcIjtcclxuICAgICAgICAgICAgICAgIGlmIChhIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGEgPSAtYTtcclxuICAgICAgICAgICAgICAgICAgICBiID0gXCItXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYiArIGxlZnRaZXJvRmlsbCh0b0ludChhIC8gNjApLCAyKSArIGxlZnRaZXJvRmlsbCh0b0ludChhKSAlIDYwLCAyKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeiA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnpvbmVBYmJyKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHp6IDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuem9uZU5hbWUoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgWCAgICA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVuaXgoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgUSA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnF1YXJ0ZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGxpc3RzID0gWydtb250aHMnLCAnbW9udGhzU2hvcnQnLCAnd2Vla2RheXMnLCAnd2Vla2RheXNTaG9ydCcsICd3ZWVrZGF5c01pbiddO1xyXG5cclxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XHJcbiAgICAgICAgLy8gV2UgbmVlZCB0byBkZWVwIGNsb25lIHRoaXMgb2JqZWN0LCBhbmQgZXM1IHN0YW5kYXJkIGlzIG5vdCB2ZXJ5XHJcbiAgICAgICAgLy8gaGVscGZ1bC5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBlbXB0eSA6IGZhbHNlLFxyXG4gICAgICAgICAgICB1bnVzZWRUb2tlbnMgOiBbXSxcclxuICAgICAgICAgICAgdW51c2VkSW5wdXQgOiBbXSxcclxuICAgICAgICAgICAgb3ZlcmZsb3cgOiAtMixcclxuICAgICAgICAgICAgY2hhcnNMZWZ0T3ZlciA6IDAsXHJcbiAgICAgICAgICAgIG51bGxJbnB1dCA6IGZhbHNlLFxyXG4gICAgICAgICAgICBpbnZhbGlkTW9udGggOiBudWxsLFxyXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0IDogZmFsc2UsXHJcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc286IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYWRUb2tlbihmdW5jLCBjb3VudCkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKGZ1bmMuY2FsbCh0aGlzLCBhKSwgY291bnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvcmRpbmFsaXplVG9rZW4oZnVuYywgcGVyaW9kKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS5vcmRpbmFsKGZ1bmMuY2FsbCh0aGlzLCBhKSwgcGVyaW9kKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChvcmRpbmFsaXplVG9rZW5zLmxlbmd0aCkge1xyXG4gICAgICAgIGkgPSBvcmRpbmFsaXplVG9rZW5zLnBvcCgpO1xyXG4gICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW2kgKyAnbyddID0gb3JkaW5hbGl6ZVRva2VuKGZvcm1hdFRva2VuRnVuY3Rpb25zW2ldLCBpKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChwYWRkZWRUb2tlbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgaSA9IHBhZGRlZFRva2Vucy5wb3AoKTtcclxuICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1tpICsgaV0gPSBwYWRUb2tlbihmb3JtYXRUb2tlbkZ1bmN0aW9uc1tpXSwgMik7XHJcbiAgICB9XHJcbiAgICBmb3JtYXRUb2tlbkZ1bmN0aW9ucy5EREREID0gcGFkVG9rZW4oZm9ybWF0VG9rZW5GdW5jdGlvbnMuRERELCAzKTtcclxuXHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgIENvbnN0cnVjdG9yc1xyXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuICAgIGZ1bmN0aW9uIExhbmd1YWdlKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyBNb21lbnQgcHJvdG90eXBlIG9iamVjdFxyXG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xyXG4gICAgICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcclxuICAgICAgICBleHRlbmQodGhpcywgY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEdXJhdGlvbiBDb25zdHJ1Y3RvclxyXG4gICAgZnVuY3Rpb24gRHVyYXRpb24oZHVyYXRpb24pIHtcclxuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoZHVyYXRpb24pLFxyXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXHJcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxyXG4gICAgICAgICAgICB3ZWVrcyA9IG5vcm1hbGl6ZWRJbnB1dC53ZWVrIHx8IDAsXHJcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXHJcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcclxuICAgICAgICAgICAgbWludXRlcyA9IG5vcm1hbGl6ZWRJbnB1dC5taW51dGUgfHwgMCxcclxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcclxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XHJcblxyXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXHJcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gK21pbGxpc2Vjb25kcyArXHJcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXHJcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcclxuICAgICAgICAgICAgaG91cnMgKiAzNmU1OyAvLyAxMDAwICogNjAgKiA2MFxyXG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgZGF0ZUFkZFJlbW92ZSB0cmVhdHMgMjQgaG91cnMgYXMgZGlmZmVyZW50IGZyb20gYVxyXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcclxuICAgICAgICB0aGlzLl9kYXlzID0gK2RheXMgK1xyXG4gICAgICAgICAgICB3ZWVrcyAqIDc7XHJcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcclxuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxyXG4gICAgICAgIC8vIGl0IHNlcGFyYXRlbHkuXHJcbiAgICAgICAgdGhpcy5fbW9udGhzID0gK21vbnRocyArXHJcbiAgICAgICAgICAgIHllYXJzICogMTI7XHJcblxyXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgIEhlbHBlcnNcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcclxuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcclxuICAgICAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgIGFbaV0gPSBiW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShcInRvU3RyaW5nXCIpKSB7XHJcbiAgICAgICAgICAgIGEudG9TdHJpbmcgPSBiLnRvU3RyaW5nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZU9mXCIpKSB7XHJcbiAgICAgICAgICAgIGEudmFsdWVPZiA9IGIudmFsdWVPZjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsb25lTW9tZW50KG0pIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0ge30sIGk7XHJcbiAgICAgICAgZm9yIChpIGluIG0pIHtcclxuICAgICAgICAgICAgaWYgKG0uaGFzT3duUHJvcGVydHkoaSkgJiYgbW9tZW50UHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gbVtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhYnNSb3VuZChudW1iZXIpIHtcclxuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbGVmdCB6ZXJvIGZpbGwgYSBudW1iZXJcclxuICAgIC8vIHNlZSBodHRwOi8vanNwZXJmLmNvbS9sZWZ0LXplcm8tZmlsbGluZyBmb3IgcGVyZm9ybWFuY2UgY29tcGFyaXNvblxyXG4gICAgZnVuY3Rpb24gbGVmdFplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcclxuICAgICAgICB2YXIgb3V0cHV0ID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxyXG4gICAgICAgICAgICBzaWduID0gbnVtYmVyID49IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChvdXRwdXQubGVuZ3RoIDwgdGFyZ2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9ICcwJyArIG91dHB1dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgKyBvdXRwdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBfLmFkZFRpbWUgYW5kIF8uc3VidHJhY3RUaW1lXHJcbiAgICBmdW5jdGlvbiBhZGRPclN1YnRyYWN0RHVyYXRpb25Gcm9tTW9tZW50KG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCBpZ25vcmVVcGRhdGVPZmZzZXQpIHtcclxuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uX21pbGxpc2Vjb25kcyxcclxuICAgICAgICAgICAgZGF5cyA9IGR1cmF0aW9uLl9kYXlzLFxyXG4gICAgICAgICAgICBtb250aHMgPSBkdXJhdGlvbi5fbW9udGhzLFxyXG4gICAgICAgICAgICBtaW51dGVzLFxyXG4gICAgICAgICAgICBob3VycztcclxuXHJcbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcykge1xyXG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZSgrbW9tLl9kICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzdG9yZSB0aGUgbWludXRlcyBhbmQgaG91cnMgc28gd2UgY2FuIHJlc3RvcmUgdGhlbVxyXG4gICAgICAgIGlmIChkYXlzIHx8IG1vbnRocykge1xyXG4gICAgICAgICAgICBtaW51dGVzID0gbW9tLm1pbnV0ZSgpO1xyXG4gICAgICAgICAgICBob3VycyA9IG1vbS5ob3VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXlzKSB7XHJcbiAgICAgICAgICAgIG1vbS5kYXRlKG1vbS5kYXRlKCkgKyBkYXlzICogaXNBZGRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobW9udGhzKSB7XHJcbiAgICAgICAgICAgIG1vbS5tb250aChtb20ubW9udGgoKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcyAmJiAhaWdub3JlVXBkYXRlT2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQobW9tLCBkYXlzIHx8IG1vbnRocyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlc3RvcmUgdGhlIG1pbnV0ZXMgYW5kIGhvdXJzIGFmdGVyIHBvc3NpYmx5IGNoYW5naW5nIGRzdFxyXG4gICAgICAgIGlmIChkYXlzIHx8IG1vbnRocykge1xyXG4gICAgICAgICAgICBtb20ubWludXRlKG1pbnV0ZXMpO1xyXG4gICAgICAgICAgICBtb20uaG91cihob3Vycyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIGlmIGlzIGFuIGFycmF5XHJcbiAgICBmdW5jdGlvbiBpc0FycmF5KGlucHV0KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XHJcbiAgICAgICAgcmV0dXJuICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXScgfHxcclxuICAgICAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXHJcbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xyXG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcclxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcclxuICAgICAgICAgICAgZGlmZnMgPSAwLFxyXG4gICAgICAgICAgICBpO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxyXG4gICAgICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKSkge1xyXG4gICAgICAgICAgICAgICAgZGlmZnMrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB7XHJcbiAgICAgICAgaWYgKHVuaXRzKSB7XHJcbiAgICAgICAgICAgIHZhciBsb3dlcmVkID0gdW5pdHMudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oLilzJC8sICckMScpO1xyXG4gICAgICAgICAgICB1bml0cyA9IHVuaXRBbGlhc2VzW3VuaXRzXSB8fCBjYW1lbEZ1bmN0aW9uc1tsb3dlcmVkXSB8fCBsb3dlcmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5pdHM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcclxuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxyXG4gICAgICAgICAgICBwcm9wO1xyXG5cclxuICAgICAgICBmb3IgKHByb3AgaW4gaW5wdXRPYmplY3QpIHtcclxuICAgICAgICAgICAgaWYgKGlucHV0T2JqZWN0Lmhhc093blByb3BlcnR5KHByb3ApKSB7XHJcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVVuaXRzKHByb3ApO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0W25vcm1hbGl6ZWRQcm9wXSA9IGlucHV0T2JqZWN0W3Byb3BdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1ha2VMaXN0KGZpZWxkKSB7XHJcbiAgICAgICAgdmFyIGNvdW50LCBzZXR0ZXI7XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC5pbmRleE9mKCd3ZWVrJykgPT09IDApIHtcclxuICAgICAgICAgICAgY291bnQgPSA3O1xyXG4gICAgICAgICAgICBzZXR0ZXIgPSAnZGF5JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZmllbGQuaW5kZXhPZignbW9udGgnKSA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb3VudCA9IDEyO1xyXG4gICAgICAgICAgICBzZXR0ZXIgPSAnbW9udGgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbW9tZW50W2ZpZWxkXSA9IGZ1bmN0aW9uIChmb3JtYXQsIGluZGV4KSB7XHJcbiAgICAgICAgICAgIHZhciBpLCBnZXR0ZXIsXHJcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBtb21lbnQuZm4uX2xhbmdbZmllbGRdLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcclxuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZ2V0dGVyID0gZnVuY3Rpb24gKGkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtID0gbW9tZW50KCkudXRjKCkuc2V0KHNldHRlciwgaSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmNhbGwobW9tZW50LmZuLl9sYW5nLCBtLCBmb3JtYXQgfHwgJycpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXIoaW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZ2V0dGVyKGkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0b0ludChhcmd1bWVudEZvckNvZXJjaW9uKSB7XHJcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcclxuICAgICAgICAgICAgdmFsdWUgPSAwO1xyXG5cclxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xyXG4gICAgICAgICAgICBpZiAoY29lcmNlZE51bWJlciA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IE1hdGguZmxvb3IoY29lcmNlZE51bWJlcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IE1hdGguY2VpbChjb2VyY2VkTnVtYmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoICsgMSwgMCkpLmdldFVUQ0RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xyXG4gICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1vbWVudChbeWVhciwgMTEsIDMxICsgZG93IC0gZG95XSksIGRvdywgZG95KS53ZWVrO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xyXG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xyXG4gICAgICAgIHJldHVybiAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkgfHwgeWVhciAlIDQwMCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93KG0pIHtcclxuICAgICAgICB2YXIgb3ZlcmZsb3c7XHJcbiAgICAgICAgaWYgKG0uX2EgJiYgbS5fcGYub3ZlcmZsb3cgPT09IC0yKSB7XHJcbiAgICAgICAgICAgIG92ZXJmbG93ID1cclxuICAgICAgICAgICAgICAgIG0uX2FbTU9OVEhdIDwgMCB8fCBtLl9hW01PTlRIXSA+IDExID8gTU9OVEggOlxyXG4gICAgICAgICAgICAgICAgbS5fYVtEQVRFXSA8IDEgfHwgbS5fYVtEQVRFXSA+IGRheXNJbk1vbnRoKG0uX2FbWUVBUl0sIG0uX2FbTU9OVEhdKSA/IERBVEUgOlxyXG4gICAgICAgICAgICAgICAgbS5fYVtIT1VSXSA8IDAgfHwgbS5fYVtIT1VSXSA+IDIzID8gSE9VUiA6XHJcbiAgICAgICAgICAgICAgICBtLl9hW01JTlVURV0gPCAwIHx8IG0uX2FbTUlOVVRFXSA+IDU5ID8gTUlOVVRFIDpcclxuICAgICAgICAgICAgICAgIG0uX2FbU0VDT05EXSA8IDAgfHwgbS5fYVtTRUNPTkRdID4gNTkgPyBTRUNPTkQgOlxyXG4gICAgICAgICAgICAgICAgbS5fYVtNSUxMSVNFQ09ORF0gPCAwIHx8IG0uX2FbTUlMTElTRUNPTkRdID4gOTk5ID8gTUlMTElTRUNPTkQgOlxyXG4gICAgICAgICAgICAgICAgLTE7XHJcblxyXG4gICAgICAgICAgICBpZiAobS5fcGYuX292ZXJmbG93RGF5T2ZZZWFyICYmIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKSkge1xyXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBEQVRFO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBtLl9wZi5vdmVyZmxvdyA9IG92ZXJmbG93O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpc1ZhbGlkKG0pIHtcclxuICAgICAgICBpZiAobS5faXNWYWxpZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG0uX2lzVmFsaWQgPSAhaXNOYU4obS5fZC5nZXRUaW1lKCkpICYmXHJcbiAgICAgICAgICAgICAgICBtLl9wZi5vdmVyZmxvdyA8IDAgJiZcclxuICAgICAgICAgICAgICAgICFtLl9wZi5lbXB0eSAmJlxyXG4gICAgICAgICAgICAgICAgIW0uX3BmLmludmFsaWRNb250aCAmJlxyXG4gICAgICAgICAgICAgICAgIW0uX3BmLm51bGxJbnB1dCAmJlxyXG4gICAgICAgICAgICAgICAgIW0uX3BmLmludmFsaWRGb3JtYXQgJiZcclxuICAgICAgICAgICAgICAgICFtLl9wZi51c2VySW52YWxpZGF0ZWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAobS5fc3RyaWN0KSB7XHJcbiAgICAgICAgICAgICAgICBtLl9pc1ZhbGlkID0gbS5faXNWYWxpZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIG0uX3BmLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICBtLl9wZi51bnVzZWRUb2tlbnMubGVuZ3RoID09PSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtLl9pc1ZhbGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxhbmd1YWdlKGtleSkge1xyXG4gICAgICAgIHJldHVybiBrZXkgPyBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdfJywgJy0nKSA6IGtleTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvem9uZSBlcXVpdmFsZW50IHRvIG1vZGVsLlxyXG4gICAgZnVuY3Rpb24gbWFrZUFzKGlucHV0LCBtb2RlbCkge1xyXG4gICAgICAgIHJldHVybiBtb2RlbC5faXNVVEMgPyBtb21lbnQoaW5wdXQpLnpvbmUobW9kZWwuX29mZnNldCB8fCAwKSA6XHJcbiAgICAgICAgICAgIG1vbWVudChpbnB1dCkubG9jYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgICAgTGFuZ3VhZ2VzXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cclxuICAgIGV4dGVuZChMYW5ndWFnZS5wcm90b3R5cGUsIHtcclxuXHJcbiAgICAgICAgc2V0IDogZnVuY3Rpb24gKGNvbmZpZykge1xyXG4gICAgICAgICAgICB2YXIgcHJvcCwgaTtcclxuICAgICAgICAgICAgZm9yIChpIGluIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgcHJvcCA9IGNvbmZpZ1tpXTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9tb250aHMgOiBcIkphbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXJcIi5zcGxpdChcIl9cIiksXHJcbiAgICAgICAgbW9udGhzIDogZnVuY3Rpb24gKG0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1ttLm1vbnRoKCldO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9tb250aHNTaG9ydCA6IFwiSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWNcIi5zcGxpdChcIl9cIiksXHJcbiAgICAgICAgbW9udGhzU2hvcnQgOiBmdW5jdGlvbiAobSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRbbS5tb250aCgpXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBtb250aHNQYXJzZSA6IGZ1bmN0aW9uIChtb250aE5hbWUpIHtcclxuICAgICAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9tID0gbW9tZW50LnV0YyhbMjAwMCwgaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykgKyAnfF4nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfd2Vla2RheXMgOiBcIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5XCIuc3BsaXQoXCJfXCIpLFxyXG4gICAgICAgIHdlZWtkYXlzIDogZnVuY3Rpb24gKG0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzW20uZGF5KCldO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF93ZWVrZGF5c1Nob3J0IDogXCJTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXRcIi5zcGxpdChcIl9cIiksXHJcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6IGZ1bmN0aW9uIChtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0W20uZGF5KCldO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF93ZWVrZGF5c01pbiA6IFwiU3VfTW9fVHVfV2VfVGhfRnJfU2FcIi5zcGxpdChcIl9cIiksXHJcbiAgICAgICAgd2Vla2RheXNNaW4gOiBmdW5jdGlvbiAobSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5bbS5kYXkoKV07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgd2Vla2RheXNQYXJzZSA6IGZ1bmN0aW9uICh3ZWVrZGF5TmFtZSkge1xyXG4gICAgICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vbSA9IG1vbWVudChbMjAwMCwgMV0pLmRheShpKTtcclxuICAgICAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpICsgJ3xeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2xvbmdEYXRlRm9ybWF0IDoge1xyXG4gICAgICAgICAgICBMVCA6IFwiaDptbSBBXCIsXHJcbiAgICAgICAgICAgIEwgOiBcIk1NL0REL1lZWVlcIixcclxuICAgICAgICAgICAgTEwgOiBcIk1NTU0gRCBZWVlZXCIsXHJcbiAgICAgICAgICAgIExMTCA6IFwiTU1NTSBEIFlZWVkgTFRcIixcclxuICAgICAgICAgICAgTExMTCA6IFwiZGRkZCwgTU1NTSBEIFlZWVkgTFRcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldO1xyXG4gICAgICAgICAgICBpZiAoIW91dHB1dCAmJiB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV0pIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXS5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwuc2xpY2UoMSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBvdXRwdXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XHJcbiAgICAgICAgICAgIC8vIElFOCBRdWlya3MgTW9kZSAmIElFNyBTdGFuZGFyZHMgTW9kZSBkbyBub3QgYWxsb3cgYWNjZXNzaW5nIHN0cmluZ3MgbGlrZSBhcnJheXNcclxuICAgICAgICAgICAgLy8gVXNpbmcgY2hhckF0IHNob3VsZCBiZSBtb3JlIGNvbXBhdGlibGUuXHJcbiAgICAgICAgICAgIHJldHVybiAoKGlucHV0ICsgJycpLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApID09PSAncCcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9tZXJpZGllbVBhcnNlIDogL1thcF1cXC4/bT9cXC4/L2ksXHJcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcclxuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BtJyA6ICdQTSc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhbScgOiAnQU0nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NhbGVuZGFyIDoge1xyXG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tUb2RheSBhdF0gTFQnLFxyXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tUb21vcnJvdyBhdF0gTFQnLFxyXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxyXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcclxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXHJcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjYWxlbmRhciA6IGZ1bmN0aW9uIChrZXksIG1vbSkge1xyXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XTtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBvdXRwdXQgPT09ICdmdW5jdGlvbicgPyBvdXRwdXQuYXBwbHkobW9tKSA6IG91dHB1dDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfcmVsYXRpdmVUaW1lIDoge1xyXG4gICAgICAgICAgICBmdXR1cmUgOiBcImluICVzXCIsXHJcbiAgICAgICAgICAgIHBhc3QgOiBcIiVzIGFnb1wiLFxyXG4gICAgICAgICAgICBzIDogXCJhIGZldyBzZWNvbmRzXCIsXHJcbiAgICAgICAgICAgIG0gOiBcImEgbWludXRlXCIsXHJcbiAgICAgICAgICAgIG1tIDogXCIlZCBtaW51dGVzXCIsXHJcbiAgICAgICAgICAgIGggOiBcImFuIGhvdXJcIixcclxuICAgICAgICAgICAgaGggOiBcIiVkIGhvdXJzXCIsXHJcbiAgICAgICAgICAgIGQgOiBcImEgZGF5XCIsXHJcbiAgICAgICAgICAgIGRkIDogXCIlZCBkYXlzXCIsXHJcbiAgICAgICAgICAgIE0gOiBcImEgbW9udGhcIixcclxuICAgICAgICAgICAgTU0gOiBcIiVkIG1vbnRoc1wiLFxyXG4gICAgICAgICAgICB5IDogXCJhIHllYXJcIixcclxuICAgICAgICAgICAgeXkgOiBcIiVkIHllYXJzXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcclxuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX3JlbGF0aXZlVGltZVtzdHJpbmddO1xyXG4gICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBvdXRwdXQgPT09ICdmdW5jdGlvbicpID9cclxuICAgICAgICAgICAgICAgIG91dHB1dChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIDpcclxuICAgICAgICAgICAgICAgIG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcGFzdEZ1dHVyZSA6IGZ1bmN0aW9uIChkaWZmLCBvdXRwdXQpIHtcclxuICAgICAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBmb3JtYXQgPT09ICdmdW5jdGlvbicgPyBmb3JtYXQob3V0cHV0KSA6IGZvcm1hdC5yZXBsYWNlKC8lcy9pLCBvdXRwdXQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoXCIlZFwiLCBudW1iZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgX29yZGluYWwgOiBcIiVkXCIsXHJcblxyXG4gICAgICAgIHByZXBhcnNlIDogZnVuY3Rpb24gKHN0cmluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHBvc3Rmb3JtYXQgOiBmdW5jdGlvbiAoc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgd2VlayA6IGZ1bmN0aW9uIChtb20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3dlZWsgOiB7XHJcbiAgICAgICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxyXG4gICAgICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2ludmFsaWREYXRlOiAnSW52YWxpZCBkYXRlJyxcclxuICAgICAgICBpbnZhbGlkRGF0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gTG9hZHMgYSBsYW5ndWFnZSBkZWZpbml0aW9uIGludG8gdGhlIGBsYW5ndWFnZXNgIGNhY2hlLiAgVGhlIGZ1bmN0aW9uXHJcbiAgICAvLyB0YWtlcyBhIGtleSBhbmQgb3B0aW9uYWxseSB2YWx1ZXMuICBJZiBub3QgaW4gdGhlIGJyb3dzZXIgYW5kIG5vIHZhbHVlc1xyXG4gICAgLy8gYXJlIHByb3ZpZGVkLCBpdCB3aWxsIGxvYWQgdGhlIGxhbmd1YWdlIGZpbGUgbW9kdWxlLiAgQXMgYSBjb252ZW5pZW5jZSxcclxuICAgIC8vIHRoaXMgZnVuY3Rpb24gYWxzbyByZXR1cm5zIHRoZSBsYW5ndWFnZSB2YWx1ZXMuXHJcbiAgICBmdW5jdGlvbiBsb2FkTGFuZyhrZXksIHZhbHVlcykge1xyXG4gICAgICAgIHZhbHVlcy5hYmJyID0ga2V5O1xyXG4gICAgICAgIGlmICghbGFuZ3VhZ2VzW2tleV0pIHtcclxuICAgICAgICAgICAgbGFuZ3VhZ2VzW2tleV0gPSBuZXcgTGFuZ3VhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGFuZ3VhZ2VzW2tleV0uc2V0KHZhbHVlcyk7XHJcbiAgICAgICAgcmV0dXJuIGxhbmd1YWdlc1trZXldO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSBhIGxhbmd1YWdlIGZyb20gdGhlIGBsYW5ndWFnZXNgIGNhY2hlLiBNb3N0bHkgdXNlZnVsIGluIHRlc3RzLlxyXG4gICAgZnVuY3Rpb24gdW5sb2FkTGFuZyhrZXkpIHtcclxuICAgICAgICBkZWxldGUgbGFuZ3VhZ2VzW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGV0ZXJtaW5lcyB3aGljaCBsYW5ndWFnZSBkZWZpbml0aW9uIHRvIHVzZSBhbmQgcmV0dXJucyBpdC5cclxuICAgIC8vXHJcbiAgICAvLyBXaXRoIG5vIHBhcmFtZXRlcnMsIGl0IHdpbGwgcmV0dXJuIHRoZSBnbG9iYWwgbGFuZ3VhZ2UuICBJZiB5b3VcclxuICAgIC8vIHBhc3MgaW4gYSBsYW5ndWFnZSBrZXksIHN1Y2ggYXMgJ2VuJywgaXQgd2lsbCByZXR1cm4gdGhlXHJcbiAgICAvLyBkZWZpbml0aW9uIGZvciAnZW4nLCBzbyBsb25nIGFzICdlbicgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgdXNpbmdcclxuICAgIC8vIG1vbWVudC5sYW5nLlxyXG4gICAgZnVuY3Rpb24gZ2V0TGFuZ0RlZmluaXRpb24oa2V5KSB7XHJcbiAgICAgICAgdmFyIGkgPSAwLCBqLCBsYW5nLCBuZXh0LCBzcGxpdCxcclxuICAgICAgICAgICAgZ2V0ID0gZnVuY3Rpb24gKGspIHtcclxuICAgICAgICAgICAgICAgIGlmICghbGFuZ3VhZ2VzW2tdICYmIGhhc01vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJy4vbGFuZy8nICsgayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFuZ3VhZ2VzW2tdO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9tZW50LmZuLl9sYW5nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcclxuICAgICAgICAgICAgLy9zaG9ydC1jaXJjdWl0IGV2ZXJ5dGhpbmcgZWxzZVxyXG4gICAgICAgICAgICBsYW5nID0gZ2V0KGtleSk7XHJcbiAgICAgICAgICAgIGlmIChsYW5nKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFuZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBrZXkgPSBba2V5XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcGljayB0aGUgbGFuZ3VhZ2UgZnJvbSB0aGUgYXJyYXlcclxuICAgICAgICAvL3RyeSBbJ2VuLWF1JywgJ2VuLWdiJ10gYXMgJ2VuLWF1JywgJ2VuLWdiJywgJ2VuJywgYXMgaW4gbW92ZSB0aHJvdWdoIHRoZSBsaXN0IHRyeWluZyBlYWNoXHJcbiAgICAgICAgLy9zdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XHJcbiAgICAgICAgd2hpbGUgKGkgPCBrZXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHNwbGl0ID0gbm9ybWFsaXplTGFuZ3VhZ2Uoa2V5W2ldKS5zcGxpdCgnLScpO1xyXG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBuZXh0ID0gbm9ybWFsaXplTGFuZ3VhZ2Uoa2V5W2kgKyAxXSk7XHJcbiAgICAgICAgICAgIG5leHQgPSBuZXh0ID8gbmV4dC5zcGxpdCgnLScpIDogbnVsbDtcclxuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsYW5nID0gZ2V0KHNwbGl0LnNsaWNlKDAsIGopLmpvaW4oJy0nKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobGFuZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYW5nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgYXJyYXkgaXRlbSBpcyBiZXR0ZXIgdGhhbiBhIHNoYWxsb3dlciBzdWJzdHJpbmcgb2YgdGhpcyBvbmVcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGotLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtb21lbnQuZm4uX2xhbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgIEZvcm1hdHRpbmdcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xyXG4gICAgICAgIGlmIChpbnB1dC5tYXRjaCgvXFxbW1xcc1xcU10vKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KSB7XHJcbiAgICAgICAgdmFyIGFycmF5ID0gZm9ybWF0Lm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpLCBpLCBsZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV0pIHtcclxuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGFycmF5W2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcclxuICAgICAgICAgICAgdmFyIG91dHB1dCA9IFwiXCI7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGFycmF5W2ldIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KSA6IGFycmF5W2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcclxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcclxuXHJcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbS5sYW5nKCkuaW52YWxpZERhdGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvcm1hdCA9IGV4cGFuZEZvcm1hdChmb3JtYXQsIG0ubGFuZygpKTtcclxuXHJcbiAgICAgICAgaWYgKCFmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSkge1xyXG4gICAgICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSA9IG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxhbmcpIHtcclxuICAgICAgICB2YXIgaSA9IDU7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2VucyhpbnB1dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGFuZy5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcclxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UobG9jYWxGb3JtYXR0aW5nVG9rZW5zLCByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMpO1xyXG4gICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcclxuICAgICAgICAgICAgaSAtPSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgIFBhcnNpbmdcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblxyXG4gICAgLy8gZ2V0IHRoZSByZWdleCB0byBmaW5kIHRoZSBuZXh0IHRva2VuXHJcbiAgICBmdW5jdGlvbiBnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykge1xyXG4gICAgICAgIHZhciBhLCBzdHJpY3QgPSBjb25maWcuX3N0cmljdDtcclxuICAgICAgICBzd2l0Y2ggKHRva2VuKSB7XHJcbiAgICAgICAgY2FzZSAnRERERCc6XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuVGhyZWVEaWdpdHM7XHJcbiAgICAgICAgY2FzZSAnWVlZWSc6XHJcbiAgICAgICAgY2FzZSAnR0dHRyc6XHJcbiAgICAgICAgY2FzZSAnZ2dnZyc6XHJcbiAgICAgICAgICAgIHJldHVybiBzdHJpY3QgPyBwYXJzZVRva2VuRm91ckRpZ2l0cyA6IHBhcnNlVG9rZW5PbmVUb0ZvdXJEaWdpdHM7XHJcbiAgICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgY2FzZSAnRyc6XHJcbiAgICAgICAgY2FzZSAnZyc6XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuU2lnbmVkTnVtYmVyO1xyXG4gICAgICAgIGNhc2UgJ1lZWVlZWSc6XHJcbiAgICAgICAgY2FzZSAnWVlZWVknOlxyXG4gICAgICAgIGNhc2UgJ0dHR0dHJzpcclxuICAgICAgICBjYXNlICdnZ2dnZyc6XHJcbiAgICAgICAgICAgIHJldHVybiBzdHJpY3QgPyBwYXJzZVRva2VuU2l4RGlnaXRzIDogcGFyc2VUb2tlbk9uZVRvU2l4RGlnaXRzO1xyXG4gICAgICAgIGNhc2UgJ1MnOlxyXG4gICAgICAgICAgICBpZiAoc3RyaWN0KSB7IHJldHVybiBwYXJzZVRva2VuT25lRGlnaXQ7IH1cclxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xyXG4gICAgICAgIGNhc2UgJ1NTJzpcclxuICAgICAgICAgICAgaWYgKHN0cmljdCkgeyByZXR1cm4gcGFyc2VUb2tlblR3b0RpZ2l0czsgfVxyXG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXHJcbiAgICAgICAgY2FzZSAnU1NTJzpcclxuICAgICAgICAgICAgaWYgKHN0cmljdCkgeyByZXR1cm4gcGFyc2VUb2tlblRocmVlRGlnaXRzOyB9XHJcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cclxuICAgICAgICBjYXNlICdEREQnOlxyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbk9uZVRvVGhyZWVEaWdpdHM7XHJcbiAgICAgICAgY2FzZSAnTU1NJzpcclxuICAgICAgICBjYXNlICdNTU1NJzpcclxuICAgICAgICBjYXNlICdkZCc6XHJcbiAgICAgICAgY2FzZSAnZGRkJzpcclxuICAgICAgICBjYXNlICdkZGRkJzpcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5Xb3JkO1xyXG4gICAgICAgIGNhc2UgJ2EnOlxyXG4gICAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICAgICAgICByZXR1cm4gZ2V0TGFuZ0RlZmluaXRpb24oY29uZmlnLl9sKS5fbWVyaWRpZW1QYXJzZTtcclxuICAgICAgICBjYXNlICdYJzpcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5UaW1lc3RhbXBNcztcclxuICAgICAgICBjYXNlICdaJzpcclxuICAgICAgICBjYXNlICdaWic6XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuVGltZXpvbmU7XHJcbiAgICAgICAgY2FzZSAnVCc6XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuVDtcclxuICAgICAgICBjYXNlICdTU1NTJzpcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5EaWdpdHM7XHJcbiAgICAgICAgY2FzZSAnTU0nOlxyXG4gICAgICAgIGNhc2UgJ0REJzpcclxuICAgICAgICBjYXNlICdZWSc6XHJcbiAgICAgICAgY2FzZSAnR0cnOlxyXG4gICAgICAgIGNhc2UgJ2dnJzpcclxuICAgICAgICBjYXNlICdISCc6XHJcbiAgICAgICAgY2FzZSAnaGgnOlxyXG4gICAgICAgIGNhc2UgJ21tJzpcclxuICAgICAgICBjYXNlICdzcyc6XHJcbiAgICAgICAgY2FzZSAnd3cnOlxyXG4gICAgICAgIGNhc2UgJ1dXJzpcclxuICAgICAgICAgICAgcmV0dXJuIHN0cmljdCA/IHBhcnNlVG9rZW5Ud29EaWdpdHMgOiBwYXJzZVRva2VuT25lT3JUd29EaWdpdHM7XHJcbiAgICAgICAgY2FzZSAnTSc6XHJcbiAgICAgICAgY2FzZSAnRCc6XHJcbiAgICAgICAgY2FzZSAnZCc6XHJcbiAgICAgICAgY2FzZSAnSCc6XHJcbiAgICAgICAgY2FzZSAnaCc6XHJcbiAgICAgICAgY2FzZSAnbSc6XHJcbiAgICAgICAgY2FzZSAncyc6XHJcbiAgICAgICAgY2FzZSAndyc6XHJcbiAgICAgICAgY2FzZSAnVyc6XHJcbiAgICAgICAgY2FzZSAnZSc6XHJcbiAgICAgICAgY2FzZSAnRSc6XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuT25lT3JUd29EaWdpdHM7XHJcbiAgICAgICAgY2FzZSAnRG8nOlxyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbk9yZGluYWw7XHJcbiAgICAgICAgZGVmYXVsdCA6XHJcbiAgICAgICAgICAgIGEgPSBuZXcgUmVnRXhwKHJlZ2V4cEVzY2FwZSh1bmVzY2FwZUZvcm1hdCh0b2tlbi5yZXBsYWNlKCdcXFxcJywgJycpKSwgXCJpXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRpbWV6b25lTWludXRlc0Zyb21TdHJpbmcoc3RyaW5nKSB7XHJcbiAgICAgICAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCI7XHJcbiAgICAgICAgdmFyIHBvc3NpYmxlVHpNYXRjaGVzID0gKHN0cmluZy5tYXRjaChwYXJzZVRva2VuVGltZXpvbmUpIHx8IFtdKSxcclxuICAgICAgICAgICAgdHpDaHVuayA9IHBvc3NpYmxlVHpNYXRjaGVzW3Bvc3NpYmxlVHpNYXRjaGVzLmxlbmd0aCAtIDFdIHx8IFtdLFxyXG4gICAgICAgICAgICBwYXJ0cyA9ICh0ekNodW5rICsgJycpLm1hdGNoKHBhcnNlVGltZXpvbmVDaHVua2VyKSB8fCBbJy0nLCAwLCAwXSxcclxuICAgICAgICAgICAgbWludXRlcyA9ICsocGFydHNbMV0gKiA2MCkgKyB0b0ludChwYXJ0c1syXSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwYXJ0c1swXSA9PT0gJysnID8gLW1pbnV0ZXMgOiBtaW51dGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZ1bmN0aW9uIHRvIGNvbnZlcnQgc3RyaW5nIGlucHV0IHRvIGRhdGVcclxuICAgIGZ1bmN0aW9uIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBpbnB1dCwgY29uZmlnKSB7XHJcbiAgICAgICAgdmFyIGEsIGRhdGVQYXJ0QXJyYXkgPSBjb25maWcuX2E7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcclxuICAgICAgICAvLyBNT05USFxyXG4gICAgICAgIGNhc2UgJ00nIDogLy8gZmFsbCB0aHJvdWdoIHRvIE1NXHJcbiAgICAgICAgY2FzZSAnTU0nIDpcclxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbTU9OVEhdID0gdG9JbnQoaW5wdXQpIC0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdNTU0nIDogLy8gZmFsbCB0aHJvdWdoIHRvIE1NTU1cclxuICAgICAgICBjYXNlICdNTU1NJyA6XHJcbiAgICAgICAgICAgIGEgPSBnZXRMYW5nRGVmaW5pdGlvbihjb25maWcuX2wpLm1vbnRoc1BhcnNlKGlucHV0KTtcclxuICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbmQgYSBtb250aCBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWQuXHJcbiAgICAgICAgICAgIGlmIChhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbTU9OVEhdID0gYTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5fcGYuaW52YWxpZE1vbnRoID0gaW5wdXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gREFZIE9GIE1PTlRIXHJcbiAgICAgICAgY2FzZSAnRCcgOiAvLyBmYWxsIHRocm91Z2ggdG8gRERcclxuICAgICAgICBjYXNlICdERCcgOlxyXG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtEQVRFXSA9IHRvSW50KGlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdEbycgOlxyXG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtEQVRFXSA9IHRvSW50KHBhcnNlSW50KGlucHV0LCAxMCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vIERBWSBPRiBZRUFSXHJcbiAgICAgICAgY2FzZSAnREREJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBEREREXHJcbiAgICAgICAgY2FzZSAnRERERCcgOlxyXG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0b0ludChpbnB1dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vIFlFQVJcclxuICAgICAgICBjYXNlICdZWScgOlxyXG4gICAgICAgICAgICBkYXRlUGFydEFycmF5W1lFQVJdID0gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdZWVlZJyA6XHJcbiAgICAgICAgY2FzZSAnWVlZWVknIDpcclxuICAgICAgICBjYXNlICdZWVlZWVknIDpcclxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtZRUFSXSA9IHRvSW50KGlucHV0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gQU0gLyBQTVxyXG4gICAgICAgIGNhc2UgJ2EnIDogLy8gZmFsbCB0aHJvdWdoIHRvIEFcclxuICAgICAgICBjYXNlICdBJyA6XHJcbiAgICAgICAgICAgIGNvbmZpZy5faXNQbSA9IGdldExhbmdEZWZpbml0aW9uKGNvbmZpZy5fbCkuaXNQTShpbnB1dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vIDI0IEhPVVJcclxuICAgICAgICBjYXNlICdIJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBoaFxyXG4gICAgICAgIGNhc2UgJ0hIJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBoaFxyXG4gICAgICAgIGNhc2UgJ2gnIDogLy8gZmFsbCB0aHJvdWdoIHRvIGhoXHJcbiAgICAgICAgY2FzZSAnaGgnIDpcclxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtIT1VSXSA9IHRvSW50KGlucHV0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gTUlOVVRFXHJcbiAgICAgICAgY2FzZSAnbScgOiAvLyBmYWxsIHRocm91Z2ggdG8gbW1cclxuICAgICAgICBjYXNlICdtbScgOlxyXG4gICAgICAgICAgICBkYXRlUGFydEFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vIFNFQ09ORFxyXG4gICAgICAgIGNhc2UgJ3MnIDogLy8gZmFsbCB0aHJvdWdoIHRvIHNzXHJcbiAgICAgICAgY2FzZSAnc3MnIDpcclxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAvLyBNSUxMSVNFQ09ORFxyXG4gICAgICAgIGNhc2UgJ1MnIDpcclxuICAgICAgICBjYXNlICdTUycgOlxyXG4gICAgICAgIGNhc2UgJ1NTUycgOlxyXG4gICAgICAgIGNhc2UgJ1NTU1MnIDpcclxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAvLyBVTklYIFRJTUVTVEFNUCBXSVRIIE1TXHJcbiAgICAgICAgY2FzZSAnWCc6XHJcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQpICogMTAwMCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vIFRJTUVaT05FXHJcbiAgICAgICAgY2FzZSAnWicgOiAvLyBmYWxsIHRocm91Z2ggdG8gWlpcclxuICAgICAgICBjYXNlICdaWicgOlxyXG4gICAgICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fdHptID0gdGltZXpvbmVNaW51dGVzRnJvbVN0cmluZyhpbnB1dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3cnOlxyXG4gICAgICAgIGNhc2UgJ3d3JzpcclxuICAgICAgICBjYXNlICdXJzpcclxuICAgICAgICBjYXNlICdXVyc6XHJcbiAgICAgICAgY2FzZSAnZCc6XHJcbiAgICAgICAgY2FzZSAnZGQnOlxyXG4gICAgICAgIGNhc2UgJ2RkZCc6XHJcbiAgICAgICAgY2FzZSAnZGRkZCc6XHJcbiAgICAgICAgY2FzZSAnZSc6XHJcbiAgICAgICAgY2FzZSAnRSc6XHJcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKDAsIDEpO1xyXG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXHJcbiAgICAgICAgY2FzZSAnZ2cnOlxyXG4gICAgICAgIGNhc2UgJ2dnZ2cnOlxyXG4gICAgICAgIGNhc2UgJ0dHJzpcclxuICAgICAgICBjYXNlICdHR0dHJzpcclxuICAgICAgICBjYXNlICdHR0dHRyc6XHJcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKDAsIDIpO1xyXG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5fdyA9IGNvbmZpZy5fdyB8fCB7fTtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5fd1t0b2tlbl0gPSBpbnB1dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXHJcbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xyXG4gICAgLy8gbm90ZTogYWxsIHZhbHVlcyBwYXN0IHRoZSB5ZWFyIGFyZSBvcHRpb25hbCBhbmQgd2lsbCBkZWZhdWx0IHRvIHRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cclxuICAgIGZ1bmN0aW9uIGRhdGVGcm9tQ29uZmlnKGNvbmZpZykge1xyXG4gICAgICAgIHZhciBpLCBkYXRlLCBpbnB1dCA9IFtdLCBjdXJyZW50RGF0ZSxcclxuICAgICAgICAgICAgeWVhclRvVXNlLCBmaXhZZWFyLCB3LCB0ZW1wLCBsYW5nLCB3ZWVrZGF5LCB3ZWVrO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xyXG5cclxuICAgICAgICAvL2NvbXB1dGUgZGF5IG9mIHRoZSB5ZWFyIGZyb20gd2Vla3MgYW5kIHdlZWtkYXlzXHJcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcclxuICAgICAgICAgICAgZml4WWVhciA9IGZ1bmN0aW9uICh2YWwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbnRfdmFsID0gcGFyc2VJbnQodmFsLCAxMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsID9cclxuICAgICAgICAgICAgICAgICAgKHZhbC5sZW5ndGggPCAzID8gKGludF92YWwgPiA2OCA/IDE5MDAgKyBpbnRfdmFsIDogMjAwMCArIGludF92YWwpIDogaW50X3ZhbCkgOlxyXG4gICAgICAgICAgICAgICAgICAoY29uZmlnLl9hW1lFQVJdID09IG51bGwgPyBtb21lbnQoKS53ZWVrWWVhcigpIDogY29uZmlnLl9hW1lFQVJdKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHcgPSBjb25maWcuX3c7XHJcbiAgICAgICAgICAgIGlmICh3LkdHICE9IG51bGwgfHwgdy5XICE9IG51bGwgfHwgdy5FICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRlbXAgPSBkYXlPZlllYXJGcm9tV2Vla3MoZml4WWVhcih3LkdHKSwgdy5XIHx8IDEsIHcuRSwgNCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYW5nID0gZ2V0TGFuZ0RlZmluaXRpb24oY29uZmlnLl9sKTtcclxuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmQgIT0gbnVsbCA/ICBwYXJzZVdlZWtkYXkody5kLCBsYW5nKSA6XHJcbiAgICAgICAgICAgICAgICAgICh3LmUgIT0gbnVsbCA/ICBwYXJzZUludCh3LmUsIDEwKSArIGxhbmcuX3dlZWsuZG93IDogMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgd2VlayA9IHBhcnNlSW50KHcudywgMTApIHx8IDE7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9pZiB3ZSdyZSBwYXJzaW5nICdkJywgdGhlbiB0aGUgbG93IGRheSBudW1iZXJzIG1heSBiZSBuZXh0IHdlZWtcclxuICAgICAgICAgICAgICAgIGlmICh3LmQgIT0gbnVsbCAmJiB3ZWVrZGF5IDwgbGFuZy5fd2Vlay5kb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB3ZWVrKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyhmaXhZZWFyKHcuZ2cpLCB3ZWVrLCB3ZWVrZGF5LCBsYW5nLl93ZWVrLmRveSwgbGFuZy5fd2Vlay5kb3cpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSB0ZW1wLnllYXI7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdGVtcC5kYXlPZlllYXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIHRoZSBkYXkgb2YgdGhlIHllYXIgaXMgc2V0LCBmaWd1cmUgb3V0IHdoYXQgaXQgaXNcclxuICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIpIHtcclxuICAgICAgICAgICAgeWVhclRvVXNlID0gY29uZmlnLl9hW1lFQVJdID09IG51bGwgPyBjdXJyZW50RGF0ZVtZRUFSXSA6IGNvbmZpZy5fYVtZRUFSXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciA+IGRheXNJblllYXIoeWVhclRvVXNlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLl9wZi5fb3ZlcmZsb3dEYXlPZlllYXIgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkYXRlID0gbWFrZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNT05USF0gPSBkYXRlLmdldFVUQ01vbnRoKCk7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fYVtEQVRFXSA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXHJcbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxyXG4gICAgICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXHJcbiAgICAgICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBaZXJvIG91dCB3aGF0ZXZlciB3YXMgbm90IGRlZmF1bHRlZCwgaW5jbHVkaW5nIHRpbWVcclxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xyXG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IChjb25maWcuX2FbaV0gPT0gbnVsbCkgPyAoaSA9PT0gMiA/IDEgOiAwKSA6IGNvbmZpZy5fYVtpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkZCB0aGUgb2Zmc2V0cyB0byB0aGUgdGltZSB0byBiZSBwYXJzZWQgc28gdGhhdCB3ZSBjYW4gaGF2ZSBhIGNsZWFuIGFycmF5IGZvciBjaGVja2luZyBpc1ZhbGlkXHJcbiAgICAgICAgaW5wdXRbSE9VUl0gKz0gdG9JbnQoKGNvbmZpZy5fdHptIHx8IDApIC8gNjApO1xyXG4gICAgICAgIGlucHV0W01JTlVURV0gKz0gdG9JbnQoKGNvbmZpZy5fdHptIHx8IDApICUgNjApO1xyXG5cclxuICAgICAgICBjb25maWcuX2QgPSAoY29uZmlnLl91c2VVVEMgPyBtYWtlVVRDRGF0ZSA6IG1ha2VEYXRlKS5hcHBseShudWxsLCBpbnB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGF0ZUZyb21PYmplY3QoY29uZmlnKSB7XHJcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dDtcclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpO1xyXG4gICAgICAgIGNvbmZpZy5fYSA9IFtcclxuICAgICAgICAgICAgbm9ybWFsaXplZElucHV0LnllYXIsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5tb250aCxcclxuICAgICAgICAgICAgbm9ybWFsaXplZElucHV0LmRheSxcclxuICAgICAgICAgICAgbm9ybWFsaXplZElucHV0LmhvdXIsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5taW51dGUsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGRhdGVGcm9tQ29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcclxuICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcclxuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIG5vdy5nZXRVVENGdWxsWWVhcigpLFxyXG4gICAgICAgICAgICAgICAgbm93LmdldFVUQ01vbnRoKCksXHJcbiAgICAgICAgICAgICAgICBub3cuZ2V0VVRDRGF0ZSgpXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIG5vdy5nZXREYXRlKCldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXHJcbiAgICBmdW5jdGlvbiBtYWtlRGF0ZUZyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XHJcblxyXG4gICAgICAgIGNvbmZpZy5fYSA9IFtdO1xyXG4gICAgICAgIGNvbmZpZy5fcGYuZW1wdHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxyXG4gICAgICAgIHZhciBsYW5nID0gZ2V0TGFuZ0RlZmluaXRpb24oY29uZmlnLl9sKSxcclxuICAgICAgICAgICAgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXHJcbiAgICAgICAgICAgIGksIHBhcnNlZElucHV0LCB0b2tlbnMsIHRva2VuLCBza2lwcGVkLFxyXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxyXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgdG9rZW5zID0gZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgbGFuZykubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XHJcbiAgICAgICAgICAgIHBhcnNlZElucHV0ID0gKHN0cmluZy5tYXRjaChnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpIHx8IFtdKVswXTtcclxuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XHJcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5fcGYudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZShzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCArPSBwYXJzZWRJbnB1dC5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXQncyBub3QgYSBrbm93biB0b2tlblxyXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcuX3BmLmVtcHR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcuX3BmLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5fcGYudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXHJcbiAgICAgICAgY29uZmlnLl9wZi5jaGFyc0xlZnRPdmVyID0gc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcclxuICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uZmlnLl9wZi51bnVzZWRJbnB1dC5wdXNoKHN0cmluZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBoYW5kbGUgYW0gcG1cclxuICAgICAgICBpZiAoY29uZmlnLl9pc1BtICYmIGNvbmZpZy5fYVtIT1VSXSA8IDEyKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSArPSAxMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgaXMgMTIgYW0sIGNoYW5nZSBob3VycyB0byAwXHJcbiAgICAgICAgaWYgKGNvbmZpZy5faXNQbSA9PT0gZmFsc2UgJiYgY29uZmlnLl9hW0hPVVJdID09PSAxMikge1xyXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0ZUZyb21Db25maWcoY29uZmlnKTtcclxuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xyXG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwMSB8fCBwMiB8fCBwMyB8fCBwNDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XHJcbiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUocykge1xyXG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGFycmF5IG9mIGZvcm1hdCBzdHJpbmdzXHJcbiAgICBmdW5jdGlvbiBtYWtlRGF0ZUZyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcclxuICAgICAgICB2YXIgdGVtcENvbmZpZyxcclxuICAgICAgICAgICAgYmVzdE1vbWVudCxcclxuXHJcbiAgICAgICAgICAgIHNjb3JlVG9CZWF0LFxyXG4gICAgICAgICAgICBpLFxyXG4gICAgICAgICAgICBjdXJyZW50U2NvcmU7XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuX2YubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fcGYuaW52YWxpZEZvcm1hdCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWcuX2YubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY3VycmVudFNjb3JlID0gMDtcclxuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGV4dGVuZCh7fSwgY29uZmlnKTtcclxuICAgICAgICAgICAgdGVtcENvbmZpZy5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XHJcbiAgICAgICAgICAgIHRlbXBDb25maWcuX2YgPSBjb25maWcuX2ZbaV07XHJcbiAgICAgICAgICAgIG1ha2VEYXRlRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNWYWxpZCh0ZW1wQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XHJcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSB0ZW1wQ29uZmlnLl9wZi5jaGFyc0xlZnRPdmVyO1xyXG5cclxuICAgICAgICAgICAgLy9vciB0b2tlbnNcclxuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IHRlbXBDb25maWcuX3BmLnVudXNlZFRva2Vucy5sZW5ndGggKiAxMDtcclxuXHJcbiAgICAgICAgICAgIHRlbXBDb25maWcuX3BmLnNjb3JlID0gY3VycmVudFNjb3JlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNjb3JlVG9CZWF0ID09IG51bGwgfHwgY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQpIHtcclxuICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xyXG4gICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQgfHwgdGVtcENvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcclxuICAgIGZ1bmN0aW9uIG1ha2VEYXRlRnJvbVN0cmluZyhjb25maWcpIHtcclxuICAgICAgICB2YXIgaSwgbCxcclxuICAgICAgICAgICAgc3RyaW5nID0gY29uZmlnLl9pLFxyXG4gICAgICAgICAgICBtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoc3RyaW5nKTtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fcGYuaXNvID0gdHJ1ZTtcclxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMoc3RyaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzVdIHNob3VsZCBiZSBcIlRcIiBvciB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2YgPSBpc29EYXRlc1tpXVswXSArIChtYXRjaFs2XSB8fCBcIiBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMoc3RyaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5fZiArPSBpc29UaW1lc1tpXVswXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3RyaW5nLm1hdGNoKHBhcnNlVG9rZW5UaW1lem9uZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5fZiArPSBcIlpcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtYWtlRGF0ZUZyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1ha2VEYXRlRnJvbUlucHV0KGNvbmZpZykge1xyXG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcclxuICAgICAgICAgICAgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGlucHV0KTtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoZWQpIHtcclxuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK21hdGNoZWRbMV0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBtYWtlRGF0ZUZyb21TdHJpbmcoY29uZmlnKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IGlucHV0LnNsaWNlKDApO1xyXG4gICAgICAgICAgICBkYXRlRnJvbUNvbmZpZyhjb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xyXG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgraW5wdXQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGlucHV0KSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgZGF0ZUZyb21PYmplY3QoY29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1ha2VEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKSB7XHJcbiAgICAgICAgLy9jYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcclxuICAgICAgICAvL2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTgxMzQ4L2luc3RhbnRpYXRpbmctYS1qYXZhc2NyaXB0LW9iamVjdC1ieS1jYWxsaW5nLXByb3RvdHlwZS1jb25zdHJ1Y3Rvci1hcHBseVxyXG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xyXG5cclxuICAgICAgICAvL3RoZSBkYXRlIGNvbnN0cnVjdG9yIGRvZXNuJ3QgYWNjZXB0IHllYXJzIDwgMTk3MFxyXG4gICAgICAgIGlmICh5IDwgMTk3MCkge1xyXG4gICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtYWtlVVRDRGF0ZSh5KSB7XHJcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcclxuICAgICAgICBpZiAoeSA8IDE5NzApIHtcclxuICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGlucHV0LCBsYW5ndWFnZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmICghaXNOYU4oaW5wdXQpKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHBhcnNlSW50KGlucHV0LCAxMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGxhbmd1YWdlLndlZWtkYXlzUGFyc2UoaW5wdXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgIFJlbGF0aXZlIFRpbWVcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblxyXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBtb21lbnQuZm4uZnJvbSwgbW9tZW50LmZuLmZyb21Ob3csIGFuZCBtb21lbnQuZHVyYXRpb24uZm4uaHVtYW5pemVcclxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbGFuZykge1xyXG4gICAgICAgIHJldHVybiBsYW5nLnJlbGF0aXZlVGltZShudW1iZXIgfHwgMSwgISF3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUobWlsbGlzZWNvbmRzLCB3aXRob3V0U3VmZml4LCBsYW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29uZHMgPSByb3VuZChNYXRoLmFicyhtaWxsaXNlY29uZHMpIC8gMTAwMCksXHJcbiAgICAgICAgICAgIG1pbnV0ZXMgPSByb3VuZChzZWNvbmRzIC8gNjApLFxyXG4gICAgICAgICAgICBob3VycyA9IHJvdW5kKG1pbnV0ZXMgLyA2MCksXHJcbiAgICAgICAgICAgIGRheXMgPSByb3VuZChob3VycyAvIDI0KSxcclxuICAgICAgICAgICAgeWVhcnMgPSByb3VuZChkYXlzIC8gMzY1KSxcclxuICAgICAgICAgICAgYXJncyA9IHNlY29uZHMgPCA0NSAmJiBbJ3MnLCBzZWNvbmRzXSB8fFxyXG4gICAgICAgICAgICAgICAgbWludXRlcyA9PT0gMSAmJiBbJ20nXSB8fFxyXG4gICAgICAgICAgICAgICAgbWludXRlcyA8IDQ1ICYmIFsnbW0nLCBtaW51dGVzXSB8fFxyXG4gICAgICAgICAgICAgICAgaG91cnMgPT09IDEgJiYgWydoJ10gfHxcclxuICAgICAgICAgICAgICAgIGhvdXJzIDwgMjIgJiYgWydoaCcsIGhvdXJzXSB8fFxyXG4gICAgICAgICAgICAgICAgZGF5cyA9PT0gMSAmJiBbJ2QnXSB8fFxyXG4gICAgICAgICAgICAgICAgZGF5cyA8PSAyNSAmJiBbJ2RkJywgZGF5c10gfHxcclxuICAgICAgICAgICAgICAgIGRheXMgPD0gNDUgJiYgWydNJ10gfHxcclxuICAgICAgICAgICAgICAgIGRheXMgPCAzNDUgJiYgWydNTScsIHJvdW5kKGRheXMgLyAzMCldIHx8XHJcbiAgICAgICAgICAgICAgICB5ZWFycyA9PT0gMSAmJiBbJ3knXSB8fCBbJ3l5JywgeWVhcnNdO1xyXG4gICAgICAgIGFyZ3NbMl0gPSB3aXRob3V0U3VmZml4O1xyXG4gICAgICAgIGFyZ3NbM10gPSBtaWxsaXNlY29uZHMgPiAwO1xyXG4gICAgICAgIGFyZ3NbNF0gPSBsYW5nO1xyXG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseSh7fSwgYXJncyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICBXZWVrIG9mIFllYXJcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblxyXG4gICAgLy8gZmlyc3REYXlPZldlZWsgICAgICAgMCA9IHN1biwgNiA9IHNhdFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgdGhlIGRheSBvZiB0aGUgd2VlayB0aGF0IHN0YXJ0cyB0aGUgd2Vla1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgc3VuZGF5IG9yIG1vbmRheSlcclxuICAgIC8vIGZpcnN0RGF5T2ZXZWVrT2ZZZWFyIDAgPSBzdW4sIDYgPSBzYXRcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCB3ZWVrIGlzIHRoZSB3ZWVrIHRoYXQgY29udGFpbnMgdGhlIGZpcnN0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGRheSBvZiB0aGUgd2Vla1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgKGVnLiBJU08gd2Vla3MgdXNlIHRodXJzZGF5ICg0KSlcclxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBmaXJzdERheU9mV2VlaywgZmlyc3REYXlPZldlZWtPZlllYXIpIHtcclxuICAgICAgICB2YXIgZW5kID0gZmlyc3REYXlPZldlZWtPZlllYXIgLSBmaXJzdERheU9mV2VlayxcclxuICAgICAgICAgICAgZGF5c1RvRGF5T2ZXZWVrID0gZmlyc3REYXlPZldlZWtPZlllYXIgLSBtb20uZGF5KCksXHJcbiAgICAgICAgICAgIGFkanVzdGVkTW9tZW50O1xyXG5cclxuXHJcbiAgICAgICAgaWYgKGRheXNUb0RheU9mV2VlayA+IGVuZCkge1xyXG4gICAgICAgICAgICBkYXlzVG9EYXlPZldlZWsgLT0gNztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkYXlzVG9EYXlPZldlZWsgPCBlbmQgLSA3KSB7XHJcbiAgICAgICAgICAgIGRheXNUb0RheU9mV2VlayArPSA3O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWRqdXN0ZWRNb21lbnQgPSBtb21lbnQobW9tKS5hZGQoJ2QnLCBkYXlzVG9EYXlPZldlZWspO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdlZWs6IE1hdGguY2VpbChhZGp1c3RlZE1vbWVudC5kYXlPZlllYXIoKSAvIDcpLFxyXG4gICAgICAgICAgICB5ZWFyOiBhZGp1c3RlZE1vbWVudC55ZWFyKClcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlI0NhbGN1bGF0aW5nX2FfZGF0ZV9naXZlbl90aGVfeWVhci4yQ193ZWVrX251bWJlcl9hbmRfd2Vla2RheVxyXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGZpcnN0RGF5T2ZXZWVrT2ZZZWFyLCBmaXJzdERheU9mV2Vlaykge1xyXG4gICAgICAgIHZhciBkID0gbWFrZVVUQ0RhdGUoeWVhciwgMCwgMSkuZ2V0VVRDRGF5KCksIGRheXNUb0FkZCwgZGF5T2ZZZWFyO1xyXG5cclxuICAgICAgICB3ZWVrZGF5ID0gd2Vla2RheSAhPSBudWxsID8gd2Vla2RheSA6IGZpcnN0RGF5T2ZXZWVrO1xyXG4gICAgICAgIGRheXNUb0FkZCA9IGZpcnN0RGF5T2ZXZWVrIC0gZCArIChkID4gZmlyc3REYXlPZldlZWtPZlllYXIgPyA3IDogMCkgLSAoZCA8IGZpcnN0RGF5T2ZXZWVrID8gNyA6IDApO1xyXG4gICAgICAgIGRheU9mWWVhciA9IDcgKiAod2VlayAtIDEpICsgKHdlZWtkYXkgLSBmaXJzdERheU9mV2VlaykgKyBkYXlzVG9BZGQgKyAxO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB5ZWFyOiBkYXlPZlllYXIgPiAwID8geWVhciA6IHllYXIgLSAxLFxyXG4gICAgICAgICAgICBkYXlPZlllYXI6IGRheU9mWWVhciA+IDAgPyAgZGF5T2ZZZWFyIDogZGF5c0luWWVhcih5ZWFyIC0gMSkgKyBkYXlPZlllYXJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICBUb3AgTGV2ZWwgRnVuY3Rpb25zXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgZnVuY3Rpb24gbWFrZU1vbWVudChjb25maWcpIHtcclxuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXHJcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQuaW52YWxpZCh7bnVsbElucHV0OiB0cnVlfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGdldExhbmdEZWZpbml0aW9uKCkucHJlcGFyc2UoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1vbWVudC5pc01vbWVudChpbnB1dCkpIHtcclxuICAgICAgICAgICAgY29uZmlnID0gY2xvbmVNb21lbnQoaW5wdXQpO1xyXG5cclxuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK2lucHV0Ll9kKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCkge1xyXG4gICAgICAgICAgICBpZiAoaXNBcnJheShmb3JtYXQpKSB7XHJcbiAgICAgICAgICAgICAgICBtYWtlRGF0ZUZyb21TdHJpbmdBbmRBcnJheShjb25maWcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbWFrZURhdGVGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYWtlRGF0ZUZyb21JbnB1dChjb25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICBtb21lbnQgPSBmdW5jdGlvbiAoaW5wdXQsIGZvcm1hdCwgbGFuZywgc3RyaWN0KSB7XHJcbiAgICAgICAgdmFyIGM7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YobGFuZykgPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgICAgIHN0cmljdCA9IGxhbmc7XHJcbiAgICAgICAgICAgIGxhbmcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXHJcbiAgICAgICAgYyA9IHt9O1xyXG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XHJcbiAgICAgICAgYy5faSA9IGlucHV0O1xyXG4gICAgICAgIGMuX2YgPSBmb3JtYXQ7XHJcbiAgICAgICAgYy5fbCA9IGxhbmc7XHJcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xyXG4gICAgICAgIGMuX2lzVVRDID0gZmFsc2U7XHJcbiAgICAgICAgYy5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBtYWtlTW9tZW50KGMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBjcmVhdGluZyB3aXRoIHV0Y1xyXG4gICAgbW9tZW50LnV0YyA9IGZ1bmN0aW9uIChpbnB1dCwgZm9ybWF0LCBsYW5nLCBzdHJpY3QpIHtcclxuICAgICAgICB2YXIgYztcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZihsYW5nKSA9PT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgICAgICAgc3RyaWN0ID0gbGFuZztcclxuICAgICAgICAgICAgbGFuZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb2JqZWN0IGNvbnN0cnVjdGlvbiBtdXN0IGJlIGRvbmUgdGhpcyB3YXkuXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MjNcclxuICAgICAgICBjID0ge307XHJcbiAgICAgICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcclxuICAgICAgICBjLl91c2VVVEMgPSB0cnVlO1xyXG4gICAgICAgIGMuX2lzVVRDID0gdHJ1ZTtcclxuICAgICAgICBjLl9sID0gbGFuZztcclxuICAgICAgICBjLl9pID0gaW5wdXQ7XHJcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcclxuICAgICAgICBjLl9zdHJpY3QgPSBzdHJpY3Q7XHJcbiAgICAgICAgYy5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBtYWtlTW9tZW50KGMpLnV0YygpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBjcmVhdGluZyB3aXRoIHVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKVxyXG4gICAgbW9tZW50LnVuaXggPSBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50KGlucHV0ICogMTAwMCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGR1cmF0aW9uXHJcbiAgICBtb21lbnQuZHVyYXRpb24gPSBmdW5jdGlvbiAoaW5wdXQsIGtleSkge1xyXG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGlucHV0LFxyXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBhZ2FpbnN0IHJlZ2V4cCBpcyBleHBlbnNpdmUsIGRvIGl0IG9uIGRlbWFuZFxyXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXHJcbiAgICAgICAgICAgIHNpZ24sXHJcbiAgICAgICAgICAgIHJldCxcclxuICAgICAgICAgICAgcGFyc2VJc287XHJcblxyXG4gICAgICAgIGlmIChtb21lbnQuaXNEdXJhdGlvbihpbnB1dCkpIHtcclxuICAgICAgICAgICAgZHVyYXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICBtczogaW5wdXQuX21pbGxpc2Vjb25kcyxcclxuICAgICAgICAgICAgICAgIGQ6IGlucHV0Ll9kYXlzLFxyXG4gICAgICAgICAgICAgICAgTTogaW5wdXQuX21vbnRoc1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xyXG4gICAgICAgICAgICBpZiAoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gaW5wdXQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSBpbnB1dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBhc3BOZXRUaW1lU3Bhbkpzb25SZWdleC5leGVjKGlucHV0KSkpIHtcclxuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gXCItXCIpID8gLTEgOiAxO1xyXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICBkOiB0b0ludChtYXRjaFtEQVRFXSkgKiBzaWduLFxyXG4gICAgICAgICAgICAgICAgaDogdG9JbnQobWF0Y2hbSE9VUl0pICogc2lnbixcclxuICAgICAgICAgICAgICAgIG06IHRvSW50KG1hdGNoW01JTlVURV0pICogc2lnbixcclxuICAgICAgICAgICAgICAgIHM6IHRvSW50KG1hdGNoW1NFQ09ORF0pICogc2lnbixcclxuICAgICAgICAgICAgICAgIG1zOiB0b0ludChtYXRjaFtNSUxMSVNFQ09ORF0pICogc2lnblxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBpc29EdXJhdGlvblJlZ2V4LmV4ZWMoaW5wdXQpKSkge1xyXG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSBcIi1cIikgPyAtMSA6IDE7XHJcbiAgICAgICAgICAgIHBhcnNlSXNvID0gZnVuY3Rpb24gKGlucCkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2UnZCBub3JtYWxseSB1c2Ugfn5pbnAgZm9yIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGFsc29cclxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnRzIGZsb2F0cyB0byBpbnRzLlxyXG4gICAgICAgICAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxyXG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IGlucCAmJiBwYXJzZUZsb2F0KGlucC5yZXBsYWNlKCcsJywgJy4nKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBhcHBseSBzaWduIHdoaWxlIHdlJ3JlIGF0IGl0XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgeTogcGFyc2VJc28obWF0Y2hbMl0pLFxyXG4gICAgICAgICAgICAgICAgTTogcGFyc2VJc28obWF0Y2hbM10pLFxyXG4gICAgICAgICAgICAgICAgZDogcGFyc2VJc28obWF0Y2hbNF0pLFxyXG4gICAgICAgICAgICAgICAgaDogcGFyc2VJc28obWF0Y2hbNV0pLFxyXG4gICAgICAgICAgICAgICAgbTogcGFyc2VJc28obWF0Y2hbNl0pLFxyXG4gICAgICAgICAgICAgICAgczogcGFyc2VJc28obWF0Y2hbN10pLFxyXG4gICAgICAgICAgICAgICAgdzogcGFyc2VJc28obWF0Y2hbOF0pXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXQgPSBuZXcgRHVyYXRpb24oZHVyYXRpb24pO1xyXG5cclxuICAgICAgICBpZiAobW9tZW50LmlzRHVyYXRpb24oaW5wdXQpICYmIGlucHV0Lmhhc093blByb3BlcnR5KCdfbGFuZycpKSB7XHJcbiAgICAgICAgICAgIHJldC5fbGFuZyA9IGlucHV0Ll9sYW5nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH07XHJcblxyXG4gICAgLy8gdmVyc2lvbiBudW1iZXJcclxuICAgIG1vbWVudC52ZXJzaW9uID0gVkVSU0lPTjtcclxuXHJcbiAgICAvLyBkZWZhdWx0IGZvcm1hdFxyXG4gICAgbW9tZW50LmRlZmF1bHRGb3JtYXQgPSBpc29Gb3JtYXQ7XHJcblxyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxyXG4gICAgLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXHJcbiAgICBtb21lbnQudXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gKCkge307XHJcblxyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgbGFuZ3VhZ2VzIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGxhbmd1YWdlLiAgSWZcclxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXHJcbiAgICAvLyBsYW5ndWFnZSBrZXkuXHJcbiAgICBtb21lbnQubGFuZyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlcykge1xyXG4gICAgICAgIHZhciByO1xyXG4gICAgICAgIGlmICgha2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQuZm4uX2xhbmcuX2FiYnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZXMpIHtcclxuICAgICAgICAgICAgbG9hZExhbmcobm9ybWFsaXplTGFuZ3VhZ2Uoa2V5KSwgdmFsdWVzKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlcyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB1bmxvYWRMYW5nKGtleSk7XHJcbiAgICAgICAgICAgIGtleSA9ICdlbic7XHJcbiAgICAgICAgfSBlbHNlIGlmICghbGFuZ3VhZ2VzW2tleV0pIHtcclxuICAgICAgICAgICAgZ2V0TGFuZ0RlZmluaXRpb24oa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgciA9IG1vbWVudC5kdXJhdGlvbi5mbi5fbGFuZyA9IG1vbWVudC5mbi5fbGFuZyA9IGdldExhbmdEZWZpbml0aW9uKGtleSk7XHJcbiAgICAgICAgcmV0dXJuIHIuX2FiYnI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIHJldHVybnMgbGFuZ3VhZ2UgZGF0YVxyXG4gICAgbW9tZW50LmxhbmdEYXRhID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIGlmIChrZXkgJiYga2V5Ll9sYW5nICYmIGtleS5fbGFuZy5fYWJicikge1xyXG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xhbmcuX2FiYnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBnZXRMYW5nRGVmaW5pdGlvbihrZXkpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBjb21wYXJlIG1vbWVudCBvYmplY3RcclxuICAgIG1vbWVudC5pc01vbWVudCA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgTW9tZW50IHx8XHJcbiAgICAgICAgICAgIChvYmogIT0gbnVsbCAmJiAgb2JqLmhhc093blByb3BlcnR5KCdfaXNBTW9tZW50T2JqZWN0JykpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBmb3IgdHlwZWNoZWNraW5nIER1cmF0aW9uIG9iamVjdHNcclxuICAgIG1vbWVudC5pc0R1cmF0aW9uID0gZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChpID0gbGlzdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcclxuICAgICAgICBtYWtlTGlzdChsaXN0c1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgbW9tZW50Lm5vcm1hbGl6ZVVuaXRzID0gZnVuY3Rpb24gKHVuaXRzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcclxuICAgIH07XHJcblxyXG4gICAgbW9tZW50LmludmFsaWQgPSBmdW5jdGlvbiAoZmxhZ3MpIHtcclxuICAgICAgICB2YXIgbSA9IG1vbWVudC51dGMoTmFOKTtcclxuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBleHRlbmQobS5fcGYsIGZsYWdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG0uX3BmLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbTtcclxuICAgIH07XHJcblxyXG4gICAgbW9tZW50LnBhcnNlWm9uZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICBNb21lbnQgUHJvdG90eXBlXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cclxuICAgIGV4dGVuZChtb21lbnQuZm4gPSBNb21lbnQucHJvdG90eXBlLCB7XHJcblxyXG4gICAgICAgIGNsb25lIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHZhbHVlT2YgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiArdGhpcy5fZCArICgodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDApO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHVuaXggOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKCt0aGlzIC8gMTAwMCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgdG9TdHJpbmcgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubGFuZygnZW4nKS5mb3JtYXQoXCJkZGQgTU1NIEREIFlZWVkgSEg6bW06c3MgW0dNVF1aWlwiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICB0b0RhdGUgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXQgPyBuZXcgRGF0ZSgrdGhpcykgOiB0aGlzLl9kO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHRvSVNPU3RyaW5nIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbSA9IG1vbWVudCh0aGlzKS51dGMoKTtcclxuICAgICAgICAgICAgaWYgKDAgPCBtLnllYXIoKSAmJiBtLnllYXIoKSA8PSA5OTk5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHRvQXJyYXkgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBtID0gdGhpcztcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIG0ueWVhcigpLFxyXG4gICAgICAgICAgICAgICAgbS5tb250aCgpLFxyXG4gICAgICAgICAgICAgICAgbS5kYXRlKCksXHJcbiAgICAgICAgICAgICAgICBtLmhvdXJzKCksXHJcbiAgICAgICAgICAgICAgICBtLm1pbnV0ZXMoKSxcclxuICAgICAgICAgICAgICAgIG0uc2Vjb25kcygpLFxyXG4gICAgICAgICAgICAgICAgbS5taWxsaXNlY29uZHMoKVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGlzVmFsaWQgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkKHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGlzRFNUU2hpZnRlZCA6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9hKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgJiYgY29tcGFyZUFycmF5cyh0aGlzLl9hLCAodGhpcy5faXNVVEMgPyBtb21lbnQudXRjKHRoaXMuX2EpIDogbW9tZW50KHRoaXMuX2EpKS50b0FycmF5KCkpID4gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHBhcnNpbmdGbGFncyA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgdGhpcy5fcGYpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGludmFsaWRBdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGYub3ZlcmZsb3c7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgdXRjIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy56b25lKDApO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGxvY2FsIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnpvbmUoMCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZvcm1hdCA6IGZ1bmN0aW9uIChpbnB1dFN0cmluZykge1xyXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nIHx8IG1vbWVudC5kZWZhdWx0Rm9ybWF0KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLnBvc3Rmb3JtYXQob3V0cHV0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBhZGQgOiBmdW5jdGlvbiAoaW5wdXQsIHZhbCkge1xyXG4gICAgICAgICAgICB2YXIgZHVyO1xyXG4gICAgICAgICAgICAvLyBzd2l0Y2ggYXJncyB0byBzdXBwb3J0IGFkZCgncycsIDEpIGFuZCBhZGQoMSwgJ3MnKVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgZHVyID0gbW9tZW50LmR1cmF0aW9uKCt2YWwsIGlucHV0KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGR1ciA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCwgdmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhZGRPclN1YnRyYWN0RHVyYXRpb25Gcm9tTW9tZW50KHRoaXMsIGR1ciwgMSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHN1YnRyYWN0IDogZnVuY3Rpb24gKGlucHV0LCB2YWwpIHtcclxuICAgICAgICAgICAgdmFyIGR1cjtcclxuICAgICAgICAgICAgLy8gc3dpdGNoIGFyZ3MgdG8gc3VwcG9ydCBzdWJ0cmFjdCgncycsIDEpIGFuZCBzdWJ0cmFjdCgxLCAncycpXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24oK3ZhbCwgaW5wdXQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZHVyID0gbW9tZW50LmR1cmF0aW9uKGlucHV0LCB2YWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFkZE9yU3VidHJhY3REdXJhdGlvbkZyb21Nb21lbnQodGhpcywgZHVyLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGRpZmYgOiBmdW5jdGlvbiAoaW5wdXQsIHVuaXRzLCBhc0Zsb2F0KSB7XHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gbWFrZUFzKGlucHV0LCB0aGlzKSxcclxuICAgICAgICAgICAgICAgIHpvbmVEaWZmID0gKHRoaXMuem9uZSgpIC0gdGhhdC56b25lKCkpICogNmU0LFxyXG4gICAgICAgICAgICAgICAgZGlmZiwgb3V0cHV0O1xyXG5cclxuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodW5pdHMgPT09ICd5ZWFyJyB8fCB1bml0cyA9PT0gJ21vbnRoJykge1xyXG4gICAgICAgICAgICAgICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgZGF5cyBpbiB0aGUgbW9udGhzIGluIHRoZSBnaXZlbiBkYXRlc1xyXG4gICAgICAgICAgICAgICAgZGlmZiA9ICh0aGlzLmRheXNJbk1vbnRoKCkgKyB0aGF0LmRheXNJbk1vbnRoKCkpICogNDMyZTU7IC8vIDI0ICogNjAgKiA2MCAqIDEwMDAgLyAyXHJcbiAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKCh0aGlzLnllYXIoKSAtIHRoYXQueWVhcigpKSAqIDEyKSArICh0aGlzLm1vbnRoKCkgLSB0aGF0Lm1vbnRoKCkpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRqdXN0IGJ5IHRha2luZyBkaWZmZXJlbmNlIGluIGRheXMsIGF2ZXJhZ2UgbnVtYmVyIG9mIGRheXNcclxuICAgICAgICAgICAgICAgIC8vIGFuZCBkc3QgaW4gdGhlIGdpdmVuIG1vbnRocy5cclxuICAgICAgICAgICAgICAgIG91dHB1dCArPSAoKHRoaXMgLSBtb21lbnQodGhpcykuc3RhcnRPZignbW9udGgnKSkgLVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhhdCAtIG1vbWVudCh0aGF0KS5zdGFydE9mKCdtb250aCcpKSkgLyBkaWZmO1xyXG4gICAgICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2l0aCB6b25lcywgdG8gbmVnYXRlIGFsbCBkc3RcclxuICAgICAgICAgICAgICAgIG91dHB1dCAtPSAoKHRoaXMuem9uZSgpIC0gbW9tZW50KHRoaXMpLnN0YXJ0T2YoJ21vbnRoJykuem9uZSgpKSAtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0LnpvbmUoKSAtIG1vbWVudCh0aGF0KS5zdGFydE9mKCdtb250aCcpLnpvbmUoKSkpICogNmU0IC8gZGlmZjtcclxuICAgICAgICAgICAgICAgIGlmICh1bml0cyA9PT0gJ3llYXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0IC8gMTI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gKHRoaXMgLSB0aGF0KTtcclxuICAgICAgICAgICAgICAgIG91dHB1dCA9IHVuaXRzID09PSAnc2Vjb25kJyA/IGRpZmYgLyAxZTMgOiAvLyAxMDAwXHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPT09ICdtaW51dGUnID8gZGlmZiAvIDZlNCA6IC8vIDEwMDAgKiA2MFxyXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnaG91cicgPyBkaWZmIC8gMzZlNSA6IC8vIDEwMDAgKiA2MCAqIDYwXHJcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPT09ICdkYXknID8gKGRpZmYgLSB6b25lRGlmZikgLyA4NjRlNSA6IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcclxuICAgICAgICAgICAgICAgICAgICB1bml0cyA9PT0gJ3dlZWsnID8gKGRpZmYgLSB6b25lRGlmZikgLyA2MDQ4ZTUgOiAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRpZmY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNSb3VuZChvdXRwdXQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZyb20gOiBmdW5jdGlvbiAodGltZSwgd2l0aG91dFN1ZmZpeCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9tZW50LmR1cmF0aW9uKHRoaXMuZGlmZih0aW1lKSkubGFuZyh0aGlzLmxhbmcoKS5fYWJicikuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZyb21Ob3cgOiBmdW5jdGlvbiAod2l0aG91dFN1ZmZpeCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tKG1vbWVudCgpLCB3aXRob3V0U3VmZml4KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBjYWxlbmRhciA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBjb21wYXJlIHRoZSBzdGFydCBvZiB0b2RheSwgdnMgdGhpcy5cclxuICAgICAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgem9uZSdkIG9yIG5vdC5cclxuICAgICAgICAgICAgdmFyIHNvZCA9IG1ha2VBcyhtb21lbnQoKSwgdGhpcykuc3RhcnRPZignZGF5JyksXHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy5kaWZmKHNvZCwgJ2RheXMnLCB0cnVlKSxcclxuICAgICAgICAgICAgICAgIGZvcm1hdCA9IGRpZmYgPCAtNiA/ICdzYW1lRWxzZScgOlxyXG4gICAgICAgICAgICAgICAgICAgIGRpZmYgPCAtMSA/ICdsYXN0V2VlaycgOlxyXG4gICAgICAgICAgICAgICAgICAgIGRpZmYgPCAwID8gJ2xhc3REYXknIDpcclxuICAgICAgICAgICAgICAgICAgICBkaWZmIDwgMSA/ICdzYW1lRGF5JyA6XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZiA8IDIgPyAnbmV4dERheScgOlxyXG4gICAgICAgICAgICAgICAgICAgIGRpZmYgPCA3ID8gJ25leHRXZWVrJyA6ICdzYW1lRWxzZSc7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdCh0aGlzLmxhbmcoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMpKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBpc0xlYXBZZWFyIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIoKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaXNEU1QgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy56b25lKCkgPCB0aGlzLmNsb25lKCkubW9udGgoMCkuem9uZSgpIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUoKSA8IHRoaXMuY2xvbmUoKS5tb250aCg1KS56b25lKCkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGRheSA6IGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgICAgICB2YXIgZGF5ID0gdGhpcy5faXNVVEMgPyB0aGlzLl9kLmdldFVUQ0RheSgpIDogdGhpcy5fZC5nZXREYXkoKTtcclxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gcGFyc2VXZWVrZGF5KGlucHV0LCB0aGlzLmxhbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoeyBkIDogaW5wdXQgLSBkYXkgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgbW9udGggOiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgdmFyIHV0YyA9IHRoaXMuX2lzVVRDID8gJ1VUQycgOiAnJyxcclxuICAgICAgICAgICAgICAgIGRheU9mTW9udGg7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMubGFuZygpLm1vbnRoc1BhcnNlKGlucHV0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZGF5T2ZNb250aCA9IE1hdGgubWluKHRoaXMuZGF0ZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXlzSW5Nb250aCh0aGlzLnllYXIoKSwgaW5wdXQpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RbJ3NldCcgKyB1dGMgKyAnTW9udGgnXShpbnB1dCwgZGF5T2ZNb250aCk7XHJcbiAgICAgICAgICAgICAgICBtb21lbnQudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZFsnZ2V0JyArIHV0YyArICdNb250aCddKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzdGFydE9mOiBmdW5jdGlvbiAodW5pdHMpIHtcclxuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XHJcbiAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgc3dpdGNoIGludGVudGlvbmFsbHkgb21pdHMgYnJlYWsga2V5d29yZHNcclxuICAgICAgICAgICAgLy8gdG8gdXRpbGl6ZSBmYWxsaW5nIHRocm91Z2ggdGhlIGNhc2VzLlxyXG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5tb250aCgwKTtcclxuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cclxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlKDEpO1xyXG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xyXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzKDApO1xyXG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xyXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygwKTtcclxuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cclxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kcygwKTtcclxuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cclxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcclxuICAgICAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmRzKDApO1xyXG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB3ZWVrcyBhcmUgYSBzcGVjaWFsIGNhc2VcclxuICAgICAgICAgICAgaWYgKHVuaXRzID09PSAnd2VlaycpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheSgwKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh1bml0cyA9PT0gJ2lzb1dlZWsnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoMSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGVuZE9mOiBmdW5jdGlvbiAodW5pdHMpIHtcclxuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YodW5pdHMpLmFkZCgodW5pdHMgPT09ICdpc29XZWVrJyA/ICd3ZWVrJyA6IHVuaXRzKSwgMSkuc3VidHJhY3QoJ21zJywgMSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaXNBZnRlcjogZnVuY3Rpb24gKGlucHV0LCB1bml0cykge1xyXG4gICAgICAgICAgICB1bml0cyA9IHR5cGVvZiB1bml0cyAhPT0gJ3VuZGVmaW5lZCcgPyB1bml0cyA6ICdtaWxsaXNlY29uZCc7XHJcbiAgICAgICAgICAgIHJldHVybiArdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpID4gK21vbWVudChpbnB1dCkuc3RhcnRPZih1bml0cyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaXNCZWZvcmU6IGZ1bmN0aW9uIChpbnB1dCwgdW5pdHMpIHtcclxuICAgICAgICAgICAgdW5pdHMgPSB0eXBlb2YgdW5pdHMgIT09ICd1bmRlZmluZWQnID8gdW5pdHMgOiAnbWlsbGlzZWNvbmQnO1xyXG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKSA8ICttb21lbnQoaW5wdXQpLnN0YXJ0T2YodW5pdHMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGlzU2FtZTogZnVuY3Rpb24gKGlucHV0LCB1bml0cykge1xyXG4gICAgICAgICAgICB1bml0cyA9IHVuaXRzIHx8ICdtcyc7XHJcbiAgICAgICAgICAgIHJldHVybiArdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpID09PSArbWFrZUFzKGlucHV0LCB0aGlzKS5zdGFydE9mKHVuaXRzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBtaW46IGZ1bmN0aW9uIChvdGhlcikge1xyXG4gICAgICAgICAgICBvdGhlciA9IG1vbWVudC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG1heDogZnVuY3Rpb24gKG90aGVyKSB7XHJcbiAgICAgICAgICAgIG90aGVyID0gbW9tZW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgem9uZSA6IGZ1bmN0aW9uIChpbnB1dCwgYWRqdXN0KSB7XHJcbiAgICAgICAgICAgIGFkanVzdCA9IChhZGp1c3QgPT0gbnVsbCA/IHRydWUgOiBmYWxzZSk7XHJcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vZmZzZXQgfHwgMDtcclxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IHRpbWV6b25lTWludXRlc0Zyb21TdHJpbmcoaW5wdXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGlucHV0KSA8IDE2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAqIDYwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1VUQyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCAmJiBhZGp1c3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBhZGRPclN1YnRyYWN0RHVyYXRpb25Gcm9tTW9tZW50KHRoaXMsIG1vbWVudC5kdXJhdGlvbihvZmZzZXQgLSBpbnB1dCwgJ20nKSwgMSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiB0aGlzLl9kLmdldFRpbWV6b25lT2Zmc2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgem9uZUFiYnIgOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IFwiVVRDXCIgOiBcIlwiO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHpvbmVOYW1lIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBcIkNvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lXCIgOiBcIlwiO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHBhcnNlWm9uZSA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3R6bSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy56b25lKHRoaXMuX3R6bSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2kgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUodGhpcy5faSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaGFzQWxpZ25lZEhvdXJPZmZzZXQgOiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgaWYgKCFpbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSBtb21lbnQoaW5wdXQpLnpvbmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnpvbmUoKSAtIGlucHV0KSAlIDYwID09PSAwO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGRheXNJbk1vbnRoIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgZGF5T2ZZZWFyIDogZnVuY3Rpb24gKGlucHV0KSB7XHJcbiAgICAgICAgICAgIHZhciBkYXlPZlllYXIgPSByb3VuZCgobW9tZW50KHRoaXMpLnN0YXJ0T2YoJ2RheScpIC0gbW9tZW50KHRoaXMpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNSkgKyAxO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKFwiZFwiLCAoaW5wdXQgLSBkYXlPZlllYXIpKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBxdWFydGVyIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkgKyAxLjApIC8gMy4wKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICB3ZWVrWWVhciA6IGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgICAgICB2YXIgeWVhciA9IHdlZWtPZlllYXIodGhpcywgdGhpcy5sYW5nKCkuX3dlZWsuZG93LCB0aGlzLmxhbmcoKS5fd2Vlay5kb3kpLnllYXI7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8geWVhciA6IHRoaXMuYWRkKFwieVwiLCAoaW5wdXQgLSB5ZWFyKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaXNvV2Vla1llYXIgOiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgdmFyIHllYXIgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLnllYXI7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8geWVhciA6IHRoaXMuYWRkKFwieVwiLCAoaW5wdXQgLSB5ZWFyKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgd2VlayA6IGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgICAgICB2YXIgd2VlayA9IHRoaXMubGFuZygpLndlZWsodGhpcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKFwiZFwiLCAoaW5wdXQgLSB3ZWVrKSAqIDcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGlzb1dlZWsgOiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgdmFyIHdlZWsgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLndlZWs7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKFwiZFwiLCAoaW5wdXQgLSB3ZWVrKSAqIDcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHdlZWtkYXkgOiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSAodGhpcy5kYXkoKSArIDcgLSB0aGlzLmxhbmcoKS5fd2Vlay5kb3cpICUgNztcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrZGF5IDogdGhpcy5hZGQoXCJkXCIsIGlucHV0IC0gd2Vla2RheSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaXNvV2Vla2RheSA6IGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XHJcbiAgICAgICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXHJcbiAgICAgICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB0aGlzLmRheSgpIHx8IDcgOiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IGlucHV0IDogaW5wdXQgLSA3KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBpc29XZWVrc0luWWVhciA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCAxLCA0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICB3ZWVrc0luWWVhciA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5fbGFuZy5fd2VlaztcclxuICAgICAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgZ2V0IDogZnVuY3Rpb24gKHVuaXRzKSB7XHJcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQgOiBmdW5jdGlvbiAodW5pdHMsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbdW5pdHNdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzW3VuaXRzXSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gSWYgcGFzc2VkIGEgbGFuZ3VhZ2Uga2V5LCBpdCB3aWxsIHNldCB0aGUgbGFuZ3VhZ2UgZm9yIHRoaXNcclxuICAgICAgICAvLyBpbnN0YW5jZS4gIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICAvLyB2YXJpYWJsZXMgZm9yIHRoaXMgaW5zdGFuY2UuXHJcbiAgICAgICAgbGFuZyA6IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGFuZztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xhbmcgPSBnZXRMYW5nRGVmaW5pdGlvbihrZXkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBoZWxwZXIgZm9yIGFkZGluZyBzaG9ydGN1dHNcclxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXJBbmRTZXR0ZXIobmFtZSwga2V5KSB7XHJcbiAgICAgICAgLy8gaWdub3JlT2Zmc2V0VHJhbnNpdGlvbnMgcHJvdmlkZXMgYSBoaW50IHRvIHVwZGF0ZU9mZnNldCB0byBub3RcclxuICAgICAgICAvLyBjaGFuZ2UgaG91cnMvbWludXRlcyB3aGVuIGNyb3NzaW5nIGEgdHogYm91bmRhcnkuICBUaGlzIGlzIGZyZXF1ZW50bHlcclxuICAgICAgICAvLyBkZXNpcmFibGUgd2hlbiBtb2RpZnlpbmcgcGFydCBvZiBhbiBleGlzdGluZyBtb21lbnQgb2JqZWN0IGRpcmVjdGx5LlxyXG4gICAgICAgIHZhciBkZWZhdWx0SWdub3JlT2Zmc2V0VHJhbnNpdGlvbnMgPSBrZXkgPT09ICdkYXRlJyB8fCBrZXkgPT09ICdtb250aCcgfHwga2V5ID09PSAneWVhcic7XHJcbiAgICAgICAgbW9tZW50LmZuW25hbWVdID0gbW9tZW50LmZuW25hbWUgKyAncyddID0gZnVuY3Rpb24gKGlucHV0LCBpZ25vcmVPZmZzZXRUcmFuc2l0aW9ucykge1xyXG4gICAgICAgICAgICB2YXIgdXRjID0gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xyXG4gICAgICAgICAgICBpZiAoaWdub3JlT2Zmc2V0VHJhbnNpdGlvbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWdub3JlT2Zmc2V0VHJhbnNpdGlvbnMgPSBkZWZhdWx0SWdub3JlT2Zmc2V0VHJhbnNpdGlvbnM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RbJ3NldCcgKyB1dGMgKyBrZXldKGlucHV0KTtcclxuICAgICAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQodGhpcywgaWdub3JlT2Zmc2V0VHJhbnNpdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZFsnZ2V0JyArIHV0YyArIGtleV0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9vcCB0aHJvdWdoIGFuZCBhZGQgc2hvcnRjdXRzIChEYXRlLCBIb3VycywgTWludXRlcywgU2Vjb25kcywgTWlsbGlzZWNvbmRzKVxyXG4gICAgLy8gTW9udGggaGFzIGEgY3VzdG9tIGdldHRlci9zZXR0ZXIuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgcHJveHlHZXR0ZXJzQW5kU2V0dGVycy5sZW5ndGg7IGkgKyspIHtcclxuICAgICAgICBtYWtlR2V0dGVyQW5kU2V0dGVyKHByb3h5R2V0dGVyc0FuZFNldHRlcnNbaV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9zJC8sICcnKSwgcHJveHlHZXR0ZXJzQW5kU2V0dGVyc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWRkIHNob3J0Y3V0IGZvciB5ZWFyICh1c2VzIGRpZmZlcmVudCBzeW50YXggdGhhbiB0aGUgZ2V0dGVyL3NldHRlciAneWVhcicgPT0gJ0Z1bGxZZWFyJylcclxuICAgIG1ha2VHZXR0ZXJBbmRTZXR0ZXIoJ3llYXInLCAnRnVsbFllYXInKTtcclxuXHJcbiAgICAvLyBhZGQgcGx1cmFsIG1ldGhvZHNcclxuICAgIG1vbWVudC5mbi5kYXlzID0gbW9tZW50LmZuLmRheTtcclxuICAgIG1vbWVudC5mbi5tb250aHMgPSBtb21lbnQuZm4ubW9udGg7XHJcbiAgICBtb21lbnQuZm4ud2Vla3MgPSBtb21lbnQuZm4ud2VlaztcclxuICAgIG1vbWVudC5mbi5pc29XZWVrcyA9IG1vbWVudC5mbi5pc29XZWVrO1xyXG5cclxuICAgIC8vIGFkZCBhbGlhc2VkIGZvcm1hdCBtZXRob2RzXHJcbiAgICBtb21lbnQuZm4udG9KU09OID0gbW9tZW50LmZuLnRvSVNPU3RyaW5nO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICBEdXJhdGlvbiBQcm90b3R5cGVcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblxyXG4gICAgZXh0ZW5kKG1vbWVudC5kdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZSwge1xyXG5cclxuICAgICAgICBfYnViYmxlIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzLFxyXG4gICAgICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMsXHJcbiAgICAgICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMsXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fZGF0YSxcclxuICAgICAgICAgICAgICAgIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycztcclxuXHJcbiAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcclxuICAgICAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxyXG4gICAgICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XHJcblxyXG4gICAgICAgICAgICBzZWNvbmRzID0gYWJzUm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCk7XHJcbiAgICAgICAgICAgIGRhdGEuc2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcclxuXHJcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBhYnNSb3VuZChzZWNvbmRzIC8gNjApO1xyXG4gICAgICAgICAgICBkYXRhLm1pbnV0ZXMgPSBtaW51dGVzICUgNjA7XHJcblxyXG4gICAgICAgICAgICBob3VycyA9IGFic1JvdW5kKG1pbnV0ZXMgLyA2MCk7XHJcbiAgICAgICAgICAgIGRhdGEuaG91cnMgPSBob3VycyAlIDI0O1xyXG5cclxuICAgICAgICAgICAgZGF5cyArPSBhYnNSb3VuZChob3VycyAvIDI0KTtcclxuICAgICAgICAgICAgZGF0YS5kYXlzID0gZGF5cyAlIDMwO1xyXG5cclxuICAgICAgICAgICAgbW9udGhzICs9IGFic1JvdW5kKGRheXMgLyAzMCk7XHJcbiAgICAgICAgICAgIGRhdGEubW9udGhzID0gbW9udGhzICUgMTI7XHJcblxyXG4gICAgICAgICAgICB5ZWFycyA9IGFic1JvdW5kKG1vbnRocyAvIDEyKTtcclxuICAgICAgICAgICAgZGF0YS55ZWFycyA9IHllYXJzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHdlZWtzIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWJzUm91bmQodGhpcy5kYXlzKCkgLyA3KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICB2YWx1ZU9mIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWlsbGlzZWNvbmRzICtcclxuICAgICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xyXG4gICAgICAgICAgICAgICh0aGlzLl9tb250aHMgJSAxMikgKiAyNTkyZTYgK1xyXG4gICAgICAgICAgICAgIHRvSW50KHRoaXMuX21vbnRocyAvIDEyKSAqIDMxNTM2ZTY7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaHVtYW5pemUgOiBmdW5jdGlvbiAod2l0aFN1ZmZpeCkge1xyXG4gICAgICAgICAgICB2YXIgZGlmZmVyZW5jZSA9ICt0aGlzLFxyXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gcmVsYXRpdmVUaW1lKGRpZmZlcmVuY2UsICF3aXRoU3VmZml4LCB0aGlzLmxhbmcoKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAod2l0aFN1ZmZpeCkge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gdGhpcy5sYW5nKCkucGFzdEZ1dHVyZShkaWZmZXJlbmNlLCBvdXRwdXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nKCkucG9zdGZvcm1hdChvdXRwdXQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGFkZCA6IGZ1bmN0aW9uIChpbnB1dCwgdmFsKSB7XHJcbiAgICAgICAgICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChtb21lbnQpXHJcbiAgICAgICAgICAgIHZhciBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQsIHZhbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgKz0gZHVyLl9taWxsaXNlY29uZHM7XHJcbiAgICAgICAgICAgIHRoaXMuX2RheXMgKz0gZHVyLl9kYXlzO1xyXG4gICAgICAgICAgICB0aGlzLl9tb250aHMgKz0gZHVyLl9tb250aHM7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9idWJibGUoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHN1YnRyYWN0IDogZnVuY3Rpb24gKGlucHV0LCB2YWwpIHtcclxuICAgICAgICAgICAgdmFyIGR1ciA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCwgdmFsKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyAtPSBkdXIuX21pbGxpc2Vjb25kcztcclxuICAgICAgICAgICAgdGhpcy5fZGF5cyAtPSBkdXIuX2RheXM7XHJcbiAgICAgICAgICAgIHRoaXMuX21vbnRocyAtPSBkdXIuX21vbnRocztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2J1YmJsZSgpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgZ2V0IDogZnVuY3Rpb24gKHVuaXRzKSB7XHJcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0cy50b0xvd2VyQ2FzZSgpICsgJ3MnXSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGFzIDogZnVuY3Rpb24gKHVuaXRzKSB7XHJcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpc1snYXMnICsgdW5pdHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB1bml0cy5zbGljZSgxKSArICdzJ10oKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBsYW5nIDogbW9tZW50LmZuLmxhbmcsXHJcblxyXG4gICAgICAgIHRvSXNvU3RyaW5nIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xyXG4gICAgICAgICAgICB2YXIgeWVhcnMgPSBNYXRoLmFicyh0aGlzLnllYXJzKCkpLFxyXG4gICAgICAgICAgICAgICAgbW9udGhzID0gTWF0aC5hYnModGhpcy5tb250aHMoKSksXHJcbiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5hYnModGhpcy5kYXlzKCkpLFxyXG4gICAgICAgICAgICAgICAgaG91cnMgPSBNYXRoLmFicyh0aGlzLmhvdXJzKCkpLFxyXG4gICAgICAgICAgICAgICAgbWludXRlcyA9IE1hdGguYWJzKHRoaXMubWludXRlcygpKSxcclxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBNYXRoLmFicyh0aGlzLnNlY29uZHMoKSArIHRoaXMubWlsbGlzZWNvbmRzKCkgLyAxMDAwKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5hc1NlY29uZHMoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxyXG4gICAgICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuYXNTZWNvbmRzKCkgPCAwID8gJy0nIDogJycpICtcclxuICAgICAgICAgICAgICAgICdQJyArXHJcbiAgICAgICAgICAgICAgICAoeWVhcnMgPyB5ZWFycyArICdZJyA6ICcnKSArXHJcbiAgICAgICAgICAgICAgICAobW9udGhzID8gbW9udGhzICsgJ00nIDogJycpICtcclxuICAgICAgICAgICAgICAgIChkYXlzID8gZGF5cyArICdEJyA6ICcnKSArXHJcbiAgICAgICAgICAgICAgICAoKGhvdXJzIHx8IG1pbnV0ZXMgfHwgc2Vjb25kcykgPyAnVCcgOiAnJykgK1xyXG4gICAgICAgICAgICAgICAgKGhvdXJzID8gaG91cnMgKyAnSCcgOiAnJykgK1xyXG4gICAgICAgICAgICAgICAgKG1pbnV0ZXMgPyBtaW51dGVzICsgJ00nIDogJycpICtcclxuICAgICAgICAgICAgICAgIChzZWNvbmRzID8gc2Vjb25kcyArICdTJyA6ICcnKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBtYWtlRHVyYXRpb25HZXR0ZXIobmFtZSkge1xyXG4gICAgICAgIG1vbWVudC5kdXJhdGlvbi5mbltuYW1lXSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFbbmFtZV07XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtYWtlRHVyYXRpb25Bc0dldHRlcihuYW1lLCBmYWN0b3IpIHtcclxuICAgICAgICBtb21lbnQuZHVyYXRpb24uZm5bJ2FzJyArIG5hbWVdID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gK3RoaXMgLyBmYWN0b3I7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGkgaW4gdW5pdE1pbGxpc2Vjb25kRmFjdG9ycykge1xyXG4gICAgICAgIGlmICh1bml0TWlsbGlzZWNvbmRGYWN0b3JzLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgIG1ha2VEdXJhdGlvbkFzR2V0dGVyKGksIHVuaXRNaWxsaXNlY29uZEZhY3RvcnNbaV0pO1xyXG4gICAgICAgICAgICBtYWtlRHVyYXRpb25HZXR0ZXIoaS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUR1cmF0aW9uQXNHZXR0ZXIoJ1dlZWtzJywgNjA0OGU1KTtcclxuICAgIG1vbWVudC5kdXJhdGlvbi5mbi5hc01vbnRocyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gKCt0aGlzIC0gdGhpcy55ZWFycygpICogMzE1MzZlNikgLyAyNTkyZTYgKyB0aGlzLnllYXJzKCkgKiAxMjtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICBEZWZhdWx0IExhbmdcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblxyXG4gICAgLy8gU2V0IGRlZmF1bHQgbGFuZ3VhZ2UsIG90aGVyIGxhbmd1YWdlcyB3aWxsIGluaGVyaXQgZnJvbSBFbmdsaXNoLlxyXG4gICAgbW9tZW50LmxhbmcoJ2VuJywge1xyXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXHJcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodG9JbnQobnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxyXG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6XHJcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcclxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8qIEVNQkVEX0xBTkdVQUdFUyAqL1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICBFeHBvc2luZyBNb21lbnRcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbiAgICBmdW5jdGlvbiBtYWtlR2xvYmFsKGRlcHJlY2F0ZSkge1xyXG4gICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZSwgbG9jYWxfbW9tZW50ID0gbW9tZW50O1xyXG4gICAgICAgIC8qZ2xvYmFsIGVuZGVyOmZhbHNlICovXHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbmRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBoZXJlLCBgdGhpc2AgbWVhbnMgYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIG9yIGBnbG9iYWxgIG9uIHRoZSBzZXJ2ZXJcclxuICAgICAgICAvLyBhZGQgYG1vbWVudGAgYXMgYSBnbG9iYWwgb2JqZWN0IHZpYSBhIHN0cmluZyBpZGVudGlmaWVyLFxyXG4gICAgICAgIC8vIGZvciBDbG9zdXJlIENvbXBpbGVyIFwiYWR2YW5jZWRcIiBtb2RlXHJcbiAgICAgICAgaWYgKGRlcHJlY2F0ZSkge1xyXG4gICAgICAgICAgICBnbG9iYWwubW9tZW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF3YXJuZWQgJiYgY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcclxuICAgICAgICAgICAgICAgICAgICB3YXJuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQWNjZXNzaW5nIE1vbWVudCB0aHJvdWdoIHRoZSBnbG9iYWwgc2NvcGUgaXMgXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXByZWNhdGVkLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmVsZWFzZS5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfbW9tZW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGV4dGVuZChnbG9iYWwubW9tZW50LCBsb2NhbF9tb21lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbFsnbW9tZW50J10gPSBtb21lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbW1vbkpTIG1vZHVsZSBpcyBkZWZpbmVkXHJcbiAgICBpZiAoaGFzTW9kdWxlKSB7XHJcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtb21lbnQ7XHJcbiAgICAgICAgbWFrZUdsb2JhbCh0cnVlKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcclxuICAgICAgICBkZWZpbmUoXCJtb21lbnRcIiwgZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlLmNvbmZpZyAmJiBtb2R1bGUuY29uZmlnKCkgJiYgbW9kdWxlLmNvbmZpZygpLm5vR2xvYmFsICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB1c2VyIHByb3ZpZGVkIG5vR2xvYmFsLCBoZSBpcyBhd2FyZSBvZiBnbG9iYWxcclxuICAgICAgICAgICAgICAgIG1ha2VHbG9iYWwobW9kdWxlLmNvbmZpZygpLm5vR2xvYmFsID09PSB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9tZW50O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBtYWtlR2xvYmFsKCk7XHJcbiAgICB9XHJcbn0pLmNhbGwodGhpcyk7XHJcbiJdLCJmaWxlIjoibW9tZW50LmpzIiwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0= \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/swfobject.js b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/swfobject.js index 830eaf540..ea4a8f7d0 100644 --- a/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/swfobject.js +++ b/src/Orchard.Web/Modules/Orchard.Azure.MediaServices/Scripts/lib/swfobject.js @@ -2,4 +2,4 @@ is released under the MIT License */ var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab