diff --git a/dist/tangram.debug.js b/dist/tangram.debug.js index 06c85f333..8b81c4b62 100644 --- a/dist/tangram.debug.js +++ b/dist/tangram.debug.js @@ -30647,14 +30647,18 @@ var Scene = function () { return; } - this.selection.bind(); // switch to FBO - this.renderPass('selection_program', // render w/alternate program - { allow_blend: false }); - this.selection.read(); // read results from selection buffer + if (!this.selection.locked) { + // check if selection buffer is locked (e.g. building tiles) + this.selection.bind(); // switch to FBO + this.renderPass('selection_program', // render w/alternate program + { allow_blend: false }); + + // Reset to screen buffer + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.viewport(0, 0, this.canvas.width, this.canvas.height); + } - // Reset to screen buffer - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.viewport(0, 0, this.canvas.width, this.canvas.height); + this.selection.read(); // process any pending results from selection buffer } this.render_count_changed = false; @@ -31363,8 +31367,12 @@ var Scene = function () { }, { key: 'resetFeatureSelection', value: function resetFeatureSelection() { + var _this15 = this; + if (!this.selection) { - this.selection = new _selection2.default(this.gl, this.workers); + this.selection = new _selection2.default(this.gl, this.workers, function () { + return _this15.building; + }); } else if (this.workers) { _worker_broker2.default.postMessage(this.workers, 'self.resetFeatureSelection'); } @@ -31375,7 +31383,7 @@ var Scene = function () { }, { key: 'getFeatureSelectionMapSize', value: function getFeatureSelectionMapSize() { - var _this15 = this; + var _this16 = this; if (this.fetching_selection_map) { return Promise.resolve(); // return undefined if already pending @@ -31383,7 +31391,7 @@ var Scene = function () { this.fetching_selection_map = true; return _worker_broker2.default.postMessage(this.workers, 'self.getFeatureSelectionMapSize').then(function (sizes) { - _this15.fetching_selection_map = false; + _this16.fetching_selection_map = false; return sizes.reduce(function (a, b) { return a + b; }); @@ -32619,11 +32627,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var FeatureSelection = function () { - function FeatureSelection(gl, workers) { + function FeatureSelection(gl, workers, lock_fn) { _classCallCheck(this, FeatureSelection); this.gl = gl; this.workers = workers; // pool of workers to request feature look-ups from, keyed by id + this._lock_fn = typeof lock_fn === 'function' && lock_fn; // indicates if safe to read/write selection buffer this frame this.init(); } @@ -32670,6 +32679,9 @@ var FeatureSelection = function () { // TODO: free texture? } + + // external lock function determines when it's safe to read/write from selection buffer + }, { key: 'bind', value: function bind() { @@ -32690,7 +32702,6 @@ var FeatureSelection = function () { // Queue requests for feature selection, and they will be picked up by the render loop _this.selection_request_id = _this.selection_request_id + 1 || 0; _this.requests[_this.selection_request_id] = { - type: 'point', id: _this.selection_request_id, point: point, resolve: resolve, @@ -32738,6 +32749,10 @@ var FeatureSelection = function () { clearTimeout(this.read_delay_timer); } this.read_delay_timer = setTimeout(function () { + if (_this2.locked) { + return; + } + var gl = _this2.gl; gl.bindFramebuffer(gl.FRAMEBUFFER, _this2.fbo); @@ -32750,11 +32765,6 @@ var FeatureSelection = function () { continue; } - // TODO: support other selection types, such as features within a box - if (request.type !== 'point') { - continue; - } - // Check selection map against FBO gl.readPixels(Math.floor(request.point.x * _this2.fbo_size.width), Math.floor((1 - request.point.y) * _this2.fbo_size.height), 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, _this2.pixel); var feature_key = _this2.pixel[0] + (_this2.pixel[1] << 8) + (_this2.pixel[2] << 16) + (_this2.pixel[3] << 24) >>> 0; @@ -32771,7 +32781,7 @@ var FeatureSelection = function () { } // No feature found, but still need to resolve promise else { - _this2.finishRead({ id: request.id, feature: null }); + _this2.finishRead({ id: request.id }); } request.sent = true; @@ -32813,6 +32823,11 @@ var FeatureSelection = function () { // need the main thread to know where each feature color originated. To accomplish this, // we partition the map by setting the 4th component (alpha channel) to the worker's id. + }, { + key: 'locked', + get: function get() { + return this._lock_fn && this._lock_fn() || false; + } }], [{ key: 'makeEntry', value: function makeEntry(tile) { @@ -41962,7 +41977,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.11.5\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson-client\": \"tangrams/topojson-client#read-only\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-preset-es2015\": \"6.16.0\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"core-js\": \"2.4.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); +var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.11.6\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson-client\": \"tangrams/topojson-client#read-only\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-preset-es2015\": \"6.16.0\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"core-js\": \"2.4.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); var version = void 0; exports.default = version = 'v' + pkg.version; @@ -43174,4 +43189,4 @@ exports.default = View; },{"./camera":198,"./geo":199,"./tile":249,"./utils/log":255,"./utils/subscribe":260,"./utils/utils":263}]},{},[223])(223) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLWFzYXAuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzNi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2ZvbnRmYWNlb2JzZXJ2ZXIvZm9udGZhY2VvYnNlcnZlci5zdGFuZGFsb25lLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9pbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9ub3JtYWwtZnJvbS1tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvY29weS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2lkZW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbG9va0F0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbXVsdGlwbHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9wZXJzcGVjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3NjYWxlLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvdHJhbnNsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2dsLXNoYWRlci1lcnJvcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2xvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvYmFzZTY0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2VkT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2lvbnMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2NyYzMyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZXh0ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2ZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbG9hZC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqc1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9BcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL0RhdGFSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9Ob2RlQnVmZmVyUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvU3RyaW5nUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvVWludDhBcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL3JlYWRlckZvci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vQ29udmVydFdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NyYzMyUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhV29ya2VyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vR2VuZXJpY1dvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL1N0cmVhbUhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRmOC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBPYmplY3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9hZGxlcjMyLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJub2RlX21vZHVsZXMvcGJmL2J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG9wb2pzb24tY2xpZW50L2Rpc3QvdG9wb2pzb24tY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMiLCJzcmMvYnVpbGRlcnMvY29tbW9uLmpzIiwic3JjL2J1aWxkZXJzL3BvaW50cy5qcyIsInNyYy9idWlsZGVycy9wb2x5Z29ucy5qcyIsInNyYy9idWlsZGVycy9wb2x5bGluZXMuanMiLCJzcmMvY2FtZXJhLmpzIiwic3JjL2dlby5qcyIsInNyYy9nbC9jb25zdGFudHMuanMiLCJzcmMvZ2wvY29udGV4dC5qcyIsInNyYy9nbC9leHRlbnNpb25zLmpzIiwic3JjL2dsL2dsc2wuanMiLCJzcmMvZ2wvcmVuZGVyX3N0YXRlLmpzIiwic3JjL2dsL3NoYWRlcl9wcm9ncmFtLmpzIiwic3JjL2dsL3RleHR1cmUuanMiLCJzcmMvZ2wvdmFvLmpzIiwic3JjL2dsL3Zib19tZXNoLmpzIiwic3JjL2dsL3ZlcnRleF9kYXRhLmpzIiwic3JjL2dsL3ZlcnRleF9lbGVtZW50cy5qcyIsInNyYy9nbC92ZXJ0ZXhfbGF5b3V0LmpzIiwic3JjL2xhYmVscy9jb2xsaXNpb24uanMiLCJzcmMvbGFiZWxzL2ludGVyc2VjdC5qcyIsInNyYy9sYWJlbHMvbGFiZWwuanMiLCJzcmMvbGFiZWxzL2xhYmVsX2xpbmUuanMiLCJzcmMvbGFiZWxzL2xhYmVsX3BvaW50LmpzIiwic3JjL2xhYmVscy9wb2ludF9hbmNob3IuanMiLCJzcmMvbGFiZWxzL3BvaW50X3BsYWNlbWVudC5qcyIsInNyYy9sYWJlbHMvcmVwZWF0X2dyb3VwLmpzIiwic3JjL2xlYWZsZXRfbGF5ZXIuanMiLCJzcmMvbGlnaHQuanMiLCJzcmMvbWF0ZXJpYWwuanMiLCJzcmMvbW9kdWxlLmpzIiwic3JjL3NjZW5lLmpzIiwic3JjL3NjZW5lX2J1bmRsZS5qcyIsInNyYy9zY2VuZV9sb2FkZXIuanMiLCJzcmMvc2NlbmVfd29ya2VyLmpzIiwic3JjL3NlbGVjdGlvbi5qcyIsInNyYy9zb3VyY2VzL2RhdGFfc291cmNlLmpzIiwic3JjL3NvdXJjZXMvZ2VvanNvbi5qcyIsInNyYy9zb3VyY2VzL212dC5qcyIsInNyYy9zb3VyY2VzL3Jhc3Rlci5qcyIsInNyYy9zb3VyY2VzL3RvcG9qc29uLmpzIiwic3JjL3N0eWxlcy9maWx0ZXIuanMiLCJzcmMvc3R5bGVzL2xheWVyLmpzIiwic3JjL3N0eWxlcy9saW5lcy9kYXNoYXJyYXkuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2xpbmVzLmpzIiwic3JjL3N0eWxlcy9wb2ludHMvcG9pbnRzLmpzIiwic3JjL3N0eWxlcy9wb2x5Z29ucy9wb2x5Z29ucy5qcyIsInNyYy9zdHlsZXMvcmFzdGVyL3Jhc3Rlci5qcyIsInNyYy9zdHlsZXMvc3R5bGUuanMiLCJzcmMvc3R5bGVzL3N0eWxlX21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3N0eWxlX3BhcnNlci5qcyIsInNyYy9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC9mb250X21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3RleHQvdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X2xhYmVscy5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X3NldHRpbmdzLmpzIiwic3JjL3RpbGUuanMiLCJzcmMvdGlsZV9tYW5hZ2VyLmpzIiwic3JjL3RpbGVfcHlyYW1pZC5qcyIsInNyYy91dGlscy9kZWJ1Z19zZXR0aW5ncy5qcyIsInNyYy91dGlscy9lcnJvcnMuanMiLCJzcmMvdXRpbHMvZ2wtbWF0cml4LmpzIiwic3JjL3V0aWxzL2xvZy5qcyIsInNyYy91dGlscy9tZWRpYV9jYXB0dXJlLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9wb2x5ZmlsbHMuanMiLCJzcmMvdXRpbHMvc3Vic2NyaWJlLmpzIiwic3JjL3V0aWxzL3RocmVhZC5qcyIsInNyYy91dGlscy91cmxzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3dkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGpEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy8yQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbmdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFrQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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SyxRQUEvQixFQUF5QyxPQUF6QztBQUNIOztBQUVEOzs7O3FDQUNjLE8sRUFBUztBQUNuQixvQkFBUSxPQUFSLENBQWdCLEtBQWhCLEVBQXVCLGNBQXZCLEVBQXVDLENBQUMsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixLQUFsQixFQUF5QixLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLE1BQTFDLENBQXZDO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixLQUFoQixFQUF1QixnQkFBdkIsRUFBeUMsQ0FBQyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQXBCLEVBQXVCLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBMUMsRUFBNkMsS0FBSyxJQUFsRCxDQUF6QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0Isb0JBQXRCLEVBQTRDLEtBQUssZ0JBQWpEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixzQkFBdEIsRUFBOEMsZ0JBQU0sa0JBQXBEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQix1QkFBdEIsRUFBK0MsS0FBSyxjQUFwRDtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsZ0JBQXRCLEVBQXdDLEtBQUssT0FBN0M7O0FBRUEsaUJBQUssTUFBTCxDQUFZLFlBQVosQ0FBeUIsT0FBekI7QUFDSDs7QUFFRDs7OztzQ0FDZTtBQUNYLG1CQUFRLEtBQUssY0FBTCxJQUF1QixrQkFBL0I7QUFDSDs7Ozs7O2tCQXRVZ0IsSSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gcmF3QXNhcCBwcm92aWRlcyBldmVyeXRoaW5nIHdlIG5lZWQgZXhjZXB0IGV4Y2VwdGlvbiBtYW5hZ2VtZW50LlxudmFyIHJhd0FzYXAgPSByZXF1aXJlKFwiLi9yYXdcIik7XG4vLyBSYXdUYXNrcyBhcmUgcmVjeWNsZWQgdG8gcmVkdWNlIEdDIGNodXJuLlxudmFyIGZyZWVUYXNrcyA9IFtdO1xuLy8gV2UgcXVldWUgZXJyb3JzIHRvIGVuc3VyZSB0aGV5IGFyZSB0aHJvd24gaW4gcmlnaHQgb3JkZXIgKEZJRk8pLlxuLy8gQXJyYXktYXMtcXVldWUgaXMgZ29vZCBlbm91Z2ggaGVyZSwgc2luY2Ugd2UgYXJlIGp1c3QgZGVhbGluZyB3aXRoIGV4Y2VwdGlvbnMuXG52YXIgcGVuZGluZ0Vycm9ycyA9IFtdO1xudmFyIHJlcXVlc3RFcnJvclRocm93ID0gcmF3QXNhcC5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXIodGhyb3dGaXJzdEVycm9yKTtcblxuZnVuY3Rpb24gdGhyb3dGaXJzdEVycm9yKCkge1xuICAgIGlmIChwZW5kaW5nRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBwZW5kaW5nRXJyb3JzLnNoaWZ0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENhbGxzIGEgdGFzayBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHJldHVybmluZywgaW4gaXRzIG93biBldmVudCwgd2l0aCBwcmlvcml0eVxuICogb3ZlciBvdGhlciBldmVudHMgbGlrZSBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlcGFpbnQuIEFuIGVycm9yIHRocm93biBmcm9tIGFuXG4gKiBldmVudCB3aWxsIG5vdCBpbnRlcnJ1cHQsIG5vciBldmVuIHN1YnN0YW50aWFsbHkgc2xvdyBkb3duIHRoZSBwcm9jZXNzaW5nIG9mXG4gKiBvdGhlciBldmVudHMsIGJ1dCB3aWxsIGJlIHJhdGhlciBwb3N0cG9uZWQgdG8gYSBsb3dlciBwcmlvcml0eSBldmVudC5cbiAqIEBwYXJhbSB7e2NhbGx9fSB0YXNrIEEgY2FsbGFibGUgb2JqZWN0LCB0eXBpY2FsbHkgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vXG4gKiBhcmd1bWVudHMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gYXNhcDtcbmZ1bmN0aW9uIGFzYXAodGFzaykge1xuICAgIHZhciByYXdUYXNrO1xuICAgIGlmIChmcmVlVGFza3MubGVuZ3RoKSB7XG4gICAgICAgIHJhd1Rhc2sgPSBmcmVlVGFza3MucG9wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmF3VGFzayA9IG5ldyBSYXdUYXNrKCk7XG4gICAgfVxuICAgIHJhd1Rhc2sudGFzayA9IHRhc2s7XG4gICAgcmF3QXNhcChyYXdUYXNrKTtcbn1cblxuLy8gV2Ugd3JhcCB0YXNrcyB3aXRoIHJlY3ljbGFibGUgdGFzayBvYmplY3RzLiAgQSB0YXNrIG9iamVjdCBpbXBsZW1lbnRzXG4vLyBgY2FsbGAsIGp1c3QgbGlrZSBhIGZ1bmN0aW9uLlxuZnVuY3Rpb24gUmF3VGFzaygpIHtcbiAgICB0aGlzLnRhc2sgPSBudWxsO1xufVxuXG4vLyBUaGUgc29sZSBwdXJwb3NlIG9mIHdyYXBwaW5nIHRoZSB0YXNrIGlzIHRvIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIHJlY3ljbGVcbi8vIHRoZSB0YXNrIG9iamVjdCBhZnRlciBpdHMgc2luZ2xlIHVzZS5cblJhd1Rhc2sucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdGhpcy50YXNrLmNhbGwoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoYXNhcC5vbmVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGhvb2sgZXhpc3RzIHB1cmVseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAgICAgICAgIC8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdFxuICAgICAgICAgICAgLy8gZGVwZW5kcyBvbiBpdHMgZXhpc3RlbmNlLlxuICAgICAgICAgICAgYXNhcC5vbmVycm9yKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEluIGEgd2ViIGJyb3dzZXIsIGV4Y2VwdGlvbnMgYXJlIG5vdCBmYXRhbC4gSG93ZXZlciwgdG8gYXZvaWRcbiAgICAgICAgICAgIC8vIHNsb3dpbmcgZG93biB0aGUgcXVldWUgb2YgcGVuZGluZyB0YXNrcywgd2UgcmV0aHJvdyB0aGUgZXJyb3IgaW4gYVxuICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgdHVybi5cbiAgICAgICAgICAgIHBlbmRpbmdFcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgICByZXF1ZXN0RXJyb3JUaHJvdygpO1xuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy50YXNrID0gbnVsbDtcbiAgICAgICAgZnJlZVRhc2tzW2ZyZWVUYXNrcy5sZW5ndGhdID0gdGhpcztcbiAgICB9XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFVzZSB0aGUgZmFzdGVzdCBtZWFucyBwb3NzaWJsZSB0byBleGVjdXRlIGEgdGFzayBpbiBpdHMgb3duIHR1cm4sIHdpdGhcbi8vIHByaW9yaXR5IG92ZXIgb3RoZXIgZXZlbnRzIGluY2x1ZGluZyBJTywgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZWRyYXdcbi8vIGV2ZW50cyBpbiBicm93c2Vycy5cbi8vXG4vLyBBbiBleGNlcHRpb24gdGhyb3duIGJ5IGEgdGFzayB3aWxsIHBlcm1hbmVudGx5IGludGVycnVwdCB0aGUgcHJvY2Vzc2luZyBvZlxuLy8gc3Vic2VxdWVudCB0YXNrcy4gVGhlIGhpZ2hlciBsZXZlbCBgYXNhcGAgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGlmIGFuXG4vLyBleGNlcHRpb24gaXMgdGhyb3duIGJ5IGEgdGFzaywgdGhhdCB0aGUgdGFzayBxdWV1ZSB3aWxsIGNvbnRpbnVlIGZsdXNoaW5nIGFzXG4vLyBzb29uIGFzIHBvc3NpYmxlLCBidXQgaWYgeW91IHVzZSBgcmF3QXNhcGAgZGlyZWN0bHksIHlvdSBhcmUgcmVzcG9uc2libGUgdG9cbi8vIGVpdGhlciBlbnN1cmUgdGhhdCBubyBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB5b3VyIHRhc2ssIG9yIHRvIG1hbnVhbGx5XG4vLyBjYWxsIGByYXdBc2FwLnJlcXVlc3RGbHVzaGAgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bi5cbm1vZHVsZS5leHBvcnRzID0gcmF3QXNhcDtcbmZ1bmN0aW9uIHJhd0FzYXAodGFzaykge1xuICAgIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHJlcXVlc3RGbHVzaCgpO1xuICAgICAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgfVxuICAgIC8vIEVxdWl2YWxlbnQgdG8gcHVzaCwgYnV0IGF2b2lkcyBhIGZ1bmN0aW9uIGNhbGwuXG4gICAgcXVldWVbcXVldWUubGVuZ3RoXSA9IHRhc2s7XG59XG5cbnZhciBxdWV1ZSA9IFtdO1xuLy8gT25jZSBhIGZsdXNoIGhhcyBiZWVuIHJlcXVlc3RlZCwgbm8gZnVydGhlciBjYWxscyB0byBgcmVxdWVzdEZsdXNoYCBhcmVcbi8vIG5lY2Vzc2FyeSB1bnRpbCB0aGUgbmV4dCBgZmx1c2hgIGNvbXBsZXRlcy5cbnZhciBmbHVzaGluZyA9IGZhbHNlO1xuLy8gYHJlcXVlc3RGbHVzaGAgaXMgYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgbWV0aG9kIHRoYXQgYXR0ZW1wdHMgdG8ga2lja1xuLy8gb2ZmIGEgYGZsdXNoYCBldmVudCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiBgZmx1c2hgIHdpbGwgYXR0ZW1wdCB0byBleGhhdXN0XG4vLyB0aGUgZXZlbnQgcXVldWUgYmVmb3JlIHlpZWxkaW5nIHRvIHRoZSBicm93c2VyJ3Mgb3duIGV2ZW50IGxvb3AuXG52YXIgcmVxdWVzdEZsdXNoO1xuLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IHRhc2sgdG8gZXhlY3V0ZSBpbiB0aGUgdGFzayBxdWV1ZS4gVGhpcyBpc1xuLy8gcHJlc2VydmVkIGJldHdlZW4gY2FsbHMgdG8gYGZsdXNoYCBzbyB0aGF0IGl0IGNhbiBiZSByZXN1bWVkIGlmXG4vLyBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbnZhciBpbmRleCA9IDA7XG4vLyBJZiBhIHRhc2sgc2NoZWR1bGVzIGFkZGl0aW9uYWwgdGFza3MgcmVjdXJzaXZlbHksIHRoZSB0YXNrIHF1ZXVlIGNhbiBncm93XG4vLyB1bmJvdW5kZWQuIFRvIHByZXZlbnQgbWVtb3J5IGV4aGF1c3Rpb24sIHRoZSB0YXNrIHF1ZXVlIHdpbGwgcGVyaW9kaWNhbGx5XG4vLyB0cnVuY2F0ZSBhbHJlYWR5LWNvbXBsZXRlZCB0YXNrcy5cbnZhciBjYXBhY2l0eSA9IDEwMjQ7XG5cbi8vIFRoZSBmbHVzaCBmdW5jdGlvbiBwcm9jZXNzZXMgYWxsIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHNjaGVkdWxlZCB3aXRoXG4vLyBgcmF3QXNhcGAgdW5sZXNzIGFuZCB1bnRpbCBvbmUgb2YgdGhvc2UgdGFza3MgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbi8vIElmIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLCBgZmx1c2hgIGVuc3VyZXMgdGhhdCBpdHMgc3RhdGUgd2lsbCByZW1haW5cbi8vIGNvbnNpc3RlbnQgYW5kIHdpbGwgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmIHdoZW4gY2FsbGVkIGFnYWluLlxuLy8gSG93ZXZlciwgYGZsdXNoYCBkb2VzIG5vdCBtYWtlIGFueSBhcnJhbmdlbWVudHMgdG8gYmUgY2FsbGVkIGFnYWluIGlmIGFuXG4vLyBleGNlcHRpb24gaXMgdGhyb3duLlxuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBjdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgLy8gQWR2YW5jZSB0aGUgaW5kZXggYmVmb3JlIGNhbGxpbmcgdGhlIHRhc2suIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHdpbGxcbiAgICAgICAgLy8gYmVnaW4gZmx1c2hpbmcgb24gdGhlIG5leHQgdGFzayB0aGUgdGFzayB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICBxdWV1ZVtjdXJyZW50SW5kZXhdLmNhbGwoKTtcbiAgICAgICAgLy8gUHJldmVudCBsZWFraW5nIG1lbW9yeSBmb3IgbG9uZyBjaGFpbnMgb2YgcmVjdXJzaXZlIGNhbGxzIHRvIGBhc2FwYC5cbiAgICAgICAgLy8gSWYgd2UgY2FsbCBgYXNhcGAgd2l0aGluIHRhc2tzIHNjaGVkdWxlZCBieSBgYXNhcGAsIHRoZSBxdWV1ZSB3aWxsXG4gICAgICAgIC8vIGdyb3csIGJ1dCB0byBhdm9pZCBhbiBPKG4pIHdhbGsgZm9yIGV2ZXJ5IHRhc2sgd2UgZXhlY3V0ZSwgd2UgZG9uJ3RcbiAgICAgICAgLy8gc2hpZnQgdGFza3Mgb2ZmIHRoZSBxdWV1ZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBleGVjdXRlZC5cbiAgICAgICAgLy8gSW5zdGVhZCwgd2UgcGVyaW9kaWNhbGx5IHNoaWZ0IDEwMjQgdGFza3Mgb2ZmIHRoZSBxdWV1ZS5cbiAgICAgICAgaWYgKGluZGV4ID4gY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIC8vIE1hbnVhbGx5IHNoaWZ0IGFsbCB2YWx1ZXMgc3RhcnRpbmcgYXQgdGhlIGluZGV4IGJhY2sgdG8gdGhlXG4gICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlLlxuICAgICAgICAgICAgZm9yICh2YXIgc2NhbiA9IDAsIG5ld0xlbmd0aCA9IHF1ZXVlLmxlbmd0aCAtIGluZGV4OyBzY2FuIDwgbmV3TGVuZ3RoOyBzY2FuKyspIHtcbiAgICAgICAgICAgICAgICBxdWV1ZVtzY2FuXSA9IHF1ZXVlW3NjYW4gKyBpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZS5sZW5ndGggLT0gaW5kZXg7XG4gICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBpbmRleCA9IDA7XG4gICAgZmx1c2hpbmcgPSBmYWxzZTtcbn1cblxuLy8gYHJlcXVlc3RGbHVzaGAgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIGNvbGxlY3RlZCBmcm9tXG4vLyBldmVyeSBhdmFpbGFibGUgU2F1Y2VMYWJzIFNlbGVuaXVtIHdlYiBkcml2ZXIgd29ya2VyIGF0IHRpbWUgb2Ygd3JpdGluZy5cbi8vIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFtRy01VVlHdXA1cXhHZEVNV2toUDZCV0N6MDUzTlViMkUxUW9VVFUxNnVBL2VkaXQjZ2lkPTc4MzcyNDU5M1xuXG4vLyBTYWZhcmkgNiBhbmQgNi4xIGZvciBkZXNrdG9wLCBpUGFkLCBhbmQgaVBob25lIGFyZSB0aGUgb25seSBicm93c2VycyB0aGF0XG4vLyBoYXZlIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIgYnV0IG5vdCB1bi1wcmVmaXhlZCBNdXRhdGlvbk9ic2VydmVyLlxuLy8gTXVzdCB1c2UgYGdsb2JhbGAgb3IgYHNlbGZgIGluc3RlYWQgb2YgYHdpbmRvd2AgdG8gd29yayBpbiBib3RoIGZyYW1lcyBhbmQgd2ViXG4vLyB3b3JrZXJzLiBgZ2xvYmFsYCBpcyBhIHByb3Zpc2lvbiBvZiBCcm93c2VyaWZ5LCBNciwgTXJzLCBvciBNb3AuXG5cbi8qIGdsb2JhbHMgc2VsZiAqL1xudmFyIHNjb3BlID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHNlbGY7XG52YXIgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSBzY29wZS5NdXRhdGlvbk9ic2VydmVyIHx8IHNjb3BlLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbi8vIE11dGF0aW9uT2JzZXJ2ZXJzIGFyZSBkZXNpcmFibGUgYmVjYXVzZSB0aGV5IGhhdmUgaGlnaCBwcmlvcml0eSBhbmQgd29ya1xuLy8gcmVsaWFibHkgZXZlcnl3aGVyZSB0aGV5IGFyZSBpbXBsZW1lbnRlZC5cbi8vIFRoZXkgYXJlIGltcGxlbWVudGVkIGluIGFsbCBtb2Rlcm4gYnJvd3NlcnMuXG4vL1xuLy8gLSBBbmRyb2lkIDQtNC4zXG4vLyAtIENocm9tZSAyNi0zNFxuLy8gLSBGaXJlZm94IDE0LTI5XG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDExXG4vLyAtIGlQYWQgU2FmYXJpIDYtNy4xXG4vLyAtIGlQaG9uZSBTYWZhcmkgNy03LjFcbi8vIC0gU2FmYXJpIDYtN1xuaWYgKHR5cGVvZiBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpO1xuXG4vLyBNZXNzYWdlQ2hhbm5lbHMgYXJlIGRlc2lyYWJsZSBiZWNhdXNlIHRoZXkgZ2l2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBIVE1MXG4vLyB0YXNrIHF1ZXVlLCBhcmUgaW1wbGVtZW50ZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAsIFNhZmFyaSA1LjAtMSwgYW5kIE9wZXJhXG4vLyAxMS0xMiwgYW5kIGluIHdlYiB3b3JrZXJzIGluIG1hbnkgZW5naW5lcy5cbi8vIEFsdGhvdWdoIG1lc3NhZ2UgY2hhbm5lbHMgeWllbGQgdG8gYW55IHF1ZXVlZCByZW5kZXJpbmcgYW5kIElPIHRhc2tzLCB0aGV5XG4vLyB3b3VsZCBiZSBiZXR0ZXIgdGhhbiBpbXBvc2luZyB0aGUgNG1zIGRlbGF5IG9mIHRpbWVycy5cbi8vIEhvd2V2ZXIsIHRoZXkgZG8gbm90IHdvcmsgcmVsaWFibHkgaW4gSW50ZXJuZXQgRXhwbG9yZXIgb3IgU2FmYXJpLlxuXG4vLyBJbnRlcm5ldCBFeHBsb3JlciAxMCBpcyB0aGUgb25seSBicm93c2VyIHRoYXQgaGFzIHNldEltbWVkaWF0ZSBidXQgZG9lc1xuLy8gbm90IGhhdmUgTXV0YXRpb25PYnNlcnZlcnMuXG4vLyBBbHRob3VnaCBzZXRJbW1lZGlhdGUgeWllbGRzIHRvIHRoZSBicm93c2VyJ3MgcmVuZGVyZXIsIGl0IHdvdWxkIGJlXG4vLyBwcmVmZXJyYWJsZSB0byBmYWxsaW5nIGJhY2sgdG8gc2V0VGltZW91dCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlXG4vLyB0aGUgbWluaW11bSA0bXMgcGVuYWx0eS5cbi8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXBwZWFycyB0byBiZSBhIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCBNb2JpbGUgKGFuZFxuLy8gRGVza3RvcCB0byBhIGxlc3NlciBleHRlbnQpIHRoYXQgcmVuZGVycyBib3RoIHNldEltbWVkaWF0ZSBhbmRcbi8vIE1lc3NhZ2VDaGFubmVsIHVzZWxlc3MgZm9yIHRoZSBwdXJwb3NlcyBvZiBBU0FQLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL2lzc3Vlcy8zOTZcblxuLy8gVGltZXJzIGFyZSBpbXBsZW1lbnRlZCB1bml2ZXJzYWxseS5cbi8vIFdlIGZhbGwgYmFjayB0byB0aW1lcnMgaW4gd29ya2VycyBpbiBtb3N0IGVuZ2luZXMsIGFuZCBpbiBmb3JlZ3JvdW5kXG4vLyBjb250ZXh0cyBpbiB0aGUgZm9sbG93aW5nIGJyb3dzZXJzLlxuLy8gSG93ZXZlciwgbm90ZSB0aGF0IGV2ZW4gdGhpcyBzaW1wbGUgY2FzZSByZXF1aXJlcyBudWFuY2VzIHRvIG9wZXJhdGUgaW4gYVxuLy8gYnJvYWQgc3BlY3RydW0gb2YgYnJvd3NlcnMuXG4vL1xuLy8gLSBGaXJlZm94IDMtMTNcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgNi05XG4vLyAtIGlQYWQgU2FmYXJpIDQuM1xuLy8gLSBMeW54IDIuOC43XG59IGVsc2Uge1xuICAgIHJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihmbHVzaCk7XG59XG5cbi8vIGByZXF1ZXN0Rmx1c2hgIHJlcXVlc3RzIHRoYXQgdGhlIGhpZ2ggcHJpb3JpdHkgZXZlbnQgcXVldWUgYmUgZmx1c2hlZCBhc1xuLy8gc29vbiBhcyBwb3NzaWJsZS5cbi8vIFRoaXMgaXMgdXNlZnVsIHRvIHByZXZlbnQgYW4gZXJyb3IgdGhyb3duIGluIGEgdGFzayBmcm9tIHN0YWxsaW5nIHRoZSBldmVudFxuLy8gcXVldWUgaWYgdGhlIGV4Y2VwdGlvbiBoYW5kbGVkIGJ5IE5vZGUuanPigJlzXG4vLyBgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIpYCBvciBieSBhIGRvbWFpbi5cbnJhd0FzYXAucmVxdWVzdEZsdXNoID0gcmVxdWVzdEZsdXNoO1xuXG4vLyBUbyByZXF1ZXN0IGEgaGlnaCBwcmlvcml0eSBldmVudCwgd2UgaW5kdWNlIGEgbXV0YXRpb24gb2JzZXJ2ZXIgYnkgdG9nZ2xpbmdcbi8vIHRoZSB0ZXh0IG9mIGEgdGV4dCBub2RlIGJldHdlZW4gXCIxXCIgYW5kIFwiLTFcIi5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKSB7XG4gICAgdmFyIHRvZ2dsZSA9IDE7XG4gICAgdmFyIG9ic2VydmVyID0gbmV3IEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gICAgICAgIHRvZ2dsZSA9IC10b2dnbGU7XG4gICAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZTtcbiAgICB9O1xufVxuXG4vLyBUaGUgbWVzc2FnZSBjaGFubmVsIHRlY2huaXF1ZSB3YXMgZGlzY292ZXJlZCBieSBNYWx0ZSBVYmwgYW5kIHdhcyB0aGVcbi8vIG9yaWdpbmFsIGZvdW5kYXRpb24gZm9yIHRoaXMgbGlicmFyeS5cbi8vIGh0dHA6Ly93d3cubm9uYmxvY2tpbmcuaW8vMjAxMS8wNi93aW5kb3duZXh0dGljay5odG1sXG5cbi8vIFNhZmFyaSA2LjAuNSAoYXQgbGVhc3QpIGludGVybWl0dGVudGx5IGZhaWxzIHRvIGNyZWF0ZSBtZXNzYWdlIHBvcnRzIG9uIGFcbi8vIHBhZ2UncyBmaXJzdCBsb2FkLiBUaGFua2Z1bGx5LCB0aGlzIHZlcnNpb24gb2YgU2FmYXJpIHN1cHBvcnRzXG4vLyBNdXRhdGlvbk9ic2VydmVycywgc28gd2UgZG9uJ3QgbmVlZCB0byBmYWxsIGJhY2sgaW4gdGhhdCBjYXNlLlxuXG4vLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTWVzc2FnZUNoYW5uZWwoY2FsbGJhY2spIHtcbi8vICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuLy8gICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gY2FsbGJhY2s7XG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuLy8gICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuLy8gICAgIH07XG4vLyB9XG5cbi8vIEZvciByZWFzb25zIGV4cGxhaW5lZCBhYm92ZSwgd2UgYXJlIGFsc28gdW5hYmxlIHRvIHVzZSBgc2V0SW1tZWRpYXRlYFxuLy8gdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuXG4vLyBFdmVuIGlmIHdlIHdlcmUsIHRoZXJlIGlzIGFub3RoZXIgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwLlxuLy8gSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gYXNzaWduIGBzZXRJbW1lZGlhdGVgIHRvIGByZXF1ZXN0Rmx1c2hgIGJlY2F1c2Vcbi8vIGBzZXRJbW1lZGlhdGVgIG11c3QgYmUgY2FsbGVkICpieSBuYW1lKiBhbmQgdGhlcmVmb3JlIG11c3QgYmUgd3JhcHBlZCBpbiBhXG4vLyBjbG9zdXJlLlxuLy8gTmV2ZXIgZm9yZ2V0LlxuXG4vLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tU2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuLy8gICAgICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuLy8gICAgIH07XG4vLyB9XG5cbi8vIFNhZmFyaSA2LjAgaGFzIGEgcHJvYmxlbSB3aGVyZSB0aW1lcnMgd2lsbCBnZXQgbG9zdCB3aGlsZSB0aGUgdXNlciBpc1xuLy8gc2Nyb2xsaW5nLiBUaGlzIHByb2JsZW0gZG9lcyBub3QgaW1wYWN0IEFTQVAgYmVjYXVzZSBTYWZhcmkgNi4wIHN1cHBvcnRzXG4vLyBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHRoYXQgaW1wbGVtZW50YXRpb24gaXMgdXNlZCBpbnN0ZWFkLlxuLy8gSG93ZXZlciwgaWYgd2UgZXZlciBlbGVjdCB0byB1c2UgdGltZXJzIGluIFNhZmFyaSwgdGhlIHByZXZhbGVudCB3b3JrLWFyb3VuZFxuLy8gaXMgdG8gYWRkIGEgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyIHRoYXQgY2FsbHMgZm9yIGEgZmx1c2guXG5cbi8vIGBzZXRUaW1lb3V0YCBkb2VzIG5vdCBjYWxsIHRoZSBwYXNzZWQgY2FsbGJhY2sgaWYgdGhlIGRlbGF5IGlzIGxlc3MgdGhhblxuLy8gYXBwcm94aW1hdGVseSA3IGluIHdlYiB3b3JrZXJzIGluIEZpcmVmb3ggOCB0aHJvdWdoIDE4LCBhbmQgc29tZXRpbWVzIG5vdFxuLy8gZXZlbiB0aGVuLlxuXG5mdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gICAgICAgIC8vIFdlIGRpc3BhdGNoIGEgdGltZW91dCB3aXRoIGEgc3BlY2lmaWVkIGRlbGF5IG9mIDAgZm9yIGVuZ2luZXMgdGhhdFxuICAgICAgICAvLyBjYW4gcmVsaWFibHkgYWNjb21tb2RhdGUgdGhhdCByZXF1ZXN0LiBUaGlzIHdpbGwgdXN1YWxseSBiZSBzbmFwcGVkXG4gICAgICAgIC8vIHRvIGEgNCBtaWxpc2Vjb25kIGRlbGF5LCBidXQgb25jZSB3ZSdyZSBmbHVzaGluZywgdGhlcmUncyBubyBkZWxheVxuICAgICAgICAvLyBiZXR3ZWVuIGV2ZW50cy5cbiAgICAgICAgdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGhhbmRsZVRpbWVyLCAwKTtcbiAgICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhpcyB0aW1lciBnZXRzIGZyZXF1ZW50bHkgZHJvcHBlZCBpbiBGaXJlZm94XG4gICAgICAgIC8vIHdvcmtlcnMsIHdlIGVubGlzdCBhbiBpbnRlcnZhbCBoYW5kbGUgdGhhdCB3aWxsIHRyeSB0byBmaXJlXG4gICAgICAgIC8vIGFuIGV2ZW50IDIwIHRpbWVzIHBlciBzZWNvbmQgdW50aWwgaXQgc3VjY2VlZHMuXG4gICAgICAgIHZhciBpbnRlcnZhbEhhbmRsZSA9IHNldEludGVydmFsKGhhbmRsZVRpbWVyLCA1MCk7XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVGltZXIoKSB7XG4gICAgICAgICAgICAvLyBXaGljaGV2ZXIgdGltZXIgc3VjY2VlZHMgd2lsbCBjYW5jZWwgYm90aCB0aW1lcnMgYW5kXG4gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxIYW5kbGUpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIFRoaXMgaXMgZm9yIGBhc2FwLmpzYCBvbmx5LlxuLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0IGRlcGVuZHMgb25cbi8vIGl0cyBleGlzdGVuY2UuXG5yYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lciA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcjtcblxuLy8gQVNBUCB3YXMgb3JpZ2luYWxseSBhIG5leHRUaWNrIHNoaW0gaW5jbHVkZWQgaW4gUS4gVGhpcyB3YXMgZmFjdG9yZWQgb3V0XG4vLyBpbnRvIHRoaXMgQVNBUCBwYWNrYWdlLiBJdCB3YXMgbGF0ZXIgYWRhcHRlZCB0byBSU1ZQIHdoaWNoIG1hZGUgZnVydGhlclxuLy8gYW1lbmRtZW50cy4gVGhlc2UgZGVjaXNpb25zLCBwYXJ0aWN1bGFybHkgdG8gbWFyZ2luYWxpemUgTWVzc2FnZUNoYW5uZWwgYW5kXG4vLyB0byBjYXB0dXJlIHRoZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIGluIGEgY2xvc3VyZSwgd2VyZSBpbnRlZ3JhdGVkXG4vLyBiYWNrIGludG8gQVNBUCBwcm9wZXIuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzL2Jsb2IvY2RkZjcyMzI1NDZhOWNmODU4NTI0Yjc1Y2RlNmY5ZWRmNzI2MjBhNy9saWIvcnN2cC9hc2FwLmpzXG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiBiNjQubGVuZ3RoICogMyAvIDQgLSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcbiAgcGxhY2VIb2xkZXJzID0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxuXG4gIGFyciA9IG5ldyBBcnIobGVuICogMyAvIDQgLSBwbGFjZUhvbGRlcnMpXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICB2YXIgTCA9IDBcblxuICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBvdXRwdXQgPSAnJ1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPT0nXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArICh1aW50OFtsZW4gLSAxXSlcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9J1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpXG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIiLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuUHJvbWlzZTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKVxuICAsIEFycmF5UHJvdG8gID0gQXJyYXkucHJvdG90eXBlO1xuaWYoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKXJlcXVpcmUoJy4vX2hpZGUnKShBcnJheVByb3RvLCBVTlNDT1BBQkxFUywge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKXtcbiAgaWYoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpe1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgdG9JbmRleCAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoJHRoaXMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuICAgICAgLCB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKWlmKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pe1xuICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07IiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXG4gIC8vIEVTMyB3cm9uZyBoZXJlXG4gICwgQVJHID0gY29mKGZ1bmN0aW9uKCl7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTsiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59OyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuNC4wJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpe1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuICBzd2l0Y2gobGVuZ3RoKXtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59OyIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnRcbiAgLy8gaW4gb2xkIElFIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnXG4gICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07IiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmUgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGN0eCAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcbiAgICAsIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0LkdcbiAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcbiAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcbiAgICAsIElTX0JJTkQgICA9IHR5cGUgJiAkZXhwb3J0LkJcbiAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXVxuICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcbiAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pXG4gICAgLCBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmKElTX0dMT0JBTClzb3VyY2UgPSBuYW1lO1xuICBmb3Ioa2V5IGluIHNvdXJjZSl7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYodGFyZ2V0KXJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmKGV4cG9ydHNba2V5XSAhPSBvdXQpaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWAgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07IiwidmFyIGN0eCAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgLCBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKVxuICAsIEJSRUFLICAgICAgID0ge31cbiAgLCBSRVRVUk4gICAgICA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1Ipe1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbigpeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYoaXNBcnJheUl0ZXIoaXRlckZuKSlmb3IobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLICA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59OyIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsiLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgYXJncywgdGhhdCl7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoKGFyZ3MubGVuZ3RoKXtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTsiLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTsiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgSVRFUkFUT1IgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTsiLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaChlKXtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmKHJldCAhPT0gdW5kZWZpbmVkKWFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBkZXNjcmlwdG9yICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgaGlkZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgSXRlcmF0b3JzICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsICRpdGVyQ3JlYXRlICAgID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgSVRFUkFUT1IgICAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEJVR0dZICAgICAgICAgID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpIC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG4gICwgVkFMVUVTICAgICAgICAgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbihraW5kKXtcbiAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG4gICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcbiAgICAsIFZBTFVFU19CVUcgPSBmYWxzZVxuICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG4gICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG4gICAgLCAkZGVmYXVsdCAgID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVClcbiAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG4gICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuICAgICwgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZigkYW55TmF0aXZlKXtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSkpO1xuICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUyl7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcbiAgaWYoREVGQVVMVCl7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuICAgICAgaWYoIShrZXkgaW4gcHJvdG8pKXJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07IiwidmFyIElURVJBVE9SICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24oKXsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24oKXsgdGhyb3cgMjsgfSk7XG59IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYywgc2tpcENsb3Npbmcpe1xuICBpZighc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORylyZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciAgPSBbN11cbiAgICAgICwgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbigpeyByZXR1cm4ge2RvbmU6IHNhZmUgPSB0cnVlfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59OyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgT2JzZXJ2ZXIgID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXJcbiAgLCBwcm9jZXNzICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIFByb21pc2UgICA9IGdsb2JhbC5Qcm9taXNlXG4gICwgaXNOb2RlICAgID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSlwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlKGhlYWQpe1xuICAgICAgZm4gICA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIGlmKGhlYWQpbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYocGFyZW50KXBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYoaXNOb2RlKXtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG4gIH0gZWxzZSBpZihPYnNlcnZlcil7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWVcbiAgICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oZm4pe1xuICAgIHZhciB0YXNrID0ge2ZuOiBmbiwgbmV4dDogdW5kZWZpbmVkfTtcbiAgICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYoIWhlYWQpe1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTsiLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZFBzICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKVxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXG4gICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgUFJPVE9UWVBFICAgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbigpe1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKVxuICAgICwgaSAgICAgID0gZW51bUJ1Z0tleXMubGVuZ3RoXG4gICAgLCBsdCAgICAgPSAnPCdcbiAgICAsIGd0ICAgICA9ICc+J1xuICAgICwgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcbiAgdmFyIHJlc3VsdDtcbiAgaWYoTyAhPT0gbnVsbCl7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBkUCAgICAgICAgICAgICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmKCd2YWx1ZScgaW4gQXR0cmlidXRlcylPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59OyIsInZhciBkUCAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGdldEtleXMgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgICA9IGdldEtleXMoUHJvcGVydGllcylcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpID0gMFxuICAgICwgUDtcbiAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07IiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9PYmplY3QgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXG4gICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbihPKXtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZihoYXMoTywgSUVfUFJPVE8pKXJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcil7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTsiLCJ2YXIgaGFzICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b0lPYmplY3QgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxuICAsIElFX1BST1RPICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSlpZihoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpe1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07IiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihiaXRtYXAsIHZhbHVlKXtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG4gIH07XG59OyIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRhcmdldCwgc3JjLCBzYWZlKXtcbiAgZm9yKHZhciBrZXkgaW4gc3JjKXJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59OyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgU1JDICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJykoJ3NyYycpXG4gICwgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJ1xuICAsICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR11cbiAgLCBUUEwgICAgICAgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbnJlcXVpcmUoJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywga2V5LCB2YWwsIHNhZmUpe1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYoaXNGdW5jdGlvbiloYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmKE9ba2V5XSA9PT0gdmFsKXJldHVybjtcbiAgaWYoaXNGdW5jdGlvbiloYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYoTyA9PT0gZ2xvYmFsKXtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaWYoIXNhZmUpe1xuICAgICAgZGVsZXRlIE9ba2V5XTtcbiAgICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihPW2tleV0pT1trZXldID0gdmFsO1xuICAgICAgZWxzZSBoaWRlKE8sIGtleSwgdmFsKTtcbiAgICB9XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIFNQRUNJRVMgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKWRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTsiLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG4gIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcbn07IiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJylcbiAgLCB1aWQgICAgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07IiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXydcbiAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTsiLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIFNQRUNJRVMgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIEQpe1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yLCBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59OyIsInZhciBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGludm9rZSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ludm9rZScpXG4gICwgaHRtbCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faHRtbCcpXG4gICwgY2VsICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIHNldFRhc2sgICAgICAgICAgICA9IGdsb2JhbC5zZXRJbW1lZGlhdGVcbiAgLCBjbGVhclRhc2sgICAgICAgICAgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGVcbiAgLCBNZXNzYWdlQ2hhbm5lbCAgICAgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWxcbiAgLCBjb3VudGVyICAgICAgICAgICAgPSAwXG4gICwgcXVldWUgICAgICAgICAgICAgID0ge31cbiAgLCBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJ1xuICAsIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG4gIHZhciBpZCA9ICt0aGlzO1xuICBpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpe1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCl7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spe1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKXtcbiAgICB2YXIgYXJncyA9IFtdLCBpID0gMTtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbigpe1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKXtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZihNZXNzYWdlQ2hhbm5lbCl7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbDtcbiAgICBwb3J0ICAgID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0Jykpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6ICAgc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWF4ICAgICAgID0gTWF0aC5tYXhcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59OyIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgID0gTWF0aC5jZWlsXG4gICwgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTsiLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59OyIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBTKXtcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZihTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTsiLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTsiLCJ2YXIgc3RvcmUgICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKVxuICAsIHVpZCAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIFN5bWJvbCAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2xcbiAgLCBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTsiLCJ2YXIgY2xhc3NvZiAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCAhPSB1bmRlZmluZWQpcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgdG9JT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOyIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCB0ZXN0ICAgID0ge307XG50ZXN0W3JlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpe1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gICAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xuICB9LCB0cnVlKTtcbn0iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNsYXNzb2YgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsICRleHBvcnQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgaXNPYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gICAgICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBhbkluc3RhbmNlICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICwgZm9yT2YgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJylcbiAgLCB0YXNrICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgbWljcm90YXNrICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKVxuICAsIFBST01JU0UgICAgICAgICAgICA9ICdQcm9taXNlJ1xuICAsIFR5cGVFcnJvciAgICAgICAgICA9IGdsb2JhbC5UeXBlRXJyb3JcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsICRQcm9taXNlICAgICAgICAgICA9IGdsb2JhbFtQUk9NSVNFXVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgaXNOb2RlICAgICAgICAgICAgID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcydcbiAgLCBlbXB0eSAgICAgICAgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgSW50ZXJuYWwsIEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uKCl7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgICAgID0gJFByb21pc2UucmVzb2x2ZSgxKVxuICAgICAgLCBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW3JlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24oZXhlYyl7IGV4ZWMoZW1wdHksIGVtcHR5KTsgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIHNhbWVDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKGEsIGIpe1xuICAvLyB3aXRoIGxpYnJhcnkgd3JhcHBlciBzcGVjaWFsIGNhc2VcbiAgcmV0dXJuIGEgPT09IGIgfHwgYSA9PT0gJFByb21pc2UgJiYgYiA9PT0gV3JhcHBlcjtcbn07XG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgcmV0dXJuIHNhbWVDb25zdHJ1Y3RvcigkUHJvbWlzZSwgQylcbiAgICA/IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgIDogbmV3IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24oJCRyZXNvbHZlLCAkJHJlamVjdCl7XG4gICAgaWYocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCAgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59O1xudmFyIHBlcmZvcm0gPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICBleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHtlcnJvcjogZX07XG4gIH1cbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24ocHJvbWlzZSwgaXNSZWplY3Qpe1xuICBpZihwcm9taXNlLl9uKXJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgb2sgICAgPSBwcm9taXNlLl9zID09IDFcbiAgICAgICwgaSAgICAgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbihyZWFjdGlvbil7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsXG4gICAgICAgICwgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmVcbiAgICAgICAgLCByZWplY3QgID0gcmVhY3Rpb24ucmVqZWN0XG4gICAgICAgICwgZG9tYWluICA9IHJlYWN0aW9uLmRvbWFpblxuICAgICAgICAsIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmKGhhbmRsZXIpe1xuICAgICAgICAgIGlmKCFvayl7XG4gICAgICAgICAgICBpZihwcm9taXNlLl9oID09IDIpb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaGFuZGxlciA9PT0gdHJ1ZSlyZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSl7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZih0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKXtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoKGUpe1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKW9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIGFicnVwdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZihpc1VuaGFuZGxlZChwcm9taXNlKSl7XG4gICAgICBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKGlzTm9kZSl7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKXtcbiAgICAgICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlfSk7XG4gICAgICAgIH0gZWxzZSBpZigoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKXtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYoYWJydXB0KXRocm93IGFicnVwdC5lcnJvcjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIGlmKHByb21pc2UuX2ggPT0gMSlyZXR1cm4gZmFsc2U7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2EgfHwgcHJvbWlzZS5fY1xuICAgICwgaSAgICAgPSAwXG4gICAgLCByZWFjdGlvbjtcbiAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSl7XG4gICAgcmVhY3Rpb24gPSBjaGFpbltpKytdO1xuICAgIGlmKHJlYWN0aW9uLmZhaWwgfHwgIWlzVW5oYW5kbGVkKHJlYWN0aW9uLnByb21pc2UpKXJldHVybiBmYWxzZTtcbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24oKXtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZihpc05vZGUpe1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKXtcbiAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdn0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYoIXByb21pc2UuX2EpcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzXG4gICAgLCB0aGVuO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmKHByb21pc2UgPT09IHZhbHVlKXRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSl7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7X3c6IHByb21pc2UsIF9kOiBmYWxzZX07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaChlKXtcbiAgICAkcmVqZWN0LmNhbGwoe193OiBwcm9taXNlLCBfZDogZmFsc2V9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYoIVVTRV9OQVRJVkUpe1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoKGVycil7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKXtcbiAgICAgIHZhciByZWFjdGlvbiAgICA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgICAgID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsICAgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZih0aGlzLl9hKXRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZih0aGlzLl9zKW5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3RlZCl7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbigpe1xuICAgIHZhciBwcm9taXNlICA9IG5ldyBJbnRlcm5hbDtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7UHJvbWlzZTogJFByb21pc2V9KTtcbnJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocil7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlamVjdCAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KXtcbiAgICAvLyBpbnN0YW5jZW9mIGluc3RlYWQgb2YgaW50ZXJuYWwgc2xvdCBjaGVjayBiZWNhdXNlIHdlIHNob3VsZCBmaXggaXQgd2l0aG91dCByZXBsYWNlbWVudCBuYXRpdmUgUHJvbWlzZSBjb3JlXG4gICAgaWYoeCBpbnN0YW5jZW9mICRQcm9taXNlICYmIHNhbWVDb25zdHJ1Y3Rvcih4LmNvbnN0cnVjdG9yLCB0aGlzKSlyZXR1cm4geDtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVzb2x2ZSAgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgJCRyZXNvbHZlKHgpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbihpdGVyKXtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVzb2x2ZSAgICA9IGNhcGFiaWxpdHkucmVzb2x2ZVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIHZhciB2YWx1ZXMgICAgPSBbXVxuICAgICAgICAsIGluZGV4ICAgICA9IDBcbiAgICAgICAgLCByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgdmFyICRpbmRleCAgICAgICAgPSBpbmRleCsrXG4gICAgICAgICAgLCBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgICAgaWYoYWxyZWFkeUNhbGxlZClyZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCAgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pOyIsInZhciAkaXRlcmF0b3JzICAgID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKVxuICAsIHJlZGVmaW5lICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgZ2xvYmFsICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIEl0ZXJhdG9ycyAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIHdrcyAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAsIElURVJBVE9SICAgICAgPSB3a3MoJ2l0ZXJhdG9yJylcbiAgLCBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpXG4gICwgQXJyYXlWYWx1ZXMgICA9IEl0ZXJhdG9ycy5BcnJheTtcblxuZm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG4gIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cbiAgICAsIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV1cbiAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlXG4gICAgLCBrZXk7XG4gIGlmKHByb3RvKXtcbiAgICBpZighcHJvdG9bSVRFUkFUT1JdKWhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYoIXByb3RvW1RPX1NUUklOR19UQUddKWhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGZvcihrZXkgaW4gJGl0ZXJhdG9ycylpZighcHJvdG9ba2V5XSlyZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcjtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuIiwiLy8gKGMpIERlYW4gTWNOYW1lZSA8ZGVhbkBnbWFpbC5jb20+LCAyMDEyLlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWFubS9jc3MtY29sb3ItcGFyc2VyLWpzXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbi8vIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1Ncbi8vIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci9cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgXCJ0cmFuc3BhcmVudFwiOiBbMCwwLDAsMF0sIFwiYWxpY2VibHVlXCI6IFsyNDAsMjQ4LDI1NSwxXSxcbiAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwyMzUsMjE1LDFdLCBcImFxdWFcIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJhcXVhbWFyaW5lXCI6IFsxMjcsMjU1LDIxMiwxXSwgXCJhenVyZVwiOiBbMjQwLDI1NSwyNTUsMV0sXG4gIFwiYmVpZ2VcIjogWzI0NSwyNDUsMjIwLDFdLCBcImJpc3F1ZVwiOiBbMjU1LDIyOCwxOTYsMV0sXG4gIFwiYmxhY2tcIjogWzAsMCwwLDFdLCBcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsMjM1LDIwNSwxXSxcbiAgXCJibHVlXCI6IFswLDAsMjU1LDFdLCBcImJsdWV2aW9sZXRcIjogWzEzOCw0MywyMjYsMV0sXG4gIFwiYnJvd25cIjogWzE2NSw0Miw0MiwxXSwgXCJidXJseXdvb2RcIjogWzIyMiwxODQsMTM1LDFdLFxuICBcImNhZGV0Ymx1ZVwiOiBbOTUsMTU4LDE2MCwxXSwgXCJjaGFydHJldXNlXCI6IFsxMjcsMjU1LDAsMV0sXG4gIFwiY2hvY29sYXRlXCI6IFsyMTAsMTA1LDMwLDFdLCBcImNvcmFsXCI6IFsyNTUsMTI3LDgwLDFdLFxuICBcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsMTQ5LDIzNywxXSwgXCJjb3Juc2lsa1wiOiBbMjU1LDI0OCwyMjAsMV0sXG4gIFwiY3JpbXNvblwiOiBbMjIwLDIwLDYwLDFdLCBcImN5YW5cIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJkYXJrYmx1ZVwiOiBbMCwwLDEzOSwxXSwgXCJkYXJrY3lhblwiOiBbMCwxMzksMTM5LDFdLFxuICBcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwxMzQsMTEsMV0sIFwiZGFya2dyYXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtncmVlblwiOiBbMCwxMDAsMCwxXSwgXCJkYXJrZ3JleVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2toYWtpXCI6IFsxODksMTgzLDEwNywxXSwgXCJkYXJrbWFnZW50YVwiOiBbMTM5LDAsMTM5LDFdLFxuICBcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwxMDcsNDcsMV0sIFwiZGFya29yYW5nZVwiOiBbMjU1LDE0MCwwLDFdLFxuICBcImRhcmtvcmNoaWRcIjogWzE1Myw1MCwyMDQsMV0sIFwiZGFya3JlZFwiOiBbMTM5LDAsMCwxXSxcbiAgXCJkYXJrc2FsbW9uXCI6IFsyMzMsMTUwLDEyMiwxXSwgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywxODgsMTQzLDFdLFxuICBcImRhcmtzbGF0ZWJsdWVcIjogWzcyLDYxLDEzOSwxXSwgXCJkYXJrc2xhdGVncmF5XCI6IFs0Nyw3OSw3OSwxXSxcbiAgXCJkYXJrc2xhdGVncmV5XCI6IFs0Nyw3OSw3OSwxXSwgXCJkYXJrdHVycXVvaXNlXCI6IFswLDIwNiwyMDksMV0sXG4gIFwiZGFya3Zpb2xldFwiOiBbMTQ4LDAsMjExLDFdLCBcImRlZXBwaW5rXCI6IFsyNTUsMjAsMTQ3LDFdLFxuICBcImRlZXBza3libHVlXCI6IFswLDE5MSwyNTUsMV0sIFwiZGltZ3JheVwiOiBbMTA1LDEwNSwxMDUsMV0sXG4gIFwiZGltZ3JleVwiOiBbMTA1LDEwNSwxMDUsMV0sIFwiZG9kZ2VyYmx1ZVwiOiBbMzAsMTQ0LDI1NSwxXSxcbiAgXCJmaXJlYnJpY2tcIjogWzE3OCwzNCwzNCwxXSwgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LDI1MCwyNDAsMV0sXG4gIFwiZm9yZXN0Z3JlZW5cIjogWzM0LDEzOSwzNCwxXSwgXCJmdWNoc2lhXCI6IFsyNTUsMCwyNTUsMV0sXG4gIFwiZ2FpbnNib3JvXCI6IFsyMjAsMjIwLDIyMCwxXSwgXCJnaG9zdHdoaXRlXCI6IFsyNDgsMjQ4LDI1NSwxXSxcbiAgXCJnb2xkXCI6IFsyNTUsMjE1LDAsMV0sIFwiZ29sZGVucm9kXCI6IFsyMTgsMTY1LDMyLDFdLFxuICBcImdyYXlcIjogWzEyOCwxMjgsMTI4LDFdLCBcImdyZWVuXCI6IFswLDEyOCwwLDFdLFxuICBcImdyZWVueWVsbG93XCI6IFsxNzMsMjU1LDQ3LDFdLCBcImdyZXlcIjogWzEyOCwxMjgsMTI4LDFdLFxuICBcImhvbmV5ZGV3XCI6IFsyNDAsMjU1LDI0MCwxXSwgXCJob3RwaW5rXCI6IFsyNTUsMTA1LDE4MCwxXSxcbiAgXCJpbmRpYW5yZWRcIjogWzIwNSw5Miw5MiwxXSwgXCJpbmRpZ29cIjogWzc1LDAsMTMwLDFdLFxuICBcIml2b3J5XCI6IFsyNTUsMjU1LDI0MCwxXSwgXCJraGFraVwiOiBbMjQwLDIzMCwxNDAsMV0sXG4gIFwibGF2ZW5kZXJcIjogWzIzMCwyMzAsMjUwLDFdLCBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwyNDAsMjQ1LDFdLFxuICBcImxhd25ncmVlblwiOiBbMTI0LDI1MiwwLDFdLCBcImxlbW9uY2hpZmZvblwiOiBbMjU1LDI1MCwyMDUsMV0sXG4gIFwibGlnaHRibHVlXCI6IFsxNzMsMjE2LDIzMCwxXSwgXCJsaWdodGNvcmFsXCI6IFsyNDAsMTI4LDEyOCwxXSxcbiAgXCJsaWdodGN5YW5cIjogWzIyNCwyNTUsMjU1LDFdLCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsMjUwLDIxMCwxXSxcbiAgXCJsaWdodGdyYXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0Z3JlZW5cIjogWzE0NCwyMzgsMTQ0LDFdLFxuICBcImxpZ2h0Z3JleVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRwaW5rXCI6IFsyNTUsMTgyLDE5MywxXSxcbiAgXCJsaWdodHNhbG1vblwiOiBbMjU1LDE2MCwxMjIsMV0sIFwibGlnaHRzZWFncmVlblwiOiBbMzIsMTc4LDE3MCwxXSxcbiAgXCJsaWdodHNreWJsdWVcIjogWzEzNSwyMDYsMjUwLDFdLCBcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksMTM2LDE1MywxXSxcbiAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LDEzNiwxNTMsMV0sIFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwxOTYsMjIyLDFdLFxuICBcImxpZ2h0eWVsbG93XCI6IFsyNTUsMjU1LDIyNCwxXSwgXCJsaW1lXCI6IFswLDI1NSwwLDFdLFxuICBcImxpbWVncmVlblwiOiBbNTAsMjA1LDUwLDFdLCBcImxpbmVuXCI6IFsyNTAsMjQwLDIzMCwxXSxcbiAgXCJtYWdlbnRhXCI6IFsyNTUsMCwyNTUsMV0sIFwibWFyb29uXCI6IFsxMjgsMCwwLDFdLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwyMDUsMTcwLDFdLCBcIm1lZGl1bWJsdWVcIjogWzAsMCwyMDUsMV0sXG4gIFwibWVkaXVtb3JjaGlkXCI6IFsxODYsODUsMjExLDFdLCBcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LDExMiwyMTksMV0sXG4gIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLDE3OSwxMTMsMV0sIFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsMTA0LDIzOCwxXSxcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwyNTAsMTU0LDFdLCBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsMjA5LDIwNCwxXSxcbiAgXCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwyMSwxMzMsMV0sIFwibWlkbmlnaHRibHVlXCI6IFsyNSwyNSwxMTIsMV0sXG4gIFwibWludGNyZWFtXCI6IFsyNDUsMjU1LDI1MCwxXSwgXCJtaXN0eXJvc2VcIjogWzI1NSwyMjgsMjI1LDFdLFxuICBcIm1vY2Nhc2luXCI6IFsyNTUsMjI4LDE4MSwxXSwgXCJuYXZham93aGl0ZVwiOiBbMjU1LDIyMiwxNzMsMV0sXG4gIFwibmF2eVwiOiBbMCwwLDEyOCwxXSwgXCJvbGRsYWNlXCI6IFsyNTMsMjQ1LDIzMCwxXSxcbiAgXCJvbGl2ZVwiOiBbMTI4LDEyOCwwLDFdLCBcIm9saXZlZHJhYlwiOiBbMTA3LDE0MiwzNSwxXSxcbiAgXCJvcmFuZ2VcIjogWzI1NSwxNjUsMCwxXSwgXCJvcmFuZ2VyZWRcIjogWzI1NSw2OSwwLDFdLFxuICBcIm9yY2hpZFwiOiBbMjE4LDExMiwyMTQsMV0sIFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LDIzMiwxNzAsMV0sXG4gIFwicGFsZWdyZWVuXCI6IFsxNTIsMjUxLDE1MiwxXSwgXCJwYWxldHVycXVvaXNlXCI6IFsxNzUsMjM4LDIzOCwxXSxcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFsyMTksMTEyLDE0NywxXSwgXCJwYXBheWF3aGlwXCI6IFsyNTUsMjM5LDIxMywxXSxcbiAgXCJwZWFjaHB1ZmZcIjogWzI1NSwyMTgsMTg1LDFdLCBcInBlcnVcIjogWzIwNSwxMzMsNjMsMV0sXG4gIFwicGlua1wiOiBbMjU1LDE5MiwyMDMsMV0sIFwicGx1bVwiOiBbMjIxLDE2MCwyMjEsMV0sXG4gIFwicG93ZGVyYmx1ZVwiOiBbMTc2LDIyNCwyMzAsMV0sIFwicHVycGxlXCI6IFsxMjgsMCwxMjgsMV0sXG4gIFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLDUxLDE1MywxXSxcbiAgXCJyZWRcIjogWzI1NSwwLDAsMV0sIFwicm9zeWJyb3duXCI6IFsxODgsMTQzLDE0MywxXSxcbiAgXCJyb3lhbGJsdWVcIjogWzY1LDEwNSwyMjUsMV0sIFwic2FkZGxlYnJvd25cIjogWzEzOSw2OSwxOSwxXSxcbiAgXCJzYWxtb25cIjogWzI1MCwxMjgsMTE0LDFdLCBcInNhbmR5YnJvd25cIjogWzI0NCwxNjQsOTYsMV0sXG4gIFwic2VhZ3JlZW5cIjogWzQ2LDEzOSw4NywxXSwgXCJzZWFzaGVsbFwiOiBbMjU1LDI0NSwyMzgsMV0sXG4gIFwic2llbm5hXCI6IFsxNjAsODIsNDUsMV0sIFwic2lsdmVyXCI6IFsxOTIsMTkyLDE5MiwxXSxcbiAgXCJza3libHVlXCI6IFsxMzUsMjA2LDIzNSwxXSwgXCJzbGF0ZWJsdWVcIjogWzEwNiw5MCwyMDUsMV0sXG4gIFwic2xhdGVncmF5XCI6IFsxMTIsMTI4LDE0NCwxXSwgXCJzbGF0ZWdyZXlcIjogWzExMiwxMjgsMTQ0LDFdLFxuICBcInNub3dcIjogWzI1NSwyNTAsMjUwLDFdLCBcInNwcmluZ2dyZWVuXCI6IFswLDI1NSwxMjcsMV0sXG4gIFwic3RlZWxibHVlXCI6IFs3MCwxMzAsMTgwLDFdLCBcInRhblwiOiBbMjEwLDE4MCwxNDAsMV0sXG4gIFwidGVhbFwiOiBbMCwxMjgsMTI4LDFdLCBcInRoaXN0bGVcIjogWzIxNiwxOTEsMjE2LDFdLFxuICBcInRvbWF0b1wiOiBbMjU1LDk5LDcxLDFdLCBcInR1cnF1b2lzZVwiOiBbNjQsMjI0LDIwOCwxXSxcbiAgXCJ2aW9sZXRcIjogWzIzOCwxMzAsMjM4LDFdLCBcIndoZWF0XCI6IFsyNDUsMjIyLDE3OSwxXSxcbiAgXCJ3aGl0ZVwiOiBbMjU1LDI1NSwyNTUsMV0sIFwid2hpdGVzbW9rZVwiOiBbMjQ1LDI0NSwyNDUsMV0sXG4gIFwieWVsbG93XCI6IFsyNTUsMjU1LDAsMV0sIFwieWVsbG93Z3JlZW5cIjogWzE1NCwyMDUsNTAsMV19XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19ieXRlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAyNTUuXG4gIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gIHJldHVybiBpIDwgMCA/IDAgOiBpID4gMjU1ID8gMjU1IDogaTtcbn1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2Zsb2F0KGYpIHsgIC8vIENsYW1wIHRvIGZsb2F0IDAuMCAuLiAxLjAuXG4gIHJldHVybiBmIDwgMCA/IDAgOiBmID4gMSA/IDEgOiBmO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfaW50KHN0cikgeyAgLy8gaW50IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlRmxvYXQoc3RyKSAvIDEwMCAqIDI1NSk7XG4gIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUludChzdHIpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KHN0cikgeyAgLy8gZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSAvIDEwMCk7XG4gIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSB7XG4gIGlmIChoIDwgMCkgaCArPSAxO1xuICBlbHNlIGlmIChoID4gMSkgaCAtPSAxO1xuXG4gIGlmIChoICogNiA8IDEpIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggKiA2O1xuICBpZiAoaCAqIDIgPCAxKSByZXR1cm4gbTI7XG4gIGlmIChoICogMyA8IDIpIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDU1NDb2xvcihjc3Nfc3RyKSB7XG4gIC8vIFJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgbm90IGNvbXBsaWFudCwgYnV0IHNob3VsZCBqdXN0IGJlIG1vcmUgYWNjZXB0aW5nLlxuICB2YXIgc3RyID0gY3NzX3N0ci5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENvbG9yIGtleXdvcmRzIChhbmQgdHJhbnNwYXJlbnQpIGxvb2t1cC5cbiAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkgcmV0dXJuIGtDU1NDb2xvclRhYmxlW3N0cl0uc2xpY2UoKTsgIC8vIGR1cC5cblxuICAvLyAjYWJjIGFuZCAjYWJjMTIzIHN5bnRheC5cbiAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZjApIHwgKChpdiAmIDB4ZjApID4+IDQpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYpIHwgKChpdiAmIDB4ZikgPDwgNCksXG4gICAgICAgICAgICAgIDFdO1xuICAgIH0gZWxzZSBpZiAoc3RyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoaXYgJiAweGZmMDAwMCkgPj4gMTYsXG4gICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgaXYgJiAweGZmLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgaWYgKG9wICE9PSAtMSAmJiBlcCArIDEgPT09IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICB2YXIgcGFyYW1zID0gc3RyLnN1YnN0cihvcCsxLCBlcC0ob3ArMSkpLnNwbGl0KCcsJyk7XG4gICAgdmFyIGFscGhhID0gMTsgIC8vIFRvIGFsbG93IGNhc2UgZmFsbHRocm91Z2guXG4gICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW3BhcnNlX2Nzc19pbnQocGFyYW1zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1sxXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGNhc2UgJ2hzbGEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGggPSAoKChwYXJzZUZsb2F0KHBhcmFtc1swXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAgICAgLy8gTk9URShkZWFubSk6IEFjY29yZGluZyB0byB0aGUgQ1NTIHNwZWMgcy9sIHNob3VsZCBvbmx5IGJlXG4gICAgICAgIC8vIHBlcmNlbnRhZ2VzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGFuZCBsZXQgZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgICAgICAgdmFyIHMgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzFdKTtcbiAgICAgICAgdmFyIGwgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzJdKTtcbiAgICAgICAgdmFyIG0yID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICAgIHZhciBtMSA9IGwgKiAyIC0gbTI7XG4gICAgICAgIHJldHVybiBbY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKzEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaC0xLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudHJ5IHsgZXhwb3J0cy5wYXJzZUNTU0NvbG9yID0gcGFyc2VDU1NDb2xvciB9IGNhdGNoKGUpIHsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcblxuZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0pIHtcblxuICAgIGRpbSA9IGRpbSB8fCAyO1xuXG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuICAgICAgICBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKSxcbiAgICAgICAgdHJpYW5nbGVzID0gW107XG5cbiAgICBpZiAoIW91dGVyTm9kZSkgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBzaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgc2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgc2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgc2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChzaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZWFyLCB0cmlhbmdsZXMsIGRpbSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDIpO1xuXG4gICAgICAgICAgICAvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcbmZ1bmN0aW9uIGlzRWFyKGVhcikge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG4gICAgdmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IGVhci5wcmV2KSB7XG4gICAgICAgIGlmIChwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG4gICAgdmFyIG1pblRYID0gYS54IDwgYi54ID8gKGEueCA8IGMueCA/IGEueCA6IGMueCkgOiAoYi54IDwgYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWluVFkgPSBhLnkgPCBiLnkgPyAoYS55IDwgYy55ID8gYS55IDogYy55KSA6IChiLnkgPCBjLnkgPyBiLnkgOiBjLnkpLFxuICAgICAgICBtYXhUWCA9IGEueCA+IGIueCA/IChhLnggPiBjLnggPyBhLnggOiBjLngpIDogKGIueCA+IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1heFRZID0gYS55ID4gYi55ID8gKGEueSA+IGMueSA/IGEueSA6IGMueSkgOiAoYi55ID4gYy55ID8gYi55IDogYy55KTtcblxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG4gICAgdmFyIG1pblogPSB6T3JkZXIobWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBzaXplKSxcbiAgICAgICAgbWF4WiA9IHpPcmRlcihtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgLy8gZmlyc3QgbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgdmFyIHAgPSBlYXIubmV4dFo7XG5cbiAgICB3aGlsZSAocCAmJiBwLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgfVxuXG4gICAgLy8gdGhlbiBsb29rIGZvciBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgcCA9IGVhci5wcmV2WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIHA7XG59XG5cbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XG5mdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuICAgIHZhciBhID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYiA9IGEubmV4dC5uZXh0O1xuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XG4gICAgICAgICAgICBpZiAoYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKGEsIGIpKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuICAgICAgICAgICAgICAgIHZhciBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcbiAgICAgICAgICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7XG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYiA9IGIubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBhID0gYS5uZXh0O1xuICAgIH0gd2hpbGUgKGEgIT09IHN0YXJ0KTtcbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKSB7XG4gICAgdmFyIHF1ZXVlID0gW10sXG4gICAgICAgIGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xuICAgICAgICBpZiAobGlzdCA9PT0gbGlzdC5uZXh0KSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuICAgICAgICBxdWV1ZS5wdXNoKGdldExlZnRtb3N0KGxpc3QpKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmVYKTtcblxuICAgIC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XG4gICAgICAgIG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0ZXJOb2RlO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlWChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAtIGIueDtcbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKG91dGVyTm9kZSkge1xuICAgICAgICB2YXIgYiA9IHNwbGl0UG9seWdvbihvdXRlck5vZGUsIGhvbGUpO1xuICAgICAgICBmaWx0ZXJQb2ludHMoYiwgYi5uZXh0KTtcbiAgICB9XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG0ubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBzdG9wKSB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmICgodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLngpKSAmJiBsb2NhbGx5SW5zaWRlKHAsIGhvbGUpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxU2l6ZSA9PT0gMCB8fCAhcSkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwLnogPD0gcS56KSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBzaXplIG9mIHRoZSBkYXRhIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAvIHNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAvIHNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54KSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiZcbiAgICAgICAgICAgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKTtcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICBpZiAoKGVxdWFscyhwMSwgcTEpICYmIGVxdWFscyhwMiwgcTIpKSB8fFxuICAgICAgICAoZXF1YWxzKHAxLCBxMikgJiYgZXF1YWxzKHAyLCBxMSkpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gYXJlYShwMSwgcTEsIHAyKSA+IDAgIT09IGFyZWEocDEsIHExLCBxMikgPiAwICYmXG4gICAgICAgICAgIGFyZWEocDIsIHEyLCBwMSkgPiAwICE9PSBhcmVhKHAyLCBxMiwgcTEpID4gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0aWNlIGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRpY2Ugbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG5cbiAgICAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG4gICAgdGhpcy56ID0gbnVsbDtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcbiAgICB0aGlzLnByZXZaID0gbnVsbDtcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcblxuICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XG59XG5cbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXG5lYXJjdXQuZGV2aWF0aW9uID0gZnVuY3Rpb24gKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcbiAgICB2YXIgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcbiAgICBpZiAoaGFzSG9sZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gdHJpYW5nbGVzW2ldICogZGltO1xuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XG4gICAgICAgIHZhciBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XG59O1xuXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XG4gICAgICAgIGogPSBpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZGltID0gZGF0YVswXVswXS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IHt2ZXJ0aWNlczogW10sIGhvbGVzOiBbXSwgZGltZW5zaW9uczogZGltfSxcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGltOyBkKyspIHJlc3VsdC52ZXJ0aWNlcy5wdXNoKGRhdGFbaV1bal1bZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaG9sZUluZGV4ICs9IGRhdGFbaSAtIDFdLmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdC5ob2xlcy5wdXNoKGhvbGVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCFpc051bWJlcihuKSB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMuZXJyb3IgfHxcbiAgICAgICAgKGlzT2JqZWN0KHRoaXMuX2V2ZW50cy5lcnJvcikgJiYgIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKSB7XG4gICAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGhhbmRsZXIpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKHRoaXMuX2V2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oZXZsaXN0ZW5lcikpXG4gICAgICByZXR1cm4gMTtcbiAgICBlbHNlIGlmIChldmxpc3RlbmVyKVxuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG59O1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG4iLCIoZnVuY3Rpb24oKXt2YXIgaz0hIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI7ZnVuY3Rpb24gbChhLGIpe2s/YS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsYiwhMSk6YS5hdHRhY2hFdmVudChcInNjcm9sbFwiLGIpfWZ1bmN0aW9uIHYoYSl7ZG9jdW1lbnQuYm9keT9hKCk6az9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGEpOmRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25yZWFkeXN0YXRlY2hhbmdlXCIsZnVuY3Rpb24oKXtcImludGVyYWN0aXZlXCIhPWRvY3VtZW50LnJlYWR5U3RhdGUmJlwiY29tcGxldGVcIiE9ZG9jdW1lbnQucmVhZHlTdGF0ZXx8YSgpfSl9O2Z1bmN0aW9uIHcoYSl7dGhpcy5hPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dGhpcy5hLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpO3RoaXMuYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7dGhpcy5iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5mPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuZz0tMTt0aGlzLmIuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuYy5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7XG50aGlzLmYuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuaC5zdHlsZS5jc3NUZXh0PVwiZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjAwJTtoZWlnaHQ6MjAwJTtmb250LXNpemU6MTZweDttYXgtd2lkdGg6bm9uZTtcIjt0aGlzLmIuYXBwZW5kQ2hpbGQodGhpcy5oKTt0aGlzLmMuYXBwZW5kQ2hpbGQodGhpcy5mKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5iKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5jKX1cbmZ1bmN0aW9uIHkoYSxiKXthLmEuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO21pbi13aWR0aDoyMHB4O21pbi1oZWlnaHQ6MjBweDtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bzttYXJnaW46MDtwYWRkaW5nOjA7dG9wOi05OTlweDtsZWZ0Oi05OTlweDt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udDpcIitiK1wiO1wifWZ1bmN0aW9uIHooYSl7dmFyIGI9YS5hLm9mZnNldFdpZHRoLGM9YisxMDA7YS5mLnN0eWxlLndpZHRoPWMrXCJweFwiO2EuYy5zY3JvbGxMZWZ0PWM7YS5iLnNjcm9sbExlZnQ9YS5iLnNjcm9sbFdpZHRoKzEwMDtyZXR1cm4gYS5nIT09Yj8oYS5nPWIsITApOiExfWZ1bmN0aW9uIEEoYSxiKXtmdW5jdGlvbiBjKCl7dmFyIGE9bTt6KGEpJiZudWxsIT09YS5hLnBhcmVudE5vZGUmJmIoYS5nKX12YXIgbT1hO2woYS5iLGMpO2woYS5jLGMpO3ooYSl9O2Z1bmN0aW9uIEIoYSxiKXt2YXIgYz1ifHx7fTt0aGlzLmZhbWlseT1hO3RoaXMuc3R5bGU9Yy5zdHlsZXx8XCJub3JtYWxcIjt0aGlzLndlaWdodD1jLndlaWdodHx8XCJub3JtYWxcIjt0aGlzLnN0cmV0Y2g9Yy5zdHJldGNofHxcIm5vcm1hbFwifXZhciBDPW51bGwsRD1udWxsLEg9ISF3aW5kb3cuRm9udEZhY2U7ZnVuY3Rpb24gSSgpe2lmKG51bGw9PT1EKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3RyeXthLnN0eWxlLmZvbnQ9XCJjb25kZW5zZWQgMTAwcHggc2Fucy1zZXJpZlwifWNhdGNoKGIpe31EPVwiXCIhPT1hLnN0eWxlLmZvbnR9cmV0dXJuIER9ZnVuY3Rpb24gSihhLGIpe3JldHVyblthLnN0eWxlLGEud2VpZ2h0LEkoKT9hLnN0cmV0Y2g6XCJcIixcIjEwMHB4XCIsYl0uam9pbihcIiBcIil9XG5CLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxtPWF8fFwiQkVTYnN3eVwiLHg9Ynx8M0UzLEU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7aWYoSCl7dmFyIEs9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBlKCl7KG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eD9iKCk6ZG9jdW1lbnQuZm9udHMubG9hZChKKGMsYy5mYW1pbHkpLG0pLnRoZW4oZnVuY3Rpb24oYyl7MTw9Yy5sZW5ndGg/YSgpOnNldFRpbWVvdXQoZSwyNSl9LGZ1bmN0aW9uKCl7YigpfSl9ZSgpfSksTD1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGMpe3NldFRpbWVvdXQoYyx4KX0pO1Byb21pc2UucmFjZShbTCxLXSkudGhlbihmdW5jdGlvbigpe2EoYyl9LGZ1bmN0aW9uKCl7YihjKX0pfWVsc2UgdihmdW5jdGlvbigpe2Z1bmN0aW9uIHEoKXt2YXIgYjtpZihiPS0xIT1mJiYtMSE9Z3x8LTEhPWYmJi0xIT1ofHwtMSE9ZyYmLTEhPVxuaCkoYj1mIT1nJiZmIT1oJiZnIT1oKXx8KG51bGw9PT1DJiYoYj0vQXBwbGVXZWJLaXRcXC8oWzAtOV0rKSg/OlxcLihbMC05XSspKS8uZXhlYyh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksQz0hIWImJig1MzY+cGFyc2VJbnQoYlsxXSwxMCl8fDUzNj09PXBhcnNlSW50KGJbMV0sMTApJiYxMT49cGFyc2VJbnQoYlsyXSwxMCkpKSxiPUMmJihmPT1yJiZnPT1yJiZoPT1yfHxmPT10JiZnPT10JiZoPT10fHxmPT11JiZnPT11JiZoPT11KSksYj0hYjtiJiYobnVsbCE9PWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLGNsZWFyVGltZW91dChHKSxhKGMpKX1mdW5jdGlvbiBGKCl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eCludWxsIT09ZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksYihjKTtlbHNle3ZhciBhPWRvY3VtZW50LmhpZGRlbjtpZighMD09PWF8fHZvaWQgMD09PWEpZj1lLmEub2Zmc2V0V2lkdGgsZz1uLmEub2Zmc2V0V2lkdGgsXG5oPXAuYS5vZmZzZXRXaWR0aCxxKCk7Rz1zZXRUaW1lb3V0KEYsNTApfX12YXIgZT1uZXcgdyhtKSxuPW5ldyB3KG0pLHA9bmV3IHcobSksZj0tMSxnPS0xLGg9LTEscj0tMSx0PS0xLHU9LTEsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLEc9MDtkLmRpcj1cImx0clwiO3koZSxKKGMsXCJzYW5zLXNlcmlmXCIpKTt5KG4sSihjLFwic2VyaWZcIikpO3kocCxKKGMsXCJtb25vc3BhY2VcIikpO2QuYXBwZW5kQ2hpbGQoZS5hKTtkLmFwcGVuZENoaWxkKG4uYSk7ZC5hcHBlbmRDaGlsZChwLmEpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7cj1lLmEub2Zmc2V0V2lkdGg7dD1uLmEub2Zmc2V0V2lkdGg7dT1wLmEub2Zmc2V0V2lkdGg7RigpO0EoZSxmdW5jdGlvbihhKXtmPWE7cSgpfSk7eShlLEooYywnXCInK2MuZmFtaWx5KydcIixzYW5zLXNlcmlmJykpO0EobixmdW5jdGlvbihhKXtnPWE7cSgpfSk7eShuLEooYywnXCInK2MuZmFtaWx5KydcIixzZXJpZicpKTtBKHAsZnVuY3Rpb24oYSl7aD1cbmE7cSgpfSk7eShwLEooYywnXCInK2MuZmFtaWx5KydcIixtb25vc3BhY2UnKSl9KX0pfTt3aW5kb3cuRm9udEZhY2VPYnNlcnZlcj1CO3dpbmRvdy5Gb250RmFjZU9ic2VydmVyLnByb3RvdHlwZS5jaGVjaz13aW5kb3cuRm9udEZhY2VPYnNlcnZlci5wcm90b3R5cGUubG9hZD1CLnByb3RvdHlwZS5sb2FkO1widW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIpO30oKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcDtcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5mdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIG1pbkFsbCwgbWF4QWxsKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDw9IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgZWxzZSBpZiAobWluQWxsID4gazIgfHwgbWF4QWxsIDwgazEpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgIG1pbiwgbWF4O1xuXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluW2F4aXNdO1xuICAgICAgICBtYXggPSBmZWF0dXJlLm1heFtheGlzXTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8PSBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gazIgfHwgbWF4IDwgazEpIGNvbnRpbnVlOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgICAgIHZhciBzbGljZXMgPSB0eXBlID09PSAxID9cbiAgICAgICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIDpcbiAgICAgICAgICAgICAgICBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCB0eXBlID09PSAzKTtcblxuICAgICAgICBpZiAoc2xpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgYSBmZWF0dXJlIGdvdCBjbGlwcGVkLCBpdCB3aWxsIGxpa2VseSBnZXQgY2xpcHBlZCBvbiB0aGUgbmV4dCB6b29tIGxldmVsIGFzIHdlbGwsXG4gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgYmJveGVzXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBzbGljZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWdzOiBmZWF0dXJlc1tpXS50YWdzIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluOiBmZWF0dXJlLm1pbixcbiAgICAgICAgICAgICAgICBtYXg6IGZlYXR1cmUubWF4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIHtcbiAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFrID0gYVtheGlzXTtcblxuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG4gICAgfVxuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgY2xvc2VkKSB7XG5cbiAgICB2YXIgc2xpY2VzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGFrID0gMCxcbiAgICAgICAgICAgIGJrID0gMCxcbiAgICAgICAgICAgIGIgPSBudWxsLFxuICAgICAgICAgICAgcG9pbnRzID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhcmVhID0gcG9pbnRzLmFyZWEsXG4gICAgICAgICAgICBkaXN0ID0gcG9pbnRzLmRpc3QsXG4gICAgICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgYSwgaiwgbGFzdDtcblxuICAgICAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBhID0gYiB8fCBwb2ludHNbal07XG4gICAgICAgICAgICBiID0gcG9pbnRzW2ogKyAxXTtcbiAgICAgICAgICAgIGFrID0gYmsgfHwgYVtheGlzXTtcbiAgICAgICAgICAgIGJrID0gYltheGlzXTtcblxuICAgICAgICAgICAgaWYgKGFrIDwgazEpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPiBrMikpIHsgLy8gLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSksIGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPj0gazEpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7IC8vIC0tLXwtLT4gIHxcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhayA+IGsyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrIDwgazEpKSB7IC8vIDwtLXwtLS0tLXwtLS1cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpLCBpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrIDw9IGsyKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpOyAvLyB8ICA8LS18LS0tXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJrIDwgazEpIHsgLy8gPC0tfC0tLSAgfFxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPiBrMikgeyAvLyB8ICAtLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB8IC0tPiB8XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcbiAgICAgICAgYSA9IHBvaW50c1tsZW4gLSAxXTtcbiAgICAgICAgYWsgPSBhW2F4aXNdO1xuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG5cbiAgICAgICAgbGFzdCA9IHNsaWNlW3NsaWNlLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2xvc2VkICYmIGxhc3QgJiYgKHNsaWNlWzBdWzBdICE9PSBsYXN0WzBdIHx8IHNsaWNlWzBdWzFdICE9PSBsYXN0WzFdKSkgc2xpY2UucHVzaChzbGljZVswXSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgICAgICBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpY2VzO1xufVxuXG5mdW5jdGlvbiBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KSB7XG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBkb24ndCByZWNhbGN1bGF0ZSB0aGUgYXJlYS9sZW5ndGggb2YgdGhlIHVuY2xpcHBlZCBnZW9tZXRyeSBiZWNhdXNlIHRoZSBjYXNlIHdoZXJlIGl0IGdvZXNcbiAgICAgICAgLy8gYmVsb3cgdGhlIHZpc2liaWxpdHkgdGhyZXNob2xkIGFzIGEgcmVzdWx0IG9mIGNsaXBwaW5nIGlzIHJhcmUsIHNvIHdlIGF2b2lkIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgc2xpY2UuYXJlYSA9IGFyZWE7XG4gICAgICAgIHNsaWNlLmRpc3QgPSBkaXN0O1xuXG4gICAgICAgIHNsaWNlcy5wdXNoKHNsaWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoJy4vc2ltcGxpZnknKTtcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEuZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgdG9sZXJhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZmVhdHVyZSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZ2VvbS50eXBlLFxuICAgICAgICBjb29yZHMgPSBnZW9tLmNvb3JkaW5hdGVzLFxuICAgICAgICB0YWdzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICBpLCBqLCByaW5ncztcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIFtwcm9qZWN0UG9pbnQoY29vcmRzKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIHByb2plY3QoY29vcmRzKSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMiwgW3Byb2plY3QoY29vcmRzLCB0b2xlcmFuY2UpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgdHlwZSA9PT0gJ1BvbHlnb24nID8gMyA6IDIsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldW2pdLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAzLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tLmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogdGFnc1xuICAgICAgICAgICAgfSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZ3MsIHR5cGUsIGdlb21ldHJ5KSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFnczogdGFncyB8fCBudWxsLFxuICAgICAgICBtaW46IFsyLCAxXSwgLy8gaW5pdGlhbCBiYm94IHZhbHVlcztcbiAgICAgICAgbWF4OiBbLTEsIDBdICAvLyBub3RlIHRoYXQgY29vcmRzIGFyZSB1c3VhbGx5IGluIFswLi4xXSByYW5nZVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QobG9ubGF0cywgdG9sZXJhbmNlKSB7XG4gICAgdmFyIHByb2plY3RlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9ubGF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm9qZWN0ZWQucHVzaChwcm9qZWN0UG9pbnQobG9ubGF0c1tpXSkpO1xuICAgIH1cbiAgICBpZiAodG9sZXJhbmNlKSB7XG4gICAgICAgIHNpbXBsaWZ5KHByb2plY3RlZCwgdG9sZXJhbmNlKTtcbiAgICAgICAgY2FsY1NpemUocHJvamVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2plY3RlZDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHApIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4ocFsxXSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB4ID0gKHBbMF0gLyAzNjAgKyAwLjUpLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICB5ID0geSA8IC0xID8gLTEgOlxuICAgICAgICB5ID4gMSA/IDEgOiB5O1xuXG4gICAgcmV0dXJuIFt4LCB5LCAwXTtcbn1cblxuLy8gY2FsY3VsYXRlIGFyZWEgYW5kIGxlbmd0aCBvZiB0aGUgcG9seVxuZnVuY3Rpb24gY2FsY1NpemUocG9pbnRzKSB7XG4gICAgdmFyIGFyZWEgPSAwLFxuICAgICAgICBkaXN0ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBhLCBiOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBhID0gYiB8fCBwb2ludHNbaV07XG4gICAgICAgIGIgPSBwb2ludHNbaSArIDFdO1xuXG4gICAgICAgIGFyZWEgKz0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTtcblxuICAgICAgICAvLyB1c2UgTWFuaGF0dGFuIGRpc3RhbmNlIGluc3RlYWQgb2YgRXVjbGlkaWFuIG9uZSB0byBhdm9pZCBleHBlbnNpdmUgc3F1YXJlIHJvb3QgY29tcHV0YXRpb25cbiAgICAgICAgZGlzdCArPSBNYXRoLmFicyhiWzBdIC0gYVswXSkgKyBNYXRoLmFicyhiWzFdIC0gYVsxXSk7XG4gICAgfVxuICAgIHBvaW50cy5hcmVhID0gTWF0aC5hYnMoYXJlYSAvIDIpO1xuICAgIHBvaW50cy5kaXN0ID0gZGlzdDtcbn1cblxuLy8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIGJvdW5kaW5nIGJveCBmb3IgZmFzdGVyIGNsaXBwaW5nIGxhdGVyXG5mdW5jdGlvbiBjYWxjQkJveChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgbWluID0gZmVhdHVyZS5taW4sXG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4O1xuXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeSk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5W2ldKTtcblxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBjYWxjUmluZ0JCb3gobWluLCBtYXgsIHBvaW50cykge1xuICAgIGZvciAodmFyIGkgPSAwLCBwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHAgPSBwb2ludHNbaV07XG4gICAgICAgIG1pblswXSA9IE1hdGgubWluKHBbMF0sIG1pblswXSk7XG4gICAgICAgIG1heFswXSA9IE1hdGgubWF4KHBbMF0sIG1heFswXSk7XG4gICAgICAgIG1pblsxXSA9IE1hdGgubWluKHBbMV0sIG1pblsxXSk7XG4gICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHBbMV0sIG1heFsxXSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlb2pzb252dDtcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCcuL2NvbnZlcnQnKSwgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpLCAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXG4gICAgd3JhcCA9IHJlcXVpcmUoJy4vd3JhcCcpLCAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cblxuXG5mdW5jdGlvbiBnZW9qc29udnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgIHZhciBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZSgncHJlcHJvY2VzcyBkYXRhJyk7XG5cbiAgICB2YXIgejIgPSAxIDw8IG9wdGlvbnMubWF4Wm9vbSwgLy8gMl56XG4gICAgICAgIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KSk7XG5cbiAgICB0aGlzLnRpbGVzID0ge307XG4gICAgdGhpcy50aWxlQ29vcmRzID0gW107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwcmVwcm9jZXNzIGRhdGEnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZCcsIG9wdGlvbnMuaW5kZXhNYXhab29tLCBvcHRpb25zLmluZGV4TWF4UG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICB0aGlzLnN0YXRzID0ge307XG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xuICAgIH1cblxuICAgIGZlYXR1cmVzID0gd3JhcChmZWF0dXJlcywgb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCwgaW50ZXJzZWN0WCk7XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlsZXMgZ2VuZXJhdGVkOicsIHRoaXMudG90YWwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKTtcbiAgICB9XG59XG5cbkdlb0pTT05WVC5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBpbmRleE1heFpvb206IDUsICAgICAgICAvLyBtYXggem9vbSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIGluZGV4TWF4UG9pbnRzOiAxMDAwMDAsIC8vIG1heCBudW1iZXIgb2YgcG9pbnRzIHBlciB0aWxlIGluIHRoZSB0aWxlIGluZGV4XG4gICAgc29saWRDaGlsZHJlbjogZmFsc2UsICAgLy8gd2hldGhlciB0byB0aWxlIHNvbGlkIHNxdWFyZSB0aWxlcyBmdXJ0aGVyXG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgICAgICAgICAvLyB0aWxlIGV4dGVudFxuICAgIGJ1ZmZlcjogNjQsICAgICAgICAgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBwcm9jZXNzaW5nIHF1ZXVlXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB5ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBmZWF0dXJlcyA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIHZhciB6MiA9IDEgPDwgeixcbiAgICAgICAgICAgIGlkID0gdG9JRCh6LCB4LCB5KSxcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSxcbiAgICAgICAgICAgIHRpbGVUb2xlcmFuY2UgPSB6ID09PSBvcHRpb25zLm1heFpvb20gPyAwIDogb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCk7XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB4LCB5LCB0aWxlVG9sZXJhbmNlLCB6ID09PSBvcHRpb25zLm1heFpvb20pO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHRoZSB0aWxlIGlzIHNvbGlkIGNsaXBwZWQgc3F1YXJlXG4gICAgICAgIGlmICghb3B0aW9ucy5zb2xpZENoaWxkcmVuICYmIGlzQ2xpcHBlZFNxdWFyZSh0aWxlLCBvcHRpb25zLmV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBpdCdzIHRoZSBmaXJzdC1wYXNzIHRpbGluZ1xuICAgICAgICBpZiAoIWN6KSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5pbmRleE1heFpvb20gfHwgdGlsZS5udW1Qb2ludHMgPD0gb3B0aW9ucy5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIGJhc2Ugem9vbSBvciBvdXIgdGFyZ2V0IHRpbGUgem9vbVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIGl0J3Mgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSB0YXJnZXQgdGlsZVxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xuICAgICAgICAgICAgaWYgKHggIT09IE1hdGguZmxvb3IoY3ggLyBtKSB8fCB5ICE9PSBNYXRoLmZsb29yKGN5IC8gbSkpIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2Ugc2xpY2UgZnVydGhlciBkb3duLCBubyBuZWVkIHRvIGtlZXAgc291cmNlIGdlb21ldHJ5XG4gICAgICAgIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgICAgIGsyID0gMC41IC0gazEsXG4gICAgICAgICAgICBrMyA9IDAuNSArIGsxLFxuICAgICAgICAgICAgazQgPSAxICsgazEsXG4gICAgICAgICAgICB0bCwgYmwsIHRyLCBiciwgbGVmdCwgcmlnaHQ7XG5cbiAgICAgICAgdGwgPSBibCA9IHRyID0gYnIgPSBudWxsO1xuXG4gICAgICAgIGxlZnQgID0gY2xpcChmZWF0dXJlcywgejIsIHggLSBrMSwgeCArIGszLCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4ICsgazIsIHggKyBrNCwgMCwgaW50ZXJzZWN0WCwgdGlsZS5taW5bMF0sIHRpbGUubWF4WzBdKTtcblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgdGwgPSBjbGlwKGxlZnQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgICAgIGJsID0gY2xpcChsZWZ0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHRyID0gY2xpcChyaWdodCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgaWYgKHRsKSBzdGFjay5wdXNoKHRsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMik7XG4gICAgICAgIGlmIChibCkgc3RhY2sucHVzaChibCwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIgKyAxKTtcbiAgICAgICAgaWYgKHRyKSBzdGFjay5wdXNoKHRyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIGlmIChicikgc3RhY2sucHVzaChiciwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIgKyAxKTtcbiAgICB9XG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBleHRlbnQgPSBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2RyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkJywgeiwgeCwgeSk7XG5cbiAgICB2YXIgejAgPSB6LFxuICAgICAgICB4MCA9IHgsXG4gICAgICAgIHkwID0geSxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgd2hpbGUgKCFwYXJlbnQgJiYgejAgPiAwKSB7XG4gICAgICAgIHowLS07XG4gICAgICAgIHgwID0gTWF0aC5mbG9vcih4MCAvIDIpO1xuICAgICAgICB5MCA9IE1hdGguZmxvb3IoeTAgLyAyKTtcbiAgICAgICAgcGFyZW50ID0gdGhpcy50aWxlc1t0b0lEKHowLCB4MCwgeTApXTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBhIHBhcmVudCB0aWxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGdlb21ldHJ5LCB3ZSBjYW4gZHJpbGwgZG93biBmcm9tIGl0XG4gICAgaWYgKHBhcmVudC5zb3VyY2UpIHtcbiAgICAgICAgaWYgKGlzQ2xpcHBlZFNxdWFyZShwYXJlbnQsIGV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSByZXR1cm4gdHJhbnNmb3JtVGlsZShwYXJlbnQsIGV4dGVudCk7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdkcmlsbGluZyBkb3duJyk7XG4gICAgICAgIHRoaXMuc3BsaXRUaWxlKHBhcmVudC5zb3VyY2UsIHowLCB4MCwgeTAsIHosIHgsIHkpO1xuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudGlsZXNbaWRdKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtVGlsZSh0aWxlLCBleHRlbnQpIHtcbiAgICBpZiAodGlsZS50cmFuc2Zvcm1lZCkgcmV0dXJuIHRpbGU7XG5cbiAgICB2YXIgejIgPSB0aWxlLnoyLFxuICAgICAgICB0eCA9IHRpbGUueCxcbiAgICAgICAgdHkgPSB0aWxlLnksXG4gICAgICAgIGksIGosIGs7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IHRpbGUuZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSBnZW9tW2pdID0gdHJhbnNmb3JtUG9pbnQoZ2VvbVtqXSwgZXh0ZW50LCB6MiwgdHgsIHR5KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGdlb21bal07XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHJpbmcubGVuZ3RoOyBrKyspIHJpbmdba10gPSB0cmFuc2Zvcm1Qb2ludChyaW5nW2tdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGlsZS50cmFuc2Zvcm1lZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQocCwgZXh0ZW50LCB6MiwgdHgsIHR5KSB7XG4gICAgdmFyIHggPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzBdICogejIgLSB0eCkpLFxuICAgICAgICB5ID0gTWF0aC5yb3VuZChleHRlbnQgKiAocFsxXSAqIHoyIC0gdHkpKTtcbiAgICByZXR1cm4gW3gsIHldO1xufVxuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFgoYSwgYiwgeCkge1xuICAgIHJldHVybiBbeCwgKHggLSBhWzBdKSAqIChiWzFdIC0gYVsxXSkgLyAoYlswXSAtIGFbMF0pICsgYVsxXSwgMV07XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RZKGEsIGIsIHkpIHtcbiAgICByZXR1cm4gWyh5IC0gYVsxXSkgKiAoYlswXSAtIGFbMF0pIC8gKGJbMV0gLSBhWzFdKSArIGFbMF0sIHksIDFdO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIGRlc3RbaV0gPSBzcmNbaV07XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbi8vIGNoZWNrcyB3aGV0aGVyIGEgdGlsZSBpcyBhIHdob2xlLWFyZWEgZmlsbCBhZnRlciBjbGlwcGluZzsgaWYgaXQgaXMsIHRoZXJlJ3Mgbm8gc2Vuc2Ugc2xpY2luZyBpdCBmdXJ0aGVyXG5mdW5jdGlvbiBpc0NsaXBwZWRTcXVhcmUodGlsZSwgZXh0ZW50LCBidWZmZXIpIHtcblxuICAgIHZhciBmZWF0dXJlcyA9IHRpbGUuc291cmNlO1xuICAgIGlmIChmZWF0dXJlcy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbMF07XG4gICAgaWYgKGZlYXR1cmUudHlwZSAhPT0gMyB8fCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW4gPSBmZWF0dXJlLmdlb21ldHJ5WzBdLmxlbmd0aDtcbiAgICBpZiAobGVuICE9PSA1KSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gdHJhbnNmb3JtUG9pbnQoZmVhdHVyZS5nZW9tZXRyeVswXVtpXSwgZXh0ZW50LCB0aWxlLnoyLCB0aWxlLngsIHRpbGUueSk7XG4gICAgICAgIGlmICgocFswXSAhPT0gLWJ1ZmZlciAmJiBwWzBdICE9PSBleHRlbnQgKyBidWZmZXIpIHx8XG4gICAgICAgICAgICAocFsxXSAhPT0gLWJ1ZmZlciAmJiBwWzFdICE9PSBleHRlbnQgKyBidWZmZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc2ltcGxpZnk7XG5cbi8vIGNhbGN1bGF0ZSBzaW1wbGlmaWNhdGlvbiBkYXRhIHVzaW5nIG9wdGltaXplZCBEb3VnbGFzLVBldWNrZXIgYWxnb3JpdGhtXG5cbmZ1bmN0aW9uIHNpbXBsaWZ5KHBvaW50cywgdG9sZXJhbmNlKSB7XG5cbiAgICB2YXIgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2UsXG4gICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgIGZpcnN0ID0gMCxcbiAgICAgICAgbGFzdCA9IGxlbiAtIDEsXG4gICAgICAgIHN0YWNrID0gW10sXG4gICAgICAgIGksIG1heFNxRGlzdCwgc3FEaXN0LCBpbmRleDtcblxuICAgIC8vIGFsd2F5cyByZXRhaW4gdGhlIGVuZHBvaW50cyAoMSBpcyB0aGUgbWF4IHZhbHVlKVxuICAgIHBvaW50c1tmaXJzdF1bMl0gPSAxO1xuICAgIHBvaW50c1tsYXN0XVsyXSA9IDE7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBzdGFja1xuICAgIHdoaWxlIChsYXN0KSB7XG5cbiAgICAgICAgbWF4U3FEaXN0ID0gMDtcblxuICAgICAgICBmb3IgKGkgPSBmaXJzdCArIDE7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgICAgICAgIHNxRGlzdCA9IGdldFNxU2VnRGlzdChwb2ludHNbaV0sIHBvaW50c1tmaXJzdF0sIHBvaW50c1tsYXN0XSk7XG5cbiAgICAgICAgICAgIGlmIChzcURpc3QgPiBtYXhTcURpc3QpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgbWF4U3FEaXN0ID0gc3FEaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICBwb2ludHNbaW5kZXhdWzJdID0gbWF4U3FEaXN0OyAvLyBzYXZlIHRoZSBwb2ludCBpbXBvcnRhbmNlIGluIHNxdWFyZWQgcGl4ZWxzIGFzIGEgeiBjb29yZGluYXRlXG4gICAgICAgICAgICBzdGFjay5wdXNoKGZpcnN0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgZmlyc3QgPSBpbmRleDtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgZmlyc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gc3F1YXJlIGRpc3RhbmNlIGZyb20gYSBwb2ludCB0byBhIHNlZ21lbnRcbmZ1bmN0aW9uIGdldFNxU2VnRGlzdChwLCBhLCBiKSB7XG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSxcbiAgICAgICAgcHggPSBwWzBdLCBweSA9IHBbMV0sXG4gICAgICAgIGR4ID0gYnggLSB4LFxuICAgICAgICBkeSA9IGJ5IC0geTtcblxuICAgIGlmIChkeCAhPT0gMCB8fCBkeSAhPT0gMCkge1xuXG4gICAgICAgIHZhciB0ID0gKChweCAtIHgpICogZHggKyAocHkgLSB5KSAqIGR5KSAvIChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cbiAgICAgICAgaWYgKHQgPiAxKSB7XG4gICAgICAgICAgICB4ID0gYng7XG4gICAgICAgICAgICB5ID0gYnk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgeCArPSBkeCAqIHQ7XG4gICAgICAgICAgICB5ICs9IGR5ICogdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGR4ID0gcHggLSB4O1xuICAgIGR5ID0gcHkgLSB5O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVRpbGU7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB0eCwgdHksIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuICAgIHZhciB0aWxlID0ge1xuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICAgIG51bVBvaW50czogMCxcbiAgICAgICAgbnVtU2ltcGxpZmllZDogMCxcbiAgICAgICAgbnVtRmVhdHVyZXM6IDAsXG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgeDogdHgsXG4gICAgICAgIHk6IHR5LFxuICAgICAgICB6MjogejIsXG4gICAgICAgIHRyYW5zZm9ybWVkOiBmYWxzZSxcbiAgICAgICAgbWluOiBbMiwgMV0sXG4gICAgICAgIG1heDogWy0xLCAwXVxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSk7XG5cbiAgICAgICAgdmFyIG1pbiA9IGZlYXR1cmVzW2ldLm1pbixcbiAgICAgICAgICAgIG1heCA9IGZlYXR1cmVzW2ldLm1heDtcblxuICAgICAgICBpZiAobWluWzBdIDwgdGlsZS5taW5bMF0pIHRpbGUubWluWzBdID0gbWluWzBdO1xuICAgICAgICBpZiAobWluWzFdIDwgdGlsZS5taW5bMV0pIHRpbGUubWluWzFdID0gbWluWzFdO1xuICAgICAgICBpZiAobWF4WzBdID4gdGlsZS5tYXhbMF0pIHRpbGUubWF4WzBdID0gbWF4WzBdO1xuICAgICAgICBpZiAobWF4WzFdID4gdGlsZS5tYXhbMV0pIHRpbGUubWF4WzFdID0gbWF4WzFdO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdLFxuICAgICAgICBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgaSwgaiwgcmluZywgcDtcblxuICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLy8gc2ltcGxpZnkgYW5kIHRyYW5zZm9ybSBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgZm9yIHRpbGUgZ2VvbWV0cnlcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmcgPSBnZW9tW2ldO1xuXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IHRpbnkgcG9seWxpbmVzICYgcG9seWdvbnNcbiAgICAgICAgICAgIGlmICghbm9TaW1wbGlmeSAmJiAoKHR5cGUgPT09IDIgJiYgcmluZy5kaXN0IDwgdG9sZXJhbmNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PT0gMyAmJiByaW5nLmFyZWEgPCBzcVRvbGVyYW5jZSkpKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzaW1wbGlmaWVkUmluZyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHAgPSByaW5nW2pdO1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgcG9pbnRzIHdpdGggaW1wb3J0YW5jZSA+IHRvbGVyYW5jZVxuICAgICAgICAgICAgICAgIGlmIChub1NpbXBsaWZ5IHx8IHBbMl0gPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBzaW1wbGlmaWVkUmluZy5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKHNpbXBsaWZpZWRSaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW1wbGlmaWVkLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdGFnczogZmVhdHVyZS50YWdzIHx8IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5cbmZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIGJ1ZmZlciwgaW50ZXJzZWN0WCkge1xuICAgIHZhciBtZXJnZWQgPSBmZWF0dXJlcyxcbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCAxLCAtMSAtIGJ1ZmZlciwgYnVmZmVyLCAgICAgMCwgaW50ZXJzZWN0WCwgLTEsIDIpLCAvLyBsZWZ0IHdvcmxkIGNvcHlcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCAxLCAgMSAtIGJ1ZmZlciwgMiArIGJ1ZmZlciwgMCwgaW50ZXJzZWN0WCwgLTEsIDIpOyAvLyByaWdodCB3b3JsZCBjb3B5XG5cbiAgICBpZiAobGVmdCB8fCByaWdodCkge1xuICAgICAgICBtZXJnZWQgPSBjbGlwKGZlYXR1cmVzLCAxLCAtYnVmZmVyLCAxICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIGNlbnRlciB3b3JsZCBjb3B5XG5cbiAgICAgICAgaWYgKGxlZnQpIG1lcmdlZCA9IHNoaWZ0RmVhdHVyZUNvb3JkcyhsZWZ0LCAxKS5jb25jYXQobWVyZ2VkKTsgLy8gbWVyZ2UgbGVmdCBpbnRvIGNlbnRlclxuICAgICAgICBpZiAocmlnaHQpIG1lcmdlZCA9IG1lcmdlZC5jb25jYXQoc2hpZnRGZWF0dXJlQ29vcmRzKHJpZ2h0LCAtMSkpOyAvLyBtZXJnZSByaWdodCBpbnRvIGNlbnRlclxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0RmVhdHVyZUNvb3JkcyhmZWF0dXJlcywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld0ZlYXR1cmVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXdGZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBuZXdHZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MsXG4gICAgICAgICAgICBtaW46IFtmZWF0dXJlLm1pblswXSArIG9mZnNldCwgZmVhdHVyZS5taW5bMV1dLFxuICAgICAgICAgICAgbWF4OiBbZmVhdHVyZS5tYXhbMF0gKyBvZmZzZXQsIGZlYXR1cmUubWF4WzFdXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5hcmVhID0gcG9pbnRzLmFyZWE7XG4gICAgbmV3UG9pbnRzLmRpc3QgPSBwb2ludHMuZGlzdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1BvaW50cy5wdXNoKFtwb2ludHNbaV1bMF0gKyBvZmZzZXQsIHBvaW50c1tpXVsxXSwgcG9pbnRzW2ldWzJdXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludHM7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGludmVydFxuXG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQGFsaWFzIG1hdDMuaW52ZXJ0XG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbmZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl1cbiAgdmFyIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV1cbiAgdmFyIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF1cblxuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxXG4gIHZhciBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwXG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjBcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjFcblxuICBpZiAoIWRldCkgcmV0dXJuIG51bGxcbiAgZGV0ID0gMS4wIC8gZGV0XG5cbiAgb3V0WzBdID0gYjAxICogZGV0XG4gIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldFxuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldFxuICBvdXRbM10gPSBiMTEgKiBkZXRcbiAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXRcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0XG4gIG91dFs2XSA9IGIyMSAqIGRldFxuICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXRcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IG5vcm1hbEZyb21NYXQ0XG5cbi8qKlxuKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XG4qXG4qIEBhbGlhcyBtYXQzLm5vcm1hbEZyb21NYXQ0XG4qIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiogQHBhcmFtIHttYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbipcbiogQHJldHVybnMge21hdDN9IG91dFxuKi9cbmZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXVxuICB2YXIgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XVxuICB2YXIgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdXG4gIHZhciBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XVxuXG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTBcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMFxuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwXG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTFcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMVxuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyXG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzBcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMFxuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwXG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzFcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMVxuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID0gYjAwICogYjExXG4gICAgICAgICAgLSBiMDEgKiBiMTBcbiAgICAgICAgICArIGIwMiAqIGIwOVxuICAgICAgICAgICsgYjAzICogYjA4XG4gICAgICAgICAgLSBiMDQgKiBiMDdcbiAgICAgICAgICArIGIwNSAqIGIwNlxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldFxuICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldFxuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldFxuXG4gIG91dFszXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0XG4gIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0XG5cbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXRcbiAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXRcbiAgb3V0WzhdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNvcHk7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG5cbi8qKlxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9va0F0O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHt2ZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxuICogQHBhcmFtIHt2ZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge3ZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbixcbiAgICAgICAgZXlleCA9IGV5ZVswXSxcbiAgICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgICB1cHogPSB1cFsyXSxcbiAgICAgICAgY2VudGVyeCA9IGNlbnRlclswXSxcbiAgICAgICAgY2VudGVyeSA9IGNlbnRlclsxXSxcbiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICAgIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCAwLjAwMDAwMSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgICB9XG5cbiAgICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICAgIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gICAgejIgPSBleWV6IC0gY2VudGVyejtcblxuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcblxuICAgIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHgwID0gMDtcbiAgICAgICAgeDEgPSAwO1xuICAgICAgICB4MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeDAgKj0gbGVuO1xuICAgICAgICB4MSAqPSBsZW47XG4gICAgICAgIHgyICo9IGxlbjtcbiAgICB9XG5cbiAgICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gICAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcblxuICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHkwID0gMDtcbiAgICAgICAgeTEgPSAwO1xuICAgICAgICB5MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeTAgKj0gbGVuO1xuICAgICAgICB5MSAqPSBsZW47XG4gICAgICAgIHkyICo9IGxlbjtcbiAgICB9XG5cbiAgICBvdXRbMF0gPSB4MDtcbiAgICBvdXRbMV0gPSB5MDtcbiAgICBvdXRbMl0gPSB6MDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHgxO1xuICAgIG91dFs1XSA9IHkxO1xuICAgIG91dFs2XSA9IHoxO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geDI7XG4gICAgb3V0WzldID0geTI7XG4gICAgb3V0WzEwXSA9IHoyO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gICAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBtdWx0aXBseTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107ICBcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBwZXJzcGVjdGl2ZTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBwZXJzcGVjdGl2ZShvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gZjtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTFdID0gLTE7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9ICgyICogZmFyICogbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHNjYWxlO1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjM1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbmZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuXG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHRyYW5zbGF0ZTtcblxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl0sXG4gICAgICAgIGEwMCwgYTAxLCBhMDIsIGEwMyxcbiAgICAgICAgYTEwLCBhMTEsIGExMiwgYTEzLFxuICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMF0gPSBhMDA7IG91dFsxXSA9IGEwMTsgb3V0WzJdID0gYTAyOyBvdXRbM10gPSBhMDM7XG4gICAgICAgIG91dFs0XSA9IGExMDsgb3V0WzVdID0gYTExOyBvdXRbNl0gPSBhMTI7IG91dFs3XSA9IGExMztcbiAgICAgICAgb3V0WzhdID0gYTIwOyBvdXRbOV0gPSBhMjE7IG91dFsxMF0gPSBhMjI7IG91dFsxMV0gPSBhMjM7XG5cbiAgICAgICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcGFyc2VFcnJvcnNcblxuZnVuY3Rpb24gcGFyc2VFcnJvcnMobG9nKSB7XG4gIGxvZyA9IFN0cmluZyhsb2cpXG5cbiAgdmFyIGxvZ3MgPSBbXVxuICB2YXIgcmVzdWx0XG5cbiAgd2hpbGUgKHJlc3VsdCA9IGxvZy5tYXRjaCgvRVJST1JcXDooW15cXG5dKykvKSkge1xuICAgIGxvZyA9IGxvZy5zbGljZShyZXN1bHQuaW5kZXggKyAxKVxuXG4gICAgdmFyIGxpbmUgPSByZXN1bHRbMV0udHJpbSgpXG4gICAgdmFyIHNlcHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICB2YXIgZW1zZyA9IHNlcHMuc2xpY2UoMikuam9pbignOicpLnRyaW0oKVxuICAgIHZhciBmaWxlID0gcGFyc2VJbnQoc2Vwc1swXSwgMTApXG4gICAgdmFyIGxpbmUgPSBwYXJzZUludChzZXBzWzFdLCAxMClcblxuICAgIGxvZ3MucHVzaCh7XG4gICAgICAgIG1lc3NhZ2U6IGVtc2dcbiAgICAgICwgZmlsZTogZmlsZVxuICAgICAgLCBsaW5lOiBsaW5lXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBsb2dzXG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHlhbWwgPSByZXF1aXJlKCcuL2xpYi9qcy15YW1sLmpzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB5YW1sO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2FkZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvbG9hZGVyJyk7XG4vLyB2YXIgZHVtcGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2R1bXBlcicpO1xuXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gJyArIG5hbWUgKyAnIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLicpO1xuICB9O1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLlR5cGUgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvdHlwZScpO1xubW9kdWxlLmV4cG9ydHMuU2NoZW1hICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEnKTtcbm1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5KU09OX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9qc29uJyk7XG5tb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9jb3JlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgICAgICAgICA9IGxvYWRlci5sb2FkO1xubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgICAgICAgICA9IGxvYWRlci5sb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWRBbGw7XG4vLyBtb2R1bGUuZXhwb3J0cy5kdW1wICAgICAgICAgICAgICAgID0gZHVtcGVyLmR1bXA7XG4vLyBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCAgICAgICAgICAgID0gZHVtcGVyLnNhZmVEdW1wO1xubW9kdWxlLmV4cG9ydHMuWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9leGNlcHRpb24nKTtcblxuLy8gRGVwcmVjYXRlZCBzY2hlbWEgbmFtZXMgZnJvbSBKUy1ZQU1MIDIuMC54XG5tb2R1bGUuZXhwb3J0cy5NSU5JTUFMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLlNBRkVfU0NIRU1BICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuLy8gRGVwcmVjYXRlZCBmdW5jdGlvbnMgZnJvbSBKUy1ZQU1MIDEueC54XG5tb2R1bGUuZXhwb3J0cy5zY2FuICAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3NjYW4nKTtcbm1vZHVsZS5leHBvcnRzLnBhcnNlICAgICAgICAgID0gZGVwcmVjYXRlZCgncGFyc2UnKTtcbm1vZHVsZS5leHBvcnRzLmNvbXBvc2UgICAgICAgID0gZGVwcmVjYXRlZCgnY29tcG9zZScpO1xubW9kdWxlLmV4cG9ydHMuYWRkQ29uc3RydWN0b3IgPSBkZXByZWNhdGVkKCdhZGRDb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGlzTm90aGluZyhzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB8fCAoc3ViamVjdCA9PT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gaXNPYmplY3Qoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JykgJiYgKHN1YmplY3QgIT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoc2VxdWVuY2UpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7XG4gIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTtcblxuICByZXR1cm4gWyBzZXF1ZW5jZSBdO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwga2V5LCBzb3VyY2VLZXlzO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIGNvdW50KSB7XG4gIHZhciByZXN1bHQgPSAnJywgY3ljbGU7XG5cbiAgZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY291bnQ7IGN5Y2xlICs9IDEpIHtcbiAgICByZXN1bHQgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhudW1iZXIpIHtcbiAgcmV0dXJuIChudW1iZXIgPT09IDApICYmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmlzTm90aGluZyAgICAgID0gaXNOb3RoaW5nO1xubW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgICAgICAgPSBpc09iamVjdDtcbm1vZHVsZS5leHBvcnRzLnRvQXJyYXkgICAgICAgID0gdG9BcnJheTtcbm1vZHVsZS5leHBvcnRzLnJlcGVhdCAgICAgICAgID0gcmVwZWF0O1xubW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybztcbm1vZHVsZS5leHBvcnRzLmV4dGVuZCAgICAgICAgID0gZXh0ZW5kO1xuIiwiLy8gWUFNTCBlcnJvciBjbGFzcy4gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NDU4OTg0XG4vL1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBZQU1MRXhjZXB0aW9uKHJlYXNvbiwgbWFyaykge1xuICAvLyBTdXBlciBjb25zdHJ1Y3RvclxuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIC8vIEluY2x1ZGUgc3RhY2sgdHJhY2UgaW4gZXJyb3Igb2JqZWN0XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIC8vIENocm9tZSBhbmQgTm9kZUpTXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gRkYsIElFIDEwKyBhbmQgU2FmYXJpIDYrLiBGYWxsYmFjayBmb3Igb3RoZXJzXG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2sgfHwgJyc7XG4gIH1cblxuICB0aGlzLm5hbWUgPSAnWUFNTEV4Y2VwdGlvbic7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICB0aGlzLm1hcmsgPSBtYXJrO1xuICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknKSArICh0aGlzLm1hcmsgPyAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICcnKTtcbn1cblxuXG4vLyBJbmhlcml0IGZyb20gRXJyb3JcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBZQU1MRXhjZXB0aW9uO1xuXG5cbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgJzogJztcblxuICByZXN1bHQgKz0gdGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknO1xuXG4gIGlmICghY29tcGFjdCAmJiB0aGlzLm1hcmspIHtcbiAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbixuby11c2UtYmVmb3JlLWRlZmluZSovXG5cbnZhciBjb21tb24gICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBNYXJrICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9tYXJrJyk7XG52YXIgREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xudmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXG52YXIgQ09OVEVYVF9GTE9XX0lOICAgPSAxO1xudmFyIENPTlRFWFRfRkxPV19PVVQgID0gMjtcbnZhciBDT05URVhUX0JMT0NLX0lOICA9IDM7XG52YXIgQ09OVEVYVF9CTE9DS19PVVQgPSA0O1xuXG5cbnZhciBDSE9NUElOR19DTElQICA9IDE7XG52YXIgQ0hPTVBJTkdfU1RSSVAgPSAyO1xudmFyIENIT01QSU5HX0tFRVAgID0gMztcblxuXG52YXIgUEFUVEVSTl9OT05fUFJJTlRBQkxFICAgICAgICAgPSAvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx4N0YtXFx4ODRcXHg4Ni1cXHg5RlxcdUZGRkVcXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS87XG52YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1xceDg1XFx1MjAyOFxcdTIwMjldLztcbnZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyAgICAgICA9IC9bLFxcW1xcXVxce1xcfV0vO1xudmFyIFBBVFRFUk5fVEFHX0hBTkRMRSAgICAgICAgICAgID0gL14oPzohfCEhfCFbYS16XFwtXSshKSQvaTtcbnZhciBQQVRURVJOX1RBR19VUkkgICAgICAgICAgICAgICA9IC9eKD86IXxbXixcXFtcXF1cXHtcXH1dKSg/OiVbMC05YS1mXXsyfXxbMC05YS16XFwtIztcXC9cXD86QCY9XFwrXFwkLF9cXC4hflxcKidcXChcXClcXFtcXF1dKSokL2k7XG5cblxuZnVuY3Rpb24gaXNfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDBBLyogTEYgKi8pIHx8IChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XSElURV9TUEFDRShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHwgKGMgPT09IDB4MjAvKiBTcGFjZSAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dTX09SX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwQS8qIExGICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX0ZMT1dfSU5ESUNBVE9SKGMpIHtcbiAgcmV0dXJuIGMgPT09IDB4MkMvKiAsICovIHx8XG4gICAgICAgICBjID09PSAweDVCLyogWyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1RC8qIF0gKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0IvKiB7ICovIHx8XG4gICAgICAgICBjID09PSAweDdELyogfSAqLztcbn1cblxuZnVuY3Rpb24gZnJvbUhleENvZGUoYykge1xuICB2YXIgbGM7XG5cbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICAvKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuICBsYyA9IGMgfCAweDIwO1xuXG4gIGlmICgoMHg2MS8qIGEgKi8gPD0gbGMpICYmIChsYyA8PSAweDY2LyogZiAqLykpIHtcbiAgICByZXR1cm4gbGMgLSAweDYxICsgMTA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRIZXhMZW4oYykge1xuICBpZiAoYyA9PT0gMHg3OC8qIHggKi8pIHsgcmV0dXJuIDI7IH1cbiAgaWYgKGMgPT09IDB4NzUvKiB1ICovKSB7IHJldHVybiA0OyB9XG4gIGlmIChjID09PSAweDU1LyogVSAqLykgeyByZXR1cm4gODsgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnJvbURlY2ltYWxDb2RlKGMpIHtcbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVzY2FwZVNlcXVlbmNlKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDMwLyogMCAqLykgPyAnXFx4MDAnIDpcbiAgICAgICAgKGMgPT09IDB4NjEvKiBhICovKSA/ICdcXHgwNycgOlxuICAgICAgICAoYyA9PT0gMHg2Mi8qIGIgKi8pID8gJ1xceDA4JyA6XG4gICAgICAgIChjID09PSAweDc0LyogdCAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4MDkvKiBUYWIgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDZFLyogbiAqLykgPyAnXFx4MEEnIDpcbiAgICAgICAgKGMgPT09IDB4NzYvKiB2ICovKSA/ICdcXHgwQicgOlxuICAgICAgICAoYyA9PT0gMHg2Ni8qIGYgKi8pID8gJ1xceDBDJyA6XG4gICAgICAgIChjID09PSAweDcyLyogciAqLykgPyAnXFx4MEQnIDpcbiAgICAgICAgKGMgPT09IDB4NjUvKiBlICovKSA/ICdcXHgxQicgOlxuICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSA/ICcgJyA6XG4gICAgICAgIChjID09PSAweDIyLyogXCIgKi8pID8gJ1xceDIyJyA6XG4gICAgICAgIChjID09PSAweDJGLyogLyAqLykgPyAnLycgOlxuICAgICAgICAoYyA9PT0gMHg1Qy8qIFxcICovKSA/ICdcXHg1QycgOlxuICAgICAgICAoYyA9PT0gMHg0RS8qIE4gKi8pID8gJ1xceDg1JyA6XG4gICAgICAgIChjID09PSAweDVGLyogXyAqLykgPyAnXFx4QTAnIDpcbiAgICAgICAgKGMgPT09IDB4NEMvKiBMICovKSA/ICdcXHUyMDI4JyA6XG4gICAgICAgIChjID09PSAweDUwLyogUCAqLykgPyAnXFx1MjAyOScgOiAnJztcbn1cblxuZnVuY3Rpb24gY2hhckZyb21Db2RlcG9pbnQoYykge1xuICBpZiAoYyA8PSAweEZGRkYpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgfVxuICAvLyBFbmNvZGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyXG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNDb2RlX3BvaW50c19VLjJCMDEwMDAwX3RvX1UuMkIxMEZGRkZcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKChjIC0gMHgwMTAwMDApID4+IDEwKSArIDB4RDgwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjIC0gMHgwMTAwMDApICYgMHgwM0ZGKSArIDB4REMwMCk7XG59XG5cbnZhciBzaW1wbGVFc2NhcGVDaGVjayA9IG5ldyBBcnJheSgyNTYpOyAvLyBpbnRlZ2VyLCBmb3IgZmFzdCBhY2Nlc3NcbnZhciBzaW1wbGVFc2NhcGVNYXAgPSBuZXcgQXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgc2ltcGxlRXNjYXBlQ2hlY2tbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKSA/IDEgOiAwO1xuICBzaW1wbGVFc2NhcGVNYXBbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKTtcbn1cblxuXG5mdW5jdGlvbiBTdGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgdGhpcy5maWxlbmFtZSAgPSBvcHRpb25zWydmaWxlbmFtZSddICB8fCBudWxsO1xuICB0aGlzLnNjaGVtYSAgICA9IG9wdGlvbnNbJ3NjaGVtYSddICAgIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7XG4gIHRoaXMub25XYXJuaW5nID0gb3B0aW9uc1snb25XYXJuaW5nJ10gfHwgbnVsbDtcbiAgdGhpcy5sZWdhY3kgICAgPSBvcHRpb25zWydsZWdhY3knXSAgICB8fCBmYWxzZTtcbiAgdGhpcy5qc29uICAgICAgPSBvcHRpb25zWydqc29uJ10gICAgICB8fCBmYWxzZTtcbiAgdGhpcy5saXN0ZW5lciAgPSBvcHRpb25zWydsaXN0ZW5lciddICB8fCBudWxsO1xuXG4gIHRoaXMuaW1wbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQ7XG4gIHRoaXMudHlwZU1hcCAgICAgICA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkVHlwZU1hcDtcblxuICB0aGlzLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gIHRoaXMucG9zaXRpb24gICA9IDA7XG4gIHRoaXMubGluZSAgICAgICA9IDA7XG4gIHRoaXMubGluZVN0YXJ0ICA9IDA7XG4gIHRoaXMubGluZUluZGVudCA9IDA7XG5cbiAgdGhpcy5kb2N1bWVudHMgPSBbXTtcblxuICAvKlxuICB0aGlzLnZlcnNpb247XG4gIHRoaXMuY2hlY2tMaW5lQnJlYWtzO1xuICB0aGlzLnRhZ01hcDtcbiAgdGhpcy5hbmNob3JNYXA7XG4gIHRoaXMudGFnO1xuICB0aGlzLmFuY2hvcjtcbiAgdGhpcy5raW5kO1xuICB0aGlzLnJlc3VsdDsqL1xuXG59XG5cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gbmV3IFlBTUxFeGNlcHRpb24oXG4gICAgbWVzc2FnZSxcbiAgICBuZXcgTWFyayhzdGF0ZS5maWxlbmFtZSwgc3RhdGUuaW5wdXQsIHN0YXRlLnBvc2l0aW9uLCBzdGF0ZS5saW5lLCAoc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQpKSk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgdGhyb3cgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRocm93V2FybmluZyhzdGF0ZSwgbWVzc2FnZSkge1xuICBpZiAoc3RhdGUub25XYXJuaW5nKSB7XG4gICAgc3RhdGUub25XYXJuaW5nLmNhbGwobnVsbCwgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkpO1xuICB9XG59XG5cblxudmFyIGRpcmVjdGl2ZUhhbmRsZXJzID0ge1xuXG4gIFlBTUw6IGZ1bmN0aW9uIGhhbmRsZVlhbWxEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBtYXRjaCwgbWFqb3IsIG1pbm9yO1xuXG4gICAgaWYgKHN0YXRlLnZlcnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiAlWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdZQU1MIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgb25lIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgbWF0Y2ggPSAvXihbMC05XSspXFwuKFswLTldKykkLy5leGVjKGFyZ3NbMF0pO1xuXG4gICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCBhcmd1bWVudCBvZiB0aGUgWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBtYWpvciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgbWlub3IgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuXG4gICAgaWYgKG1ham9yICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS52ZXJzaW9uID0gYXJnc1swXTtcbiAgICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSAobWlub3IgPCAyKTtcblxuICAgIGlmIChtaW5vciAhPT0gMSAmJiBtaW5vciAhPT0gMikge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cbiAgfSxcblxuICBUQUc6IGZ1bmN0aW9uIGhhbmRsZVRhZ0RpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIGhhbmRsZSwgcHJlZml4O1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGhhbmRsZSA9IGFyZ3NbMF07XG4gICAgcHJlZml4ID0gYXJnc1sxXTtcblxuICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QoaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIGhhbmRsZSAoZmlyc3QgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZXJlIGlzIGEgcHJldmlvdXNseSBkZWNsYXJlZCBzdWZmaXggZm9yIFwiJyArIGhhbmRsZSArICdcIiB0YWcgaGFuZGxlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFQQVRURVJOX1RBR19VUkkudGVzdChwcmVmaXgpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgcHJlZml4IChzZWNvbmQgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgc3RhdGUudGFnTWFwW2hhbmRsZV0gPSBwcmVmaXg7XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gY2FwdHVyZVNlZ21lbnQoc3RhdGUsIHN0YXJ0LCBlbmQsIGNoZWNrSnNvbikge1xuICB2YXIgX3Bvc2l0aW9uLCBfbGVuZ3RoLCBfY2hhcmFjdGVyLCBfcmVzdWx0O1xuXG4gIGlmIChzdGFydCA8IGVuZCkge1xuICAgIF9yZXN1bHQgPSBzdGF0ZS5pbnB1dC5zbGljZShzdGFydCwgZW5kKTtcblxuICAgIGlmIChjaGVja0pzb24pIHtcbiAgICAgIGZvciAoX3Bvc2l0aW9uID0gMCwgX2xlbmd0aCA9IF9yZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gPCBfbGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gKz0gMSkge1xuICAgICAgICBfY2hhcmFjdGVyID0gX3Jlc3VsdC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG4gICAgICAgIGlmICghKF9jaGFyYWN0ZXIgPT09IDB4MDkgfHxcbiAgICAgICAgICAgICAgKDB4MjAgPD0gX2NoYXJhY3RlciAmJiBfY2hhcmFjdGVyIDw9IDB4MTBGRkZGKSkpIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHN0YXRlLnJlc3VsdCArPSBfcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlTWFwcGluZ3Moc3RhdGUsIGRlc3RpbmF0aW9uLCBzb3VyY2UsIG92ZXJyaWRhYmxlS2V5cykge1xuICB2YXIgc291cmNlS2V5cywga2V5LCBpbmRleCwgcXVhbnRpdHk7XG5cbiAgaWYgKCFjb21tb24uaXNPYmplY3Qoc291cmNlKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgbWVyZ2UgbWFwcGluZ3M7IHRoZSBwcm92aWRlZCBzb3VyY2Ugb2JqZWN0IGlzIHVuYWNjZXB0YWJsZScpO1xuICB9XG5cbiAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2luZGV4XTtcblxuICAgIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoZGVzdGluYXRpb24sIGtleSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIG92ZXJyaWRhYmxlS2V5c1trZXldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkge1xuICB2YXIgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGtleU5vZGUgPSBTdHJpbmcoa2V5Tm9kZSk7XG5cbiAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHtcbiAgICBfcmVzdWx0ID0ge307XG4gIH1cblxuICBpZiAoa2V5VGFnID09PSAndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVOb2RlKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gdmFsdWVOb2RlLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGVbaW5kZXhdLCBvdmVycmlkYWJsZUtleXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGUsIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghc3RhdGUuanNvbiAmJlxuICAgICAgICAhX2hhc093blByb3BlcnR5LmNhbGwob3ZlcnJpZGFibGVLZXlzLCBrZXlOb2RlKSAmJlxuICAgICAgICBfaGFzT3duUHJvcGVydHkuY2FsbChfcmVzdWx0LCBrZXlOb2RlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0ZWQgbWFwcGluZyBrZXknKTtcbiAgICB9XG4gICAgX3Jlc3VsdFtrZXlOb2RlXSA9IHZhbHVlTm9kZTtcbiAgICBkZWxldGUgb3ZlcnJpZGFibGVLZXlzW2tleU5vZGVdO1xuICB9XG5cbiAgcmV0dXJuIF9yZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRMaW5lQnJlYWsoc3RhdGUpIHtcbiAgdmFyIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDBBLyogTEYgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDBELyogQ1IgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSBsaW5lIGJyZWFrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBzdGF0ZS5saW5lICs9IDE7XG4gIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xufVxuXG5mdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkge1xuICB2YXIgbGluZUJyZWFrcyA9IDAsXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dDb21tZW50cyAmJiBjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfSB3aGlsZSAoY2ggIT09IDB4MEEvKiBMRiAqLyAmJiBjaCAhPT0gMHgwRC8qIENSICovICYmIGNoICE9PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBsaW5lQnJlYWtzKys7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGNoID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZS5saW5lSW5kZW50IDwgY2hlY2tJbmRlbnQpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdkZWZpY2llbnQgaW5kZW50YXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lQnJlYWtzO1xufVxuXG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgLy8gQ29uZGl0aW9uIHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgaXMgdGVzdGVkXG4gIC8vIGluIHBhcmVudCBvbiBlYWNoIGNhbGwsIGZvciBlZmZpY2llbmN5LiBObyBuZWVkcyB0byB0ZXN0IGhlcmUgYWdhaW4uXG4gIGlmICgoY2ggPT09IDB4MkQvKiAtICovIHx8IGNoID09PSAweDJFLyogLiAqLykgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDEpICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAyKSkge1xuXG4gICAgX3Bvc2l0aW9uICs9IDM7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMCB8fCBpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50KSB7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGNvdW50IC0gMSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkUGxhaW5TY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQsIHdpdGhpbkZsb3dDb2xsZWN0aW9uKSB7XG4gIHZhciBwcmVjZWRpbmcsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQsXG4gICAgICBfbGluZSxcbiAgICAgIF9saW5lU3RhcnQsXG4gICAgICBfbGluZUluZGVudCxcbiAgICAgIF9raW5kID0gc3RhdGUua2luZCxcbiAgICAgIF9yZXN1bHQgPSBzdGF0ZS5yZXN1bHQsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChpc19XU19PUl9FT0woY2gpICAgICAgfHxcbiAgICAgIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSB8fFxuICAgICAgY2ggPT09IDB4MjMvKiAjICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNi8qICYgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDJBLyogKiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjEvKiAhICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg3Qy8qIHwgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDNFLyogPiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjcvKiAnICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMi8qIFwiICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNS8qICUgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDQwLyogQCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NjAvKiBgICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgcHJlY2VkaW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiAtIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKHByZWNlZGluZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHx8XG4gICAgICAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICAgIGJyZWFrO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgICBfbGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuICAgICAgX2xpbmVJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIC0xKTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPj0gbm9kZUluZGVudCkge1xuICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IHRydWU7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBjYXB0dXJlRW5kO1xuICAgICAgICBzdGF0ZS5saW5lID0gX2xpbmU7XG4gICAgICAgIHN0YXRlLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSBfbGluZUluZGVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICB9XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG5cbiAgaWYgKHN0YXRlLnJlc3VsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9IF9raW5kO1xuICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNoLFxuICAgICAgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI3LyogJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhleExlbmd0aCxcbiAgICAgIGhleFJlc3VsdCxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIyLyogXCIgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyMi8qIFwiICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDVDLyogXFwgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpO1xuXG4gICAgICAgIC8vIFRPRE86IHJld29yayB0byBpbmxpbmUgZm4gd2l0aCBubyB0eXBlIGNhc3Q/XG4gICAgICB9IGVsc2UgaWYgKGNoIDwgMjU2ICYmIHNpbXBsZUVzY2FwZUNoZWNrW2NoXSkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gc2ltcGxlRXNjYXBlTWFwW2NoXTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIGlmICgodG1wID0gZXNjYXBlZEhleExlbihjaCkpID4gMCkge1xuICAgICAgICBoZXhMZW5ndGggPSB0bXA7XG4gICAgICAgIGhleFJlc3VsdCA9IDA7XG5cbiAgICAgICAgZm9yICg7IGhleExlbmd0aCA+IDA7IGhleExlbmd0aC0tKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCh0bXAgPSBmcm9tSGV4Q29kZShjaCkpID49IDApIHtcbiAgICAgICAgICAgIGhleFJlc3VsdCA9IChoZXhSZXN1bHQgPDwgNCkgKyB0bXA7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIGhleGFkZWNpbWFsIGNoYXJhY3RlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjaGFyRnJvbUNvZGVwb2ludChoZXhSZXN1bHQpO1xuXG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIGVzY2FwZSBzZXF1ZW5jZScpO1xuICAgICAgfVxuXG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIHJlYWROZXh0ID0gdHJ1ZSxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfcmVzdWx0LFxuICAgICAgX2FuY2hvciAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICB0ZXJtaW5hdG9yLFxuICAgICAgaXNQYWlyLFxuICAgICAgaXNFeHBsaWNpdFBhaXIsXG4gICAgICBpc01hcHBpbmcsXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleU5vZGUsXG4gICAgICBrZXlUYWcsXG4gICAgICB2YWx1ZU5vZGUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg1RDsvKiBdICovXG4gICAgaXNNYXBwaW5nID0gZmFsc2U7XG4gICAgX3Jlc3VsdCA9IFtdO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDdCLyogeyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDdEOy8qIH0gKi9cbiAgICBpc01hcHBpbmcgPSB0cnVlO1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gdGVybWluYXRvcikge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgc3RhdGUua2luZCA9IGlzTWFwcGluZyA/ICdtYXBwaW5nJyA6ICdzZXF1ZW5jZSc7XG4gICAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghcmVhZE5leHQpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcycpO1xuICAgIH1cblxuICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gZmFsc2U7XG5cbiAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IHRydWU7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChpc0V4cGxpY2l0UGFpciB8fCBzdGF0ZS5saW5lID09PSBfbGluZSkgJiYgY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBpc1BhaXIgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTWFwcGluZykge1xuICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc1BhaXIpIHtcbiAgICAgIF9yZXN1bHQucHVzaChzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTtcbiAgICB9XG5cbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkMvKiAsICovKSB7XG4gICAgICByZWFkTmV4dCA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWROZXh0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgZm9sZGluZyxcbiAgICAgIGNob21waW5nICAgICAgID0gQ0hPTVBJTkdfQ0xJUCxcbiAgICAgIGRldGVjdGVkSW5kZW50ID0gZmFsc2UsXG4gICAgICB0ZXh0SW5kZW50ICAgICA9IG5vZGVJbmRlbnQsXG4gICAgICBlbXB0eUxpbmVzICAgICA9IDAsXG4gICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlLFxuICAgICAgdG1wLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4N0MvKiB8ICovKSB7XG4gICAgZm9sZGluZyA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDNFLyogPiAqLykge1xuICAgIGZvbGRpbmcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJCLyogKyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGlmIChDSE9NUElOR19DTElQID09PSBjaG9tcGluZykge1xuICAgICAgICBjaG9tcGluZyA9IChjaCA9PT0gMHgyQi8qICsgKi8pID8gQ0hPTVBJTkdfS0VFUCA6IENIT01QSU5HX1NUUklQO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3JlcGVhdCBvZiBhIGNob21waW5nIG1vZGUgaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgodG1wID0gZnJvbURlY2ltYWxDb2RlKGNoKSkgPj0gMCkge1xuICAgICAgaWYgKHRtcCA9PT0gMCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZScpO1xuICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxO1xuICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXInKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKTtcblxuICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICB3aGlsZSAoIWlzX0VPTChjaCkgJiYgKGNoICE9PSAwKSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG4gICAgc3RhdGUubGluZUluZGVudCA9IDA7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpICYmXG4gICAgICAgICAgIChjaCA9PT0gMHgyMC8qIFNwYWNlICovKSkge1xuICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICghZGV0ZWN0ZWRJbmRlbnQgJiYgc3RhdGUubGluZUluZGVudCA+IHRleHRJbmRlbnQpIHtcbiAgICAgIHRleHRJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBlbXB0eUxpbmVzKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBFbmQgb2YgdGhlIHNjYWxhci5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpIHtcblxuICAgICAgLy8gUGVyZm9ybSB0aGUgY2hvbXBpbmcuXG4gICAgICBpZiAoY2hvbXBpbmcgPT09IENIT01QSU5HX0tFRVApIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkge1xuICAgICAgICBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHRoZSBzY2FsYXIgaXMgbm90IGVtcHR5LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayB0aGlzIGB3aGlsZWAgY3ljbGUgYW5kIGdvIHRvIHRoZSBmdW5jaXRvbidzIGVwaWxvZ3VlLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRm9sZGVkIHN0eWxlOiB1c2UgZmFuY3kgcnVsZXMgdG8gaGFuZGxlIGxpbmUgYnJlYWtzLlxuICAgIGlmIChmb2xkaW5nKSB7XG5cbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggd2hpdGUgc3BhY2UgY2hhcmFjdGVycyAobW9yZS1pbmRlbnRlZCBsaW5lcykgYXJlIG5vdCBmb2xkZWQuXG4gICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcblxuICAgICAgLy8gRW5kIG9mIG1vcmUtaW5kZW50ZWQgYmxvY2suXG4gICAgICB9IGVsc2UgaWYgKGF0TW9yZUluZGVudGVkKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG5cbiAgICAgIC8vIEp1c3Qgb25lIGxpbmUgYnJlYWsgLSBwZXJjZWl2ZSBhcyB0aGUgc2FtZSBsaW5lLlxuICAgICAgfSBlbHNlIGlmIChlbXB0eUxpbmVzID09PSAwKSB7XG4gICAgICAgIGlmIChkZXRlY3RlZEluZGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgc29tZSBzY2FsYXIgY29udGVudC5cbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICAgICAgICB9XG5cbiAgICAgIC8vIFNldmVyYWwgbGluZSBicmVha3MgLSBwZXJjZWl2ZSBhcyBkaWZmZXJlbnQgbGluZXMuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9XG5cbiAgICAvLyBMaXRlcmFsIHN0eWxlOiBqdXN0IGFkZCBleGFjdCBudW1iZXIgb2YgbGluZSBicmVha3MgYmV0d2VlbiBjb250ZW50IGxpbmVzLlxuICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgIC8vIElmIGN1cnJlbnQgbGluZSBpc24ndCB0aGUgZmlyc3Qgb25lIC0gY291bnQgbGluZSBicmVhayBmcm9tIHRoZSBsYXN0IGNvbnRlbnQgbGluZS5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIGNhc2Ugb2YgdGhlIGZpcnN0IGNvbnRlbnQgbGluZSAtIGNvdW50IG9ubHkgZW1wdHkgbGluZXMuXG4gICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgfVxuXG4gICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgIGVtcHR5TGluZXMgPSAwO1xuICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBfbGluZSxcbiAgICAgIF90YWcgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICA9IFtdLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgZGV0ZWN0ZWQgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcblxuICAgIGlmIChjaCAhPT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmICghaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPD0gbm9kZUluZGVudCkge1xuICAgICAgICBfcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19JTiwgZmFsc2UsIHRydWUpO1xuICAgIF9yZXN1bHQucHVzaChzdGF0ZS5yZXN1bHQpO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgc2VxdWVuY2UgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdzZXF1ZW5jZSc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIG5vZGVJbmRlbnQsIGZsb3dJbmRlbnQpIHtcbiAgdmFyIGZvbGxvd2luZyxcbiAgICAgIGFsbG93Q29tcGFjdCxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICAgICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgICAgID0ge30sXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleVRhZyAgICAgICAgPSBudWxsLFxuICAgICAga2V5Tm9kZSAgICAgICA9IG51bGwsXG4gICAgICB2YWx1ZU5vZGUgICAgID0gbnVsbCxcbiAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZSxcbiAgICAgIGRldGVjdGVkICAgICAgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7IC8vIFNhdmUgdGhlIGN1cnJlbnQgbGluZS5cblxuICAgIC8vXG4gICAgLy8gRXhwbGljaXQgbm90YXRpb24gY2FzZS4gVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBibG9ja3M6XG4gICAgLy8gZmlyc3QgZm9yIHRoZSBrZXkgKGRlbm90ZWQgYnkgXCI/XCIpIGFuZCBzZWNvbmQgZm9yIHRoZSB2YWx1ZSAoZGVub3RlZCBieSBcIjpcIilcbiAgICAvL1xuICAgIGlmICgoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDNBLyogOiAqLykgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcblxuICAgICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAvLyBpLmUuIDB4M0EvKiA6ICovID09PSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGV4cGxpY2l0IGtleS5cbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaW5jb21wbGV0ZSBleHBsaWNpdCBtYXBwaW5nIHBhaXI7IGEga2V5IG5vZGUgaXMgbWlzc2VkJyk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gICAgICBjaCA9IGZvbGxvd2luZztcblxuICAgIC8vXG4gICAgLy8gSW1wbGljaXQgbm90YXRpb24gY2FzZS4gRmxvdy1zdHlsZSBub2RlIGFzIHRoZSBrZXkgZmlyc3QsIHRoZW4gXCI6XCIsIGFuZCB0aGUgdmFsdWUuXG4gICAgLy9cbiAgICB9IGVsc2UgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfT1VULCBmYWxzZSwgdHJ1ZSkpIHtcblxuICAgICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICBhbGxvd0NvbXBhY3QgPSBmYWxzZTtcbiAgICAgICAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcblxuICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhbiBpbXBsaWNpdCBtYXBwaW5nIHBhaXI7IGEgY29sb24gaXMgbWlzc2VkJyk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleScpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7IC8vIFJlYWRpbmcgaXMgZG9uZS4gR28gdG8gdGhlIGVwaWxvZ3VlLlxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gQ29tbW9uIHJlYWRpbmcgY29kZSBmb3IgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQgbm90YXRpb25zLlxuICAgIC8vXG4gICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSB7XG4gICAgICBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfT1VULCB0cnVlLCBhbGxvd0NvbXBhY3QpKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIG1hcHBpbmcgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvL1xuICAvLyBFcGlsb2d1ZS5cbiAgLy9cblxuICAvLyBTcGVjaWFsIGNhc2U6IGxhc3QgbWFwcGluZydzIG5vZGUgY29udGFpbnMgb25seSB0aGUga2V5IGluIGV4cGxpY2l0IG5vdGF0aW9uLlxuICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgfVxuXG4gIC8vIEV4cG9zZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcuXG4gIGlmIChkZXRlY3RlZCkge1xuICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICBzdGF0ZS5raW5kID0gJ21hcHBpbmcnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgaXNWZXJiYXRpbSA9IGZhbHNlLFxuICAgICAgaXNOYW1lZCAgICA9IGZhbHNlLFxuICAgICAgdGFnSGFuZGxlLFxuICAgICAgdGFnTmFtZSxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIxLyogISAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS50YWcgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYSB0YWcgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4M0MvKiA8ICovKSB7XG4gICAgaXNWZXJiYXRpbSA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgaXNOYW1lZCA9IHRydWU7XG4gICAgdGFnSGFuZGxlID0gJyEhJztcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIHtcbiAgICB0YWdIYW5kbGUgPSAnISc7XG4gIH1cblxuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgd2hpbGUgKGNoICE9PSAwICYmIGNoICE9PSAweDNFLyogPiAqLyk7XG5cbiAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGgpIHtcbiAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgdmVyYmF0aW0gdGFnJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgICAgIGlmICghaXNOYW1lZCkge1xuICAgICAgICAgIHRhZ0hhbmRsZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiAtIDEsIHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KHRhZ0hhbmRsZSkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lZCB0YWcgaGFuZGxlIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVycycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBleGNsYW1hdGlvbiBtYXJrcycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoUEFUVEVSTl9GTE9XX0lORElDQVRPUlMudGVzdCh0YWdOYW1lKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0YWdOYW1lICYmICFQQVRURVJOX1RBR19VUkkudGVzdCh0YWdOYW1lKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgbmFtZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnM6ICcgKyB0YWdOYW1lKTtcbiAgfVxuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgc3RhdGUudGFnID0gdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgdGFnSGFuZGxlKSkge1xuICAgIHN0YXRlLnRhZyA9IHN0YXRlLnRhZ01hcFt0YWdIYW5kbGVdICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEnKSB7XG4gICAgc3RhdGUudGFnID0gJyEnICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEhJykge1xuICAgIHN0YXRlLnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjonICsgdGFnTmFtZTtcblxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmRlY2xhcmVkIHRhZyBoYW5kbGUgXCInICsgdGFnSGFuZGxlICsgJ1wiJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyNi8qICYgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGFuIGFuY2hvciBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYW5jaG9yIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIHN0YXRlLmFuY2hvciA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFsaWFzKHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sIGFsaWFzLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MkEvKiAqICovKSByZXR1cm4gZmFsc2U7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYWxpYXMgbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgYWxpYXMgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoIXN0YXRlLmFuY2hvck1hcC5oYXNPd25Qcm9wZXJ0eShhbGlhcykpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzIFwiJyArIGFsaWFzICsgJ1wiJyk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bHQgPSBzdGF0ZS5hbmNob3JNYXBbYWxpYXNdO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkge1xuICB2YXIgYWxsb3dCbG9ja1N0eWxlcyxcbiAgICAgIGFsbG93QmxvY2tTY2FsYXJzLFxuICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zLFxuICAgICAgaW5kZW50U3RhdHVzID0gMSwgLy8gMTogdGhpcz5wYXJlbnQsIDA6IHRoaXM9cGFyZW50LCAtMTogdGhpczxwYXJlbnRcbiAgICAgIGF0TmV3TGluZSAgPSBmYWxzZSxcbiAgICAgIGhhc0NvbnRlbnQgPSBmYWxzZSxcbiAgICAgIHR5cGVJbmRleCxcbiAgICAgIHR5cGVRdWFudGl0eSxcbiAgICAgIHR5cGUsXG4gICAgICBmbG93SW5kZW50LFxuICAgICAgYmxvY2tJbmRlbnQ7XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ29wZW4nLCBzdGF0ZSk7XG4gIH1cblxuICBzdGF0ZS50YWcgICAgPSBudWxsO1xuICBzdGF0ZS5hbmNob3IgPSBudWxsO1xuICBzdGF0ZS5raW5kICAgPSBudWxsO1xuICBzdGF0ZS5yZXN1bHQgPSBudWxsO1xuXG4gIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9XG4gICAgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0IHx8XG4gICAgQ09OVEVYVF9CTE9DS19JTiAgPT09IG5vZGVDb250ZXh0O1xuXG4gIGlmIChhbGxvd1RvU2Vlaykge1xuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGF0TmV3TGluZSA9IHRydWU7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB8fCByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpKSB7XG4gICAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICAgIGF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7XG5cbiAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7XG4gICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDtcbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxO1xuICAgIH1cblxuICAgIGJsb2NrSW5kZW50ID0gc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQ7XG5cbiAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmXG4gICAgICAgICAgKHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCkgfHxcbiAgICAgICAgICAgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgYmxvY2tJbmRlbnQsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGFsbG93QmxvY2tTY2FsYXJzICYmIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgICByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSB8fFxuICAgICAgICAgICAgcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRBbGlhcyhzdGF0ZSkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkUGxhaW5TY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS50YWcgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmRlbnRTdGF0dXMgPT09IDApIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogYmxvY2sgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIHRvIGhhdmUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyB0aGUgcGFyZW50LlxuICAgICAgLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyNzk5Nzg0XG4gICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICchJykge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICc/Jykge1xuICAgICAgZm9yICh0eXBlSW5kZXggPSAwLCB0eXBlUXVhbnRpdHkgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgdHlwZUluZGV4IDwgdHlwZVF1YW50aXR5O1xuICAgICAgICAgICB0eXBlSW5kZXggKz0gMSkge1xuICAgICAgICB0eXBlID0gc3RhdGUuaW1wbGljaXRUeXBlc1t0eXBlSW5kZXhdO1xuXG4gICAgICAgIC8vIEltcGxpY2l0IHJlc29sdmluZyBpcyBub3QgYWxsb3dlZCBmb3Igbm9uLXNjYWxhciB0eXBlcywgYW5kICc/J1xuICAgICAgICAvLyBub24tc3BlY2lmaWMgdGFnIGlzIG9ubHkgYXNzaWduZWQgdG8gcGxhaW4gc2NhbGFycy4gU28sIGl0IGlzbid0XG4gICAgICAgIC8vIG5lZWRlZCB0byBjaGVjayBmb3IgJ2tpbmQnIGNvbmZvcm1pdHkuXG5cbiAgICAgICAgaWYgKHR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgICAgc3RhdGUudGFnID0gdHlwZS50YWc7XG4gICAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50eXBlTWFwLCBzdGF0ZS50YWcpKSB7XG4gICAgICB0eXBlID0gc3RhdGUudHlwZU1hcFtzdGF0ZS50YWddO1xuXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGUua2luZCAhPT0gc3RhdGUua2luZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwnICsgc3RhdGUudGFnICsgJz4gdGFnOyBpdCBzaG91bGQgYmUgXCInICsgdHlwZS5raW5kICsgJ1wiLCBub3QgXCInICsgc3RhdGUua2luZCArICdcIicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwnICsgc3RhdGUudGFnICsgJz4gZXhwbGljaXQgdGFnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gdGFnICE8JyArIHN0YXRlLnRhZyArICc+Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ2Nsb3NlJywgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZS50YWcgIT09IG51bGwgfHwgIHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50O1xufVxuXG5mdW5jdGlvbiByZWFkRG9jdW1lbnQoc3RhdGUpIHtcbiAgdmFyIGRvY3VtZW50U3RhcnQgPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIF9wb3NpdGlvbixcbiAgICAgIGRpcmVjdGl2ZU5hbWUsXG4gICAgICBkaXJlY3RpdmVBcmdzLFxuICAgICAgaGFzRGlyZWN0aXZlcyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgc3RhdGUudmVyc2lvbiA9IG51bGw7XG4gIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlLmxlZ2FjeTtcbiAgc3RhdGUudGFnTWFwID0ge307XG4gIHN0YXRlLmFuY2hvck1hcCA9IHt9O1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAweDI1LyogJSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZGlyZWN0aXZlTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgIGRpcmVjdGl2ZUFyZ3MgPSBbXTtcblxuICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkgYnJlYWs7XG5cbiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkaXJlY3RpdmVBcmdzLnB1c2goc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7XG4gICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZSwgZGlyZWN0aXZlTmFtZSwgZGlyZWN0aXZlQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlIFwiJyArIGRpcmVjdGl2ZU5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH1cblxuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IDAgJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pICAgICA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKSA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmNoZWNrTGluZUJyZWFrcyAmJlxuICAgICAgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnbm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Jyk7XG4gIH1cblxuICBzdGF0ZS5kb2N1bWVudHMucHVzaChzdGF0ZS5yZXN1bHQpO1xuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcblxuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyRS8qIC4gKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAvLyBBZGQgdGFpbGluZyBgXFxuYCBpZiBub3QgZXhpc3RzXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEEvKiBMRiAqLyAmJlxuICAgICAgICBpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBELyogQ1IgKi8pIHtcbiAgICAgIGlucHV0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFN0cmlwIEJPTVxuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTtcblxuICAvLyBVc2UgMCBhcyBzdHJpbmcgdGVybWluYXRvci4gVGhhdCBzaWduaWZpY2FudGx5IHNpbXBsaWZpZXMgYm91bmRzIGNoZWNrLlxuICBzdGF0ZS5pbnB1dCArPSAnXFwwJztcblxuICB3aGlsZSAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgcmVhZERvY3VtZW50KHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7XG59XG5cblxuZnVuY3Rpb24gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpLCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkb2N1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGl0ZXJhdG9yKGRvY3VtZW50c1tpbmRleF0pO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZChpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyk7XG5cbiAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50c1swXTtcbiAgfVxuICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignZXhwZWN0ZWQgYSBzaW5nbGUgZG9jdW1lbnQgaW4gdGhlIHN0cmVhbSwgYnV0IGZvdW5kIG1vcmUnKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgb3V0cHV0LCBvcHRpb25zKSB7XG4gIGxvYWRBbGwoaW5wdXQsIG91dHB1dCwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxvYWQoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgID0gbG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgID0gbG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsID0gc2FmZUxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICA9IHNhZmVMb2FkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbmZ1bmN0aW9uIE1hcmsobmFtZSwgYnVmZmVyLCBwb3NpdGlvbiwgbGluZSwgY29sdW1uKSB7XG4gIHRoaXMubmFtZSAgICAgPSBuYW1lO1xuICB0aGlzLmJ1ZmZlciAgID0gYnVmZmVyO1xuICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIHRoaXMubGluZSAgICAgPSBsaW5lO1xuICB0aGlzLmNvbHVtbiAgID0gY29sdW1uO1xufVxuXG5cbk1hcmsucHJvdG90eXBlLmdldFNuaXBwZXQgPSBmdW5jdGlvbiBnZXRTbmlwcGV0KGluZGVudCwgbWF4TGVuZ3RoKSB7XG4gIHZhciBoZWFkLCBzdGFydCwgdGFpbCwgZW5kLCBzbmlwcGV0O1xuXG4gIGlmICghdGhpcy5idWZmZXIpIHJldHVybiBudWxsO1xuXG4gIGluZGVudCA9IGluZGVudCB8fCA0O1xuICBtYXhMZW5ndGggPSBtYXhMZW5ndGggfHwgNzU7XG5cbiAgaGVhZCA9ICcnO1xuICBzdGFydCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKHN0YXJ0ID4gMCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHtcbiAgICBzdGFydCAtPSAxO1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICBoZWFkID0gJyAuLi4gJztcbiAgICAgIHN0YXJ0ICs9IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0YWlsID0gJyc7XG4gIGVuZCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKGVuZCA8IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChlbmQpKSA9PT0gLTEpIHtcbiAgICBlbmQgKz0gMTtcbiAgICBpZiAoZW5kIC0gdGhpcy5wb3NpdGlvbiA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIHRhaWwgPSAnIC4uLiAnO1xuICAgICAgZW5kIC09IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzbmlwcGV0ID0gdGhpcy5idWZmZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgcmV0dXJuIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQpICsgaGVhZCArIHNuaXBwZXQgKyB0YWlsICsgJ1xcbicgK1xuICAgICAgICAgY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCArIHRoaXMucG9zaXRpb24gLSBzdGFydCArIGhlYWQubGVuZ3RoKSArICdeJztcbn07XG5cblxuTWFyay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciBzbmlwcGV0LCB3aGVyZSA9ICcnO1xuXG4gIGlmICh0aGlzLm5hbWUpIHtcbiAgICB3aGVyZSArPSAnaW4gXCInICsgdGhpcy5uYW1lICsgJ1wiICc7XG4gIH1cblxuICB3aGVyZSArPSAnYXQgbGluZSAnICsgKHRoaXMubGluZSArIDEpICsgJywgY29sdW1uICcgKyAodGhpcy5jb2x1bW4gKyAxKTtcblxuICBpZiAoIWNvbXBhY3QpIHtcbiAgICBzbmlwcGV0ID0gdGhpcy5nZXRTbmlwcGV0KCk7XG5cbiAgICBpZiAoc25pcHBldCkge1xuICAgICAgd2hlcmUgKz0gJzpcXG4nICsgc25pcHBldDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2hlcmU7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWFyaztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBtYXgtbGVuKi9cblxudmFyIGNvbW1vbiAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIFR5cGUgICAgICAgICAgPSByZXF1aXJlKCcuL3R5cGUnKTtcblxuXG5mdW5jdGlvbiBjb21waWxlTGlzdChzY2hlbWEsIG5hbWUsIHJlc3VsdCkge1xuICB2YXIgZXhjbHVkZSA9IFtdO1xuXG4gIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24gKGluY2x1ZGVkU2NoZW1hKSB7XG4gICAgcmVzdWx0ID0gY29tcGlsZUxpc3QoaW5jbHVkZWRTY2hlbWEsIG5hbWUsIHJlc3VsdCk7XG4gIH0pO1xuXG4gIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50VHlwZSkge1xuICAgIHJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChwcmV2aW91c1R5cGUsIHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChwcmV2aW91c1R5cGUudGFnID09PSBjdXJyZW50VHlwZS50YWcpIHtcbiAgICAgICAgZXhjbHVkZS5wdXNoKHByZXZpb3VzSW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnB1c2goY3VycmVudFR5cGUpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAodHlwZSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZXhjbHVkZS5pbmRleE9mKGluZGV4KSA9PT0gLTE7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGNvbXBpbGVNYXAoLyogbGlzdHMuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9LCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RUeXBlKHR5cGUpIHtcbiAgICByZXN1bHRbdHlwZS50YWddID0gdHlwZTtcbiAgfVxuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGFyZ3VtZW50c1tpbmRleF0uZm9yRWFjaChjb2xsZWN0VHlwZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIFNjaGVtYShkZWZpbml0aW9uKSB7XG4gIHRoaXMuaW5jbHVkZSAgPSBkZWZpbml0aW9uLmluY2x1ZGUgIHx8IFtdO1xuICB0aGlzLmltcGxpY2l0ID0gZGVmaW5pdGlvbi5pbXBsaWNpdCB8fCBbXTtcbiAgdGhpcy5leHBsaWNpdCA9IGRlZmluaXRpb24uZXhwbGljaXQgfHwgW107XG5cbiAgdGhpcy5pbXBsaWNpdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHR5cGUubG9hZEtpbmQgJiYgdHlwZS5sb2FkS2luZCAhPT0gJ3NjYWxhcicpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuY29tcGlsZWRJbXBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdpbXBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZEV4cGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2V4cGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkVHlwZU1hcCAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTtcbn1cblxuXG5TY2hlbWEuREVGQVVMVCA9IG51bGw7XG5cblxuU2NoZW1hLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHtcbiAgdmFyIHNjaGVtYXMsIHR5cGVzO1xuXG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHNjaGVtYXMgPSBTY2hlbWEuREVGQVVMVDtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzBdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgU2NoZW1hLmNyZWF0ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgc2NoZW1hcyA9IGNvbW1vbi50b0FycmF5KHNjaGVtYXMpO1xuICB0eXBlcyA9IGNvbW1vbi50b0FycmF5KHR5cGVzKTtcblxuICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24gKHNjaGVtYSkgeyByZXR1cm4gc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBzdXBlciBzY2hlbWFzIChvciBhIHNpbmdsZSBTY2hlbWEgb2JqZWN0KSBjb250YWlucyBhIG5vbi1TY2hlbWEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGU7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4nKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2NoZW1hKHtcbiAgICBpbmNsdWRlOiBzY2hlbWFzLFxuICAgIGV4cGxpY2l0OiB0eXBlc1xuICB9KTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWE7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCBDb3JlIHNjaGVtYSBoYXMgbm8gZGlzdGluY3Rpb25zIGZyb20gSlNPTiBzY2hlbWEgaXMgSlMtWUFNTC5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2pzb24nKVxuICBdXG59KTtcbiIsIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYGxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIEpTLVlBTUwncyBkZWZhdWx0IHNhZmUgc2NoZW1hIGFuZCBpbmNsdWRlc1xuLy8gSmF2YVNjcmlwdC1zcGVjaWZpYyB0eXBlczogISFqcy91bmRlZmluZWQsICEhanMvcmVnZXhwIGFuZCAhIWpzL2Z1bmN0aW9uLlxuLy9cbi8vIEFsc28gdGhpcyBzY2hlbWEgaXMgdXNlZCBhcyBkZWZhdWx0IGJhc2Ugc2NoZW1hIGF0IGBTY2hlbWEuY3JlYXRlYCBmdW5jdGlvbi5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZW1hLkRFRkFVTFQgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vZGVmYXVsdF9zYWZlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3VuZGVmaW5lZCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvcmVnZXhwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9mdW5jdGlvbicpXG4gIF1cbn0pO1xuIiwiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgc2FmZUxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIHN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYSBhbmQgaW5jbHVkZXMgbW9zdCBvZlxuLy8gZXh0cmEgdHlwZXMgZGVzY3JpYmVkIGF0IFlBTUwgdGFnIHJlcG9zaXRvcnkuIChodHRwOi8veWFtbC5vcmcvdHlwZS8pXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9jb3JlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3RpbWVzdGFtcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWVyZ2UnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvYmluYXJ5JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9vbWFwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9wYWlycycpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2V0JylcbiAgXVxufSk7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgRmFpbHNhZmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAyMzQ2XG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvc3RyJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXEnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21hcCcpXG4gIF1cbn0pO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIEpTT04gc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAzMjMxXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgdGhpcyBzY2hlbWEgaXMgbm90IHN1Y2ggc3RyaWN0IGFzIGRlZmluZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vIEl0IGFsbG93cyBudW1iZXJzIGluIGJpbmFyeSBub3RhaW9uLCB1c2UgYE51bGxgIGFuZCBgTlVMTGAgYXMgYG51bGxgLCBldGMuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9mYWlsc2FmZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9udWxsJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9ib29sJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9pbnQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Zsb2F0JylcbiAgXVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUyA9IFtcbiAgJ2tpbmQnLFxuICAncmVzb2x2ZScsXG4gICdjb25zdHJ1Y3QnLFxuICAnaW5zdGFuY2VPZicsXG4gICdwcmVkaWNhdGUnLFxuICAncmVwcmVzZW50JyxcbiAgJ2RlZmF1bHRTdHlsZScsXG4gICdzdHlsZUFsaWFzZXMnXG5dO1xuXG52YXIgWUFNTF9OT0RFX0tJTkRTID0gW1xuICAnc2NhbGFyJyxcbiAgJ3NlcXVlbmNlJyxcbiAgJ21hcHBpbmcnXG5dO1xuXG5mdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKG1hcCkge1xuICB2YXIgcmVzdWx0ID0ge307XG5cbiAgaWYgKG1hcCAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIG1hcFtzdHlsZV0uZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgcmVzdWx0W1N0cmluZyhhbGlhcyldID0gc3R5bGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIFR5cGUodGFnLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBvcHRpb24gXCInICsgbmFtZSArICdcIiBpcyBtZXQgaW4gZGVmaW5pdGlvbiBvZiBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVE9ETzogQWRkIHRhZyBmb3JtYXQgY2hlY2suXG4gIHRoaXMudGFnICAgICAgICAgID0gdGFnO1xuICB0aGlzLmtpbmQgICAgICAgICA9IG9wdGlvbnNbJ2tpbmQnXSAgICAgICAgIHx8IG51bGw7XG4gIHRoaXMucmVzb2x2ZSAgICAgID0gb3B0aW9uc1sncmVzb2x2ZSddICAgICAgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgdGhpcy5jb25zdHJ1Y3QgICAgPSBvcHRpb25zWydjb25zdHJ1Y3QnXSAgICB8fCBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YTsgfTtcbiAgdGhpcy5pbnN0YW5jZU9mICAgPSBvcHRpb25zWydpbnN0YW5jZU9mJ10gICB8fCBudWxsO1xuICB0aGlzLnByZWRpY2F0ZSAgICA9IG9wdGlvbnNbJ3ByZWRpY2F0ZSddICAgIHx8IG51bGw7XG4gIHRoaXMucmVwcmVzZW50ICAgID0gb3B0aW9uc1sncmVwcmVzZW50J10gICAgfHwgbnVsbDtcbiAgdGhpcy5kZWZhdWx0U3R5bGUgPSBvcHRpb25zWydkZWZhdWx0U3R5bGUnXSB8fCBudWxsO1xuICB0aGlzLnN0eWxlQWxpYXNlcyA9IGNvbXBpbGVTdHlsZUFsaWFzZXMob3B0aW9uc1snc3R5bGVBbGlhc2VzJ10gfHwgbnVsbCk7XG5cbiAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCBcIicgKyB0aGlzLmtpbmQgKyAnXCIgaXMgc3BlY2lmaWVkIGZvciBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVHlwZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cblxuLy8gQSB0cmljayBmb3IgYnJvd3NlcmlmaWVkIHZlcnNpb24uXG4vLyBTaW5jZSB3ZSBtYWtlIGJyb3dzZXJpZmllciB0byBpZ25vcmUgYGJ1ZmZlcmAgbW9kdWxlLCBOb2RlQnVmZmVyIHdpbGwgYmUgdW5kZWZpbmVkXG52YXIgTm9kZUJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBUeXBlICAgICAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5cbi8vIFsgNjQsIDY1LCA2NiBdIC0+IFsgcGFkZGluZywgQ1IsIExGIF1cbnZhciBCQVNFNjRfTUFQID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XFxuXFxyJztcblxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJpbmFyeShkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGNvZGUsIGlkeCwgYml0bGVuID0gMCwgbWF4ID0gZGF0YS5sZW5ndGgsIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBvbmUgYnkgb25lLlxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBjb2RlID0gbWFwLmluZGV4T2YoZGF0YS5jaGFyQXQoaWR4KSk7XG5cbiAgICAvLyBTa2lwIENSL0xGXG4gICAgaWYgKGNvZGUgPiA2NCkgY29udGludWU7XG5cbiAgICAvLyBGYWlsIG9uIGlsbGVnYWwgY2hhcmFjdGVyc1xuICAgIGlmIChjb2RlIDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYml0bGVuICs9IDY7XG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgYW55IGJpdHMgbGVmdCwgc291cmNlIHdhcyBjb3JydXB0ZWRcbiAgcmV0dXJuIChiaXRsZW4gJSA4KSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7XG4gIHZhciBpZHgsIHRhaWxiaXRzLFxuICAgICAgaW5wdXQgPSBkYXRhLnJlcGxhY2UoL1tcXHJcXG49XS9nLCAnJyksIC8vIHJlbW92ZSBDUi9MRiAmIHBhZGRpbmcgdG8gc2ltcGxpZnkgc2NhblxuICAgICAgbWF4ID0gaW5wdXQubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUCxcbiAgICAgIGJpdHMgPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgLy8gQ29sbGVjdCBieSA2KjQgYml0cyAoMyBieXRlcylcblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDQgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA2KSB8IG1hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWxiaXRzID0gKG1heCAlIDQpICogNjtcblxuICBpZiAodGFpbGJpdHMgPT09IDApIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxMCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAyKSAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDQpICYgMHhGRik7XG4gIH1cblxuICAvLyBXcmFwIGludG8gQnVmZmVyIGZvciBOb2RlSlMgYW5kIGxlYXZlIEFycmF5IGZvciBicm93c2VyXG4gIGlmIChOb2RlQnVmZmVyKSByZXR1cm4gbmV3IE5vZGVCdWZmZXIocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJycsIGJpdHMgPSAwLCBpZHgsIHRhaWwsXG4gICAgICBtYXggPSBvYmplY3QubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IGV2ZXJ5IHRocmVlIGJ5dGVzIHRvIDQgQVNDSUkgY2hhcmFjdGVycy5cblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDMgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgOCkgKyBvYmplY3RbaWR4XTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWwgPSBtYXggJSAzO1xuXG4gIGlmICh0YWlsID09PSAwKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAyKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDEpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNCaW5hcnkob2JqZWN0KSB7XG4gIHJldHVybiBOb2RlQnVmZmVyICYmIE5vZGVCdWZmZXIuaXNCdWZmZXIob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCaW5hcnksXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJpbmFyeSxcbiAgcHJlZGljYXRlOiBpc0JpbmFyeSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sQmluYXJ5XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sQm9vbGVhbihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSA0ICYmIChkYXRhID09PSAndHJ1ZScgfHwgZGF0YSA9PT0gJ1RydWUnIHx8IGRhdGEgPT09ICdUUlVFJykpIHx8XG4gICAgICAgICAobWF4ID09PSA1ICYmIChkYXRhID09PSAnZmFsc2UnIHx8IGRhdGEgPT09ICdGYWxzZScgfHwgZGF0YSA9PT0gJ0ZBTFNFJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihkYXRhKSB7XG4gIHJldHVybiBkYXRhID09PSAndHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUcnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RSVUUnO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpib29sJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCb29sZWFuLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCb29sZWFuLFxuICBwcmVkaWNhdGU6IGlzQm9vbGVhbixcbiAgcmVwcmVzZW50OiB7XG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAndHJ1ZScgOiAnZmFsc2UnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RSVUUnIDogJ0ZBTFNFJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUcnVlJyA6ICdGYWxzZSc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX0ZMT0FUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAnXig/OlstK10/KD86WzAtOV1bMC05X10qKVxcXFwuWzAtOV9dKig/OltlRV1bLStdWzAtOV0rKT8nICtcbiAgJ3xcXFxcLlswLTlfXSsoPzpbZUVdWy0rXVswLTldKyk/JyArXG4gICd8Wy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1xcXFwuWzAtOV9dKicgK1xuICAnfFstK10/XFxcXC4oPzppbmZ8SW5mfElORiknICtcbiAgJ3xcXFxcLig/Om5hbnxOYU58TkFOKSkkJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICghWUFNTF9GTE9BVF9QQVRURVJOLnRlc3QoZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHtcbiAgdmFyIHZhbHVlLCBzaWduLCBiYXNlLCBkaWdpdHM7XG5cbiAgdmFsdWUgID0gZGF0YS5yZXBsYWNlKC9fL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICBzaWduICAgPSB2YWx1ZVswXSA9PT0gJy0nID8gLTEgOiAxO1xuICBkaWdpdHMgPSBbXTtcblxuICBpZiAoJystJy5pbmRleE9mKHZhbHVlWzBdKSA+PSAwKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJy5pbmYnKSB7XG4gICAgcmV0dXJuIChzaWduID09PSAxKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICB9IGVsc2UgaWYgKHZhbHVlID09PSAnLm5hbicpIHtcbiAgICByZXR1cm4gTmFOO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignOicpID49IDApIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlRmxvYXQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMC4wO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IGQgKiBiYXNlO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuICByZXR1cm4gc2lnbiAqIHBhcnNlRmxvYXQodmFsdWUsIDEwKTtcbn1cblxuXG52YXIgU0NJRU5USUZJQ19XSVRIT1VUX0RPVCA9IC9eWy0rXT9bMC05XStlLztcblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHtcbiAgdmFyIHJlcztcblxuICBpZiAoaXNOYU4ob2JqZWN0KSkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLm5hbic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5OQU4nO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuTmFOJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICctLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy0uSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLS5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSkge1xuICAgIHJldHVybiAnLTAuMCc7XG4gIH1cblxuICByZXMgPSBvYmplY3QudG9TdHJpbmcoMTApO1xuXG4gIC8vIEpTIHN0cmluZ2lmaWVyIGNhbiBidWlsZCBzY2llbnRpZmljIGZvcm1hdCB3aXRob3V0IGRvdHM6IDVlLTEwMCxcbiAgLy8gd2hpbGUgWUFNTCByZXF1cmVzIGRvdDogNS5lLTEwMC4gRml4IGl0IHdpdGggc2ltcGxlIGhhY2tcblxuICByZXR1cm4gU0NJRU5USUZJQ19XSVRIT1VUX0RPVC50ZXN0KHJlcykgPyByZXMucmVwbGFjZSgnZScsICcuZScpIDogcmVzO1xufVxuXG5mdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBOdW1iZXJdJykgJiZcbiAgICAgICAgIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCxcbiAgcHJlZGljYXRlOiBpc0Zsb2F0LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIGlzSGV4Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkgfHxcbiAgICAgICAgICgoMHg0MS8qIEEgKi8gPD0gYykgJiYgKGMgPD0gMHg0Ni8qIEYgKi8pKSB8fFxuICAgICAgICAgKCgweDYxLyogYSAqLyA8PSBjKSAmJiAoYyA8PSAweDY2LyogZiAqLykpO1xufVxuXG5mdW5jdGlvbiBpc09jdENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM3LyogNyAqLykpO1xufVxuXG5mdW5jdGlvbiBpc0RlY0NvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIGhhc0RpZ2l0cyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcblxuICBjaCA9IGRhdGFbaW5kZXhdO1xuXG4gIC8vIHNpZ25cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgLy8gMFxuICAgIGlmIChpbmRleCArIDEgPT09IG1heCkgcmV0dXJuIHRydWU7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuXG4gICAgLy8gYmFzZSAyLCBiYXNlIDgsIGJhc2UgMTZcblxuICAgIGlmIChjaCA9PT0gJ2InKSB7XG4gICAgICAvLyBiYXNlIDJcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmIChjaCAhPT0gJzAnICYmIGNoICE9PSAnMScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG5cbiAgICBpZiAoY2ggPT09ICd4Jykge1xuICAgICAgLy8gYmFzZSAxNlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpc0hleENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG4gICAgLy8gYmFzZSA4XG4gICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc09jdENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNEaWdpdHM7XG4gIH1cblxuICAvLyBiYXNlIDEwIChleGNlcHQgMCkgb3IgYmFzZSA2MFxuXG4gIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgIGlmIChjaCA9PT0gJzonKSBicmVhaztcbiAgICBpZiAoIWlzRGVjQ29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFoYXNEaWdpdHMpIHJldHVybiBmYWxzZTtcblxuICAvLyBpZiAhYmFzZTYwIC0gZG9uZTtcbiAgaWYgKGNoICE9PSAnOicpIHJldHVybiB0cnVlO1xuXG4gIC8vIGJhc2U2MCBhbG1vc3Qgbm90IHVzZWQsIG5vIG5lZWRzIHRvIG9wdGltaXplXG4gIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleCkpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJ18nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL18vZywgJycpO1xuICB9XG5cbiAgY2ggPSB2YWx1ZVswXTtcblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgaWYgKGNoID09PSAnLScpIHNpZ24gPSAtMTtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgIGNoID0gdmFsdWVbMF07XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIDA7XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICBpZiAodmFsdWVbMV0gPT09ICdiJykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgMik7XG4gICAgaWYgKHZhbHVlWzFdID09PSAneCcpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDE2KTtcbiAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCA4KTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IChkICogYmFzZSk7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG5cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5mdW5jdGlvbiBpc0ludGVnZXIob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgPT09IDAgJiYgIWNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6aW50Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLFxuICBwcmVkaWNhdGU6IGlzSW50ZWdlcixcbiAgcmVwcmVzZW50OiB7XG4gICAgYmluYXJ5OiAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwYicgKyBvYmplY3QudG9TdHJpbmcoMik7IH0sXG4gICAgb2N0YWw6ICAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwJyAgKyBvYmplY3QudG9TdHJpbmcoOCk7IH0sXG4gICAgZGVjaW1hbDogICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICAgICAgICBvYmplY3QudG9TdHJpbmcoMTApOyB9LFxuICAgIGhleGFkZWNpbWFsOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMHgnICsgb2JqZWN0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2RlY2ltYWwnLFxuICBzdHlsZUFsaWFzZXM6IHtcbiAgICBiaW5hcnk6ICAgICAgWyAyLCAgJ2JpbicgXSxcbiAgICBvY3RhbDogICAgICAgWyA4LCAgJ29jdCcgXSxcbiAgICBkZWNpbWFsOiAgICAgWyAxMCwgJ2RlYycgXSxcbiAgICBoZXhhZGVjaW1hbDogWyAxNiwgJ2hleCcgXVxuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVzcHJpbWE7XG5cbi8vIEJyb3dzZXJpZmllZCB2ZXJzaW9uIGRvZXMgbm90IGhhdmUgZXNwcmltYVxuLy9cbi8vIDEuIEZvciBub2RlLmpzIGp1c3QgcmVxdWlyZSBtb2R1bGUgYXMgZGVwc1xuLy8gMi4gRm9yIGJyb3dzZXIgdHJ5IHRvIHJlcXVpcmUgbXVkdWxlIHZpYSBleHRlcm5hbCBBTUQgc3lzdGVtLlxuLy8gICAgSWYgbm90IGZvdW5kIC0gdHJ5IHRvIGZhbGxiYWNrIHRvIHdpbmRvdy5lc3ByaW1hLiBJZiBub3Rcbi8vICAgIGZvdW5kIHRvbyAtIHRoZW4gZmFpbCB0byBwYXJzZS5cbi8vXG50cnkge1xuICAvLyB3b3JrYXJvdW5kIHRvIGV4Y2x1ZGUgcGFja2FnZSBmcm9tIGJyb3dzZXJpZnkgbGlzdC5cbiAgdmFyIF9yZXF1aXJlID0gcmVxdWlyZTtcbiAgZXNwcmltYSA9IF9yZXF1aXJlKCdlc3ByaW1hJyk7XG59IGNhdGNoIChfKSB7XG4gIC8qZ2xvYmFsIHdpbmRvdyAqL1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIGVzcHJpbWEgPSB3aW5kb3cuZXNwcmltYTtcbn1cblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pO1xuXG4gICAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIC8qanNsaW50IGV2aWw6dHJ1ZSovXG5cbiAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSxcbiAgICAgIHBhcmFtcyA9IFtdLFxuICAgICAgYm9keTtcblxuICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgcGFyYW1zLnB1c2gocGFyYW0ubmFtZSk7XG4gIH0pO1xuXG4gIGJvZHkgPSBhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkucmFuZ2U7XG5cbiAgLy8gRXNwcmltYSdzIHJhbmdlcyBpbmNsdWRlIHRoZSBmaXJzdCAneycgYW5kIHRoZSBsYXN0ICd9JyBjaGFyYWN0ZXJzIG9uXG4gIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zLiBTbyBjdXQgdGhlbSBvdXQuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgc291cmNlLnNsaWNlKGJvZHlbMF0gKyAxLCBib2R5WzFdIC0gMSkpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb24ob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9mdW5jdGlvbicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBwcmVkaWNhdGU6IGlzRnVuY3Rpb24sXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gaWYgcmVnZXhwIHN0YXJ0cyB3aXRoICcvJyBpdCBjYW4gaGF2ZSBtb2RpZmllcnMgYW5kIG11c3QgYmUgcHJvcGVybHkgY2xvc2VkXG4gIC8vIGAvZm9vL2dpbWAgLSBtb2RpZmllcnMgdGFpbCBjYW4gYmUgbWF4aW11bSAzIGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuXG4gICAgaWYgKG1vZGlmaWVycy5sZW5ndGggPiAzKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gaWYgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAvLCBpcyBzaG91bGQgYmUgcHJvcGVybHkgdGVybWluYXRlZFxuICAgIGlmIChyZWdleHBbcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxXSAhPT0gJy8nKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGAvZm9vL2dpbWAgLSB0YWlsIGNhbiBiZSBtYXhpbXVtIDQgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG4gICAgcmVnZXhwID0gcmVnZXhwLnNsaWNlKDEsIHJlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnLycgKyBvYmplY3Quc291cmNlICsgJy8nO1xuXG4gIGlmIChvYmplY3QuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAob2JqZWN0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKG9iamVjdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9yZWdleHAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwLFxuICBwcmVkaWNhdGU6IGlzUmVnRXhwLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTWVyZ2UoZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJzw8JyB8fCBkYXRhID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTWVyZ2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxOdWxsKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gMSAmJiBkYXRhID09PSAnficpIHx8XG4gICAgICAgICAobWF4ID09PSA0ICYmIChkYXRhID09PSAnbnVsbCcgfHwgZGF0YSA9PT0gJ051bGwnIHx8IGRhdGEgPT09ICdOVUxMJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbChvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCxcbiAgcHJlZGljYXRlOiBpc051bGwsXG4gIHJlcHJlc2VudDoge1xuICAgIGNhbm9uaWNhbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ34nOyAgICB9LFxuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ251bGwnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ05VTEwnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ051bGwnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX3RvU3RyaW5nICAgICAgID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxPbWFwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBvYmplY3RLZXlzID0gW10sIGluZGV4LCBsZW5ndGgsIHBhaXIsIHBhaXJLZXksIHBhaXJIYXNLZXksXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuICAgIHBhaXJIYXNLZXkgPSBmYWxzZTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAocGFpcktleSBpbiBwYWlyKSB7XG4gICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwocGFpciwgcGFpcktleSkpIHtcbiAgICAgICAgaWYgKCFwYWlySGFzS2V5KSBwYWlySGFzS2V5ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwYWlySGFzS2V5KSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAob2JqZWN0S2V5cy5pbmRleE9mKHBhaXJLZXkpID09PSAtMSkgb2JqZWN0S2V5cy5wdXNoKHBhaXJLZXkpO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxPbWFwKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sT21hcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sT21hcFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlyc1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBrZXksIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgaWYgKG9iamVjdFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2V0Jywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c3RyJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAnJzsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9USU1FU1RBTVBfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ14oWzAtOV1bMC05XVswLTldWzAtOV0pJyAgICAgICAgICArIC8vIFsxXSB5ZWFyXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbMl0gbW9udGhcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFszXSBkYXlcbiAgJyg/Oig/OltUdF18WyBcXFxcdF0rKScgICAgICAgICAgICAgICsgLy8gLi4uXG4gICcoWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNF0gaG91clxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzVdIG1pbnV0ZVxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzZdIHNlY29uZFxuICAnKD86XFxcXC4oWzAtOV0qKSk/JyAgICAgICAgICAgICAgICAgKyAvLyBbN10gZnJhY3Rpb25cbiAgJyg/OlsgXFxcXHRdKihafChbLStdKShbMC05XVswLTldPyknICsgLy8gWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91clxuICAnKD86OihbMC05XVswLTldKSk/KSk/KT8kJyk7ICAgICAgICAgLy8gWzExXSB0el9taW51dGVcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSkgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICB2YXIgbWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiA9IDAsXG4gICAgICBkZWx0YSA9IG51bGwsIHR6X2hvdXIsIHR6X21pbnV0ZSwgZGF0ZTtcblxuICBtYXRjaCA9IFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpO1xuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdEYXRlIHJlc29sdmUgZXJyb3InKTtcblxuICAvLyBtYXRjaDogWzFdIHllYXIgWzJdIG1vbnRoIFszXSBkYXlcblxuICB5ZWFyID0gKyhtYXRjaFsxXSk7XG4gIG1vbnRoID0gKyhtYXRjaFsyXSkgLSAxOyAvLyBKUyBtb250aCBzdGFydHMgd2l0aCAwXG4gIGRheSA9ICsobWF0Y2hbM10pO1xuXG4gIGlmICghbWF0Y2hbNF0pIHsgLy8gbm8gaG91clxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5KSk7XG4gIH1cblxuICAvLyBtYXRjaDogWzRdIGhvdXIgWzVdIG1pbnV0ZSBbNl0gc2Vjb25kIFs3XSBmcmFjdGlvblxuXG4gIGhvdXIgPSArKG1hdGNoWzRdKTtcbiAgbWludXRlID0gKyhtYXRjaFs1XSk7XG4gIHNlY29uZCA9ICsobWF0Y2hbNl0pO1xuXG4gIGlmIChtYXRjaFs3XSkge1xuICAgIGZyYWN0aW9uID0gbWF0Y2hbN10uc2xpY2UoMCwgMyk7XG4gICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IDMpIHsgLy8gbWlsbGktc2Vjb25kc1xuICAgICAgZnJhY3Rpb24gKz0gJzAnO1xuICAgIH1cbiAgICBmcmFjdGlvbiA9ICtmcmFjdGlvbjtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyIFsxMV0gdHpfbWludXRlXG5cbiAgaWYgKG1hdGNoWzldKSB7XG4gICAgdHpfaG91ciA9ICsobWF0Y2hbMTBdKTtcbiAgICB0el9taW51dGUgPSArKG1hdGNoWzExXSB8fCAwKTtcbiAgICBkZWx0YSA9ICh0el9ob3VyICogNjAgKyB0el9taW51dGUpICogNjAwMDA7IC8vIGRlbHRhIGluIG1pbGktc2Vjb25kc1xuICAgIGlmIChtYXRjaFs5XSA9PT0gJy0nKSBkZWx0YSA9IC1kZWx0YTtcbiAgfVxuXG4gIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24pKTtcblxuICBpZiAoZGVsdGEpIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSAtIGRlbHRhKTtcblxuICByZXR1cm4gZGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLFxuICBpbnN0YW5jZU9mOiBEYXRlLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vIHByaXZhdGUgcHJvcGVydHlcbnZhciBfa2V5U3RyID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGVuY29kaW5nXG4vLyBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4vLyAgICAgdmFyIG91dHB1dCA9IFtdO1xuLy8gICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzLCBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuLy8gICAgIHZhciBpID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoLCByZW1haW5pbmdCeXRlcyA9IGxlbjtcblxuLy8gICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gXCJzdHJpbmdcIjtcbi8vICAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuLy8gICAgICAgICByZW1haW5pbmdCeXRlcyA9IGxlbiAtIGk7XG5cbi8vICAgICAgICAgaWYgKCFpc0FycmF5KSB7XG4vLyAgICAgICAgICAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuLy8gICAgICAgICAgICAgY2hyMiA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgY2hyMSA9IGlucHV0W2krK107XG4vLyAgICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dFtpKytdIDogMDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGVuYzEgPSBjaHIxID4+IDI7XG4vLyAgICAgICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuLy8gICAgICAgICBlbmMzID0gcmVtYWluaW5nQnl0ZXMgPiAxID8gKCgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpKSA6IDY0O1xuLy8gICAgICAgICBlbmM0ID0gcmVtYWluaW5nQnl0ZXMgPiAyID8gKGNocjMgJiA2MykgOiA2NDtcblxuLy8gICAgICAgICBvdXRwdXQucHVzaChfa2V5U3RyLmNoYXJBdChlbmMxKSArIF9rZXlTdHIuY2hhckF0KGVuYzIpICsgX2tleVN0ci5jaGFyQXQoZW5jMykgKyBfa2V5U3RyLmNoYXJBdChlbmM0KSk7XG5cbi8vICAgICB9XG5cbi8vICAgICByZXR1cm4gb3V0cHV0LmpvaW4oXCJcIik7XG4vLyB9O1xuXG4vLyBwdWJsaWMgbWV0aG9kIGZvciBkZWNvZGluZ1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzO1xuICAgIHZhciBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuICAgIHZhciBpID0gMCwgcmVzdWx0SW5kZXggPSAwO1xuXG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgXCJcIik7XG5cbiAgICB2YXIgdG90YWxMZW5ndGggPSBpbnB1dC5sZW5ndGggKiAzIC8gNDtcbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMSkgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMikgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICB2YXIgb3V0cHV0O1xuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IG5ldyBBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICBlbmMxID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMiA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzMgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmM0ID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgICBjaHIxID0gKGVuYzEgPDwgMikgfCAoZW5jMiA+PiA0KTtcbiAgICAgICAgY2hyMiA9ICgoZW5jMiAmIDE1KSA8PCA0KSB8IChlbmMzID4+IDIpO1xuICAgICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjE7XG5cbiAgICAgICAgaWYgKGVuYzMgIT09IDY0KSB7XG4gICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmM0ICE9PSA2NCkge1xuICAgICAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMztcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgRGF0YUxlbmd0aFByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlJyk7XG52YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTtcbnZhciBEYXRhTGVuZ3RoUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUnKTtcblxuLyoqXG4gKiBSZXByZXNlbnQgYSBjb21wcmVzc2VkIG9iamVjdCwgd2l0aCBldmVyeXRoaW5nIG5lZWRlZCB0byBkZWNvbXByZXNzIGl0LlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge251bWJlcn0gY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29tcHJlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB1bmNvbXByZXNzZWRTaXplIHRoZSBzaXplIG9mIHRoZSBkYXRhIGFmdGVyIGRlY29tcHJlc3Npb24uXG4gKiBAcGFyYW0ge251bWJlcn0gY3JjMzIgdGhlIGNyYzMyIG9mIHRoZSBkZWNvbXByZXNzZWQgZmlsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiwgc2VlIGxpYi9jb21wcmVzc2lvbnMuanMuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgY29tcHJlc3NlZCBkYXRhLlxuICovXG5mdW5jdGlvbiBDb21wcmVzc2VkT2JqZWN0KGNvbXByZXNzZWRTaXplLCB1bmNvbXByZXNzZWRTaXplLCBjcmMzMiwgY29tcHJlc3Npb24sIGRhdGEpIHtcbiAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7XG4gICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gdW5jb21wcmVzc2VkU2l6ZTtcbiAgICB0aGlzLmNyYzMyID0gY3JjMzI7XG4gICAgdGhpcy5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uO1xuICAgIHRoaXMuY29tcHJlc3NlZENvbnRlbnQgPSBkYXRhO1xufVxuXG5Db21wcmVzc2VkT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSB1bmNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIGdldENvbnRlbnRXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpXG4gICAgICAgIC5waXBlKHRoaXMuY29tcHJlc3Npb24udW5jb21wcmVzc1dvcmtlcigpKVxuICAgICAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwiZGF0YV9sZW5ndGhcIikpO1xuXG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgd29ya2VyLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuc3RyZWFtSW5mb1snZGF0YV9sZW5ndGgnXSAhPT0gdGhhdC51bmNvbXByZXNzZWRTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBnZXRDb21wcmVzc2VkV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIoZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2VkU2l6ZVwiLCB0aGlzLmNvbXByZXNzZWRTaXplKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJ1bmNvbXByZXNzZWRTaXplXCIsIHRoaXMudW5jb21wcmVzc2VkU2l6ZSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY3JjMzJcIiwgdGhpcy5jcmMzMilcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIiwgdGhpcy5jb21wcmVzc2lvbilcbiAgICAgICAgO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2hhaW4gdGhlIGdpdmVuIHdvcmtlciB3aXRoIG90aGVyIHdvcmtlcnMgdG8gY29tcHJlc3MgdGhlIGNvbnRlbnQgd2l0aCB0aGVcbiAqIGdpdmVuIGNvbXByZXNpb24uXG4gKiBAcGFyYW0ge0dlbmVyaWNXb3JrZXJ9IHVuY29tcHJlc3NlZFdvcmtlciB0aGUgd29ya2VyIHRvIHBpcGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29tcHJlc3NpbmcuXG4gKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgbmV3IHdvcmtlciBjb21wcmVzc2luZyB0aGUgY29udGVudC5cbiAqL1xuQ29tcHJlc3NlZE9iamVjdC5jcmVhdGVXb3JrZXJGcm9tID0gZnVuY3Rpb24gKHVuY29tcHJlc3NlZFdvcmtlciwgY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiB1bmNvbXByZXNzZWRXb3JrZXJcbiAgICAucGlwZShuZXcgQ3JjMzJQcm9iZSgpKVxuICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJ1bmNvbXByZXNzZWRTaXplXCIpKVxuICAgIC5waXBlKGNvbXByZXNzaW9uLmNvbXByZXNzV29ya2VyKGNvbXByZXNzaW9uT3B0aW9ucykpXG4gICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcImNvbXByZXNzZWRTaXplXCIpKVxuICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzaW9uXCIsIGNvbXByZXNzaW9uKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcHJlc3NlZE9iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKTtcblxuZXhwb3J0cy5TVE9SRSA9IHtcbiAgICBtYWdpYzogXCJcXHgwMFxceDAwXCIsXG4gICAgLy8gY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgR2VuZXJpY1dvcmtlcihcIlNUT1JFIGNvbXByZXNzaW9uXCIpO1xuICAgIC8vIH0sXG4gICAgdW5jb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljV29ya2VyKFwiU1RPUkUgZGVjb21wcmVzc2lvblwiKTtcbiAgICB9XG59O1xuZXhwb3J0cy5ERUZMQVRFID0gcmVxdWlyZSgnLi9mbGF0ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tZSBmcm9tIHBha28sIGZyb20gcGFrby9saWIvemxpYi9jcmMzMi5qc1xuICogcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgcGFrbyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgICB2YXIgYywgdGFibGUgPSBbXTtcblxuICAgIGZvcih2YXIgbiA9MDsgbiA8IDI1NjsgbisrKXtcbiAgICAgICAgYyA9IG47XG4gICAgICAgIGZvcih2YXIgayA9MDsgayA8IDg7IGsrKyl7XG4gICAgICAgICAgICBjID0gKChjJjEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZVtuXSA9IGM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcblxuICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBjcmMzMiBvZiBhIHN0cmluZy5cbiAqIFRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBmdW5jdGlvbiBjcmMzMiwgYnV0IGZvciBzdHJpbmdzLiBVc2luZyB0aGVcbiAqIHNhbWUgZnVuY3Rpb24gZm9yIHRoZSB0d28gdXNlIGNhc2VzIGxlYWRzIHRvIGhvcnJpYmxlIHBlcmZvcm1hbmNlcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBjcmMgdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBjcmMuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdXNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0ge051bWJlcn0gcG9zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIGNyYzMyIGNvbXB1dGF0aW9uLlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgY29tcHV0ZWQgY3JjMzIuXG4gKi9cbmZ1bmN0aW9uIGNyYzMyc3RyKGNyYywgc3RyLCBsZW4sIHBvcykge1xuICAgIHZhciB0ID0gY3JjVGFibGUsIGVuZCA9IHBvcyArIGxlbjtcblxuICAgIGNyYyA9IGNyYyBeICgtMSk7XG5cbiAgICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKysgKSB7XG4gICAgICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gc3RyLmNoYXJDb2RlQXQoaSkpICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JjMzJ3cmFwcGVyKGlucHV0LCBjcmMpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIGlzQXJyYXkgPSB1dGlscy5nZXRUeXBlT2YoaW5wdXQpICE9PSBcInN0cmluZ1wiO1xuXG4gICAgaWYoaXNBcnJheSkge1xuICAgICAgICByZXR1cm4gY3JjMzIoY3JjfDAsIGlucHV0LCBpbnB1dC5sZW5ndGgsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmMzMnN0cihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7XG4gICAgfVxufTtcbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuIiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5iYXNlNjQgPSBmYWxzZTtcbmV4cG9ydHMuYmluYXJ5ID0gZmFsc2U7XG5leHBvcnRzLmRpciA9IGZhbHNlO1xuZXhwb3J0cy5jcmVhdGVGb2xkZXJzID0gdHJ1ZTtcbmV4cG9ydHMuZGF0ZSA9IG51bGw7XG5leHBvcnRzLmNvbXByZXNzaW9uID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb25PcHRpb25zID0gbnVsbDtcbmV4cG9ydHMuY29tbWVudCA9IG51bGw7XG5leHBvcnRzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7XG5leHBvcnRzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gdmFyIEVTNlByb21pc2UgPSByZXF1aXJlKFwiZXM2LXByb21pc2VcIikuUHJvbWlzZTtcblxuLyoqXG4gKiBMZXQgdGhlIHVzZXIgdXNlL2NoYW5nZSBzb21lIGltcGxlbWVudGF0aW9ucy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgUHJvbWlzZTogd2luZG93LlByb21pc2Vcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVVNFX1RZUEVEQVJSQVkgPSAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBVaW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgcGFrbyA9IHJlcXVpcmUoXCJwYWtvXCIpO1xudmFyIHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpO1xuXG52YXIgQVJSQVlfVFlQRSA9IFVTRV9UWVBFREFSUkFZID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG5cbmV4cG9ydHMubWFnaWMgPSBcIlxceDA4XFx4MDBcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSB3b3JrZXIgdGhhdCB1c2VzIHBha28gdG8gaW5mbGF0ZS9kZWZsYXRlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uIHRoZSBuYW1lIG9mIHRoZSBwYWtvIGZ1bmN0aW9uIHRvIGNhbGwgOiBlaXRoZXIgXCJEZWZsYXRlXCIgb3IgXCJJbmZsYXRlXCIuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiAoZGUpY29tcHJlc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIEZsYXRlV29ya2VyKGFjdGlvbiwgb3B0aW9ucykge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkZsYXRlV29ya2VyL1wiICsgYWN0aW9uKTtcblxuICAgIHRoaXMuX3Bha28gPSBuZXcgcGFrb1thY3Rpb25dKHtcbiAgICAgICAgcmF3OnRydWUsXG4gICAgICAgIGxldmVsIDogb3B0aW9ucy5sZXZlbCB8fCAtMSAvLyBkZWZhdWx0IGNvbXByZXNzaW9uXG4gICAgfSk7XG4gICAgLy8gdGhlIGBtZXRhYCBvYmplY3QgZnJvbSB0aGUgbGFzdCBjaHVuayByZWNlaXZlZFxuICAgIC8vIHRoaXMgYWxsb3cgdGhpcyB3b3JrZXIgdG8gcGFzcyBhcm91bmQgbWV0YWRhdGFcbiAgICB0aGlzLm1ldGEgPSB7fTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9wYWtvLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgc2VsZi5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBkYXRhLFxuICAgICAgICAgICAgbWV0YSA6IHNlbGYubWV0YVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG51dGlscy5pbmhlcml0cyhGbGF0ZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5tZXRhID0gY2h1bmsubWV0YTtcbiAgICB0aGlzLl9wYWtvLnB1c2godXRpbHMudHJhbnNmb3JtVG8oQVJSQVlfVFlQRSwgY2h1bmsuZGF0YSksIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuX3Bha28ucHVzaChbXSwgdHJ1ZSk7XG59O1xuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUuY2xlYW5VcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyk7XG4gICAgdGhpcy5fcGFrbyA9IG51bGw7XG59O1xuXG5leHBvcnRzLmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJEZWZsYXRlXCIsIGNvbXByZXNzaW9uT3B0aW9ucyk7XG59O1xuZXhwb3J0cy51bmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJJbmZsYXRlXCIsIHt9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gYSBvZiB6aXAgZmlsZSBpbiBqc1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEpTWmlwKCkge1xuICAgIC8vIGlmIHRoaXMgY29uc3RydWN0b3IgaXPCoHVzZWQgd2l0aG91dMKgYG5ld2AsIGl0wqBhZGRzIGBuZXdgIGJlZm9yZcKgaXRzZWxmOlxuICAgIGlmKCEodGhpcyBpbnN0YW5jZW9mIEpTWmlwKSkge1xuICAgICAgICByZXR1cm4gbmV3IEpTWmlwKCk7XG4gICAgfVxuXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH1cblxuICAgIC8vIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyA6XG4gICAgLy8ge1xuICAgIC8vICAgXCJmb2xkZXIvXCIgOiB7Li4ufSxcbiAgICAvLyAgIFwiZm9sZGVyL2RhdGEudHh0XCIgOiB7Li4ufVxuICAgIC8vIH1cbiAgICB0aGlzLmZpbGVzID0ge307XG5cbiAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuXG4gICAgLy8gV2hlcmUgd2UgYXJlIGluIHRoZSBoaWVyYXJjaHlcbiAgICB0aGlzLnJvb3QgPSBcIlwiO1xuICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5ld09iaiA9IG5ldyBKU1ppcCgpO1xuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1tpXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbmV3T2JqW2ldID0gdGhpc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgIH07XG59XG5KU1ppcC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL29iamVjdCcpO1xuSlNaaXAucHJvdG90eXBlLmxvYWRBc3luYyA9IHJlcXVpcmUoJy4vbG9hZCcpO1xuSlNaaXAuc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuSlNaaXAuZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbkpTWmlwLmxvYWRBc3luYyA9IGZ1bmN0aW9uIChjb250ZW50LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBKU1ppcCgpLmxvYWRBc3luYyhjb250ZW50LCBvcHRpb25zKTtcbn07XG5cbkpTWmlwLmV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5tb2R1bGUuZXhwb3J0cyA9IEpTWmlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIFppcEVudHJpZXMgPSByZXF1aXJlKCcuL3ppcEVudHJpZXMnKTtcbnZhciBDcmMzMlByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vQ3JjMzJQcm9iZScpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZShcIi4vbm9kZWpzVXRpbHNcIik7XG5cbi8qKlxuICogQ2hlY2sgdGhlIENSQzMyIG9mIGFuIGVudHJ5LlxuICogQHBhcmFtIHtaaXBFbnRyeX0gemlwRW50cnkgdGhlIHppcCBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRW50cnlDUkMzMih6aXBFbnRyeSkge1xuICAgIHJldHVybiBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSB6aXBFbnRyeS5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IENyYzMyUHJvYmUoKSk7XG4gICAgICAgIHdvcmtlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAod29ya2VyLnN0cmVhbUluZm8uY3JjMzIgIT09IHppcEVudHJ5LmRlY29tcHJlc3NlZC5jcmMzMikge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogQ1JDMzIgbWlzbWF0Y2hcIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkYXRhLCBvcHRpb25zKSB7XG4gICAgdmFyIHppcCA9IHRoaXM7XG4gICAgb3B0aW9ucyA9IHV0aWxzLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgICAgIGJhc2U2NDogZmFsc2UsXG4gICAgICAgIGNoZWNrQ1JDMzI6IGZhbHNlLFxuICAgICAgICBvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6IGZhbHNlLFxuICAgICAgICBjcmVhdGVGb2xkZXJzOiBmYWxzZSxcbiAgICAgICAgZGVjb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGRlY29kZVxuICAgIH0pO1xuXG4gICAgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSlNaaXAgY2FuJ3QgYWNjZXB0IGEgc3RyZWFtIHdoZW4gbG9hZGluZyBhIHppcCBmaWxlLlwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLnByZXBhcmVDb250ZW50KFwidGhlIGxvYWRlZCB6aXAgZmlsZVwiLCBkYXRhLCB0cnVlLCBvcHRpb25zLm9wdGltaXplZEJpbmFyeVN0cmluZywgb3B0aW9ucy5iYXNlNjQpXG4gICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IG5ldyBaaXBFbnRyaWVzKG9wdGlvbnMpO1xuICAgICAgICB6aXBFbnRyaWVzLmxvYWQoZGF0YSk7XG4gICAgICAgIHJldHVybiB6aXBFbnRyaWVzO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gY2hlY2tDUkMzMih6aXBFbnRyaWVzKSB7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoemlwRW50cmllcyldO1xuICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgICAgICBpZiAob3B0aW9ucy5jaGVja0NSQzMyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjaGVja0VudHJ5Q1JDMzIoZmlsZXNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gYWRkRmlsZXMocmVzdWx0cykge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IHJlc3VsdHMuc2hpZnQoKTtcbiAgICAgICAgdmFyIGZpbGVzID0gemlwRW50cmllcy5maWxlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gZmlsZXNbaV07XG4gICAgICAgICAgICB6aXAuZmlsZShpbnB1dC5maWxlTmFtZVN0ciwgaW5wdXQuZGVjb21wcmVzc2VkLCB7XG4gICAgICAgICAgICAgICAgYmluYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkYXRlOiBpbnB1dC5kYXRlLFxuICAgICAgICAgICAgICAgIGRpcjogaW5wdXQuZGlyLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQgOiBpbnB1dC5maWxlQ29tbWVudFN0ci5sZW5ndGggPyBpbnB1dC5maWxlQ29tbWVudFN0ciA6IG51bGwsXG4gICAgICAgICAgICAgICAgdW5peFBlcm1pc3Npb25zIDogaW5wdXQudW5peFBlcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgIGRvc1Blcm1pc3Npb25zIDogaW5wdXQuZG9zUGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyczogb3B0aW9ucy5jcmVhdGVGb2xkZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoemlwRW50cmllcy56aXBDb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgemlwLmNvbW1lbnQgPSB6aXBFbnRyaWVzLnppcENvbW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gemlwO1xuICAgIH0pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgdXNlIGEgbm9kZWpzIHN0cmVhbSBhcyBzb3VyY2UuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBlbnRyeSBmb3IgdGhpcyBzdHJlYW0uXG4gKiBAcGFyYW0ge1JlYWRhYmxlfSBzdHJlYW0gdGhlIG5vZGVqcyBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcihmaWxlbmFtZSwgc3RyZWFtKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiTm9kZWpzIHN0cmVhbSBpbnB1dCBhZGFwdGVyIGZvciBcIiArIGZpbGVuYW1lKTtcbiAgICB0aGlzLl91cHN0cmVhbUVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYmluZFN0cmVhbShzdHJlYW0pO1xufVxuXG51dGlscy5pbmhlcml0cyhOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHN0cmVhbSBhbmQgYmluZCB0aGUgY2FsbGJhY2tzIG9uIGl0LlxuICogRG8gdGhpcyBBU0FQIG9uIG5vZGUgMC4xMCAhIEEgbGF6eSBiaW5kaW5nIGRvZXNuJ3QgYWx3YXlzIHdvcmsuXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHRoZSBub2RlanMgc3RyZWFtIHRvIHVzZS5cbiAqL1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5fYmluZFN0cmVhbSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIHN0cmVhbVxuICAgIC5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHNlbGYucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiBjaHVuayxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZihzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKHNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3Vwc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9zdHJlYW0ucGF1c2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmKHRoaXMuX3Vwc3RyZWFtRW5kZWQpIHtcbiAgICAgICAgdGhpcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUmVhZGFibGU7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudXRpbC5pbmhlcml0cyhOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLCBSZWFkYWJsZSk7XG5cbi8qKlxuKiBBIG5vZGVqcyBzdHJlYW0gdXNpbmcgYSB3b3JrZXIgYXMgc291cmNlLlxuKiBAc2VlIHRoZSBTb3VyY2VXcmFwcGVyIGluIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9zdHJlYW0uaHRtbFxuKiBAY29uc3RydWN0b3JcbiogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHdyYXBwaW5nIHRoZSB3b3JrZXJcbiogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG5vZGVqcyBzdHJlYW0gb3B0aW9uc1xuKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIoaGVscGVyLCBvcHRpb25zLCB1cGRhdGVDYikge1xuICAgIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5faGVscGVyID0gaGVscGVyO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGhlbHBlci5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEsIG1ldGEpIHtcbiAgICAgICAgaWYgKCFzZWxmLnB1c2goZGF0YSkpIHtcbiAgICAgICAgICAgIHNlbGYuX2hlbHBlci5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHVwZGF0ZUNiKSB7XG4gICAgICAgICAgICB1cGRhdGVDYihtZXRhKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSlcbiAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgfSk7XG59XG5cblxuTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlci5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9oZWxwZXIucmVzdW1lKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhpcyBpcyBydW5uaW5nIGluIE5vZGVqcywgd2lsbCBiZSB1bmRlZmluZWQgaW4gYSBicm93c2VyLlxuICAgICAqIEluIGEgYnJvd3NlciwgYnJvd3NlcmlmeSB3b24ndCBpbmNsdWRlIHRoaXMgZmlsZSBhbmQgdGhlIHdob2xlIG1vZHVsZVxuICAgICAqIHdpbGwgYmUgcmVzb2x2ZWQgYW4gZW1wdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIGlzTm9kZSA6IHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIsXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG5vZGVqcyBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIHRoZSBlbmNvZGluZyB0byB1c2UuXG4gICAgICogQHJldHVybiB7QnVmZmVyfSBhIG5ldyBCdWZmZXIuXG4gICAgICovXG4gICAgbmV3QnVmZmVyIDogZnVuY3Rpb24oZGF0YSwgZW5jb2Rpbmcpe1xuICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcihkYXRhLCBlbmNvZGluZyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIG91dCBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGIgdGhlIG9iamVjdCB0byB0ZXN0LlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIEJ1ZmZlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzQnVmZmVyIDogZnVuY3Rpb24oYil7XG4gICAgICAgIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYik7XG4gICAgfSxcblxuICAgIGlzU3RyZWFtIDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLm9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoucGF1c2UgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5yZXN1bWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gdmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuLy8gdmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBaaXBPYmplY3QgPSByZXF1aXJlKCcuL3ppcE9iamVjdCcpO1xuLy8gdmFyIGdlbmVyYXRlID0gcmVxdWlyZShcIi4vZ2VuZXJhdGVcIik7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKFwiLi9ub2RlanNVdGlsc1wiKTtcbnZhciBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIgPSByZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyXCIpO1xuXG5cbi8qKlxuICogQWRkIGEgZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge09iamVjdH0gbyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgbmV3IGZpbGUuXG4gKi9cbnZhciBmaWxlQWRkID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgbykge1xuICAgIC8vIGJlIHN1cmUgc3ViIGZvbGRlcnMgZXhpc3RcbiAgICB2YXIgZGF0YVR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSksXG4gICAgICAgIHBhcmVudDtcblxuXG4gICAgLypcbiAgICAgKiBDb3JyZWN0IG9wdGlvbnMuXG4gICAgICovXG5cbiAgICBvID0gdXRpbHMuZXh0ZW5kKG8gfHwge30sIGRlZmF1bHRzKTtcbiAgICBvLmRhdGUgPSBvLmRhdGUgfHwgbmV3IERhdGUoKTtcbiAgICBpZiAoby5jb21wcmVzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICBvLmNvbXByZXNzaW9uID0gby5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygby51bml4UGVybWlzc2lvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgby51bml4UGVybWlzc2lvbnMgPSBwYXJzZUludChvLnVuaXhQZXJtaXNzaW9ucywgOCk7XG4gICAgfVxuXG4gICAgLy8gVU5YX0lGRElSICAwMDQwMDAwIHNlZSB6aXBpbmZvLmNcbiAgICBpZiAoby51bml4UGVybWlzc2lvbnMgJiYgKG8udW5peFBlcm1pc3Npb25zICYgMHg0MDAwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEJpdCA0ICAgIERpcmVjdG9yeVxuICAgIGlmIChvLmRvc1Blcm1pc3Npb25zICYmIChvLmRvc1Blcm1pc3Npb25zICYgMHgwMDEwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG8uZGlyKSB7XG4gICAgICAgIG5hbWUgPSBmb3JjZVRyYWlsaW5nU2xhc2gobmFtZSk7XG4gICAgfVxuICAgIGlmIChvLmNyZWF0ZUZvbGRlcnMgJiYgKHBhcmVudCA9IHBhcmVudEZvbGRlcihuYW1lKSkpIHtcbiAgICAgICAgZm9sZGVyQWRkLmNhbGwodGhpcywgcGFyZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gZGF0YVR5cGUgPT09IFwic3RyaW5nXCIgJiYgby5iaW5hcnkgPT09IGZhbHNlICYmIG8uYmFzZTY0ID09PSBmYWxzZTtcbiAgICBvLmJpbmFyeSA9ICFpc1VuaWNvZGVTdHJpbmc7XG5cblxuICAgIHZhciBpc0NvbXByZXNzZWRFbXB0eSA9IChkYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkgJiYgZGF0YS51bmNvbXByZXNzZWRTaXplID09PSAwO1xuXG4gICAgaWYgKGlzQ29tcHJlc3NlZEVtcHR5IHx8IG8uZGlyIHx8ICFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG8uYmFzZTY0ID0gZmFsc2U7XG4gICAgICAgIG8uYmluYXJ5ID0gdHJ1ZTtcbiAgICAgICAgZGF0YSA9IFwiXCI7XG4gICAgICAgIG8uY29tcHJlc3Npb24gPSBcIlNUT1JFXCI7XG4gICAgICAgIGRhdGFUeXBlID0gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIENvbnZlcnQgY29udGVudCB0byBmaXQuXG4gICAgICovXG5cbiAgICB2YXIgemlwT2JqZWN0Q29udGVudCA9IG51bGw7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0IHx8IGRhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBkYXRhO1xuICAgIH0gZWxzZSBpZiAobm9kZWpzVXRpbHMuaXNOb2RlICYmIG5vZGVqc1V0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBuZXcgTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyKG5hbWUsIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSB1dGlscy5wcmVwYXJlQ29udGVudChuYW1lLCBkYXRhLCBvLmJpbmFyeSwgby5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIG8uYmFzZTY0KTtcbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gbmV3IFppcE9iamVjdChuYW1lLCB6aXBPYmplY3RDb250ZW50LCBvKTtcbiAgICB0aGlzLmZpbGVzW25hbWVdID0gb2JqZWN0O1xuICAgIC8qXG4gICAgVE9ETzogd2UgY2FuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2Ugd2UgaGF2ZSBhc3luYyBwcm9taXNlc1xuICAgICh3ZSBjYW4gaGF2ZSBhIHByb21pc2Ugb2YgYSBEYXRlKCkgZm9yIGV4YW1wbGUpIGJ1dCByZXR1cm5pbmcgYVxuICAgIHByb21pc2UgaXMgdXNlbGVzcyBiZWNhdXNlIGZpbGUobmFtZSwgZGF0YSkgcmV0dXJucyB0aGUgSlNaaXBcbiAgICBvYmplY3QgZm9yIGNoYWluaW5nLiBTaG91bGQgd2UgYnJlYWsgdGhhdCB0byBhbGxvdyB0aGUgdXNlclxuICAgIHRvIGNhdGNoIHRoZSBlcnJvciA/XG5cbiAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHppcE9iamVjdENvbnRlbnQpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuICAgICovXG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIHBhcmVudCBmb2xkZXIgb2YgdGhlIHBhdGguXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIHBhdGggdG8gdXNlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBwYXJlbnQgZm9sZGVyLCBvciBcIlwiXG4gKi9cbnZhciBwYXJlbnRGb2xkZXIgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICB2YXIgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgIHJldHVybiAobGFzdFNsYXNoID4gMCkgPyBwYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpIDogXCJcIjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCB3aXRoIGEgc2xhc2ggYXQgdGhlIGVuZC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHBhdGggd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICovXG52YXIgZm9yY2VUcmFpbGluZ1NsYXNoID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIC8vIENoZWNrIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC9cbiAgICBpZiAocGF0aC5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgICAgIHBhdGggKz0gXCIvXCI7IC8vIElFIGRvZXNuJ3QgbGlrZSBzdWJzdHIoLTEpXG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufTtcblxuLyoqXG4gKiBBZGQgYSAoc3ViKSBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBmb2xkZXIncyBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBbY3JlYXRlRm9sZGVyc10gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBjcmVhdGUgc3ViXG4gKiAgZm9sZGVycy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZm9sZGVyLlxuICovXG52YXIgZm9sZGVyQWRkID0gZnVuY3Rpb24obmFtZSwgY3JlYXRlRm9sZGVycykge1xuICAgIGNyZWF0ZUZvbGRlcnMgPSAodHlwZW9mIGNyZWF0ZUZvbGRlcnMgIT09ICd1bmRlZmluZWQnKSA/IGNyZWF0ZUZvbGRlcnMgOiBkZWZhdWx0cy5jcmVhdGVGb2xkZXJzO1xuXG4gICAgbmFtZSA9IGZvcmNlVHJhaWxpbmdTbGFzaChuYW1lKTtcblxuICAgIC8vIERvZXMgdGhpcyBmb2xkZXIgYWxyZWFkeSBleGlzdD9cbiAgICBpZiAoIXRoaXMuZmlsZXNbbmFtZV0pIHtcbiAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUsIG51bGwsIHtcbiAgICAgICAgICAgIGRpcjogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IGNyZWF0ZUZvbGRlcnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbGVzW25hbWVdO1xufTtcblxuLyoqXG4qIENyb3NzLXdpbmRvdywgY3Jvc3MtTm9kZS1jb250ZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBkZXRlY3Rpb25cbiogQHBhcmFtICB7T2JqZWN0fSAgb2JqZWN0IEFueXRoaW5nXG4qIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sXG4qIGZhbHNlIG90aGVyd2lzZVxuKi9cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbn1cblxuLy8gcmV0dXJuIHRoZSBhY3R1YWwgcHJvdG90eXBlIG9mIEpTWmlwXG52YXIgb3V0ID0ge1xuICAgIC8qKlxuICAgICAqIEBzZWUgbG9hZEFzeW5jXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENhbGwgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBlbnRyeSBhdCB0aGlzIGZvbGRlciBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiB0aGUgY2FsbGJhY2sgZnVuY3Rpb246XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKi9cbiAgICBmb3JFYWNoOiBmdW5jdGlvbihjYikge1xuICAgICAgICB2YXIgZmlsZW5hbWUsIHJlbGF0aXZlUGF0aCwgZmlsZTtcbiAgICAgICAgZm9yIChmaWxlbmFtZSBpbiB0aGlzLmZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXMuaGFzT3duUHJvcGVydHkoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tmaWxlbmFtZV07XG4gICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBmaWxlbmFtZS5zbGljZSh0aGlzLnJvb3QubGVuZ3RoLCBmaWxlbmFtZS5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aCAmJiBmaWxlbmFtZS5zbGljZSgwLCB0aGlzLnJvb3QubGVuZ3RoKSA9PT0gdGhpcy5yb290KSB7IC8vIHRoZSBmaWxlIGlzIGluIHRoZSBjdXJyZW50IHJvb3RcbiAgICAgICAgICAgICAgICBjYihyZWxhdGl2ZVBhdGgsIGZpbGUpOyAvLyBUT0RPIHJldmVyc2UgdGhlIHBhcmFtZXRlcnMgPyBuZWVkIHRvIGJlIGNsZWFuIEFORCBjb25zaXN0ZW50IHdpdGggdGhlIGZpbHRlciBzZWFyY2ggZm4uLi5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgbmVzdGVkIGZpbGVzL2ZvbGRlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNlYXJjaCB0aGUgcHJlZGljYXRlIHRvIHVzZSA6XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgbWF0Y2hpbmcgZWxlbWVudHMuXG4gICAgICovXG4gICAgZmlsdGVyOiBmdW5jdGlvbihzZWFyY2gpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZW50cnkpIHtcbiAgICAgICAgICAgIGlmIChzZWFyY2gocmVsYXRpdmVQYXRoLCBlbnRyeSkpIHsgLy8gdGhlIGZpbGUgbWF0Y2hlcyB0aGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGZpbGUgdG8gdGhlIHppcCBmaWxlLCBvciBzZWFyY2ggYSBmaWxlLlxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd8UmVnRXhwfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGFkZCAoaWYgZGF0YSBpcyBkZWZpbmVkKSxcbiAgICAgKiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBmaW5kIChpZiBubyBkYXRhKSBvciBhIHJlZ2V4IHRvIG1hdGNoIGZpbGVzLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgIFRoZSBmaWxlIGRhdGEsIGVpdGhlciByYXcgb3IgYmFzZTY0IGVuY29kZWRcbiAgICAgKiBAcGFyYW0gICB7T2JqZWN0fSBvICAgICBGaWxlIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuICB7SlNaaXB8T2JqZWN0fEFycmF5fSB0aGlzIEpTWmlwIG9iamVjdCAod2hlbiBhZGRpbmcgYSBmaWxlKSxcbiAgICAgKiBhIGZpbGUgKHdoZW4gc2VhcmNoaW5nIGJ5IHN0cmluZykgb3IgYW4gYXJyYXkgb2YgZmlsZXMgKHdoZW4gc2VhcmNoaW5nIGJ5IHJlZ2V4KS5cbiAgICAgKi9cbiAgICBmaWxlOiBmdW5jdGlvbihuYW1lLCBkYXRhLCBvKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoaXNSZWdFeHAobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnZXhwID0gbmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhZmlsZS5kaXIgJiYgcmVnZXhwLnRlc3QocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyB0ZXh0XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHRoaXMuZmlsZXNbdGhpcy5yb290ICsgbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG9iaiAmJiAhb2JqLmRpcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gbW9yZSB0aGFuIG9uZSBhcmd1bWVudCA6IHdlIGhhdmUgZGF0YSAhXG4gICAgICAgICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAgICAgICAgIGZpbGVBZGQuY2FsbCh0aGlzLCBuYW1lLCBkYXRhLCBvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSB6aXAgZmlsZSwgb3Igc2VhcmNoLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8UmVnRXhwfSBhcmcgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBhZGQsIG9yIGEgcmVnZXggdG8gc2VhcmNoIGZvbGRlcnMuXG4gICAgICogQHJldHVybiAge0pTWmlwfSBhbiBvYmplY3Qgd2l0aCB0aGUgbmV3IGRpcmVjdG9yeSBhcyB0aGUgcm9vdCwgb3IgYW4gYXJyYXkgY29udGFpbmluZyBtYXRjaGluZyBmb2xkZXJzLlxuICAgICAqL1xuICAgIGZvbGRlcjogZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIGlmICghYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JlZ0V4cChhcmcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZGlyICYmIGFyZy50ZXN0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UsIG5hbWUgaXMgYSBuZXcgZm9sZGVyXG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5yb290ICsgYXJnO1xuICAgICAgICB2YXIgbmV3Rm9sZGVyID0gZm9sZGVyQWRkLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICAgICAgLy8gQWxsb3cgY2hhaW5pbmcgYnkgcmV0dXJuaW5nIGEgbmV3IG9iamVjdCB3aXRoIHRoaXMgZm9sZGVyIGFzIHRoZSByb290XG4gICAgICAgIHZhciByZXQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJldC5yb290ID0gbmV3Rm9sZGVyLm5hbWU7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfS8vLFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgYW5kIGFsbCBzdWItZmlsZXMsIGZyb20gdGhlIHppcFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge0pTWmlwfSB0aGlzIEpTWmlwIG9iamVjdFxuICAgICAqL1xuICAgIC8vIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIC8vICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAvLyAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICBpZiAoIWZpbGUpIHtcbiAgICAvLyAgICAgICAgIC8vIExvb2sgZm9yIGFueSBmb2xkZXJzXG4gICAgLy8gICAgICAgICBpZiAobmFtZS5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgLy8gICAgICAgICAgICAgbmFtZSArPSBcIi9cIjtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKGZpbGUgJiYgIWZpbGUuZGlyKSB7XG4gICAgLy8gICAgICAgICAvLyBmaWxlXG4gICAgLy8gICAgICAgICBkZWxldGUgdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIC8vIG1heWJlIGEgZm9sZGVyLCBkZWxldGUgcmVjdXJzaXZlbHlcbiAgICAvLyAgICAgICAgIHZhciBraWRzID0gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIGZpbGUubmFtZS5zbGljZSgwLCBuYW1lLmxlbmd0aCkgPT09IG5hbWU7XG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2lkcy5sZW5ndGg7IGkrKykge1xuICAgIC8vICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW2tpZHNbaV0ubmFtZV07XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICByZXR1cm4gdGhpcztcbiAgICAvLyB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIHppcCBmaWxlXG4gICAgICovXG4gICAgLy8gZ2VuZXJhdGU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhcyBhbiBpbnRlcm5hbCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBzdHJlYW1lZCB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICAvLyBnZW5lcmF0ZUludGVybmFsU3RyZWFtOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgLy8gICB2YXIgd29ya2VyLCBvcHRzID0ge307XG4gICAgLy8gICB0cnkge1xuICAgIC8vICAgICAgIG9wdHMgPSB1dGlscy5leHRlbmQob3B0aW9ucyB8fCB7fSwge1xuICAgIC8vICAgICAgICAgICBzdHJlYW1GaWxlczogZmFsc2UsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uOiBcIlNUT1JFXCIsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG51bGwsXG4gICAgLy8gICAgICAgICAgIHR5cGU6IFwiXCIsXG4gICAgLy8gICAgICAgICAgIHBsYXRmb3JtOiBcIkRPU1wiLFxuICAgIC8vICAgICAgICAgICBjb21tZW50OiBudWxsLFxuICAgIC8vICAgICAgICAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICAgLy8gICAgICAgICAgIGVuY29kZUZpbGVOYW1lOiB1dGY4LnV0ZjhlbmNvZGVcbiAgICAvLyAgICAgICB9KTtcblxuICAgIC8vICAgICAgIG9wdHMudHlwZSA9IG9wdHMudHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vICAgICAgIG9wdHMuY29tcHJlc3Npb24gPSBvcHRzLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAvLyAgICAgICAvLyBcImJpbmFyeXN0cmluZ1wiIGlzIHByZWZlcmVkIGJ1dCB0aGUgaW50ZXJuYWxzIHVzZSBcInN0cmluZ1wiLlxuICAgIC8vICAgICAgIGlmKG9wdHMudHlwZSA9PT0gXCJiaW5hcnlzdHJpbmdcIikge1xuICAgIC8vICAgICAgICAgb3B0cy50eXBlID0gXCJzdHJpbmdcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICBpZiAoIW9wdHMudHlwZSkge1xuICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLlwiKTtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB1dGlscy5jaGVja1N1cHBvcnQob3B0cy50eXBlKTtcblxuICAgIC8vICAgICAgIC8vIGFjY2VwdCBub2RlanMgYHByb2Nlc3MucGxhdGZvcm1gXG4gICAgLy8gICAgICAgaWYoXG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdkYXJ3aW4nIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdmcmVlYnNkJyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnbGludXgnIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdzdW5vcydcbiAgICAvLyAgICAgICApIHtcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9IFwiVU5JWFwiO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgICBpZiAob3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID0gXCJET1NcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB2YXIgY29tbWVudCA9IG9wdHMuY29tbWVudCB8fCB0aGlzLmNvbW1lbnQgfHwgXCJcIjtcbiAgICAvLyAgICAgICB3b3JrZXIgPSBnZW5lcmF0ZS5nZW5lcmF0ZVdvcmtlcih0aGlzLCBvcHRzLCBjb21tZW50KTtcbiAgICAvLyAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgICAgd29ya2VyID0gbmV3IEdlbmVyaWNXb3JrZXIoXCJlcnJvclwiKTtcbiAgICAvLyAgICAgd29ya2VyLmVycm9yKGUpO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIod29ya2VyLCBvcHRzLnR5cGUgfHwgXCJzdHJpbmdcIiwgb3B0cy5taW1lVHlwZSk7XG4gICAgLy8gfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXN5bmNocm9ub3VzbHkuXG4gICAgLy8gICogQHNlZSBnZW5lcmF0ZUludGVybmFsU3RyZWFtXG4gICAgLy8gICovXG4gICAgLy8gZ2VuZXJhdGVBc3luYzogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICAvLyB9LFxuICAgIC8vIC8qKlxuICAgIC8vICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhc3luY2hyb25vdXNseS5cbiAgICAvLyAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW1cbiAgICAvLyAgKi9cbiAgICAvLyBnZW5lcmF0ZU5vZGVTdHJlYW06IGZ1bmN0aW9uKG9wdGlvbnMsIG9uVXBkYXRlKSB7XG4gICAgLy8gICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIC8vICAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgIC8vICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJub2RlYnVmZmVyXCI7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS50b05vZGVqc1N0cmVhbShvblVwZGF0ZSk7XG4gICAgLy8gfVxufTtcbm1vZHVsZS5leHBvcnRzID0gb3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEFycmF5UmVhZGVyKGRhdGEpIHtcbiAgICBEYXRhUmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRkYXRhW2ldID0gZGF0YVtpXSAmIDB4RkY7XG5cdH1cbn1cbnV0aWxzLmluaGVyaXRzKEFycmF5UmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy56ZXJvICsgaV07XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7XG4gICAgdmFyIHNpZzAgPSBzaWcuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgc2lnMSA9IHNpZy5jaGFyQ29kZUF0KDEpLFxuICAgICAgICBzaWcyID0gc2lnLmNoYXJDb2RlQXQoMiksXG4gICAgICAgIHNpZzMgPSBzaWcuY2hhckNvZGVBdCgzKTtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSA0OyBpID49IDA7IC0taSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhW2ldID09PSBzaWcwICYmIHRoaXMuZGF0YVtpICsgMV0gPT09IHNpZzEgJiYgdGhpcy5kYXRhW2kgKyAyXSA9PT0gc2lnMiAmJiB0aGlzLmRhdGFbaSArIDNdID09PSBzaWczKSB7XG4gICAgICAgICAgICByZXR1cm4gaSAtIHRoaXMuemVybztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHtcbiAgICB2YXIgc2lnMCA9IHNpZy5jaGFyQ29kZUF0KDApLFxuICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksXG4gICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSxcbiAgICAgICAgc2lnMyA9IHNpZy5jaGFyQ29kZUF0KDMpLFxuICAgICAgICBkYXRhID0gdGhpcy5yZWFkRGF0YSg0KTtcbiAgICByZXR1cm4gc2lnMCA9PT0gZGF0YVswXSAmJiBzaWcxID09PSBkYXRhWzFdICYmIHNpZzIgPT09IGRhdGFbMl0gJiYgc2lnMyA9PT0gZGF0YVszXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICBpZihzaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIERhdGFSZWFkZXIoZGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7IC8vIHR5cGUgOiBzZWUgaW1wbGVtZW50YXRpb25cbiAgICB0aGlzLmxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMuemVybyA9IDA7XG59XG5EYXRhUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIGNoZWNrT2Zmc2V0OiBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXggKyBvZmZzZXQpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgc3BlY2lmZWQgaW5kZXggd2lsbCBub3QgYmUgdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3SW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAgICAgKi9cbiAgICBjaGVja0luZGV4OiBmdW5jdGlvbihuZXdJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPCB0aGlzLnplcm8gKyBuZXdJbmRleCB8fCBuZXdJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gXCIgKyB0aGlzLmxlbmd0aCArIFwiLCBhc2tlZCBpbmRleCA9IFwiICsgKG5ld0luZGV4KSArIFwiKS4gQ29ycnVwdGVkIHppcCA/XCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJbmRleCBUaGUgbmV3IGluZGV4LlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgbmV3IGluZGV4IGlzIG91dCBvZiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICBzZXRJbmRleDogZnVuY3Rpb24obmV3SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KG5ld0luZGV4KTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ld0luZGV4O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2tpcCB0aGUgbmV4dCBuIGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgc2tpcDogZnVuY3Rpb24obikge1xuICAgICAgICB0aGlzLnNldEluZGV4KHRoaXMuaW5kZXggKyBuKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIHRoZSBpbmRleCB0byB1c2UuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBhIGJ5dGUuXG4gICAgICovXG4gICAgYnl0ZUF0OiBmdW5jdGlvbihpKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBudW1iZXIgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIuXG4gICAgICovXG4gICAgcmVhZEludDogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgICAgIGZvciAoaSA9IHRoaXMuaW5kZXggKyBzaXplIC0gMTsgaSA+PSB0aGlzLmluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgKyB0aGlzLmJ5dGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgc3RyaW5nIHdpdGggYSBnaXZlbiBieXRlIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLlxuICAgICAqL1xuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMucmVhZERhdGEoc2l6ZSkpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSByYXcgZGF0YSwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuXG4gICAgICovXG4gICAgcmVhZERhdGE6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB6aXAgc2lnbmF0dXJlICg0IGJ5dGVzKS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnIHRoZSBzaWduYXR1cmUgdG8gZmluZC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cmVuY2UsIC0xIGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBsYXN0SW5kZXhPZlNpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIHNpZ25hdHVyZSAoNCBieXRlcykgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGNvbXBhcmUgaXQgd2l0aCBzaWcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZWFkQW5kQ2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKHNpZykge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgZGF0ZS5cbiAgICAgKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZS5cbiAgICAgKi9cbiAgICByZWFkRGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkb3N0aW1lID0gdGhpcy5yZWFkSW50KDQpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoXG4gICAgICAgICgoZG9zdGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vIHllYXJcbiAgICAgICAgKChkb3N0aW1lID4+IDIxKSAmIDB4MGYpIC0gMSwgLy8gbW9udGhcbiAgICAgICAgKGRvc3RpbWUgPj4gMTYpICYgMHgxZiwgLy8gZGF5XG4gICAgICAgIChkb3N0aW1lID4+IDExKSAmIDB4MWYsIC8vIGhvdXJcbiAgICAgICAgKGRvc3RpbWUgPj4gNSkgJiAweDNmLCAvLyBtaW51dGVcbiAgICAgICAgKGRvc3RpbWUgJiAweDFmKSA8PCAxKSk7IC8vIHNlY29uZFxuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IERhdGFSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTm9kZUJ1ZmZlclJlYWRlcihkYXRhKSB7XG4gICAgVWludDhBcnJheVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoTm9kZUJ1ZmZlclJlYWRlciwgVWludDhBcnJheVJlYWRlcik7XG5cbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cbk5vZGVCdWZmZXJSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBOb2RlQnVmZmVyUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFN0cmluZ1JlYWRlcihkYXRhKSB7XG4gICAgRGF0YVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoU3RyaW5nUmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy56ZXJvICsgaSk7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2Yoc2lnKSAtIHRoaXMuemVybztcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmUgPSBmdW5jdGlvbiAoc2lnKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlYWREYXRhKDQpO1xuICAgIHJldHVybiBzaWcgPT09IGRhdGE7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIC8vIHRoaXMgd2lsbCB3b3JrIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZWQgdGhlIFwiJiAweGZmXCIgbWFzay5cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZ1JlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFVpbnQ4QXJyYXlSZWFkZXIoZGF0YSkge1xuICAgIEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhVaW50OEFycmF5UmVhZGVyLCBBcnJheVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5VaW50OEFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIGlmKHNpemUgPT09IDApIHtcbiAgICAgICAgLy8gaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5UmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuLi9zdXBwb3J0Jyk7XG52YXIgQXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL0FycmF5UmVhZGVyJyk7XG52YXIgU3RyaW5nUmVhZGVyID0gcmVxdWlyZSgnLi9TdHJpbmdSZWFkZXInKTtcbnZhciBOb2RlQnVmZmVyUmVhZGVyID0gcmVxdWlyZSgnLi9Ob2RlQnVmZmVyUmVhZGVyJyk7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlYWRlciBhZGFwdGVkIHRvIHRoZSBkYXRhLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgdG8gcmVhZC5cbiAqIEByZXR1cm4ge0RhdGFSZWFkZXJ9IHRoZSBkYXRhIHJlYWRlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciB0eXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpO1xuICAgIHV0aWxzLmNoZWNrU3VwcG9ydCh0eXBlKTtcbiAgICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAhc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheVJlYWRlcih1dGlscy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlcIiwgZGF0YSkpO1xufTtcblxuLy8gdmltOiBzZXQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLkxPQ0FMX0ZJTEVfSEVBREVSID0gXCJQS1xceDAzXFx4MDRcIjtcbmV4cG9ydHMuQ0VOVFJBTF9GSUxFX0hFQURFUiA9IFwiUEtcXHgwMVxceDAyXCI7XG5leHBvcnRzLkNFTlRSQUxfRElSRUNUT1JZX0VORCA9IFwiUEtcXHgwNVxceDA2XCI7XG5leHBvcnRzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IgPSBcIlBLXFx4MDZcXHgwN1wiO1xuZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSBcIlBLXFx4MDZcXHgwNlwiO1xuZXhwb3J0cy5EQVRBX0RFU0NSSVBUT1IgPSBcIlBLXFx4MDdcXHgwOFwiO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjb252ZXJ0IGNodW5rcyB0byBhIHNwZWNpZmllZCB0eXBlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzdFR5cGUgdGhlIGRlc3RpbmF0aW9uIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIENvbnZlcnRXb3JrZXIoZGVzdFR5cGUpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJDb252ZXJ0V29ya2VyIHRvIFwiICsgZGVzdFR5cGUpO1xuICAgIHRoaXMuZGVzdFR5cGUgPSBkZXN0VHlwZTtcbn1cbnV0aWxzLmluaGVyaXRzKENvbnZlcnRXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ29udmVydFdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IHV0aWxzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsIGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbm1vZHVsZS5leHBvcnRzID0gQ29udmVydFdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciBjcmMzMiA9IHJlcXVpcmUoJy4uL2NyYzMyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNhbGN1bGF0ZSB0aGUgY3JjMzIgb2YgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIENyYzMyUHJvYmUoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiQ3JjMzJQcm9iZVwiKTtcbn1cbnV0aWxzLmluaGVyaXRzKENyYzMyUHJvYmUsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ3JjMzJQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5zdHJlYW1JbmZvLmNyYzMyID0gY3JjMzIoY2h1bmsuZGF0YSwgdGhpcy5zdHJlYW1JbmZvLmNyYzMyIHx8IDApO1xuICAgIHRoaXMucHVzaChjaHVuayk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDcmMzMlByb2JlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZGF0YSBmbG93aW5nIHRocm91Z2guXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wTmFtZSB0aGUgbmFtZSB1c2VkIHRvIGV4cG9zZSB0aGUgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIERhdGFMZW5ndGhQcm9iZShwcm9wTmFtZSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkRhdGFMZW5ndGhQcm9iZSBmb3IgXCIgKyBwcm9wTmFtZSk7XG4gICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lO1xuICAgIHRoaXMud2l0aFN0cmVhbUluZm8ocHJvcE5hbWUsIDApO1xufVxudXRpbHMuaW5oZXJpdHMoRGF0YUxlbmd0aFByb2JlLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkRhdGFMZW5ndGhQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYoY2h1bmspIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXSB8fCAwO1xuICAgICAgICB0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV0gPSBsZW5ndGggKyBjaHVuay5kYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcywgY2h1bmspO1xufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YUxlbmd0aFByb2JlO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xuXG4vLyB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNodW5rc1xuLy8gVE9ETyBleHBvc2UgdGhpcyBhcyBhIHB1YmxpYyB2YXJpYWJsZVxudmFyIERFRkFVTFRfQkxPQ0tfU0laRSA9IDE2ICogMTAyNDtcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IHJlYWRzIGEgY29udGVudCBhbmQgZW1pdHMgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1Byb21pc2V9IGRhdGFQIHRoZSBwcm9taXNlIG9mIHRoZSBkYXRhIHRvIHNwbGl0XG4gKi9cbmZ1bmN0aW9uIERhdGFXb3JrZXIoZGF0YVApIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJEYXRhV29ya2VyXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmRhdGFJc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgdGhpcy5tYXggPSAwO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gXCJcIjtcblxuICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIGRhdGFQLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgc2VsZi5kYXRhSXNSZWFkeSA9IHRydWU7XG4gICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7XG4gICAgICAgIHNlbGYubWF4ID0gZGF0YSAmJiBkYXRhLmxlbmd0aCB8fCAwO1xuICAgICAgICBzZWxmLnR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7XG4gICAgICAgIGlmKCFzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICBzZWxmLl90aWNrQW5kUmVwZWF0KCk7XG4gICAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgIH0pO1xufVxuXG51dGlscy5pbmhlcml0cyhEYXRhV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5jbGVhblVwID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmRhdGEgPSBudWxsO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucmVzdW1lXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGlja1NjaGVkdWxlZCAmJiB0aGlzLmRhdGFJc1JlYWR5KSB7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGEgdGljayBhIHNjaGVkdWxlIGFuIG90aGVyIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi5cbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuX3RpY2tBbmRSZXBlYXQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90aWNrKCk7XG4gICAgaWYoIXRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbi8qKlxuICogUmVhZCBhbmQgcHVzaCBhIGNodW5rLlxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5fdGljayA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBzaXplID0gREVGQVVMVF9CTE9DS19TSVpFO1xuICAgIHZhciBkYXRhID0gbnVsbCwgbmV4dEluZGV4ID0gTWF0aC5taW4odGhpcy5tYXgsIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICBpZiAodGhpcy5pbmRleCA+PSB0aGlzLm1heCkge1xuICAgICAgICAvLyBFT0ZcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc3Vic3RyaW5nKHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ1aW50OGFycmF5XCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZGF0YSxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IHRoaXMubWF4ID8gdGhpcy5pbmRleCAvIHRoaXMubWF4ICogMTAwIDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHBhc3NpbmcgY2h1bmtzIHRvIHRoZSBuZXh0IG9uZS4gVGhpcyBpcyBsaWtlXG4gKiBhIG5vZGVqcyBzdHJlYW0gYnV0IHdpdGggc29tZSBkaWZmZXJlbmNlcy4gT24gdGhlIGdvb2Qgc2lkZSA6XG4gKiAtIGl0IHdvcmtzIG9uIElFIDYtOSB3aXRob3V0IGFueSBpc3N1ZSAvIHBvbHlmaWxsXG4gKiAtIGl0IHdlaWdodHMgbGVzcyB0aGFuIHRoZSBmdWxsIGRlcGVuZGVuY2llcyBidW5kbGVkIHdpdGggYnJvd3NlcmlmeVxuICogLSBpdCBmb3J3YXJkcyBlcnJvcnMgKG5vIG5lZWQgdG8gZGVjbGFyZSBhbiBlcnJvciBoYW5kbGVyIEVWRVJZV0hFUkUpXG4gKlxuICogQSBjaHVuayBpcyBhbiBvYmplY3Qgd2l0aCAyIGF0dHJpYnV0ZXMgOiBgbWV0YWAgYW5kIGBkYXRhYC4gVGhlIGZvcm1lciBpcyBhblxuICogb2JqZWN0IGNvbnRhaW5pbmcgYW55dGhpbmcgKGBwZXJjZW50YCBmb3IgZXhhbXBsZSksIHNlZSBlYWNoIHdvcmtlciBmb3IgbW9yZVxuICogZGV0YWlscy4gVGhlIGxhdHRlciBpcyB0aGUgcmVhbCBkYXRhIChTdHJpbmcsIFVpbnQ4QXJyYXksIGV0YykuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3RyZWFtIChtYWlubHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICovXG5mdW5jdGlvbiBHZW5lcmljV29ya2VyKG5hbWUpIHtcbiAgICAvLyB0aGUgbmFtZSBvZiB0aGUgd29ya2VyXG4gICAgdGhpcy5uYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcbiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgd29ya2VycyBjaGFpblxuICAgIHRoaXMuc3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIGFuIGVycm9yIHdoaWNoIGhhcHBlbmVkIHdoZW4gdGhlIHdvcmtlciB3YXMgcGF1c2VkXG4gICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IG51bGw7XG4gICAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgdG8gYmUgbWVyZ2VkIGJ5IHRoaXMgd29ya2VyIGludG8gdGhlIGdlbmVyYWwgbWV0YWRhdGFcbiAgICB0aGlzLmV4dHJhU3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBwYXVzZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGZpbmlzaGVkIChhbmQgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBsb2NrZWQgdG8gcHJldmVudCBmdXJ0aGVyIHN0cnVjdHVyZSB1cGRhdGVzIChwaXBlKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlO1xuICAgIC8vIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7XG4gICAgICAgICdkYXRhJzpbXSxcbiAgICAgICAgJ2VuZCc6W10sXG4gICAgICAgICdlcnJvcic6W11cbiAgICB9O1xuICAgIC8vIHRoZSBwcmV2aW91cyB3b3JrZXIsIGlmIGFueVxuICAgIHRoaXMucHJldmlvdXMgPSBudWxsO1xufVxuXG5HZW5lcmljV29ya2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBQdXNoIGEgY2h1bmsgdG8gdGhlIG5leHQgd29ya2Vycy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKi9cbiAgICBwdXNoIDogZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImRhdGFcIiwgY2h1bmspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRW5kIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVuZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEVuZCB0aGUgc3RyZWFtIHdpdGggYW4gZXJyb3IuXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZSB0aGUgZXJyb3Igd2hpY2ggY2F1c2VkIHRoZSBwcmVtYXR1cmUgZW5kLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIGVuZGVkIHRoZSB3b3JrZXIgd2l0aCBhbiBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVycm9yIDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5pc1BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcblxuICAgICAgICAgICAgLy8gaW4gdGhlIHdvcmtlcnMgY2hhaW4gZXhwbG9kZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY2hhaW4sXG4gICAgICAgICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgd2lsbCBnbyBkb3dud2FyZCBidXQgd2UgYWxzbyBuZWVkIHRvIG5vdGlmeVxuICAgICAgICAgICAgLy8gd29ya2VycyB1cHdhcmQgdGhhdCB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvci5cbiAgICAgICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIG9uIGFuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgY3VycmVudCBvYmplY3QgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDbGVhbiBhbnkgcmVmZXJlbmNlcyB3aGVuIGEgd29ya2VyIGlzIGVuZGluZy5cbiAgICAgKi9cbiAgICBjbGVhblVwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSB0aGlzLmdlbmVyYXRlZEVycm9yID0gdGhpcy5leHRyYVN0cmVhbUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYW4gZXZlbnQuIFRoaXMgd2lsbCBjYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCB0aGUgcHJvdmlkZWQgYXJnLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJnIHRoZSBhcmd1bWVudCB0byBjYWxsIHRoZSBjYWxsYmFjayB3aXRoLlxuICAgICAqL1xuICAgIGVtaXQgOiBmdW5jdGlvbiAobmFtZSwgYXJnKSB7XG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbbmFtZV0pIHtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV1baV0uY2FsbCh0aGlzLCBhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFpbiBhIHdvcmtlciB3aXRoIGFuIG90aGVyLlxuICAgICAqIEBwYXJhbSB7V29ya2VyfSBuZXh0IHRoZSB3b3JrZXIgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgKiBAcmV0dXJuIHt3b3JrZXJ9IHRoZSBuZXh0IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcGlwZSA6IGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXh0LnJlZ2lzdGVyUHJldmlvdXModGhpcyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTYW1lIGFzIGBwaXBlYCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqIFVzaW5nIGFuIEFQSSB3aXRoIGBwaXBlKG5leHQpYCBpcyB2ZXJ5IGVhc3kuXG4gICAgICogSW1wbGVtZW50aW5nIHRoZSBBUEkgd2l0aCB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgbmV4dCBvbmUgcmVnaXN0ZXJpbmdcbiAgICAgKiBhIHNvdXJjZSBpcyBlYXNpZXIsIHNlZSB0aGUgWmlwRmlsZVdvcmtlci5cbiAgICAgKiBAcGFyYW0ge1dvcmtlcn0gcHJldmlvdXMgdGhlIHByZXZpb3VzIHdvcmtlciwgc2VuZGluZyBldmVudHMgdG8gdGhpcyBvbmVcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJQcmV2aW91cyA6IGZ1bmN0aW9uIChwcmV2aW91cykge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0cmVhbSAnXCIgKyB0aGlzICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaGFyaW5nIHRoZSBzdHJlYW1JbmZvLi4uXG4gICAgICAgIHRoaXMuc3RyZWFtSW5mbyA9IHByZXZpb3VzLnN0cmVhbUluZm87XG4gICAgICAgIC8vIC4uLiBhbmQgYWRkaW5nIG91ciBvd24gYml0c1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICB0aGlzLnByZXZpb3VzID0gIHByZXZpb3VzO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHByZXZpb3VzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICBzZWxmLnByb2Nlc3NDaHVuayhjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2aW91cy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZpb3VzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgc3RyZWFtIHNvIGl0IGRvZXNuJ3Qgc2VuZCBldmVudHMgYW55bW9yZS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBwYXVzZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHBhdXNlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlc3VtZSBhIHBhdXNlZCBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgcmVzdW1lZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVzdW1lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZighdGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaWYgdHJ1ZSwgdGhlIHdvcmtlciB0cmllZCB0byByZXN1bWUgYnV0IGZhaWxlZFxuICAgICAgICB2YXIgd2l0aEVycm9yID0gZmFsc2U7XG4gICAgICAgIGlmKHRoaXMuZ2VuZXJhdGVkRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvcik7XG4gICAgICAgICAgICB3aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucmVzdW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXdpdGhFcnJvcjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZsdXNoIGFueSByZW1haW5pbmcgYnl0ZXMgYXMgdGhlIHN0cmVhbSBpcyBlbmRpbmcuXG4gICAgICovXG4gICAgZmx1c2ggOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGEgY2h1bmsuIFRoaXMgaXMgdXN1YWxseSB0aGUgbWV0aG9kIG92ZXJyaWRkZW4uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNodW5rIHRoZSBjaHVuayB0byBwcm9jZXNzLlxuICAgICAqL1xuICAgIHByb2Nlc3NDaHVuayA6IGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBrZXkvdmFsdWUgdG8gYmUgYWRkZWQgaW4gdGhlIHdvcmtlcnMgY2hhaW4gc3RyZWFtSW5mbyBvbmNlIGFjdGl2YXRlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgdG8gdXNlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIHRoZSBhc3NvY2lhdGVkIHZhbHVlXG4gICAgICogQHJldHVybiB7V29ya2VyfSB0aGUgY3VycmVudCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHdpdGhTdHJlYW1JbmZvIDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHRyYVN0cmVhbUluZm9ba2V5XSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE1lcmdlIHRoaXMgd29ya2VyJ3Mgc3RyZWFtSW5mbyBpbnRvIHRoZSBjaGFpbidzIHN0cmVhbUluZm8uXG4gICAgICovXG4gICAgbWVyZ2VTdHJlYW1JbmZvIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dHJhU3RyZWFtSW5mby5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUluZm9ba2V5XSA9IHRoaXMuZXh0cmFTdHJlYW1JbmZvW2tleV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9jayB0aGUgc3RyZWFtIHRvIHByZXZlbnQgZnVydGhlciB1cGRhdGVzIG9uIHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGFsbCBjYWxscyB0byBwaXBlIHdpbGwgZmFpbC5cbiAgICAgKi9cbiAgICBsb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIiArIHRoaXMgKyBcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMubG9jaygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUHJldHR5IHByaW50IHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqL1xuICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWUgPSBcIldvcmtlciBcIiArIHRoaXMubmFtZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzICsgXCIgLT4gXCIgKyBtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gR2VuZXJpY1dvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBDb252ZXJ0V29ya2VyID0gcmVxdWlyZSgnLi9Db252ZXJ0V29ya2VyJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4uL2Jhc2U2NCcpO1xudmFyIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIgPSByZXF1aXJlKCcuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcicpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4uL2V4dGVybmFsXCIpO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBmaW5hbCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZGF0YS4gSWYgdGhlIHVzZXIgd2FudHMgYSBCbG9iIGZvclxuICogZXhhbXBsZSwgaXQncyBlYXNpZXIgdG8gd29yayB3aXRoIGFuIFU4aW50QXJyYXkgYW5kIGZpbmFsbHkgZG8gdGhlXG4gKiBBcnJheUJ1ZmZlci9CbG9iIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbmFtZSBvZiB0aGUgZmluYWwgdHlwZVxuICogQHBhcmFtIHtTdHJpbmd8VWludDhBcnJheXxCdWZmZXJ9IGNvbnRlbnQgdGhlIGNvbnRlbnQgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgaWYgYXBwbGljYWJsZS5cbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEFycmF5QnVmZmVyfEJ1ZmZlcnxCbG9ifSB0aGUgY29udGVudCBpbiB0aGUgcmlnaHQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1aaXBPdXRwdXQodHlwZSwgY29udGVudCwgbWltZVR5cGUpIHtcbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiIDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5uZXdCbG9iKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlidWZmZXJcIiwgY29udGVudCksIG1pbWVUeXBlKTtcbiAgICAgICAgY2FzZSBcImJhc2U2NFwiIDpcbiAgICAgICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2RlKGNvbnRlbnQpO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1Ubyh0eXBlLCBjb250ZW50KTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgYW4gYXJyYXkgb2YgZGF0YSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGFBcnJheSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBjaHVua3MgdG8gY29uY2F0ZW5hdGVcbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIGNvbmNhdGVuYXRlZCBkYXRhXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhc2tlZCB0eXBlIGlzIHVuc3VwcG9ydGVkXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdCAodHlwZSwgZGF0YUFycmF5KSB7XG4gICAgdmFyIGksIGluZGV4ID0gMCwgcmVzID0gbnVsbCwgdG90YWxMZW5ndGggPSAwO1xuICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbExlbmd0aCArPSBkYXRhQXJyYXlbaV0ubGVuZ3RoO1xuICAgIH1cbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gZGF0YUFycmF5LmpvaW4oXCJcIik7XG4gICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgZGF0YUFycmF5KTtcbiAgICAgICAgY2FzZSBcInVpbnQ4YXJyYXlcIjpcbiAgICAgICAgICAgIHJlcyA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlcy5zZXQoZGF0YUFycmF5W2ldLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gZGF0YUFycmF5W2ldLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChkYXRhQXJyYXkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29uY2F0IDogdW5zdXBwb3J0ZWQgdHlwZSAnXCIgICsgdHlwZSArIFwiJ1wiKTtcbiAgICB9XG59XG5cbi8qKlxuICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAqIGNvbXBsZXRlIGJsb2NrLlxuICogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHRvIHVzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNhbGxiYWNrIGEgY2FsbGJhY2sgY2FsbGVkIG9uIGVhY2ggdXBkYXRlLiBDYWxsZWRcbiAqIHdpdGggb25lIGFyZyA6XG4gKiAtIHRoZSBtZXRhZGF0YSBsaW5rZWQgdG8gdGhlIHVwZGF0ZSByZWNlaXZlZC5cbiAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZShoZWxwZXIsIHVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3Qpe1xuICAgICAgICB2YXIgZGF0YUFycmF5ID0gW107XG4gICAgICAgIHZhciBjaHVua1R5cGUgPSBoZWxwZXIuX2ludGVybmFsVHlwZSxcbiAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBoZWxwZXIuX291dHB1dFR5cGUsXG4gICAgICAgICAgICBtaW1lVHlwZSA9IGhlbHBlci5fbWltZVR5cGU7XG4gICAgICAgIGhlbHBlclxuICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSwgbWV0YSkge1xuICAgICAgICAgICAgZGF0YUFycmF5LnB1c2goZGF0YSk7XG4gICAgICAgICAgICBpZih1cGRhdGVDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKG1ldGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtWmlwT3V0cHV0KHJlc3VsdFR5cGUsIGNvbmNhdChjaHVua1R5cGUsIGRhdGFBcnJheSksIG1pbWVUeXBlKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YUFycmF5ID0gW107XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBbiBoZWxwZXIgdG8gZWFzaWx5IHVzZSB3b3JrZXJzIG91dHNpZGUgb2YgSlNaaXAuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7V29ya2VyfSB3b3JrZXIgdGhlIHdvcmtlciB0byB3cmFwXG4gKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0VHlwZSB0aGUgdHlwZSBvZiBkYXRhIGV4cGVjdGVkIGJ5IHRoZSB1c2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBTdHJlYW1IZWxwZXIod29ya2VyLCBvdXRwdXRUeXBlLCBtaW1lVHlwZSkge1xuICAgIHZhciBpbnRlcm5hbFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgIHN3aXRjaChvdXRwdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJibG9iXCI6XG4gICAgICAgIGNhc2UgXCJhcnJheWJ1ZmZlclwiOlxuICAgICAgICAgICAgaW50ZXJuYWxUeXBlID0gXCJ1aW50OGFycmF5XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIGludGVybmFsbHlcbiAgICAgICAgdGhpcy5faW50ZXJuYWxUeXBlID0gaW50ZXJuYWxUeXBlO1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIHRvIG91dHB1dCByZXN1bHRzXG4gICAgICAgIHRoaXMuX291dHB1dFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgICAgICAvLyB0aGUgbWltZSB0eXBlXG4gICAgICAgIHRoaXMuX21pbWVUeXBlID0gbWltZVR5cGU7XG4gICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChpbnRlcm5hbFR5cGUpO1xuICAgICAgICB0aGlzLl93b3JrZXIgPSB3b3JrZXIucGlwZShuZXcgQ29udmVydFdvcmtlcihpbnRlcm5hbFR5cGUpKTtcbiAgICAgICAgLy8gdGhlIGxhc3Qgd29ya2VycyBjYW4gYmUgcmV3aXJlZCB3aXRob3V0IGlzc3VlcyBidXQgd2UgbmVlZCB0b1xuICAgICAgICAvLyBwcmV2ZW50IGFueSB1cGRhdGVzIG9uIHByZXZpb3VzIHdvcmtlcnMuXG4gICAgICAgIHdvcmtlci5sb2NrKCk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKFwiZXJyb3JcIik7XG4gICAgICAgIHRoaXMuX3dvcmtlci5lcnJvcihlKTtcbiAgICB9XG59XG5cblN0cmVhbUhlbHBlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAgICAgKiBjb21wbGV0ZSBibG9jay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAgICAgKi9cbiAgICBhY2N1bXVsYXRlIDogZnVuY3Rpb24gKHVwZGF0ZUNiKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRlKHRoaXMsIHVwZGF0ZUNiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxpc3RlbmVyIG9uIGFuIGV2ZW50IHRyaWdnZXJlZCBvbiBhIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZ0IHRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHRoZSBsaXN0ZW5lclxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKGV2dCwgZm4pIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmKGV2dCA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoc2VsZiwgY2h1bmsuZGF0YSwgY2h1bmsubWV0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1dGlscy5kZWxheShmbiwgYXJndW1lbnRzLCBzZWxmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3dvcmtlci5yZXN1bWUsIFtdLCB0aGlzLl93b3JrZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICBwYXVzZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyLnBhdXNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbm9kZWpzIHN0cmVhbSBmb3IgdGhpcyBoZWxwZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyfSB0aGUgbm9kZWpzIHN0cmVhbS5cbiAgICAgKi9cbiAgICB0b05vZGVqc1N0cmVhbSA6IGZ1bmN0aW9uICh1cGRhdGVDYikge1xuICAgICAgICB1dGlscy5jaGVja1N1cHBvcnQoXCJub2Rlc3RyZWFtXCIpO1xuICAgICAgICBpZiAodGhpcy5fb3V0cHV0VHlwZSAhPT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIC8vIGFuIG9iamVjdCBzdHJlYW0gY29udGFpbmluZyBibG9iL2FycmF5YnVmZmVyL3VpbnQ4YXJyYXkvc3RyaW5nXG4gICAgICAgICAgICAvLyBpcyBzdHJhbmdlIGFuZCBJIGRvbid0IGtub3cgaWYgaXQgd291bGQgYmUgdXNlZnVsLlxuICAgICAgICAgICAgLy8gSSB5b3UgZmluZCB0aGlzIGNvbW1lbnQgYW5kIGhhdmUgYSBnb29kIHVzZWNhc2UsIHBsZWFzZSBvcGVuIGFcbiAgICAgICAgICAgIC8vIGJ1ZyByZXBvcnQgIVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuX291dHB1dFR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyKHRoaXMsIHtcbiAgICAgICAgICAgIG9iamVjdE1vZGUgOiB0aGlzLl9vdXRwdXRUeXBlICE9PSBcIm5vZGVidWZmZXJcIlxuICAgICAgICB9LCB1cGRhdGVDYik7XG4gICAgfVxufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbUhlbHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5iYXNlNjQgPSB0cnVlO1xuZXhwb3J0cy5hcnJheSA9IHRydWU7XG5leHBvcnRzLnN0cmluZyA9IHRydWU7XG5leHBvcnRzLmFycmF5YnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xuZXhwb3J0cy5ub2RlYnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIjtcbi8vIGNvbnRhaW5zIHRydWUgaWYgSlNaaXAgY2FuIHJlYWQvZ2VuZXJhdGUgVWludDhBcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLlxuZXhwb3J0cy51aW50OGFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG5cbmlmICh0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbn1cbmVsc2Uge1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZXhwb3J0cy5ibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXBwbGljYXRpb24vemlwXCJcbiAgICAgICAgfSkuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIpO1xuICAgICAgICAgICAgZXhwb3J0cy5ibG9iID0gYnVpbGRlci5nZXRCbG9iKCdhcHBsaWNhdGlvbi96aXAnKS5zaXplID09PSAwO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0cy5ub2Rlc3RyZWFtID0gISFyZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlclwiKS5wcm90b3R5cGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKCcuL25vZGVqc1V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi91dGlscy9zdHJpbmdzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaT0wOyBpPDI1NjsgaSsrKSB7XG4gIF91dGY4bGVuW2ldID0gKGkgPj0gMjUyID8gNiA6IGkgPj0gMjQ4ID8gNSA6IGkgPj0gMjQwID8gNCA6IGkgPj0gMjI0ID8gMyA6IGkgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XT1fdXRmOGxlblsyNTRdPTE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxudmFyIHN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICAgICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcysxIDwgc3RyX2xlbikpIHtcbiAgICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MrMSk7XG4gICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgICAgICAgICAgbV9wb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICAgIH1cblxuICAgIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmX2xlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnVmID0gbmV3IEFycmF5KGJ1Zl9sZW4pO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnRcbiAgICBmb3IgKGk9MCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG52YXIgdXRmOGJvcmRlciA9IGZ1bmN0aW9uKGJ1ZiwgbWF4KSB7XG4gICAgdmFyIHBvcztcblxuICAgIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICAgIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAgIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICAgIHBvcyA9IG1heC0xO1xuICAgIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gICAgLy8gRnVja3VwIC0gdmVyeSBzbWFsbCBhbmQgYnJva2VuIHNlcXVlbmNlLFxuICAgIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICAgIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAgIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBtZWFucyB2dWZmZXIgaXMgdG9vIHNtYWxsLFxuICAgIC8vIHJldHVybiBtYXggdG9vLlxuICAgIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgpID8gcG9zIDogbWF4O1xufTtcblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbnZhciBidWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgIHZhciBzdHIsIGksIG91dCwgYywgY19sZW47XG4gICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gICAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gICAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuKjIpO1xuXG4gICAgZm9yIChvdXQ9MCwgaT0wOyBpPGxlbjspIHtcbiAgICAgICAgYyA9IGJ1ZltpKytdO1xuICAgICAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgICAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgaSArPSBjX2xlbi0xOyBjb250aW51ZTsgfVxuXG4gICAgICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAzID8gMHgwZiA6IDB4MDc7XG4gICAgICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICAgICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgICAgICAgIGNfbGVuLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNocmlua0J1Zih1dGYxNmJ1Ziwgb3V0KVxuICAgIGlmICh1dGYxNmJ1Zi5sZW5ndGggIT09IG91dCkge1xuICAgICAgICBpZih1dGYxNmJ1Zi5zdWJhcnJheSkge1xuICAgICAgICAgICAgdXRmMTZidWYgPSB1dGYxNmJ1Zi5zdWJhcnJheSgwLCBvdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXRmMTZidWYubGVuZ3RoID0gb3V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRmMTZidWYpO1xuICAgIHJldHVybiB1dGlscy5hcHBseUZyb21DaGFyQ29kZSh1dGYxNmJ1Zik7XG59O1xuXG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGphdmFzY3JpcHQgc3RyaW5nIGludG8gYW4gYXJyYXkgKHR5cGVkIGlmIHBvc3NpYmxlKSBvZiBieXRlcyxcbiAqIFVURi04IGVuY29kZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIFVURi04IGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhlbmNvZGUgPSBmdW5jdGlvbiB1dGY4ZW5jb2RlKHN0cikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihzdHIsIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZzJidWYoc3RyKTtcbn07XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBieXRlcyBhcnJheSAob3IgYSByZXByZXNlbnRhdGlvbikgcmVwcmVzZW50aW5nIGFuIFVURi04IGVuY29kZWRcbiAqIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBzdHJpbmcuXG4gKiBAcGFyYW0ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSBidWYgdGhlIGRhdGEgZGUgZGVjb2RlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0cy51dGY4ZGVjb2RlID0gZnVuY3Rpb24gdXRmOGRlY29kZShidWYpIHtcbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcIm5vZGVidWZmZXJcIiwgYnVmKS50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGJ1ZiA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBidWYpO1xuXG4gICAgcmV0dXJuIGJ1ZjJzdHJpbmcoYnVmKTtcbn07XG5cbi8qKlxuICogQSB3b3JrZXIgdG8gZGVjb2RlIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzIGludG8gc3RyaW5nIGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBVdGY4RGVjb2RlV29ya2VyKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcInV0Zi04IGRlY29kZVwiKTtcbiAgICAvLyB0aGUgbGFzdCBieXRlcyBpZiBhIGNodW5rIGRpZG4ndCBlbmQgd2l0aCBhIGNvbXBsZXRlIGNvZGVwb2ludC5cbiAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbn1cbnV0aWxzLmluaGVyaXRzKFV0ZjhEZWNvZGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuVXRmOERlY29kZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG5cbiAgICB2YXIgZGF0YSA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBjaHVuay5kYXRhKTtcblxuICAgIC8vIDFzdCBzdGVwLCByZS11c2Ugd2hhdCdzIGxlZnQgb2YgdGhlIHByZXZpb3VzIGNodW5rXG4gICAgaWYgKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgaWYoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNEYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShwcmV2aW91c0RhdGEubGVuZ3RoICsgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5zZXQodGhpcy5sZWZ0T3ZlciwgMCk7XG4gICAgICAgICAgICBkYXRhLnNldChwcmV2aW91c0RhdGEsIHRoaXMubGVmdE92ZXIubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmxlZnRPdmVyLmNvbmNhdChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEJvdW5kYXJ5ID0gdXRmOGJvcmRlcihkYXRhKTtcbiAgICB2YXIgdXNhYmxlRGF0YSA9IGRhdGE7XG4gICAgaWYgKG5leHRCb3VuZGFyeSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc3ViYXJyYXkoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnN1YmFycmF5KG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc2xpY2UoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnNsaWNlKG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh1c2FibGVEYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cblV0ZjhEZWNvZGVXb3JrZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhkZWNvZGUodGhpcy5sZWZ0T3ZlciksXG4gICAgICAgICAgICBtZXRhIDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xuICAgIH1cbn07XG5leHBvcnRzLlV0ZjhEZWNvZGVXb3JrZXIgPSBVdGY4RGVjb2RlV29ya2VyO1xuXG4vKipcbiAqIEEgd29ya2VyIHRvIGVuZGNvZGUgc3RyaW5nIGNodW5rcyBpbnRvIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFV0ZjhFbmNvZGVXb3JrZXIoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwidXRmLTggZW5jb2RlXCIpO1xufVxudXRpbHMuaW5oZXJpdHMoVXRmOEVuY29kZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5VdGY4RW5jb2RlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZW5jb2RlKGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbmV4cG9ydHMuVXRmOEVuY29kZVdvcmtlciA9IFV0ZjhFbmNvZGVXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTtcbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcCcpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIHRoYXQgcGFzcyBhcyBhIFwiYmluYXJ5IHN0cmluZ1wiOiBpdCBzaG91bGQgcmVwcmVzZW50IGEgYnl0ZVxuICogYXJyYXkgYnV0IG1heSBoYXZlID4gMjU1IGNoYXIgY29kZXMuIEJlIHN1cmUgdG8gdGFrZSBvbmx5IHRoZSBmaXJzdCBieXRlXG4gKiBhbmQgcmV0dXJucyB0aGUgYnl0ZSBhcnJheS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fSB0aGUgc3RyaW5nIGluIGEgYmluYXJ5IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nMmJpbmFyeShzdHIpIHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHN0ci5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCByZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBibG9iIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgYW5kIHRoZSBnaXZlbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ9IHBhcnQgdGhlIGNvbnRlbnQgdG8gcHV0IGluIHRoZSBibG9iLiBETyBOT1QgdXNlXG4gKiBhbiBVaW50OEFycmF5IGJlY2F1c2UgdGhlIHN0b2NrIGJyb3dzZXIgb2YgYW5kcm9pZCA0IHdvbid0IGFjY2VwdCBpdCAoaXRcbiAqIHdpbGwgYmUgc2lsZW50bHkgY29udmVydGVkIHRvIGEgc3RyaW5nLCBcIltvYmplY3QgVWludDhBcnJheV1cIikuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBibG9iLlxuICogQHJldHVybiB7QmxvYn0gdGhlIGNyZWF0ZWQgYmxvYi5cbiAqL1xuZXhwb3J0cy5uZXdCbG9iID0gZnVuY3Rpb24ocGFydCwgdHlwZSkge1xuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KFwiYmxvYlwiKTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEJsb2IgY29uc3RydWN0b3JcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtwYXJ0XSwge1xuICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCwgYnJvd3NlciBvbmx5LCBvbGQgd2F5XG4gICAgICAgICAgICB2YXIgQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xuICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydCk7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRCbG9iKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgIC8vIHdlbGwsIGZ1Y2sgPyFcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxufTtcbi8qKlxuICogVGhlIGlkZW50aXR5IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dC5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIHNhbWUgaW5wdXQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYW4gYXJyYXkgd2l0aCBhIHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gZmlsbCBpbiAod2lsbCBiZSBtdXRhdGVkKS5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCBhcnJheSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGFycmF5W2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQW4gaGVscGVyIGZvciB0aGUgZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcuXG4gKiBUaGlzIGNvbnRhaW5zIHN0YXRpYyBpbmZvcm1hdGlvbnMgYW5kIGZ1bmN0aW9ucyB0aGF0XG4gKiBjYW4gYmUgb3B0aW1pemVkIGJ5IHRoZSBicm93c2VyIEpJVCBjb21waWxlci5cbiAqL1xudmFyIGFycmF5VG9TdHJpbmdIZWxwZXIgPSB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGFuIGFycmF5IG9mIGludCBpbnRvIGEgc3RyaW5nLCBjaHVuayBieSBjaHVuay5cbiAgICAgKiBTZWUgdGhlIHBlcmZvcm1hbmNlcyBub3RlcyBvbiBhcnJheUxpa2VUb1N0cmluZy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGNodW5rIHRoZSBjaHVuayBzaXplLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gICAgICogQHRocm93cyBFcnJvciBpZiB0aGUgY2h1bmsgaXMgdG9vIGJpZyBmb3IgdGhlIHN0YWNrLlxuICAgICAqL1xuICAgIHN0cmluZ2lmeUJ5Q2h1bms6IGZ1bmN0aW9uKGFycmF5LCB0eXBlLCBjaHVuaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW10sIGsgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIC8vIHNob3J0Y3V0XG4gICAgICAgIGlmIChsZW4gPD0gY2h1bmspIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiB8fCB0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkuc2xpY2UoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zdWJhcnJheShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrICs9IGNodW5rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGwgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBldmVyeSBpdGVtIGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGlzIGlzIHRoZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggZ2VuZXJhdGUgQSBMT1Qgb2YgaW50ZXJtZWRpYXRlIHN0cmluZy5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGZhaWwuXG4gICAgICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgc3RyaW5naWZ5QnlDaGFyOiBmdW5jdGlvbihhcnJheSl7XG4gICAgICAgIHZhciByZXN1bHRTdHIgPSBcIlwiO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0U3RyO1xuICAgIH0sXG4gICAgYXBwbHlDYW5CZVVzZWQgOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cnVlIGlmIHRoZSBicm93c2VyIGFjY2VwdHMgdG8gdXNlIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gVWludDhBcnJheVxuICAgICAgICAgKi9cbiAgICAgICAgdWludDhhcnJheSA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBub2RlanMgQnVmZmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgbm9kZWJ1ZmZlciA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0Lm5vZGVidWZmZXIgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBub2RlanNVdGlscy5uZXdCdWZmZXIoMSkpLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICB9XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhcnJheS1saWtlIG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvU3RyaW5nKGFycmF5KSB7XG4gICAgLy8gUGVyZm9ybWFuY2VzIG5vdGVzIDpcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpIGlzIHRoZSBmYXN0ZXN0LCBzZWVcbiAgICAvLyBzZWUgaHR0cDovL2pzcGVyZi5jb20vY29udmVydGluZy1hLXVpbnQ4YXJyYXktdG8tYS1zdHJpbmcvMlxuICAgIC8vIGJ1dCB0aGUgc3RhY2sgaXMgbGltaXRlZCAoYW5kIHdlIGNhbiBnZXQgaHVnZSBhcnJheXMgISkuXG4gICAgLy9cbiAgICAvLyByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7IGdlbmVyYXRlIHRvbyBtYW55IHN0cmluZ3MgIVxuICAgIC8vXG4gICAgLy8gVGhpcyBjb2RlIGlzIGluc3BpcmVkIGJ5IGh0dHA6Ly9qc3BlcmYuY29tL2FycmF5YnVmZmVyLXRvLXN0cmluZy1hcHBseS1wZXJmb3JtYW5jZS8yXG4gICAgLy8gVE9ETyA6IHdlIG5vdyBoYXZlIHdvcmtlcnMgdGhhdCBzcGxpdCB0aGUgd29yay4gRG8gd2Ugc3RpbGwgbmVlZCB0aGF0ID9cbiAgICB2YXIgY2h1bmsgPSA2NTUzNixcbiAgICAgICAgdHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGFycmF5KSxcbiAgICAgICAgY2FuVXNlQXBwbHkgPSB0cnVlO1xuICAgIGlmICh0eXBlID09PSBcInVpbnQ4YXJyYXlcIikge1xuICAgICAgICBjYW5Vc2VBcHBseSA9IGFycmF5VG9TdHJpbmdIZWxwZXIuYXBwbHlDYW5CZVVzZWQudWludDhhcnJheTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyO1xuICAgIH1cblxuICAgIGlmIChjYW5Vc2VBcHBseSkge1xuICAgICAgICB3aGlsZSAoY2h1bmsgPiAxKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2h1bmsoYXJyYXksIHR5cGUsIGNodW5rKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjaHVuayA9IE1hdGguZmxvb3IoY2h1bmsgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vIGFwcGx5IG9yIGNodW5rIGVycm9yIDogc2xvdyBhbmQgcGFpbmZ1bCBhbGdvcml0aG1cbiAgICAvLyBkZWZhdWx0IGJyb3dzZXIgb24gYW5kcm9pZCA0LipcbiAgICByZXR1cm4gYXJyYXlUb1N0cmluZ0hlbHBlci5zdHJpbmdpZnlCeUNoYXIoYXJyYXkpO1xufVxuXG5leHBvcnRzLmFwcGx5RnJvbUNoYXJDb2RlID0gYXJyYXlMaWtlVG9TdHJpbmc7XG5cblxuLyoqXG4gKiBDb3B5IHRoZSBkYXRhIGZyb20gYW4gYXJyYXktbGlrZSB0byBhbiBvdGhlciBhcnJheS1saWtlLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXlGcm9tIHRoZSBvcmlnaW4gYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheVRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGljaCB3aWxsIGJlIG11dGF0ZWQuXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIHVwZGF0ZWQgZGVzdGluYXRpb24gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvQXJyYXlMaWtlKGFycmF5RnJvbSwgYXJyYXlUbykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlGcm9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycmF5VG9baV0gPSBhcnJheUZyb21baV07XG4gICAgfVxuICAgIHJldHVybiBhcnJheVRvO1xufVxuXG4vLyBhIG1hdHJpeCBjb250YWluaW5nIGZ1bmN0aW9ucyB0byB0cmFuc2Zvcm0gZXZlcnl0aGluZyBpbnRvIGV2ZXJ5dGhpbmcuXG52YXIgdHJhbnNmb3JtID0ge307XG5cbi8vIHN0cmluZyB0byA/XG50cmFuc2Zvcm1bXCJzdHJpbmdcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVtcInN0cmluZ1wiXVtcInVpbnQ4YXJyYXlcIl0oaW5wdXQpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0Lmxlbmd0aCkpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5IHRvID9cbnRyYW5zZm9ybVtcImFycmF5XCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKG5ldyBVaW50OEFycmF5KGlucHV0KSkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gYXJyYXlidWZmZXIgdG8gP1xudHJhbnNmb3JtW1wiYXJyYXlidWZmZXJcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvU3RyaW5nKG5ldyBVaW50OEFycmF5KGlucHV0KSk7XG4gICAgfSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShuZXcgVWludDhBcnJheShpbnB1dCksIG5ldyBBcnJheShpbnB1dC5ieXRlTGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGlkZW50aXR5LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKTtcbiAgICB9XG59O1xuXG4vLyB1aW50OGFycmF5IHRvID9cbnRyYW5zZm9ybVtcInVpbnQ4YXJyYXlcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBpZGVudGl0eSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gbm9kZWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogaWRlbnRpdHlcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGlucHV0IGludG8gYW55IHR5cGUuXG4gKiBUaGUgc3VwcG9ydGVkIG91dHB1dCB0eXBlIGFyZSA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBub2RlYnVmZmVyLlxuICogSWYgbm8gb3V0cHV0IHR5cGUgaXMgc3BlY2lmaWVkLCB0aGUgdW5tb2RpZmllZCBpbnB1dCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGlucHV0IHRoZSBpbnB1dCB0byBjb252ZXJ0LlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIG91dHB1dCB0eXBlLlxuICovXG5leHBvcnRzLnRyYW5zZm9ybVRvID0gZnVuY3Rpb24ob3V0cHV0VHlwZSwgaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCwgbnVsbCwgZXRjXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b24ndCBoYXJtLlxuICAgICAgICBpbnB1dCA9IFwiXCI7XG4gICAgfVxuICAgIGlmICghb3V0cHV0VHlwZSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KG91dHB1dFR5cGUpO1xuICAgIHZhciBpbnB1dFR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihpbnB1dCk7XG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybVtpbnB1dFR5cGVdW291dHB1dFR5cGVdKGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGlucHV0LlxuICogVGhlIHR5cGUgd2lsbCBiZSBpbiBhIGZvcm1hdCB2YWxpZCBmb3IgSlNaaXAudXRpbHMudHJhbnNmb3JtVG8gOiBzdHJpbmcsIGFycmF5LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQgdG8gaWRlbnRpZnkuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSAobG93ZXJjYXNlKSB0eXBlIG9mIHRoZSBpbnB1dC5cbiAqL1xuZXhwb3J0cy5nZXRUeXBlT2YgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBub2RlanNVdGlscy5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIFwibm9kZWJ1ZmZlclwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5ICYmIGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gXCJ1aW50OGFycmF5XCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LmFycmF5YnVmZmVyICYmIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlidWZmZXJcIjtcbiAgICB9XG59O1xuXG4vKipcbiAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgdHlwZS5cbiAqL1xuZXhwb3J0cy5jaGVja1N1cHBvcnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgdmFyIHN1cHBvcnRlZCA9IHN1cHBvcnRbdHlwZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoIXN1cHBvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLk1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmV4cG9ydHMuTUFYX1ZBTFVFXzMyQklUUyA9IC0xOyAvLyB3ZWxsLCBcIlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcIiBpcyBwYXJzZWQgYXMgLTFcblxuLyoqXG4gKiBQcmV0dGlmeSBhIHN0cmluZyByZWFkIGFzIGJpbmFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBwcmV0dGlmeS5cbiAqIEByZXR1cm4ge3N0cmluZ30gYSBwcmV0dHkgc3RyaW5nLlxuICovXG5leHBvcnRzLnByZXR0eSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciByZXMgPSAnJyxcbiAgICAgICAgY29kZSwgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgKHN0ciB8fCBcIlwiKS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJlcyArPSAnXFxcXHgnICsgKGNvZGUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBEZWZlciB0aGUgY2FsbCBvZiBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYXN5bmNocm9ub3VzbHkuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIHRoZSBhcmd1bWVudHMgdG8gZ2l2ZSB0byB0aGUgY2FsbGJhY2suXG4gKi9cbmV4cG9ydHMuZGVsYXkgPSBmdW5jdGlvbihjYWxsYmFjaywgYXJncywgc2VsZikge1xuICAgIGFzYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjay5hcHBseShzZWxmIHx8IG51bGwsIGFyZ3MgfHwgW10pO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIGEgcHJvdG90eXBlIHdpdGggYW4gb3RoZXIsIHdpdGhvdXQgY2FsbGluZyBhIGNvbnN0cnVjdG9yIHdpdGhcbiAqIHNpZGUgZWZmZWN0cy4gSW5zcGlyZWQgYnkgbm9kZWpzJyBgdXRpbHMuaW5oZXJpdHNgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdG9yIHRoZSBjb25zdHJ1Y3RvciB0byBhdWdtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdXBlckN0b3IgdGhlIHBhcmVudCBjb25zdHJ1Y3RvciB0byB1c2VcbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICB2YXIgT2JqID0gZnVuY3Rpb24oKSB7fTtcbiAgICBPYmoucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBPYmooKTtcbn07XG5cbi8qKlxuICogTWVyZ2UgdGhlIG9iamVjdHMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgaW50byBhIG5ldyBvbmUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsuLi5PYmplY3R9IHZhcl9hcmdzIEFsbCBvYmplY3RzIHRvIG1lcmdlLlxuICogQHJldHVybiB7T2JqZWN0fSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgZGF0YSBvZiB0aGUgb3RoZXJzLlxuICovXG5leHBvcnRzLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSB7fSwgaSwgYXR0cjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IC8vIGFyZ3VtZW50cyBpcyBub3QgZW51bWVyYWJsZSBpbiBzb21lIGJyb3dzZXJzXG4gICAgICAgIGZvciAoYXR0ciBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0uaGFzT3duUHJvcGVydHkoYXR0cikgJiYgdHlwZW9mIHJlc3VsdFthdHRyXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdFthdHRyXSA9IGFyZ3VtZW50c1tpXVthdHRyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYXJiaXRyYXJ5IGNvbnRlbnQgaW50byBhIFByb21pc2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBhIG5hbWUgZm9yIHRoZSBjb250ZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGEgdGhlIGNvbnRlbnQgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCaW5hcnkgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyBub3QgYW4gdW5pY29kZSBzdHJpbmdcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgb25seSBoYXMgb25lIGJ5dGUgcGVyIGNoYXJhY3Rlci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCYXNlNjQgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgaXMgZW5jb2RlZCB3aXRoIGJhc2U2NC5cbiAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSBpbiBhIGZvcm1hdCB1c2FibGUgYnkgSlNaaXAuXG4gKi9cbmV4cG9ydHMucHJlcGFyZUNvbnRlbnQgPSBmdW5jdGlvbihuYW1lLCBpbnB1dERhdGEsIGlzQmluYXJ5LCBpc09wdGltaXplZEJpbmFyeVN0cmluZywgaXNCYXNlNjQpIHtcblxuICAgIHZhciBwcm9taXNlID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC5ibG9iICYmIGlucHV0RGF0YSBpbnN0YW5jZW9mIEJsb2IgJiYgdHlwZW9mIEZpbGVSZWFkZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZS50YXJnZXQuZXJyb3IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpbnB1dERhdGEpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBkYXRhIGlzIGFscmVhZHkgYSBwcm9taXNlLCB0aGlzIGZsYXR0ZW4gaXQuXG4gICAgICAgIHByb21pc2UgPSBleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoaW5wdXREYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIGRhdGFUeXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoZGF0YSk7XG5cbiAgICAgICAgaWYgKCFkYXRhVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcIlRoZSBkYXRhIG9mICdcIiArIG5hbWUgKyBcIicgaXMgaW4gYW4gdW5zdXBwb3J0ZWQgZm9ybWF0ICFcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIDogaXQncyB3YXkgZWFzaWVyIHRvIHdvcmsgd2l0aCBVaW50OEFycmF5IHRoYW4gd2l0aCBBcnJheUJ1ZmZlclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFwiYXJyYXlidWZmZXJcIikge1xuICAgICAgICAgICAgZGF0YSA9IGV4cG9ydHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAoaXNCYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYmFzZTY0LmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQmluYXJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkQmluYXJ5U3RyaW5nID09PSB0cnVlIG1lYW5zIHRoYXQgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBmaWx0ZXJlZCB3aXRoIGEgMHhGRiBtYXNrXG4gICAgICAgICAgICAgICAgaWYgKGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJpbmcsIG5vdCBpbiBhIGJhc2U2NCBmb3JtYXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJlIHN1cmUgdGhhdCB0aGlzIGlzIGEgY29ycmVjdCBcImJpbmFyeSBzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3RyaW5nMmJpbmFyeShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHNpZyA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgWmlwRW50cnkgPSByZXF1aXJlKCcuL3ppcEVudHJ5Jyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vICBjbGFzcyBaaXBFbnRyaWVzIHt7e1xuLyoqXG4gKiBBbGwgdGhlIGVudHJpZXMgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyaWVzKGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIHRoaXMubG9hZE9wdGlvbnMgPSBsb2FkT3B0aW9ucztcbn1cblppcEVudHJpZXMucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIHJlYWRlciBpcyBvbiB0aGUgc3BlZmljaWVkIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRTaWduYXR1cmUgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgaXQgaXMgYW4gb3RoZXIgc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIGNoZWNrU2lnbmF0dXJlOiBmdW5jdGlvbihleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShleHBlY3RlZFNpZ25hdHVyZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLmluZGV4IC09IDQ7XG4gICAgICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgb3IgYnVnIDogdW5leHBlY3RlZCBzaWduYXR1cmUgXCIgKyBcIihcIiArIHV0aWxzLnByZXR0eShzaWduYXR1cmUpICsgXCIsIGV4cGVjdGVkIFwiICsgdXRpbHMucHJldHR5KGV4cGVjdGVkU2lnbmF0dXJlKSArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHNpZ25hdHVyZSBpcyBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFza2VkSW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHRvIGV4cGVjdC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1cmUgaXMgaGVyZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzU2lnbmF0dXJlOiBmdW5jdGlvbihhc2tlZEluZGV4LCBleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGFza2VkSW5kZXgpO1xuICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHNpZ25hdHVyZSA9PT0gZXhwZWN0ZWRTaWduYXR1cmU7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGN1cnJlbnRJbmRleCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRCbG9ja0VuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcblxuICAgICAgICB0aGlzLnppcENvbW1lbnRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAvLyB3YXJuaW5nIDogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGVcbiAgICAgICAgLy8gT24gYSBsaW51eCBtYWNoaW5lIHdpdGggTEFORz1lbl9VUy51dGY4LCB0aGlzIGZpZWxkIGlzIHV0ZjggZW5jb2RlZC5cbiAgICAgICAgLy8gT24gYSB3aW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2NhbGl6ZWQgd2luZG93cyBjb2RlIHBhZ2UuXG4gICAgICAgIHZhciB6aXBDb21tZW50ID0gdGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKTtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICAvLyBUbyBnZXQgY29uc2lzdGVudCBiZWhhdmlvciB3aXRoIHRoZSBnZW5lcmF0aW9uIHBhcnQsIHdlIHdpbGwgYXNzdW1lIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyB1dGY4IGVuY29kZWQgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UuXG4gICAgICAgIHZhciBkZWNvZGVDb250ZW50ID0gdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB6aXBDb21tZW50KTtcbiAgICAgICAgdGhpcy56aXBDb21tZW50ID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShkZWNvZGVDb250ZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgWmlwIDY0IGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqIE5vdCBtZXJnZWQgd2l0aCB0aGUgbWV0aG9kIHJlYWRFbmRPZkNlbnRyYWwgOlxuICAgICAqIFRoZSBlbmQgb2YgY2VudHJhbCBjYW4gY29leGlzdCB3aXRoIGl0cyBaaXA2NCBicm90aGVyLFxuICAgICAqIEkgZG9uJ3Qgd2FudCB0byByZWFkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMgIVxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLnJlYWRlci5za2lwKDQpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25NYWRlQnkgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25OZWVkZWQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpck9mZnNldCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG5cbiAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhID0ge307XG4gICAgICAgIHZhciBleHRyYURhdGFTaXplID0gdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgLSA0NCxcbiAgICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGV4dHJhRGF0YVNpemUpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHRoaXMucmVhZGVyLnJlYWREYXRhKGV4dHJhRmllbGRMZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhW2V4dHJhRmllbGRJZF0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV4dHJhRmllbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvci5cbiAgICAgKi9cbiAgICByZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmRpc2tzQ291bnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICBpZiAodGhpcy5kaXNrc0NvdW50ID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVsdGktdm9sdW1lcyB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGxvY2FsIGZpbGVzLCBiYXNlZCBvbiB0aGUgb2Zmc2V0IHJlYWQgaW4gdGhlIGNlbnRyYWwgcGFydC5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxGaWxlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpLCBmaWxlO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbaV07XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChmaWxlLmxvY2FsSGVhZGVyT2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgICAgICAgICAgIGZpbGUucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlcik7XG4gICAgICAgICAgICBmaWxlLmhhbmRsZVVURjgoKTtcbiAgICAgICAgICAgIGZpbGUucHJvY2Vzc0F0dHJpYnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZENlbnRyYWxEaXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZmlsZTtcblxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgICAgICAgICAgZmlsZSA9IG5ldyBaaXBFbnRyeSh7XG4gICAgICAgICAgICAgICAgemlwNjQ6IHRoaXMuemlwNjRcbiAgICAgICAgICAgIH0sIHRoaXMubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgZmlsZS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpO1xuICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VudHJhbERpclJlY29yZHMgIT09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZW50cmFsRGlyUmVjb3JkcyAhPT0gMCAmJiB0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdGVkIHNvbWUgcmVjb3JkcyBidXQgY291bGRuJ3QgZmluZCBBTlkuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyByZWFsbHkgc3VzcGljaW91cywgYXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkIFwiICsgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyArIFwiIHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCBcIiArIHRoaXMuZmlsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgc29tZSByZWNvcmRzIGJ1dCBub3QgYWxsLlxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZyBidXQgd2UgZ290IHNvbWV0aGluZyBmb3IgdGhlIHVzZXI6IG5vIGVycm9yIGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiZXhwZWN0ZWRcIiwgdGhpcy5jZW50cmFsRGlyUmVjb3JkcywgXCJyZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3RcIiwgdGhpcy5maWxlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEVuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZW50IGlzIGEgdHJ1bmNhdGVkIHppcCBvciBjb21wbGV0ZSBnYXJiYWdlLlxuICAgICAgICAgICAgLy8gQSBcIkxPQ0FMX0ZJTEVfSEVBREVSXCIgaXMgbm90IHJlcXVpcmVkIGF0IHRoZSBiZWdpbm5pbmcgKGF1dG9cbiAgICAgICAgICAgIC8vIGV4dHJhY3RpYmxlIHppcCBmb3IgZXhhbXBsZSkgYnV0IGl0IGNhbiBnaXZlIGEgZ29vZCBoaW50LlxuICAgICAgICAgICAgLy8gSWYgYW4gYWpheCByZXF1ZXN0IHdhcyB1c2VkIHdpdGhvdXQgcmVzcG9uc2VUeXBlLCB3ZSB3aWxsIGFsc29cbiAgICAgICAgICAgIC8vIGdldCB1bnJlYWRhYmxlIGRhdGEuXG4gICAgICAgICAgICB2YXIgaXNHYXJiYWdlID0gIXRoaXMuaXNTaWduYXR1cmUoMCwgc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcblxuICAgICAgICAgICAgaWYgKGlzR2FyYmFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IDogaXMgdGhpcyBhIHppcCBmaWxlID8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklmIGl0IGlzLCBzZWUgaHR0cDovL3N0dWsuZ2l0aHViLmlvL2pzemlwL2RvY3VtZW50YXRpb24vaG93dG8vcmVhZF96aXAuaHRtbFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgdmFyIGVuZE9mQ2VudHJhbERpck9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgdGhpcy5yZWFkQmxvY2tFbmRPZkNlbnRyYWwoKTtcblxuXG4gICAgICAgIC8qIGV4dHJhY3QgZnJvbSB0aGUgemlwIHNwZWMgOlxuICAgICAgICAgICAgNCkgIElmIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICByZWNvcmQgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVxdWlyZWQgZGF0YSwgdGhlIGZpZWxkXG4gICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9yIDB4RkZGRkZGRkYpIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaSVA2NCBmb3JtYXQgcmVjb3JkIHNob3VsZCBiZSBjcmVhdGVkLlxuICAgICAgICAgICAgNSkgIFRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdFxuICAgICAgICAgICAgICAgIHJlc2lkZSBvbiB0aGUgc2FtZSBkaXNrIHdoZW4gc3BsaXR0aW5nIG9yIHNwYW5uaW5nXG4gICAgICAgICAgICAgICAgYW4gYXJjaGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmRpc2tOdW1iZXIgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnppcDY0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIFdhcm5pbmcgOiB0aGUgemlwNjQgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCwgYnV0IE9OTFkgaWYgdGhlIDY0Yml0cyBpbnRlZ2VyIHJlYWQgZnJvbVxuICAgICAgICAgICAgdGhlIHppcCBmaWxlIGNhbiBmaXQgaW50byBhIDMyYml0cyBpbnRlZ2VyLiBUaGlzIGNhbm5vdCBiZSBzb2x2ZWQgOiBKYXZhc2NyaXB0IHJlcHJlc2VudHNcbiAgICAgICAgICAgIGFsbCBudW1iZXJzIGFzIDY0LWJpdCBkb3VibGUgcHJlY2lzaW9uIElFRUUgNzU0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuXG4gICAgICAgICAgICBTbywgd2UgaGF2ZSA1M2JpdHMgZm9yIGludGVnZXJzIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgdHJlYXQgZXZlcnl0aGluZyBhcyAzMmJpdHMuXG4gICAgICAgICAgICBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQml0d2lzZV9PcGVyYXRvcnNcbiAgICAgICAgICAgIGFuZCBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS0yNjIucGRmIHNlY3Rpb24gOC41XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBzaG91bGQgbG9vayBmb3IgYSB6aXA2NCBFT0NEIGxvY2F0b3JcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKTtcblxuICAgICAgICAgICAgLy8gbm93IHRoZSB6aXA2NCBFT0NEIHJlY29yZFxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciwgc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgbm90IHdoZXJlIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcik7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5jZW50cmFsRGlyT2Zmc2V0ICsgdGhpcy5jZW50cmFsRGlyU2l6ZTtcbiAgICAgICAgaWYgKHRoaXMuemlwNjQpIHtcbiAgICAgICAgICAgIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ICs9IDIwOyAvLyBlbmQgb2YgY2VudHJhbCBkaXIgNjQgbG9jYXRvclxuICAgICAgICAgICAgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgKz0gMTIgLyogc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nIDEyIGJ5dGVzICovICsgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXh0cmFCeXRlcyA9IGVuZE9mQ2VudHJhbERpck9mZnNldCAtIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0O1xuXG4gICAgICAgIGlmIChleHRyYUJ5dGVzID4gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGV4dHJhQnl0ZXMsIFwiZXh0cmEgYnl0ZXMgYXQgYmVnaW5uaW5nIG9yIHdpdGhpbiB6aXBmaWxlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWduYXR1cmUoZW5kT2ZDZW50cmFsRGlyT2Zmc2V0LCBzaWcuQ0VOVFJBTF9GSUxFX0hFQURFUikpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb2Zmc2V0cyBzZWVtIHdyb25nLCBidXQgd2UgaGF2ZSBzb21ldGhpbmcgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuXG4gICAgICAgICAgICAgICAgLy8gU2/igKYgd2Uga2VlcCBpdC5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9mZnNldCBpcyB3cm9uZywgdXBkYXRlIHRoZSBcInplcm9cIiBvZiB0aGUgcmVhZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGRhdGEgaGFzIGJlZW4gcHJlcGVuZGVkIChjcnggZmlsZXMgZm9yIGV4YW1wbGUpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIuemVybyA9IGV4dHJhQnl0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXA6IG1pc3NpbmcgXCIgKyBNYXRoLmFicyhleHRyYUJ5dGVzKSArIFwiIGJ5dGVzLlwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHJlcGFyZVJlYWRlcjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlckZvcihkYXRhKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgYSB6aXAgZmlsZSBhbmQgY3JlYXRlIFppcEVudHJpZXMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgemlwIGZpbGUuXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnByZXBhcmVSZWFkZXIoZGF0YSk7XG4gICAgICAgIHRoaXMucmVhZEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB0aGlzLnJlYWRDZW50cmFsRGlyKCk7XG4gICAgICAgIHRoaXMucmVhZExvY2FsRmlsZXMoKTtcbiAgICB9XG59O1xuLy8gfX19IGVuZCBvZiBaaXBFbnRyaWVzXG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJpZXM7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVhZGVyRm9yID0gcmVxdWlyZSgnLi9yZWFkZXIvcmVhZGVyRm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIGNyYzMyZm4gPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIGNvbXByZXNzaW9ucyA9IHJlcXVpcmUoJy4vY29tcHJlc3Npb25zJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuXG52YXIgTUFERV9CWV9ET1MgPSAweDAwO1xudmFyIE1BREVfQllfVU5JWCA9IDB4MDM7XG5cbi8qKlxuICogRmluZCBhIGNvbXByZXNzaW9uIHJlZ2lzdGVyZWQgaW4gSlNaaXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcHJlc3Npb25NZXRob2QgdGhlIG1ldGhvZCBtYWdpYyB0byBmaW5kLlxuICogQHJldHVybiB7T2JqZWN0fG51bGx9IHRoZSBKU1ppcCBjb21wcmVzc2lvbiBvYmplY3QsIG51bGwgaWYgbm9uZSBmb3VuZC5cbiAqL1xudmFyIGZpbmRDb21wcmVzc2lvbiA9IGZ1bmN0aW9uKGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgZm9yICh2YXIgbWV0aG9kIGluIGNvbXByZXNzaW9ucykge1xuICAgICAgICBpZiAoIWNvbXByZXNzaW9ucy5oYXNPd25Qcm9wZXJ0eShtZXRob2QpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHJlc3Npb25zW21ldGhvZF0ubWFnaWMgPT09IGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHJlc3Npb25zW21ldGhvZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vLyBjbGFzcyBaaXBFbnRyeSB7e3tcbi8qKlxuICogQW4gZW50cnkgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSBjdXJyZW50IGZpbGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyeShvcHRpb25zLCBsb2FkT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cnkucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0VuY3J5cHRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDAwMSkgPT09IDB4MDAwMTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBoYXMgdXRmLTggZmlsZW5hbWUvY29tbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlbmFtZS9jb21tZW50IGlzIGluIHV0Zi04LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXNlVVRGODogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxMSBpcyBzZXRcbiAgICAgICAgcmV0dXJuICh0aGlzLmJpdEZsYWcgJiAweDA4MDApID09PSAweDA4MDA7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBsb2NhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxQYXJ0OiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uLCBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoO1xuXG4gICAgICAgIC8vIHdlIGFscmVhZHkga25vdyBldmVyeXRoaW5nIGZyb20gdGhlIGNlbnRyYWwgZGlyICFcbiAgICAgICAgLy8gSWYgdGhlIGNlbnRyYWwgZGlyIGRhdGEgYXJlIGZhbHNlLCB3ZSBhcmUgZG9vbWVkLlxuICAgICAgICAvLyBPbiB0aGUgYnJpZ2h0IHNpZGUsIHRoZSBsb2NhbCBwYXJ0IGlzIHNjYXJ5ICA6IHppcDY0LCBkYXRhIGRlc2NyaXB0b3JzLCBib3RoLCBldGMuXG4gICAgICAgIC8vIFRoZSBsZXNzIGRhdGEgd2UgZ2V0IGhlcmUsIHRoZSBtb3JlIHJlbGlhYmxlIHRoaXMgc2hvdWxkIGJlLlxuICAgICAgICAvLyBMZXQncyBza2lwIHRoZSB3aG9sZSBoZWFkZXIgYW5kIGRhc2ggdG8gdGhlIGRhdGEgIVxuICAgICAgICByZWFkZXIuc2tpcCgyMik7XG4gICAgICAgIC8vIGluIHNvbWUgemlwIGNyZWF0ZWQgb24gd2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCBkaXIgY29udGFpbnMgXFwgaW5zdGVhZCBvZiAvLlxuICAgICAgICAvLyBTdHJhbmdlbHksIHRoZSBmaWxlbmFtZSBoZXJlIGlzIE9LLlxuICAgICAgICAvLyBJIHdvdWxkIGxvdmUgdG8gdHJlYXQgdGhlc2UgemlwIGZpbGVzIGFzIGNvcnJ1cHRlZCAoc2VlIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzXG4gICAgICAgIC8vIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCBnZW5lcmF0b3JzLi4uXG4gICAgICAgIC8vIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGggXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiIG9uXG4gICAgICAgIC8vIHRoZSBpbnRlcm5ldC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSB0aGluayBJIHNlZSB0aGUgbG9naWMgaGVyZSA6IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGRpc3BsYXlcbiAgICAgICAgLy8gY29udGVudCBhbmQgdGhlIGxvY2FsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGZpbGVzLiBNaXhpbmcgLyBhbmQgXFxcbiAgICAgICAgLy8gbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBcXCB0byB3aW5kb3dzIHVzZXJzIGFuZCB1c2UgLyB3aGVuIGV4dHJhY3RpbmcgdGhlIGZpbGVzLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGxlYWQgYWxzbyB0byBzb21lIGlzc3VlcyA6IGh0dHA6Ly9zZWNsaXN0cy5vcmcvZnVsbGRpc2Nsb3N1cmUvMjAwOS9TZXAvMzk0XG4gICAgICAgIHRoaXMuZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgbG9jYWxFeHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpOyAvLyBjYW4ndCBiZSBzdXJlIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgY2VudHJhbCBkaXJcbiAgICAgICAgLy8gdGhlIGZpbGVOYW1lIGlzIHN0b3JlZCBhcyBiaW5hcnkgZGF0YSwgdGhlIGhhbmRsZVVURjggbWV0aG9kIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBlbmNvZGluZy5cbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKTtcbiAgICAgICAgcmVhZGVyLnNraXAobG9jYWxFeHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb25zIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IFwiICsgXCIoY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHVuY29tcHJlc3NlZFNpemUgPT09IC0xKVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXByZXNzaW9uID0gZmluZENvbXByZXNzaW9uKHRoaXMuY29tcHJlc3Npb25NZXRob2QpO1xuICAgICAgICBpZiAoY29tcHJlc3Npb24gPT09IG51bGwpIHsgLy8gbm8gY29tcHJlc3Npb24gZm91bmRcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiBcIiArIHV0aWxzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSArIFwiIHVua25vd24gKGlubmVyIGZpbGUgOiBcIiArIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMuZmlsZU5hbWUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVjb21wcmVzc2VkID0gbmV3IENvbXByZXNzZWRPYmplY3QodGhpcy5jb21wcmVzc2VkU2l6ZSwgdGhpcy51bmNvbXByZXNzZWRTaXplLCB0aGlzLmNyYzMyLCBjb21wcmVzc2lvbiwgcmVhZGVyLnJlYWREYXRhKHRoaXMuY29tcHJlc3NlZFNpemUpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB0aGlzLnZlcnNpb25NYWRlQnkgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgcmVhZGVyLnNraXAoMik7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmJpdEZsYWcgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9IHJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICB0aGlzLmRhdGUgPSByZWFkZXIucmVhZERhdGUoKTtcbiAgICAgICAgdGhpcy5jcmMzMiA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmZpbGVDb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IHJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRW5jcnlwdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aWxsIGJlIHJlYWQgaW4gdGhlIGxvY2FsIHBhcnQsIHNlZSB0aGUgY29tbWVudHMgdGhlcmVcbiAgICAgICAgcmVhZGVyLnNraXAoZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICB0aGlzLnJlYWRFeHRyYUZpZWxkcyhyZWFkZXIpO1xuICAgICAgICB0aGlzLnBhcnNlWklQNjRFeHRyYUZpZWxkKHJlYWRlcik7XG4gICAgICAgIHRoaXMuZmlsZUNvbW1lbnQgPSByZWFkZXIucmVhZERhdGEodGhpcy5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgYW5kIGdldCB0aGUgdW5peC9kb3MgcGVybWlzc2lvbnMuXG4gICAgICovXG4gICAgcHJvY2Vzc0F0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBudWxsO1xuICAgICAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiAgICAgICAgdmFyIG1hZGVCeSA9IHRoaXMudmVyc2lvbk1hZGVCeSA+PiA4O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgdGhlIERPUyBkaXJlY3RvcnkgZmxhZyBzZXQuXG4gICAgICAgIC8vIFdlIGxvb2sgZm9yIGl0IGluIHRoZSBET1MgYW5kIFVOSVggcGVybWlzc2lvbnNcbiAgICAgICAgLy8gYnV0IHNvbWUgdW5rbm93biBwbGF0Zm9ybSBjb3VsZCBzZXQgaXQgYXMgYSBjb21wYXRpYmlsaXR5IGZsYWcuXG4gICAgICAgIHRoaXMuZGlyID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9ET1MpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IDYgYml0cyAoMCB0byA1KVxuICAgICAgICAgICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyAmIDB4M0Y7XG4gICAgICAgIH1cblxuICAgICAgICBpZihtYWRlQnkgPT09IE1BREVfQllfVU5JWCkge1xuICAgICAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSAodGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4RkZGRjtcbiAgICAgICAgICAgIC8vIHRoZSBvY3RhbCBwZXJtaXNzaW9ucyBhcmUgaW4gKHRoaXMudW5peFBlcm1pc3Npb25zICYgMHgwMUZGKS50b1N0cmluZyg4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZhaWwgc2FmZSA6IGlmIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC8gaXQgcHJvYmFibHkgbWVhbnMgYSBmb2xkZXJcbiAgICAgICAgaWYgKCF0aGlzLmRpciAmJiB0aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIFpJUDY0IGV4dHJhIGZpZWxkIGFuZCBtZXJnZSB0aGUgaW5mbyBpbiB0aGUgY3VycmVudCBaaXBFbnRyeS5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICBwYXJzZVpJUDY0RXh0cmFGaWVsZDogZnVuY3Rpb24ocmVhZGVyKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNob3VsZCBiZSBzb21ldGhpbmcsIHByZXBhcmluZyB0aGUgZXh0cmEgcmVhZGVyXG4gICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0udmFsdWUpO1xuXG4gICAgICAgIC8vIEkgcmVhbGx5IGhvcGUgdGhhdCB0aGVzZSA2NGJpdHMgaW50ZWdlciBjYW4gZml0IGluIDMyIGJpdHMgaW50ZWdlciwgYmVjYXVzZSBqc1xuICAgICAgICAvLyB3b24ndCBsZXQgdXMgaGF2ZSBtb3JlLlxuICAgICAgICBpZiAodGhpcy51bmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2NhbEhlYWRlck9mZnNldCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2tOdW1iZXJTdGFydCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZEV4dHJhRmllbGRzOiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRlci5pbmRleCArIHRoaXMuZXh0cmFGaWVsZHNMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5leHRyYUZpZWxkcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHJlYWRlci5pbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgZXh0cmFGaWVsZElkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWUgPSByZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuZXh0cmFGaWVsZHNbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBcHBseSBhbiBVVEY4IHRyYW5zZm9ybWF0aW9uIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBoYW5kbGVVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICBpZiAodGhpcy51c2VVVEY4KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdXRmOC51dGY4ZGVjb2RlKHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHVwYXRoID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoKCk7XG4gICAgICAgICAgICBpZiAodXBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdXBhdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFTQ0lJIHRleHQgb3IgdW5zdXBwb3J0ZWQgY29kZSBwYWdlXG4gICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lQnl0ZUFycmF5ID0gIHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgdGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoZmlsZU5hbWVCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdWNvbW1lbnQgPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh1Y29tbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB1Y29tbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2VcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudEJ5dGVBcnJheSA9ICB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGNvbW1lbnRCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgcGF0aCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIHBhdGgsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdXBhdGhGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg3MDc1XTtcbiAgICAgICAgaWYgKHVwYXRoRmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1cGF0aEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgZmlsZW5hbWUgY2hhbmdlZCwgdGhpcyBmaWVsZCBpcyBvdXQgb2YgZGF0ZS5cbiAgICAgICAgICAgIGlmIChjcmMzMmZuKHRoaXMuZmlsZU5hbWUpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGY4LnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZERhdGEodXBhdGhGaWVsZC5sZW5ndGggLSA1KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgY29tbWVudCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIGNvbW1lbnQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdWNvbW1lbnRGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg2Mzc1XTtcbiAgICAgICAgaWYgKHVjb21tZW50RmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1Y29tbWVudEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgY29tbWVudCBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGNyYzMyZm4odGhpcy5maWxlQ29tbWVudCkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1Y29tbWVudEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBaaXBFbnRyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgc2ltcGxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICovXG52YXIgWmlwT2JqZWN0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kaXIgPSBvcHRpb25zLmRpcjtcbiAgICB0aGlzLmRhdGUgPSBvcHRpb25zLmRhdGU7XG4gICAgdGhpcy5jb21tZW50ID0gb3B0aW9ucy5jb21tZW50O1xuICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gb3B0aW9ucy51bml4UGVybWlzc2lvbnM7XG4gICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IG9wdGlvbnMuZG9zUGVybWlzc2lvbnM7XG5cbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl9kYXRhQmluYXJ5ID0gb3B0aW9ucy5iaW5hcnk7XG4gICAgLy8ga2VlcCBvbmx5IHRoZSBjb21wcmVzc2lvblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY29tcHJlc3Npb24gOiBvcHRpb25zLmNvbXByZXNzaW9uLFxuICAgICAgICBjb21wcmVzc2lvbk9wdGlvbnMgOiBvcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc1xuICAgIH07XG59O1xuXG5aaXBPYmplY3QucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnRlcm5hbCBzdHJlYW0gZm9yIHRoZSBjb250ZW50IG9mIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGVhY2ggY2h1bmsuXG4gICAgICogQHJldHVybiBTdHJlYW1IZWxwZXIgdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBpbnRlcm5hbFN0cmVhbTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIG91dHB1dFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBhc2tVbmljb2RlU3RyaW5nID0gb3V0cHV0VHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBvdXRwdXRUeXBlID09PSBcInRleHRcIjtcbiAgICAgICAgaWYgKG91dHB1dFR5cGUgPT09IFwiYmluYXJ5c3RyaW5nXCIgfHwgb3V0cHV0VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7XG5cbiAgICAgICAgdmFyIGlzVW5pY29kZVN0cmluZyA9ICF0aGlzLl9kYXRhQmluYXJ5O1xuXG4gICAgICAgIGlmIChpc1VuaWNvZGVTdHJpbmcgJiYgIWFza1VuaWNvZGVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhFbmNvZGVXb3JrZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuaWNvZGVTdHJpbmcgJiYgYXNrVW5pY29kZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOERlY29kZVdvcmtlcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtSGVscGVyKHJlc3VsdCwgb3V0cHV0VHlwZSwgXCJcIik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIGNvbnRlbnQgaW4gdGhlIGFza2VkIHR5cGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIG9mIHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmM6IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbSh0eXBlKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgY29udGVudCBhcyBhIG5vZGVqcyBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBTdHJlYW0gdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBub2RlU3RyZWFtOiBmdW5jdGlvbiAodHlwZSwgb25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0odHlwZSB8fCBcIm5vZGVidWZmZXJcIikudG9Ob2RlanNTdHJlYW0ob25VcGRhdGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB3b3JrZXIgZm9yIHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdCB0byB1c2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy5cbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIC8vIF9jb21wcmVzc1dvcmtlcjogZnVuY3Rpb24gKGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICAvLyAgICAgaWYgKFxuICAgIC8vICAgICAgICAgdGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuX2RhdGEuY29tcHJlc3Npb24ubWFnaWMgPT09IGNvbXByZXNzaW9uLm1hZ2ljXG4gICAgLy8gICAgICkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtcbiAgICAvLyAgICAgICAgIGlmKCF0aGlzLl9kYXRhQmluYXJ5KSB7XG4gICAgLy8gICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIHJldHVybiBDb21wcmVzc2VkT2JqZWN0LmNyZWF0ZVdvcmtlckZyb20ocmVzdWx0LCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgd29ya2VyIGZvciB0aGUgZGVjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIF9kZWNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgR2VuZXJpY1dvcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIodGhpcy5fZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgcmVtb3ZlZE1ldGhvZHMgPSBbXCJhc1RleHRcIiwgXCJhc0JpbmFyeVwiLCBcImFzTm9kZUJ1ZmZlclwiLCBcImFzVWludDhBcnJheVwiLCBcImFzQXJyYXlCdWZmZXJcIl07XG52YXIgcmVtb3ZlZEZuID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xufTtcblxuZm9yKHZhciBpID0gMDsgaSA8IHJlbW92ZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgWmlwT2JqZWN0LnByb3RvdHlwZVtyZW1vdmVkTWV0aG9kc1tpXV0gPSByZW1vdmVkRm47XG59XG5tb2R1bGUuZXhwb3J0cyA9IFppcE9iamVjdDtcbiIsIi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSByZXF1aXJlKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9kZWZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcblxudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5XG4gKlxuICogQ29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbRGVmbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pICBvciBpZiB5b3VcbiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aFxuICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgZGVmbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFlvdSB3aWxsIG5vdCBuZWVkIGl0IGluIHJlYWwgbGlmZSwgYmVjYXVzZSBkZWZsYXRlIGVycm9yc1xuICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBiYWQgYG9uRGF0YWAgLyBgb25FbmRgXG4gKiBjdXN0b20gaGFuZGxlcnMuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tEZWZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgbGV2ZWxgXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgbWVtTGV2ZWxgXG4gKiAtIGBzdHJhdGVneWBcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGRlZmxhdGVcbiAqIC0gYGd6aXBgIChCb29sZWFuKSAtIGNyZWF0ZSBnemlwIHdyYXBwZXJcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKiAtIGBoZWFkZXJgIChPYmplY3QpIC0gY3VzdG9tIGhlYWRlciBmb3IgZ3ppcFxuICogICAtIGB0ZXh0YCAoQm9vbGVhbikgLSB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0XG4gKiAgIC0gYHRpbWVgIChOdW1iZXIpIC0gbW9kaWZpY2F0aW9uIHRpbWUsIHVuaXggdGltZXN0YW1wXG4gKiAgIC0gYG9zYCAoTnVtYmVyKSAtIG9wZXJhdGlvbiBzeXN0ZW0gY29kZVxuICogICAtIGBleHRyYWAgKEFycmF5KSAtIGFycmF5IG9mIGJ5dGVzIHdpdGggZXh0cmEgZGF0YSAobWF4IDY1NTM2KVxuICogICAtIGBuYW1lYCAoU3RyaW5nKSAtIGZpbGUgbmFtZSAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgY29tbWVudGAgKFN0cmluZykgLSBjb21tZW50IChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBoY3JjYCAoQm9vbGVhbikgLSB0cnVlIGlmIGhlYWRlciBjcmMgc2hvdWxkIGJlIGFkZGVkXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBVaW50OEFycmF5KFsxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOV0pO1xuICpcbiAqIHZhciBkZWZsYXRlID0gbmV3IHBha28uRGVmbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogZGVmbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogZGVmbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoZGVmbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGRlZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGRlZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gRGVmbGF0ZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlKSkgcmV0dXJuIG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTixcbiAgICBtZXRob2Q6IFpfREVGTEFURUQsXG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAxNSxcbiAgICBtZW1MZXZlbDogOCxcbiAgICBzdHJhdGVneTogWl9ERUZBVUxUX1NUUkFURUdZLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+IDApKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmIChvcHQuZ3ppcCAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAxNjtcbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQubGV2ZWwsXG4gICAgb3B0Lm1ldGhvZCxcbiAgICBvcHQud2luZG93Qml0cyxcbiAgICBvcHQubWVtTGV2ZWwsXG4gICAgb3B0LnN0cmF0ZWd5XG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICBpZiAob3B0LmhlYWRlcikge1xuICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7XG4gIH1cblxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICB2YXIgZGljdDtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBkaWN0ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWN0ID0gb3B0LmRpY3Rpb25hcnk7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7XG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICAgIH1cblxuICAgIHRoaXMuX2RpY3Rfc2V0ID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIERlZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhLiBTdHJpbmdzIHdpbGwgYmVcbiAqICAgY29udmVydGVkIHRvIHV0ZjggYnl0ZSBzZXF1ZW5jZS5cbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbRGVmbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGFycmF5IGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCB8fCBfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MuYnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpO1xuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChaX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBkZWZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBvbmNlIGFmdGVyIHlvdSB0ZWxsIGRlZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGRlZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENvbXByZXNzIGBkYXRhYCB3aXRoIGRlZmxhdGUgYWxnb3JpdGhtIGFuZCBgb3B0aW9uc2AuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gbGV2ZWxcbiAqIC0gd2luZG93Qml0c1xuICogLSBtZW1MZXZlbFxuICogLSBzdHJhdGVneVxuICogLSBkaWN0aW9uYXJ5XG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgZGF0YSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSk7XG4gKlxuICogY29uc29sZS5sb2cocGFrby5kZWZsYXRlKGRhdGEpKTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICBkZWZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoZGVmbGF0b3IuZXJyKSB7IHRocm93IGRlZmxhdG9yLm1zZzsgfVxuXG4gIHJldHVybiBkZWZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBkZWZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiBnemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCBvZlxuICogZGVmbGF0ZSBvbmUuXG4gKiovXG5mdW5jdGlvbiBnemlwKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmd6aXAgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuZXhwb3J0cy5EZWZsYXRlID0gRGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVSYXcgPSBkZWZsYXRlUmF3O1xuZXhwb3J0cy5nemlwID0gZ3ppcDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZSgnLi96bGliL2luZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIGMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9jb25zdGFudHMnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xudmFyIEdaaGVhZGVyICAgICA9IHJlcXVpcmUoJy4vemxpYi9nemhlYWRlcicpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIGNsYXNzIEluZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tpbmZsYXRlXV1cbiAqIGFuZCBbW2luZmxhdGVSYXddXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIGluZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0luZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICpcbiAqIFVuY29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbSW5mbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbSW5mbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGluZmxhdGUgPSBuZXcgcGFrby5JbmZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBpbmZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBpbmZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChpbmZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBJbmZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDAsXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgLy8gRm9yY2Ugd2luZG93IHNpemUgZm9yIGByYXdgIGRhdGEsIGlmIG5vdCBzZXQgZGlyZWN0bHksXG4gIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMgPSAtMTU7IH1cbiAgfVxuXG4gIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikgJiZcbiAgICAgICEob3B0aW9ucyAmJiBvcHRpb25zLndpbmRvd0JpdHMpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7XG4gIH1cblxuICAvLyBHemlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHlcbiAgLy8gZm9yIGRlZmxhdGUuIFNvLCBpZiB3aW5kb3cgc2l6ZSBub3Qgc2V0LCBmb3JjZSBpdCB0byBtYXggd2hlbiBnemlwIHBvc3NpYmxlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPiAxNSkgJiYgKG9wdC53aW5kb3dCaXRzIDwgNDgpKSB7XG4gICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGFcbiAgICAvLyBiaXQgNCAoMzIpIC0+IGF1dG9kZXRlY3QgZ3ppcC9kZWZsYXRlXG4gICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkge1xuICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtICAgPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC53aW5kb3dCaXRzXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7XG5cbiAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG59XG5cbi8qKlxuICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGFcbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBpbmZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tJbmZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tJbmZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0luZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuICB2YXIgbmV4dF9vdXRfdXRmOCwgdGFpbCwgdXRmOHN0cjtcbiAgdmFyIGRpY3Q7XG5cbiAgLy8gRmxhZyB0byBwcm9wZXJseSBwcm9jZXNzIFpfQlVGX0VSUk9SIG9uIHRlc3RpbmcgaW5mbGF0ZSBjYWxsXG4gIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2FzIGZsdXNoZWQuXG4gIHZhciBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgICAgaWYgKHR5cGVvZiBkaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShkaWN0aW9uYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpY3QgPSBkaWN0aW9uYXJ5O1xuICAgICAgfVxuXG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gYy5aX09LO1xuICAgICAgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5uZXh0X291dCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBjLlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICAgIG5leHRfb3V0X3V0ZjggPSBzdHJpbmdzLnV0Zjhib3JkZXIoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpO1xuXG4gICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpO1xuXG4gICAgICAgICAgLy8gbW92ZSB0YWlsXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsO1xuICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH1cblxuICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vIG1vcmUgaW5wdXQgZGF0YSwgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaW50ZXJuYWwgaW5mbGF0ZSBidWZmZXJzXG4gICAgLy8gYXJlIGZsdXNoZWQuIFRoZSBvbmx5IHdheSB0byBkbyBpdCB3aGVuIGF2YWlsX291dCA9IDAgLSBydW4gb25lIG1vcmVcbiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JVRl9FUlJPUi5cbiAgICAvLyBIZXJlIHdlIHNldCBmbGFnIHRvIHByb2Nlc3MgdGhpcyBlcnJvciBwcm9wZXJseS5cbiAgICAvL1xuICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaFxuICAgIC8vIGxvZ2ljLlxuICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTtcblxuICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkge1xuICAgIF9tb2RlID0gYy5aX0ZJTklTSDtcbiAgfVxuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChjLlpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIGVpdGhlciBhZnRlciB5b3UgdGVsbCBpbmZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgb2JqW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG5cbi8vIHJlZHVjZSBidWZmZXIgc2l6ZSwgYXZvaWRpbmcgbWVtIGNvcHlcbmV4cG9ydHMuc2hyaW5rQnVmID0gZnVuY3Rpb24gKGJ1Ziwgc2l6ZSkge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9XG4gIGlmIChidWYuc3ViYXJyYXkpIHsgcmV0dXJuIGJ1Zi5zdWJhcnJheSgwLCBzaXplKTsgfVxuICBidWYubGVuZ3RoID0gc2l6ZTtcbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxudmFyIGZuVHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG4iLCIvLyBTdHJpbmcgZW5jb2RlL2RlY29kZSBoZWxwZXJzXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG4vLyBRdWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uXG4vL1xuLy8gLSBhcHBseShBcnJheSkgY2FuIGZhaWwgb24gQW5kcm9pZCAyLjJcbi8vIC0gYXBwbHkoVWludDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcnlcbi8vXG52YXIgU1RSX0FQUExZX09LID0gdHJ1ZTtcbnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBbIDAgXSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9PSyA9IGZhbHNlOyB9XG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOyB9XG5cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgdXRpbHMuQnVmOCgyNTYpO1xuZm9yICh2YXIgcSA9IDA7IHEgPCAyNTY7IHErKykge1xuICBfdXRmOGxlbltxXSA9IChxID49IDI1MiA/IDYgOiBxID49IDI0OCA/IDUgOiBxID49IDI0MCA/IDQgOiBxID49IDIyNCA/IDMgOiBxID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTRdID0gMTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgfVxuXG4gIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICBidWYgPSBuZXcgdXRpbHMuQnVmOChidWZfbGVuKTtcblxuICAvLyBjb252ZXJ0XG4gIGZvciAoaSA9IDAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgIGJ1ZltpKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG4vLyBIZWxwZXIgKHVzZWQgaW4gMiBwbGFjZXMpXG5mdW5jdGlvbiBidWYyYmluc3RyaW5nKGJ1ZiwgbGVuKSB7XG4gIC8vIHVzZSBmYWxsYmFjayBmb3IgYmlnIGFycmF5cyB0byBhdm9pZCBzdGFjayBvdmVyZmxvd1xuICBpZiAobGVuIDwgNjU1MzcpIHtcbiAgICBpZiAoKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LKSB8fCAoIWJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfT0spKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGlscy5zaHJpbmtCdWYoYnVmLCBsZW4pKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gQ29udmVydCBieXRlIGFycmF5IHRvIGJpbmFyeSBzdHJpbmdcbmV4cG9ydHMuYnVmMmJpbnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHtcbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcoYnVmLCBidWYubGVuZ3RoKTtcbn07XG5cblxuLy8gQ29udmVydCBiaW5hcnkgc3RyaW5nICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuYmluc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KHN0ci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbmV4cG9ydHMuYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgaSwgb3V0LCBjLCBjX2xlbjtcbiAgdmFyIGxlbiA9IG1heCB8fCBidWYubGVuZ3RoO1xuXG4gIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuXG4gIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4gKiAyKTtcblxuICBmb3IgKG91dCA9IDAsIGkgPSAwOyBpIDwgbGVuOykge1xuICAgIGMgPSBidWZbaSsrXTtcbiAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICBjX2xlbiA9IF91dGY4bGVuW2NdO1xuICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuIC0gMTsgY29udGludWU7IH1cblxuICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgIGNfbGVuLS07XG4gICAgfVxuXG4gICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgIH0gZWxzZSB7XG4gICAgICBjIC09IDB4MTAwMDA7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcodXRmMTZidWYsIG91dCk7XG59O1xuXG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG5leHBvcnRzLnV0Zjhib3JkZXIgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIHBvcztcblxuICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDtcbiAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICBwb3MgPSBtYXggLSAxO1xuICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gIC8vIHJldHVybiBtYXggdG9vLlxuICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiBhZGxlcjMyIHRha2VzIDEyJSBmb3IgbGV2ZWwgMCBhbmQgMiUgZm9yIGxldmVsIDYuXG4vLyBJdCBkb2Vzbid0IHdvcnRoIHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25hIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG5mdW5jdGlvbiBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciBzMSA9IChhZGxlciAmIDB4ZmZmZikgfDAsXG4gICAgICBzMiA9ICgoYWRsZXIgPj4+IDE2KSAmIDB4ZmZmZikgfDAsXG4gICAgICBuID0gMDtcblxuICB3aGlsZSAobGVuICE9PSAwKSB7XG4gICAgLy8gU2V0IGxpbWl0IH4gdHdpY2UgbGVzcyB0aGFuIDU1NTIsIHRvIGtlZXBcbiAgICAvLyBzMiBpbiAzMS1iaXRzLCBiZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLlxuICAgIC8vIGluIG90aGVyIGNhc2UgJT0gd2lsbCBmYWlsLlxuICAgIG4gPSBsZW4gPiAyMDAwID8gMjAwMCA6IGxlbjtcbiAgICBsZW4gLT0gbjtcblxuICAgIGRvIHtcbiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7XG4gICAgICBzMiA9IChzMiArIHMxKSB8MDtcbiAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgczEgJT0gNjU1MjE7XG4gICAgczIgJT0gNjU1MjE7XG4gIH1cblxuICByZXR1cm4gKHMxIHwgKHMyIDw8IDE2KSkgfDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgIGNhc2UgSEVBRDpcbiAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuXG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICBiaXRzIC09IDQ7XG4gICAgICAvLy0tLS8vXG4gICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIEZMQUdTOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUSU1FOlxuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgIC8vPT09XG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE9TOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYTEVOOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBFWFRSQTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVuZCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE5BTUU6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPTU1FTlQ6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgSENSQzpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBESUNUSUQ6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJQ1Q6XG4gICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIHJldHVybiBaX05FRURfRElDVDtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRTpcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRZUEVETzpcbiAgICAgIGlmIChzdGF0ZS5sYXN0KSB7XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gMTtcbiAgICAgIGJpdHMgLT0gMTtcbiAgICAgIC8vLS0tLy9cblxuICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpLypCSVRTKDIpKi8pIHtcbiAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovXG4gICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgYml0cyAtPSAyO1xuICAgICAgLy8tLS0vL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTVE9SRUQ6XG4gICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAvLy0tLS8vXG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZXzpcbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09QWTpcbiAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBpZiAoY29weSkge1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvLy0tLSB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7IC0tLVxuICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHB1dCArPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRBQkxFOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMTtcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuLy8jZW5kaWZcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkxFTlM6XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwO1xuICAgICAgfVxuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5fOlxuICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTjpcbiAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgIC8vLS0tXG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVDpcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJU1RFWFQ6XG4gICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE1BVENIOlxuICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgfVxuICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICBkbyB7XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMSVQ6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBsZWZ0LS07XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBDSEVDSzpcbiAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAvLyBVc2UgJ3wnIGluc2RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgfVxuICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOR1RIOlxuICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBET05FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRE9ORTpcbiAgICAgIHJldCA9IFpfU1RSRUFNX0VORDtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIEJBRDpcbiAgICAgIHJldCA9IFpfREFUQV9FUlJPUjtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIE1FTTpcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICBjYXNlIFNZTkM6XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICBpKys7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc2RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gbGlnaHR3ZWlnaHQgQnVmZmVyIHNoaW0gZm9yIHBiZiBicm93c2VyIGJ1aWxkXG4vLyBiYXNlZCBvbiBjb2RlIGZyb20gZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyIChNSVQtbGljZW5zZWQpXG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyO1xuXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKTtcblxudmFyIEJ1ZmZlck1ldGhvZHM7XG5cbmZ1bmN0aW9uIEJ1ZmZlcihsZW5ndGgpIHtcbiAgICB2YXIgYXJyO1xuICAgIGlmIChsZW5ndGggJiYgbGVuZ3RoLmxlbmd0aCkge1xuICAgICAgICBhcnIgPSBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGggfHwgMCk7XG4gICAgaWYgKGFycikgYnVmLnNldChhcnIpO1xuXG4gICAgYnVmLnJlYWRVSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZFVJbnQzMkxFO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFO1xuICAgIGJ1Zi5yZWFkSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZEludDMyTEU7XG4gICAgYnVmLndyaXRlSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVJbnQzMkxFO1xuICAgIGJ1Zi5yZWFkRmxvYXRMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZEZsb2F0TEU7XG4gICAgYnVmLndyaXRlRmxvYXRMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVGbG9hdExFO1xuICAgIGJ1Zi5yZWFkRG91YmxlTEUgPSBCdWZmZXJNZXRob2RzLnJlYWREb3VibGVMRTtcbiAgICBidWYud3JpdGVEb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVEb3VibGVMRTtcbiAgICBidWYudG9TdHJpbmcgPSBCdWZmZXJNZXRob2RzLnRvU3RyaW5nO1xuICAgIGJ1Zi53cml0ZSA9IEJ1ZmZlck1ldGhvZHMud3JpdGU7XG4gICAgYnVmLnNsaWNlID0gQnVmZmVyTWV0aG9kcy5zbGljZTtcbiAgICBidWYuY29weSA9IEJ1ZmZlck1ldGhvZHMuY29weTtcblxuICAgIGJ1Zi5faXNCdWZmZXIgPSB0cnVlO1xuICAgIHJldHVybiBidWY7XG59XG5cbnZhciBsYXN0U3RyLCBsYXN0U3RyRW5jb2RlZDtcblxuQnVmZmVyTWV0aG9kcyA9IHtcbiAgICByZWFkVUludDMyTEU6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gKCh0aGlzW3Bvc10pIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAgICAgKHRoaXNbcG9zICsgM10gKiAweDEwMDAwMDApO1xuICAgIH0sXG5cbiAgICB3cml0ZVVJbnQzMkxFOiBmdW5jdGlvbih2YWwsIHBvcykge1xuICAgICAgICB0aGlzW3Bvc10gPSB2YWw7XG4gICAgICAgIHRoaXNbcG9zICsgMV0gPSAodmFsID4+PiA4KTtcbiAgICAgICAgdGhpc1twb3MgKyAyXSA9ICh2YWwgPj4+IDE2KTtcbiAgICAgICAgdGhpc1twb3MgKyAzXSA9ICh2YWwgPj4+IDI0KTtcbiAgICB9LFxuXG4gICAgcmVhZEludDMyTEU6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gKCh0aGlzW3Bvc10pIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAgICAgKHRoaXNbcG9zICsgM10gPDwgMjQpO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXRMRTogIGZ1bmN0aW9uKHBvcykgeyByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIHBvcywgdHJ1ZSwgMjMsIDQpOyB9LFxuICAgIHJlYWREb3VibGVMRTogZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCA1MiwgOCk7IH0sXG5cbiAgICB3cml0ZUZsb2F0TEU6ICBmdW5jdGlvbih2YWwsIHBvcykgeyByZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLCB2YWwsIHBvcywgdHJ1ZSwgMjMsIDQpOyB9LFxuICAgIHdyaXRlRG91YmxlTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCA1MiwgOCk7IH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdmFyIHN0ciA9ICcnLFxuICAgICAgICAgICAgdG1wID0gJyc7XG5cbiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0aGlzLmxlbmd0aCwgZW5kIHx8IHRoaXMubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoID0gdGhpc1tpXTtcbiAgICAgICAgICAgIGlmIChjaCA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9IGRlY29kZVVSSUNvbXBvbmVudCh0bXApICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgICAgICAgdG1wID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRtcCArPSAnJScgKyBjaC50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgd3JpdGU6IGZ1bmN0aW9uKHN0ciwgcG9zKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHN0ciA9PT0gbGFzdFN0ciA/IGxhc3RTdHJFbmNvZGVkIDogZW5jb2RlU3RyaW5nKHN0cik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXNbcG9zICsgaV0gPSBieXRlc1tpXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzbGljZTogZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICB9LFxuXG4gICAgY29weTogZnVuY3Rpb24oYnVmLCBwb3MpIHtcbiAgICAgICAgcG9zID0gcG9zIHx8IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnVmW3BvcyArIGldID0gdGhpc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkJ1ZmZlck1ldGhvZHMud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFO1xuXG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGxhc3RTdHIgPSBzdHI7XG4gICAgbGFzdFN0ckVuY29kZWQgPSBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICByZXR1cm4gbGFzdFN0ckVuY29kZWQubGVuZ3RoO1xufTtcblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgcmV0dXJuICEhKGJ1ZiAmJiBidWYuX2lzQnVmZmVyKTtcbn07XG5cbmZ1bmN0aW9uIGVuY29kZVN0cmluZyhzdHIpIHtcbiAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aCxcbiAgICAgICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBjLCBsZWFkOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBjb2RlIHBvaW50XG5cbiAgICAgICAgaWYgKGMgPiAweEQ3RkYgJiYgYyA8IDB4RTAwMCkge1xuXG4gICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHhEQzAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBsZWFkIC0gMHhEODAwIDw8IDEwIHwgYyAtIDB4REMwMCB8IDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4REJGRiB8fCAoaSArIDEgPT09IGxlbmd0aCkpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICAgICAgZWxzZSBsZWFkID0gYztcblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAobGVhZCkge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSBieXRlcy5wdXNoKGMpO1xuICAgICAgICBlbHNlIGlmIChjIDwgMHg4MDApIGJ5dGVzLnB1c2goYyA+PiAweDYgfCAweEMwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgICAgICBlbHNlIGlmIChjIDwgMHgxMDAwMCkgYnl0ZXMucHVzaChjID4+IDB4QyB8IDB4RTAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgYnl0ZXMucHVzaChjID4+IDB4MTIgfCAweEYwLCBjID4+IDB4QyAmIDB4M0YgfCAweDgwLCBjID4+IDB4NiAmIDB4M0YgfCAweDgwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGJmO1xuXG52YXIgQnVmZmVyID0gZ2xvYmFsLkJ1ZmZlciB8fCByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5mdW5jdGlvbiBQYmYoYnVmKSB7XG4gICAgdGhpcy5idWYgPSAhQnVmZmVyLmlzQnVmZmVyKGJ1ZikgPyBuZXcgQnVmZmVyKGJ1ZiB8fCAwKSA6IGJ1ZjtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgID0gMDsgLy8gdmFyaW50OiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuUGJmLkZpeGVkNjQgPSAxOyAvLyA2NC1iaXQ6IGRvdWJsZSwgZml4ZWQ2NCwgc2ZpeGVkNjRcblBiZi5CeXRlcyAgID0gMjsgLy8gbGVuZ3RoLWRlbGltaXRlZDogc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMixcbiAgICBQT1dfMl82MyA9IE1hdGgucG93KDIsIDYzKTtcblxuUGJmLnByb3RvdHlwZSA9IHtcblxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmJ1ZiA9IG51bGw7XG4gICAgfSxcblxuICAgIC8vID09PSBSRUFESU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICByZWFkRmllbGRzOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCwgZW5kKSB7XG4gICAgICAgIGVuZCA9IGVuZCB8fCB0aGlzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKSxcbiAgICAgICAgICAgICAgICB0YWcgPSB2YWwgPj4gMyxcbiAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHRoaXMucG9zO1xuXG4gICAgICAgICAgICByZWFkRmllbGQodGFnLCByZXN1bHQsIHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0UG9zKSB0aGlzLnNraXAodmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICByZWFkTWVzc2FnZTogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZpZWxkcyhyZWFkRmllbGQsIHJlc3VsdCwgdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyk7XG4gICAgfSxcblxuICAgIHJlYWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIDY0LWJpdCBpbnQgaGFuZGxpbmcgaXMgYmFzZWQgb24gZ2l0aHViLmNvbS9kcHcvbm9kZS1idWZmZXItbW9yZS1pbnRzIChNSVQtbGljZW5zZWQpXG5cbiAgICByZWFkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSArIHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZEZsb2F0TEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWREb3VibGVMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5idWYsXG4gICAgICAgICAgICB2YWwsIGIsIGIwLCBiMSwgYjIsIGIzO1xuXG4gICAgICAgIGIwID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjAgPCAweDgwKSByZXR1cm4gYjA7ICAgICAgICAgICAgICAgICBiMCA9IGIwICYgMHg3ZjtcbiAgICAgICAgYjEgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMSA8IDB4ODApIHJldHVybiBiMCB8IGIxIDw8IDc7ICAgICAgIGIxID0gKGIxICYgMHg3ZikgPDwgNztcbiAgICAgICAgYjIgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMiA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgPDwgMTQ7IGIyID0gKGIyICYgMHg3ZikgPDwgMTQ7XG4gICAgICAgIGIzID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjMgPCAweDgwKSByZXR1cm4gYjAgfCBiMSB8IGIyIHwgYjMgPDwgMjE7XG5cbiAgICAgICAgdmFsID0gYjAgfCBiMSB8IGIyIHwgKGIzICYgMHg3ZikgPDwgMjE7XG5cbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwOyAgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDsgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDQwMDAwMDAwMDAwOyAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDIwMDAwMDAwMDAwMDA7ICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwMDAwMDAwMDsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDAwMDAwMDA7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzJyk7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgdmFsID0gdGhpcy5yZWFkVmFyaW50KCk7XG5cbiAgICAgICAgaWYgKHZhbCA8IFBPV18yXzYzKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcyAtIDI7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ1Zltwb3NdID09PSAweGZmKSBwb3MtLTtcbiAgICAgICAgaWYgKHBvcyA8IHN0YXJ0UG9zKSBwb3MgPSBzdGFydFBvcztcblxuICAgICAgICB2YWwgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvcyAtIHN0YXJ0UG9zICsgMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYiA9IH50aGlzLmJ1ZltzdGFydFBvcyArIGldICYgMHg3ZjtcbiAgICAgICAgICAgIHZhbCArPSBpIDwgNCA/IGIgPDwgaSAqIDcgOiBiICogTWF0aC5wb3coMiwgaSAqIDcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIC12YWwgLSAxO1xuICAgIH0sXG5cbiAgICByZWFkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBudW0gPSB0aGlzLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDIgPT09IDEgPyAobnVtICsgMSkgLyAtMiA6IG51bSAvIDI7IC8vIHppZ3phZyBlbmNvZGluZ1xuICAgIH0sXG5cbiAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKTtcbiAgICB9LFxuXG4gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgc3RyID0gdGhpcy5idWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIHJlYWRCeXRlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWYuc2xpY2UodGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcblxuICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgIGlmICh0eXBlID09PSBQYmYuVmFyaW50KSB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gPiAweDdmKSB7fVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuQnl0ZXMpIHRoaXMucG9zID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDY0KSB0aGlzLnBvcyArPSA4O1xuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCB0eXBlOiAnICsgdHlwZSk7XG4gICAgfSxcblxuICAgIC8vID09PSBXUklUSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB3cml0ZVRhZzogZnVuY3Rpb24odGFnLCB0eXBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoKHRhZyA8PCAzKSB8IHR5cGUpO1xuICAgIH0sXG5cbiAgICByZWFsbG9jOiBmdW5jdGlvbihtaW4pIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDE2O1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikgbGVuZ3RoICo9IDI7XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5jb3B5KGJ1Zik7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnNsaWNlKDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUoTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUoTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFsID0gK3ZhbDtcblxuICAgICAgICBpZiAodmFsIDw9IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4M2ZmZikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDIpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiA3KSAmIDB4N2YpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4MWZmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMyk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMTQpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHhmZmZmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMTQpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMjEpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHdoaWxlICh2YWwgPj0gMHg4MCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICh2YWwgJiAweGZmKSB8IDB4ODA7XG4gICAgICAgICAgICAgICAgdmFsIC89IDB4ODA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMSk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IHZhbCB8IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgLSBwb3MgPiAxMCkgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiB2YXJpbnQgZG9lc25cXCd0IGZpdCBpbnRvIDEwIGJ5dGVzJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgd3JpdGVTVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwgPCAwID8gLXZhbCAqIDIgLSAxIDogdmFsICogMik7XG4gICAgfSxcblxuICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih2YWwpKTtcbiAgICB9LFxuXG4gICAgd3JpdGVTdHJpbmc6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICAgICAgdmFyIGJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyKTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChieXRlcyk7XG4gICAgICAgIHRoaXMucmVhbGxvYyhieXRlcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlKHN0ciwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSBieXRlcztcbiAgICB9LFxuXG4gICAgd3JpdGVGbG9hdDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVEb3VibGVMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVCeXRlczogZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IGJ1ZmZlcltpXTtcbiAgICB9LFxuXG4gICAgd3JpdGVNZXNzYWdlOiBmdW5jdGlvbih0YWcsIGZuLCBvYmopIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG5cbiAgICAgICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IG1lc3NhZ2UgbGVuZ3RoXG5cbiAgICAgICAgLy8gd3JpdGUgdGhlIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGhvdyBtdWNoIHdhcyB3cml0dGVuXG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zO1xuICAgICAgICBmbihvYmosIHRoaXMpO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5wb3MgLSBzdGFydFBvcztcblxuICAgICAgICB2YXIgdmFyaW50TGVuID1cbiAgICAgICAgICAgIGxlbiA8PSAweDdmID8gMSA6XG4gICAgICAgICAgICBsZW4gPD0gMHgzZmZmID8gMiA6XG4gICAgICAgICAgICBsZW4gPD0gMHgxZmZmZmYgPyAzIDpcbiAgICAgICAgICAgIGxlbiA8PSAweGZmZmZmZmYgPyA0IDogTWF0aC5jZWlsKE1hdGgubG9nKGxlbikgLyAoTWF0aC5MTjIgKiA3KSk7XG5cbiAgICAgICAgLy8gaWYgMSBieXRlIGlzbid0IGVub3VnaCBmb3IgZW5jb2RpbmcgbWVzc2FnZSBsZW5ndGgsIHNoaWZ0IHRoZSBkYXRhIHRvIHRoZSByaWdodFxuICAgICAgICBpZiAodmFyaW50TGVuID4gMSkge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKHZhcmludExlbiAtIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMucG9zIC0gMTsgaSA+PSBzdGFydFBvczsgaS0tKSB0aGlzLmJ1ZltpICsgdmFyaW50TGVuIC0gMV0gPSB0aGlzLmJ1ZltpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBtZXNzYWdlIGxlbmd0aCBpbiB0aGUgcmVzZXJ2ZWQgcGxhY2UgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICB9LFxuXG4gICAgd3JpdGVQYWNrZWRWYXJpbnQ6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFZhcmludCwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkU1ZhcmludDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTVmFyaW50LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEJvb2xlYW46ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkQm9vbGVhbiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRGbG9hdDogICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZsb2F0LCBhcnIpOyAgICB9LFxuICAgIHdyaXRlUGFja2VkRG91YmxlOiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWREb3VibGUsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkMzI6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQzMiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDMyLCBhcnIpOyB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQ2NDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDY0LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkNjQsIGFycik7IH0sXG5cbiAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uKHRhZywgYnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlQnl0ZXMoYnVmZmVyKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uKHRhZywgc3RyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHN0cik7XG4gICAgfSxcbiAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZURvdWJsZSh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlVmFyaW50KGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTVmFyaW50KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU1ZhcmludChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGbG9hdChhcnIsIHBiZikgICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRmxvYXQoYXJyW2ldKTsgICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWREb3VibGUoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRG91YmxlKGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRCb29sZWFuKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlQm9vbGVhbihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDMyKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQzMihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQzMihhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkMzIoYXJyW2ldKTsgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQ2NChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NChhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkNjQoYXJyW2ldKTsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50O1xuXG5mdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xufVxuXG5Qb2ludC5wcm90b3R5cGUgPSB7XG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfSxcblxuICAgIGFkZDogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHApOyAgICAgfSxcbiAgICBzdWI6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihwKTsgICAgIH0sXG4gICAgbXVsdDogICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KGspOyAgICB9LFxuICAgIGRpdjogICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KGspOyAgICAgfSxcbiAgICByb3RhdGU6ICBmdW5jdGlvbihhKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZShhKTsgIH0sXG4gICAgbWF0TXVsdDogZnVuY3Rpb24obSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KG0pOyB9LFxuICAgIHVuaXQ6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCk7IH0sXG4gICAgcGVycDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3BlcnAoKTsgfSxcbiAgICByb3VuZDogICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKTsgfSxcblxuICAgIG1hZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgICB9LFxuXG4gICAgZXF1YWxzOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPT09IHAueCAmJlxuICAgICAgICAgICAgICAgdGhpcy55ID09PSBwLnk7XG4gICAgfSxcblxuICAgIGRpc3Q6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RTcXIocCkpO1xuICAgIH0sXG5cbiAgICBkaXN0U3FyOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueCxcbiAgICAgICAgICAgIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfSxcblxuICAgIGFuZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVRvOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSAtIGIueSwgdGhpcy54IC0gYi54KTtcbiAgICB9LFxuXG4gICAgYW5nbGVXaXRoOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZ2xlV2l0aFNlcChiLngsIGIueSk7XG4gICAgfSxcblxuICAgIC8vIEZpbmQgdGhlIGFuZ2xlIG9mIHRoZSB0d28gdmVjdG9ycywgc29sdmluZyB0aGUgZm9ybXVsYSBmb3IgdGhlIGNyb3NzIHByb2R1Y3QgYSB4IGIgPSB8YXx8YnxzaW4ozrgpIGZvciDOuC5cbiAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoXG4gICAgICAgICAgICB0aGlzLnggKiB5IC0gdGhpcy55ICogeCxcbiAgICAgICAgICAgIHRoaXMueCAqIHggKyB0aGlzLnkgKiB5KTtcbiAgICB9LFxuXG4gICAgX21hdE11bHQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmFyIHggPSBtWzBdICogdGhpcy54ICsgbVsxXSAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBtWzJdICogdGhpcy54ICsgbVszXSAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICs9IHAueDtcbiAgICAgICAgdGhpcy55ICs9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC09IHAueDtcbiAgICAgICAgdGhpcy55IC09IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAqPSBrO1xuICAgICAgICB0aGlzLnkgKj0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXY6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54IC89IGs7XG4gICAgICAgIHRoaXMueSAvPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3VuaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXYodGhpcy5tYWcoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcGVycDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xuICAgICAgICB0aGlzLnkgPSB0aGlzLng7XG4gICAgICAgIHRoaXMueCA9IC15O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZTogZnVuY3Rpb24oYW5nbGUpIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBjb3MgKiB0aGlzLnggLSBzaW4gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gc2luICogdGhpcy54ICsgY29zICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cbi8vIGNvbnN0cnVjdHMgUG9pbnQgZnJvbSBhbiBhcnJheSBpZiBuZWNlc3NhcnlcblBvaW50LmNvbnZlcnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIGlmIChhIGluc3RhbmNlb2YgUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoYVswXSwgYVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBuZXh0VGljaztcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5uZXh0VGljaztcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB1bmRlZmluZWQ7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKSByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiYgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcikgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO2Vsc2UgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0ID0gbnVsbDtlbHNlIGlmIChvYmplY3RNb2RlKSByZXQgPSBsaXN0LnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSBsaXN0LmpvaW4oJycpO2Vsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXQgPSBsaXN0WzBdO2Vsc2UgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSAnJztlbHNlIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtlbHNlIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aCkgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO2Vsc2UgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGNyZWF0ZSB0aGUgdHdvIG9iamVjdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBjb3JrZWQgcmVxdWVzdHNcbiAgLy8gdGhleSBhcmUgbm90IGEgbGlua2VkIGxpc3QsIGFzIG5vIG5ldyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlcmVcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn0iLCJ2YXIgU3RyZWFtID0gKGZ1bmN0aW9uICgpe1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdzdCcgKyAncmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuICB9IGNhdGNoKF8pe31cbn0oKSk7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwiLyohXG4gKiBzdHJpcC1jb21tZW50cyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvc3RyaXAtY29tbWVudHM+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IEpvbiBTY2hsaW5rZXJ0LCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpYyc7XG5cbnZhciByZUJsb2NrID0gJ1xcXFwvXFxcXConO1xudmFyIHJlQmxvY2tJZ25vcmUgPSAnXFxcXC9cXFxcKig/IVxcXFwqP1xcXFwhKSc7XG52YXIgcmVCbG9ja0VuZCA9ICcoLnxbXFxcXHJcXFxcbl18XFxcXG4pKj9cXFxcKlxcXFwvXFxcXG4/XFxcXG4/JztcbnZhciByZUxpbmUgPSAvKF58W15cXFNcXG5dKSg/OlxcL1xcLykoW1xcc1xcU10rPykkL2dtO1xudmFyIHJlTGluZUlnbm9yZSA9IC8oXnxbXlxcU1xcbl0pKD86XFwvXFwvW14hXSkoW1xcc1xcU10rPykkL2dtO1xuXG5cbi8qKlxuICogU3RyaXAgYWxsIGNvbW1lbnRzXG4gKlxuICogeyU9IGRvY3MoXCJzdHJpcFwiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnRzIG9yIHN0cmluZyB0byBzdHJpcC5cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIGAuYmxvY2tgLCBhbmQgYC5saW5lYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnZhciBzdHJpcCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIHJldHVybiBzdHIgPyBzdHJpcC5ibG9jayhzdHJpcC5saW5lKHN0ciwgb3B0cyksIG9wdHMpIDogJyc7XG59O1xuXG5cbi8qKlxuICogU3RyaXAgb25seSBibG9jayBjb21tZW50cywgb3B0aW9uYWxseSBsZWF2aW5nIHByb3RlY3RlZCBjb21tZW50c1xuICogKGUuZy4gYC8qIWApIGludGFjdC5cbiAqXG4gKiB7JT0gZG9jcyhcImJsb2NrXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudCBvciBzdHJpbmcgdG8gc3RyaXAgdG9cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgaWYgYHNhZmU6dHJ1ZWAsIHN0cmlwIG9ubHkgY29tbWVudHMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgLyohYCBvciBgLyoqIWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGJsb2NrIGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5zdHJpcC5ibG9jayA9IGZ1bmN0aW9uKHN0ciwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHJlID0gbmV3IFJlZ0V4cChyZUJsb2NrICsgcmVCbG9ja0VuZCwgJ2dtJyk7XG4gIGlmKG9wdHMuc2FmZSkge1xuICAgIHJlID0gbmV3IFJlZ0V4cChyZUJsb2NrSWdub3JlICsgcmVCbG9ja0VuZCwgJ2dtJyk7XG4gIH1cbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKHJlLCAnJykgOiAnJztcbn07XG5cblxuLyoqXG4gKiBTdHJpcCBvbmx5IGxpbmUgY29tbWVudHNcbiAqXG4gKiB7JT0gZG9jcyhcImxpbmVcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50IG9yIHN0cmluZyB0byBzdHJpcCB0b1xuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBpZiBgc2FmZTp0cnVlYCwgc3RyaXAgYWxsIHRoYXQgbm90IHN0YXJ0cyB3aXRoIGAvLyFgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBsaW5lIGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5zdHJpcC5saW5lID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgcmUgPSByZUxpbmU7XG4gIGlmKG9wdHMuc2FmZSkge1xuICAgIHJlID0gcmVMaW5lSWdub3JlO1xuICB9XG4gIHJldHVybiBzdHIgPyBzdHIucmVwbGFjZShyZSwgJycpIDogJyc7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RvcG9qc29uL3RvcG9qc29uLWNsaWVudCBWZXJzaW9uIDIuMS4wLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwudG9wb2pzb24gPSBnbG9iYWwudG9wb2pzb24gfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbnZhciByZXZlcnNlID0gZnVuY3Rpb24oYXJyYXksIG4pIHtcbiAgdmFyIHQsIGogPSBhcnJheS5sZW5ndGgsIGkgPSBqIC0gbjtcbiAgd2hpbGUgKGkgPCAtLWopIHQgPSBhcnJheVtpXSwgYXJyYXlbaSsrXSA9IGFycmF5W2pdLCBhcnJheVtqXSA9IHQ7XG59O1xuXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufTtcblxudmFyIHRyYW5zZm9ybSA9IGZ1bmN0aW9uKHRvcG9sb2d5KSB7XG4gIGlmICgodHJhbnNmb3JtID0gdG9wb2xvZ3kudHJhbnNmb3JtKSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhciB0cmFuc2Zvcm0sXG4gICAgICB4MCxcbiAgICAgIHkwLFxuICAgICAga3ggPSB0cmFuc2Zvcm0uc2NhbGVbMF0sXG4gICAgICBreSA9IHRyYW5zZm9ybS5zY2FsZVsxXSxcbiAgICAgIGR4ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVswXSxcbiAgICAgIGR5ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVsxXTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHBvaW50LCBpKSB7XG4gICAgaWYgKCFpKSB4MCA9IHkwID0gMDtcbiAgICBwb2ludFswXSA9ICh4MCArPSBwb2ludFswXSkgKiBreCArIGR4O1xuICAgIHBvaW50WzFdID0gKHkwICs9IHBvaW50WzFdKSAqIGt5ICsgZHk7XG4gICAgcmV0dXJuIHBvaW50O1xuICB9O1xufTtcblxudmFyIGZlYXR1cmUgPSBmdW5jdGlvbih0b3BvbG9neSwgbykge1xuICByZXR1cm4gby50eXBlID09PSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiXG4gICAgICA/IHt0eXBlOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsIGZlYXR1cmVzOiBvLmdlb21ldHJpZXMubWFwKGZ1bmN0aW9uKG8pIHsgcmV0dXJuIGZlYXR1cmUkMSh0b3BvbG9neSwgbyk7IH0pfVxuICAgICAgOiBmZWF0dXJlJDEodG9wb2xvZ3ksIG8pO1xufTtcblxuZnVuY3Rpb24gZmVhdHVyZSQxKHRvcG9sb2d5LCBvKSB7XG4gIHZhciBpZCA9IG8uaWQsXG4gICAgICBiYm94ID0gby5iYm94LFxuICAgICAgcHJvcGVydGllcyA9IG8ucHJvcGVydGllcyA9PSBudWxsID8ge30gOiBvLnByb3BlcnRpZXMsXG4gICAgICBnZW9tZXRyeSA9IG9iamVjdCh0b3BvbG9neSwgbyk7XG4gIHJldHVybiBpZCA9PSBudWxsICYmIGJib3ggPT0gbnVsbCA/IHt0eXBlOiBcIkZlYXR1cmVcIiwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fVxuICAgICAgOiBiYm94ID09IG51bGwgPyB7dHlwZTogXCJGZWF0dXJlXCIsIGlkOiBpZCwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fVxuICAgICAgOiB7dHlwZTogXCJGZWF0dXJlXCIsIGlkOiBpZCwgYmJveDogYmJveCwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0KHRvcG9sb2d5LCBvKSB7XG4gIHZhciB0cmFuc2Zvcm1Qb2ludCA9IHRyYW5zZm9ybSh0b3BvbG9neSksXG4gICAgICBhcmNzID0gdG9wb2xvZ3kuYXJjcztcblxuICBmdW5jdGlvbiBhcmMoaSwgcG9pbnRzKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGgpIHBvaW50cy5wb3AoKTtcbiAgICBmb3IgKHZhciBhID0gYXJjc1tpIDwgMCA/IH5pIDogaV0sIGsgPSAwLCBuID0gYS5sZW5ndGg7IGsgPCBuOyArK2spIHtcbiAgICAgIHBvaW50cy5wdXNoKHRyYW5zZm9ybVBvaW50KGFba10uc2xpY2UoKSwgaykpO1xuICAgIH1cbiAgICBpZiAoaSA8IDApIHJldmVyc2UocG9pbnRzLCBuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvaW50KHApIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtUG9pbnQocC5zbGljZSgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmUoYXJjcykge1xuICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyY3MubGVuZ3RoOyBpIDwgbjsgKytpKSBhcmMoYXJjc1tpXSwgcG9pbnRzKTtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmluZyhhcmNzKSB7XG4gICAgdmFyIHBvaW50cyA9IGxpbmUoYXJjcyk7XG4gICAgd2hpbGUgKHBvaW50cy5sZW5ndGggPCA0KSBwb2ludHMucHVzaChwb2ludHNbMF0uc2xpY2UoKSk7XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvbHlnb24oYXJjcykge1xuICAgIHJldHVybiBhcmNzLm1hcChyaW5nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlb21ldHJ5KG8pIHtcbiAgICB2YXIgdHlwZSA9IG8udHlwZSwgY29vcmRpbmF0ZXM7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiR2VvbWV0cnlDb2xsZWN0aW9uXCI6IHJldHVybiB7dHlwZTogdHlwZSwgZ2VvbWV0cmllczogby5nZW9tZXRyaWVzLm1hcChnZW9tZXRyeSl9O1xuICAgICAgY2FzZSBcIlBvaW50XCI6IGNvb3JkaW5hdGVzID0gcG9pbnQoby5jb29yZGluYXRlcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpUG9pbnRcIjogY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLm1hcChwb2ludCk7IGJyZWFrO1xuICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjogY29vcmRpbmF0ZXMgPSBsaW5lKG8uYXJjcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOiBjb29yZGluYXRlcyA9IG8uYXJjcy5tYXAobGluZSk7IGJyZWFrO1xuICAgICAgY2FzZSBcIlBvbHlnb25cIjogY29vcmRpbmF0ZXMgPSBwb2x5Z29uKG8uYXJjcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpUG9seWdvblwiOiBjb29yZGluYXRlcyA9IG8uYXJjcy5tYXAocG9seWdvbik7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7dHlwZTogdHlwZSwgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzfTtcbiAgfVxuXG4gIHJldHVybiBnZW9tZXRyeShvKTtcbn1cblxuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIGJib3h9IGZyb20gXCIuL3NyYy9iYm94XCI7XG5cbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBtZXNoLCBtZXNoQXJjc30gZnJvbSBcIi4vc3JjL21lc2hcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBtZXJnZSwgbWVyZ2VBcmNzfSBmcm9tIFwiLi9zcmMvbWVyZ2VcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBuZWlnaGJvcnN9IGZyb20gXCIuL3NyYy9uZWlnaGJvcnNcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBxdWFudGl6ZX0gZnJvbSBcIi4vc3JjL3F1YW50aXplXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgdHJhbnNmb3JtfSBmcm9tIFwiLi9zcmMvdHJhbnNmb3JtXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgdW50cmFuc2Zvcm19IGZyb20gXCIuL3NyYy91bnRyYW5zZm9ybVwiO1xuXG5leHBvcnRzLmZlYXR1cmUgPSBmZWF0dXJlO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlRmVhdHVyZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUZlYXR1cmUocGJmLCBlbmQsIGV4dGVudCwga2V5cywgdmFsdWVzKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0ge307XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQ7XG4gICAgdGhpcy50eXBlID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fZ2VvbWV0cnkgPSAtMTtcbiAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkRmVhdHVyZSwgdGhpcywgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZlYXR1cmUodGFnLCBmZWF0dXJlLCBwYmYpIHtcbiAgICBpZiAodGFnID09IDEpIGZlYXR1cmUuX2lkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICAgICAgICBpZiAoY21kID09PSAxKSB7IC8vIG1vdmVUb1xuICAgICAgICAgICAgICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZS5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgPT09IDcpIHtcbiAgICAgICAgICAgIGxpbmUucHVzaChsaW5lWzBdLmNsb25lKCkpOyAvLyBjbG9zZVBvbHlnb25cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBsaW5lcztcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gY29vcmRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgJiYgY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF1bMF07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICAgICAgdHlwZSA9ICdNdWx0aVBvaW50JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICB0eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXNcbiAgICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVMYXllcjtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5NjtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IFtdO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZExheWVyLCB0aGlzLCBlbmQpO1xuXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBsYXllci5fZmVhdHVyZXMucHVzaChwYmYucG9zKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGxheWVyLl9rZXlzLnB1c2gocGJmLnJlYWRTdHJpbmcoKSk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcbiAgICB2YXIgdmFsdWUgPSBudWxsLFxuICAgICAgICBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciB0YWcgPSBwYmYucmVhZFZhcmludCgpID4+IDM7XG5cbiAgICAgICAgdmFsdWUgPSB0YWcgPT09IDEgPyBwYmYucmVhZFN0cmluZygpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMiA/IHBiZi5yZWFkRmxvYXQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNCA/IHBiZi5yZWFkVmFyaW50NjQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDUgPyBwYmYucmVhZFZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNyA/IHBiZi5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJldHVybiBmZWF0dXJlIGBpYCBmcm9tIHRoaXMgbGF5ZXIgYXMgYSBgVmVjdG9yVGlsZUZlYXR1cmVgXG5WZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgdGhpcy5fcGJmLnBvcyA9IHRoaXMuX2ZlYXR1cmVzW2ldO1xuXG4gICAgdmFyIGVuZCA9IHRoaXMuX3BiZi5yZWFkVmFyaW50KCkgKyB0aGlzLl9wYmYucG9zO1xuICAgIHJldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLCBlbmQsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xufTtcbiIsIi8vIEdlb21ldHJ5IGJ1aWxkaW5nIGZ1bmN0aW9uc1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgY29uc3QgdGlsZV9ib3VuZHMgPSBbXG4gICAgeyB4OiAwLCB5OiAwfSxcbiAgICB7IHg6IEdlby50aWxlX3NjYWxlLCB5OiAtR2VvLnRpbGVfc2NhbGUgfSAvLyBUT0RPOiBjb3JyZWN0IGZvciBmbGlwcGVkIHktYXhpcz9cbl07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0X3V2cyA9IFswLCAwLCAxLCAxXTtcblxuLy8gVGVzdHMgaWYgYSBsaW5lIHNlZ21lbnQgKGZyb20gcG9pbnQgQSB0byBCKSBpcyBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kc1xuLy8gKHdpdGhpbiBhIGNlcnRhaW4gdG9sZXJhbmNlIHRvIGFjY291bnQgZm9yIGdlb21ldHJ5IG5lYXJseSBvbiB0aWxlIGVkZ2VzKVxuZXhwb3J0IGZ1bmN0aW9uIG91dHNpZGVUaWxlIChfYSwgX2IsIHRvbGVyYW5jZSkge1xuICAgIGxldCB0aWxlX21pbiA9IHRpbGVfYm91bmRzWzBdO1xuICAgIGxldCB0aWxlX21heCA9IHRpbGVfYm91bmRzWzFdO1xuXG4gICAgLy8gVE9ETzogZml4IGZsaXBwZWQgWSBjb29yZHMgaGVyZSwgY29uZnVzaW5nIHdpdGggJ21heCcgcmVmZXJlbmNlXG4gICAgaWYgKChfYVswXSA8PSB0aWxlX21pbi54ICsgdG9sZXJhbmNlICYmIF9iWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlICYmIF9iWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlICYmIF9iWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVsxXSA8PSB0aWxlX21heC55ICsgdG9sZXJhbmNlICYmIF9iWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2UpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29vcmRPdXRzaWRlVGlsZSAoY29vcmQsIHRvbGVyYW5jZSkge1xuICAgIHRvbGVyYW5jZSA9IHRvbGVyYW5jZSB8fCAwO1xuICAgIGxldCB0aWxlX21pbiA9IHRpbGVfYm91bmRzWzBdO1xuICAgIGxldCB0aWxlX21heCA9IHRpbGVfYm91bmRzWzFdO1xuXG4gICAgcmV0dXJuIGNvb3JkWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2U7XG59XG4iLCIvLyBQb2ludCBidWlsZGVyc1xuaW1wb3J0IHsgZGVmYXVsdF91dnMgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8vIEJ1aWxkIGEgYmlsbGJvYXJkIHNwcml0ZSBxdWFkIGNlbnRlcmVkIG9uIGEgcG9pbnQuIFNwcml0ZXMgYXJlIGludGVuZGVkIHRvIGJlIGRyYXduIGluIHNjcmVlbnNwYWNlLCBhbmQgaGF2ZVxuLy8gcHJvcGVydGllcyBmb3Igd2lkdGgsIGhlaWdodCwgYW5nbGUsIGFuZCBhIHNjYWxlIGZhY3RvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVycG9sYXRlIHRoZSBzY3JlZW5zcGFjZSBzaXplXG4vLyBvZiBhIHNwcml0ZSBiZXR3ZWVuIHR3byB6b29tIGxldmVscy5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFF1YWRzRm9yUG9pbnRzIChwb2ludHMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgeyB0ZXhjb29yZF9pbmRleCwgcG9zaXRpb25faW5kZXgsIHNoYXBlX2luZGV4LCBvZmZzZXRfaW5kZXggfSxcbiAgICB7IHF1YWQsIHF1YWRfbm9ybWFsaXplLCBvZmZzZXQsIGFuZ2xlLCBzaGFwZV93LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pIHtcbiAgICBxdWFkX25vcm1hbGl6ZSA9IHF1YWRfbm9ybWFsaXplIHx8IDE7XG4gICAgbGV0IHcyID0gcXVhZFswXSAvIDIgKiBxdWFkX25vcm1hbGl6ZTtcbiAgICBsZXQgaDIgPSBxdWFkWzFdIC8gMiAqIHF1YWRfbm9ybWFsaXplO1xuICAgIGxldCBzY2FsaW5nID0gW1xuICAgICAgICBbLXcyLCAtaDJdLFxuICAgICAgICBbdzIsIC1oMl0sXG4gICAgICAgIFt3MiwgaDJdLFxuICAgICAgICBbLXcyLCBoMl1cbiAgICBdO1xuXG4gICAgbGV0IHZlcnRleF9lbGVtZW50cyA9IHZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICBsZXQgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICBsZXQgdGV4Y29vcmRzO1xuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcblxuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgICAgICB0ZXhjb29yZHMgPSBbXG4gICAgICAgICAgICBbbWluX3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtYXhfdl0sXG4gICAgICAgICAgICBbbWluX3UsIG1heF92XVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGxldCBudW1fcG9pbnRzID0gcG9pbnRzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBwPTA7IHAgPCBudW1fcG9pbnRzOyBwKyspIHtcbiAgICAgICAgbGV0IHBvaW50ID0gcG9pbnRzW3BdO1xuXG4gICAgICAgIGZvciAobGV0IHBvcz0wOyBwb3MgPCA0OyBwb3MrKykge1xuICAgICAgICAgICAgLy8gQWRkIHRleGNvb3Jkc1xuICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXhjb29yZHNbcG9zXVswXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleGNvb3Jkc1twb3NdWzFdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbcG9zaXRpb25faW5kZXggKyAwXSA9IHBvaW50WzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3Bvc2l0aW9uX2luZGV4ICsgMV0gPSBwb2ludFsxXTtcblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMF0gPSBzY2FsaW5nW3Bvc11bMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAxXSA9IHNjYWxpbmdbcG9zXVsxXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDJdID0gYW5nbGU7XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAzXSA9IHNoYXBlX3c7XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtvZmZzZXRfaW5kZXggKyAwXSA9IG9mZnNldFswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtvZmZzZXRfaW5kZXggKyAxXSA9IG9mZnNldFsxXTtcblxuICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDMpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuXG4gICAgICAgIGVsZW1lbnRfb2Zmc2V0ICs9IDQ7XG4gICAgfVxufVxuIiwiLy8gUG9seWdvbiBidWlsZGVyc1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IHsgZGVmYXVsdF91dnMsIG91dHNpZGVUaWxlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5cbmNvbnN0IHVwX3ZlYzMgPSBbMCwgMCwgMV07XG5cbi8vIFRlc3NlbGF0ZSBhIGZsYXQgMkQgcG9seWdvblxuLy8geCAmIHkgY29vcmRpbmF0ZXMgd2lsbCBiZSBzZXQgYXMgZmlyc3QgdHdvIGVsZW1lbnRzIG9mIHByb3ZpZGVkIHZlcnRleF90ZW1wbGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9seWdvbnMgKFxuICAgIHBvbHlnb25zLFxuICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgeyB0ZXhjb29yZF9pbmRleCwgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KSB7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgIH1cblxuICAgIHZhciBudW1fcG9seWdvbnMgPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgcD0wOyBwIDwgbnVtX3BvbHlnb25zOyBwKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgICAgIHZhciBwb2x5Z29uID0gcG9seWdvbnNbcF07XG5cbiAgICAgICAgLy8gRmluZCBwb2x5Z29uIGV4dGVudHMgdG8gY2FsY3VsYXRlIFVWcywgZml0IHRoZW0gdG8gdGhlIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3hcbiAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICB2YXIgW21pbl94LCBtaW5feSwgbWF4X3gsIG1heF95XSA9IEdlby5maW5kQm91bmRpbmdCb3gocG9seWdvbik7XG4gICAgICAgICAgICB2YXIgc3Bhbl94ID0gbWF4X3ggLSBtaW5feDtcbiAgICAgICAgICAgIHZhciBzcGFuX3kgPSBtYXhfeSAtIG1pbl95O1xuICAgICAgICAgICAgdmFyIHNjYWxlX3UgPSAobWF4X3UgLSBtaW5fdSkgLyBzcGFuX3g7XG4gICAgICAgICAgICB2YXIgc2NhbGVfdiA9IChtYXhfdiAtIG1pbl92KSAvIHNwYW5feTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHJpbmdfaW5kZXggPSAwOyByaW5nX2luZGV4IDwgcG9seWdvbi5sZW5ndGg7IHJpbmdfaW5kZXgrKyl7XG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGRhdGFcbiAgICAgICAgICAgIHZhciBwb2x5Z29uX3JpbmcgPSBwb2x5Z29uW3JpbmdfaW5kZXhdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uX3JpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmVydGV4ID0gcG9seWdvbl9yaW5nW2ldO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHZlcnRleFswXTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB2ZXJ0ZXhbMV07XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgVVZzXG4gICAgICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDBdID0gKCh2ZXJ0ZXhbMF0gLSBtaW5feCkgKiBzY2FsZV91ICsgbWluX3UpICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9ICgodmVydGV4WzFdIC0gbWluX3kpICogc2NhbGVfdiArIG1pbl92KSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBlbGVtZW50IGluZGljZXNcbiAgICAgICAgdmFyIGluZGljZXMgPSB0cmlhbmd1bGF0ZVBvbHlnb24oZWFyY3V0LmZsYXR0ZW4ocG9seWdvbikpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyBpbmRpY2VzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVGVzc2VsYXRlIGFuZCBleHRydWRlIGEgZmxhdCAyRCBwb2x5Z29uIGludG8gYSBzaW1wbGUgM0QgbW9kZWwgd2l0aCBmaXhlZCBoZWlnaHQgYW5kIGFkZCB0byBHTCB2ZXJ0ZXggYnVmZmVyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHRydWRlZFBvbHlnb25zIChcbiAgICBwb2x5Z29ucyxcbiAgICB6LCBoZWlnaHQsIG1pbl9oZWlnaHQsXG4gICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICBub3JtYWxfaW5kZXgsXG4gICAgbm9ybWFsX25vcm1hbGl6ZSxcbiAgICB7XG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSxcbiAgICAgICAgd2luZGluZ1xuICAgIH0pIHtcblxuICAgIC8vIFRvcFxuICAgIHZhciBtaW5feiA9IHogKyAobWluX2hlaWdodCB8fCAwKTtcbiAgICB2YXIgbWF4X3ogPSB6ICsgaGVpZ2h0O1xuICAgIHZlcnRleF90ZW1wbGF0ZVsyXSA9IG1heF96O1xuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsIHsgdGV4Y29vcmRfaW5kZXgsIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSk7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIHZhciBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIC8vIFdhbGxzXG4gICAgLy8gRml0IFVWcyB0byB3YWxsIHF1YWRcbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgICAgIHZhciB0ZXhjb29yZHMgPSBbXG4gICAgICAgICAgICBbbWluX3UsIG1heF92XSxcbiAgICAgICAgICAgIFttaW5fdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1heF92XVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHZhciBudW1fcG9seWdvbnMgPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgcD0wOyBwIDwgbnVtX3BvbHlnb25zOyBwKyspIHtcbiAgICAgICAgdmFyIHBvbHlnb24gPSBwb2x5Z29uc1twXTtcblxuICAgICAgICBmb3IgKHZhciBxPTA7IHEgPCBwb2x5Z29uLmxlbmd0aDsgcSsrKSB7XG4gICAgICAgICAgICB2YXIgY29udG91ciA9IHBvbHlnb25bcV07XG5cbiAgICAgICAgICAgIGZvciAodmFyIHc9MDsgdyA8IGNvbnRvdXIubGVuZ3RoIC0gMTsgdysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvbnRvdXJbd10sIGNvbnRvdXJbdysxXSwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGRvbid0IGV4dHJ1ZGUgdGlsZSBlZGdlc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFdhbGwgb3JkZXIgaXMgZGVwZW5kZW50IG9uIHdpbmRpbmcgb3JkZXIsIHNvIHRoYXQgbm9ybWFscyBmYWNlIG91dHdhcmRcbiAgICAgICAgICAgICAgICBsZXQgdzAsIHcxO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kaW5nID09PSAnQ0NXJykge1xuICAgICAgICAgICAgICAgICAgICB3MCA9IHc7XG4gICAgICAgICAgICAgICAgICAgIHcxID0gdysxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdzAgPSB3KzE7XG4gICAgICAgICAgICAgICAgICAgIHcxID0gdztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBUd28gdHJpYW5nbGVzIGZvciB0aGUgcXVhZCBmb3JtZWQgYnkgZWFjaCB2ZXJ0ZXggcGFpciwgZ29pbmcgZnJvbSBib3R0b20gdG8gdG9wIGhlaWdodFxuICAgICAgICAgICAgICAgIHZhciB3YWxsX3ZlcnRpY2VzID0gW1xuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MV1bMF0sIGNvbnRvdXJbdzFdWzFdLCBtYXhfel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cxXVswXSwgY29udG91clt3MV1bMV0sIG1pbl96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cwXVsxXSwgbWluX3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzBdWzFdLCBtYXhfel1cbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsYyB0aGUgbm9ybWFsIG9mIHRoZSB3YWxsIGZyb20gdXAgdmVjdG9yIGFuZCBvbmUgc2VnbWVudCBvZiB0aGUgd2FsbCB0cmlhbmdsZXNcbiAgICAgICAgICAgICAgICBsZXQgd2FsbF92ZWMgPSBWZWN0b3Iubm9ybWFsaXplKFtjb250b3VyW3cxXVswXSAtIGNvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cxXVsxXSAtIGNvbnRvdXJbdzBdWzFdLCAwXSk7XG4gICAgICAgICAgICAgICAgbGV0IG5vcm1hbCA9IFZlY3Rvci5jcm9zcyh1cF92ZWMzLCB3YWxsX3ZlYyk7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdmVydGV4IHRlbXBsYXRlIHdpdGggY3VycmVudCBzdXJmYWNlIG5vcm1hbFxuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAwXSA9IG5vcm1hbFswXSAqIG5vcm1hbF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDFdID0gbm9ybWFsWzFdICogbm9ybWFsX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMl0gPSBub3JtYWxbMl0gKiBub3JtYWxfbm9ybWFsaXplO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgd3Y9MDsgd3YgPCB3YWxsX3ZlcnRpY2VzLmxlbmd0aDsgd3YrKykge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMF0gPSB3YWxsX3ZlcnRpY2VzW3d2XVswXTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzFdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMV07XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsyXSA9IHdhbGxfdmVydGljZXNbd3ZdWzJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXhjb29yZHNbd3ZdWzBdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXhjb29yZHNbd3ZdWzFdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDEpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDMpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50X29mZnNldCArPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUcmlhbmd1bGF0aW9uIHVzaW5nIGVhcmN1dFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXRcbmV4cG9ydCBmdW5jdGlvbiB0cmlhbmd1bGF0ZVBvbHlnb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZWFyY3V0KGRhdGEudmVydGljZXMsIGRhdGEuaG9sZXMsIGRhdGEuZGltZW5zaW9ucyk7XG59XG4iLCIvLyBHZW9tZXRyeSBidWlsZGluZyBmdW5jdGlvbnNcblxuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IHtvdXRzaWRlVGlsZSwgaXNDb29yZE91dHNpZGVUaWxlfSBmcm9tICcuL2NvbW1vbic7XG5cbmNvbnN0IHplcm9fdmVjMiA9IFswLCAwXTtcblxuLy8gQnVpbGQgdGVzc2VsbGF0ZWQgdHJpYW5nbGVzIGZvciBhIHBvbHlsaW5lXG5jb25zdCBDQVBfVFlQRSA9IHtcbiAgICBidXR0OiAwLFxuICAgIHNxdWFyZTogMSxcbiAgICByb3VuZDogMlxufTtcblxuY29uc3QgSk9JTl9UWVBFID0ge1xuICAgIG1pdGVyOiAwLFxuICAgIGJldmVsOiAxLFxuICAgIHJvdW5kOiAyXG59O1xuXG5jb25zdCBERUZBVUxUID0ge1xuICAgIE1JVEVSX0xJTUlUOiAzLFxuICAgIFRFWENPT1JEX05PUk1BTElaRTogMSxcbiAgICBURVhDT09SRF9SQVRJTzogMSxcbiAgICBNSU5fRkFOX1dJRFRIOiA1ICAgICAgICAvLyBXaWR0aCBvZiBsaW5lIGluIHRpbGUgdW5pdHMgdG8gcGxhY2UgMSB0cmlhbmdsZSBwZXIgZmFuXG59O1xuXG4vLyBTY2FsaW5nIGZhY3RvciB0byBhZGQgcHJlY2lzaW9uIHRvIGxpbmUgdGV4dHVyZSBWIGNvb3JkaW5hdGUgcGFja2VkIGFzIG5vcm1hbGl6ZWQgc2hvcnRcbmNvbnN0IHZfc2NhbGVfYWRqdXN0ID0gR2VvLnRpbGVfc2NhbGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvbHlsaW5lcyAobGluZXMsIHdpZHRoLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIHtcbiAgICAgICAgY2xvc2VkX3BvbHlnb24sXG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX3dpZHRoLFxuICAgICAgICB0ZXhjb29yZF9yYXRpbyxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplLFxuICAgICAgICBzY2FsaW5nX2luZGV4LFxuICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZSxcbiAgICAgICAgam9pbiwgY2FwLFxuICAgICAgICBtaXRlcl9saW1pdFxuICAgIH0pIHtcblxuICAgIHZhciBjYXBfdHlwZSA9IGNhcCA/IENBUF9UWVBFW2NhcF0gOiBDQVBfVFlQRS5idXR0O1xuICAgIHZhciBqb2luX3R5cGUgPSBqb2luID8gSk9JTl9UWVBFW2pvaW5dIDogSk9JTl9UWVBFLm1pdGVyO1xuXG4gICAgLy8gQ29uZmlndXJlIG1pdGVyIGxpbWl0XG4gICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgIG1pdGVyX2xpbWl0ID0gbWl0ZXJfbGltaXQgfHwgREVGQVVMVC5NSVRFUl9MSU1JVDsgLy8gZGVmYXVsdCBtaXRlciBsaW1pdFxuICAgICAgICB2YXIgbWl0ZXJfbGVuX3NxID0gbWl0ZXJfbGltaXQgKiBtaXRlcl9saW1pdDtcbiAgICB9XG5cbiAgICAvLyBUZXh0dXJlIFZhcmlhYmxlc1xuICAgIHZhciB2X3NjYWxlO1xuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgREVGQVVMVC5URVhDT09SRF9OT1JNQUxJWkU7XG4gICAgICAgIHRleGNvb3JkX3JhdGlvID0gdGV4Y29vcmRfcmF0aW8gfHwgREVGQVVMVC5URVhDT09SRF9SQVRJTztcbiAgICAgICAgdl9zY2FsZSA9IDEgLyAodGV4Y29vcmRfd2lkdGggKiB0ZXhjb29yZF9yYXRpbyAqIHZfc2NhbGVfYWRqdXN0KTsgLy8gc2NhbGVzIGxpbmUgdGV4dHVyZSBhcyBhIHJhdGlvIG9mIHRoZSBsaW5lJ3Mgd2lkdGhcbiAgICB9XG5cbiAgICAvLyBWYWx1ZXMgdGhhdCBhcmUgY29uc3RhbnQgZm9yIGVhY2ggbGluZSBhbmQgYXJlIHBhc3NlZCB0byBoZWxwZXIgZnVuY3Rpb25zXG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgIGNsb3NlZF9wb2x5Z29uLFxuICAgICAgICByZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZSxcbiAgICAgICAgbWl0ZXJfbGVuX3NxLFxuICAgICAgICBqb2luX3R5cGUsXG4gICAgICAgIGNhcF90eXBlLFxuICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICBoYWxmX3dpZHRoOiB3aWR0aCAvIDIsXG4gICAgICAgIHNjYWxpbmdfaW5kZXgsXG4gICAgICAgIHNjYWxpbmdfbm9ybWFsaXplLFxuICAgICAgICB2X3NjYWxlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfd2lkdGgsXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZVxuICAgIH07XG5cbiAgICAvLyBCdWZmZXIgZm9yIGV4dHJhIGxpbmVzIHRvIHByb2Nlc3NcbiAgICB2YXIgZXh0cmFfbGluZXMgPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgbGluZXNcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGJ1aWxkUG9seWxpbmUobGluZXNbaW5kZXhdLCBjb250ZXh0LCBleHRyYV9saW5lcyk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBleHRyYSBsaW5lc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHRyYV9saW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgYnVpbGRQb2x5bGluZShleHRyYV9saW5lc1tpbmRleF0sIGNvbnRleHQsIGV4dHJhX2xpbmVzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUG9seWxpbmUobGluZSwgY29udGV4dCwgZXh0cmFfbGluZXMpe1xuICAgIC8vIFNraXAgaWYgbGluZSBpcyBub3QgdmFsaWRcbiAgICBpZiAobGluZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIge2pvaW5fdHlwZSwgY2FwX3R5cGUsIGNsb3NlZF9wb2x5Z29uLCByZW1vdmVfdGlsZV9lZGdlcywgdGlsZV9lZGdlX3RvbGVyYW5jZSwgdl9zY2FsZSwgbWl0ZXJfbGVuX3NxfSA9IGNvbnRleHQ7XG5cbiAgICAvLyBMb29wIGJhY2t3YXJkcyB0aHJvdWdoIGxpbmUgdG8gYSB0aWxlIGJvdW5kYXJ5IGlmIGZvdW5kXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uICYmIGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgIHZhciBib3VuZGFyeUluZGV4ID0gZ2V0VGlsZUJvdW5kYXJ5SW5kZXgobGluZSk7XG4gICAgICAgIGlmIChib3VuZGFyeUluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGxpbmUgdGhhdCBpcyBhIGN5Y2xpYyBwZXJtdXRhdGlvbiBvZiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgIHZhciBwZXJtdXRlZExpbmUgPSBwZXJtdXRlTGluZShsaW5lLCBib3VuZGFyeUluZGV4KTtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gocGVybXV0ZWRMaW5lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjb29yZEN1cnIsIGNvb3JkTmV4dCwgbm9ybVByZXYsIG5vcm1OZXh0O1xuICAgIHZhciB2ID0gMDsgLy8gVGV4dHVyZSB2LWNvb3JkaW5hdGVcblxuICAgIHZhciBpbmRleF9zdGFydCA9IDA7XG4gICAgdmFyIGluZGV4X2VuZCA9IGxpbmUubGVuZ3RoIC0gMTtcbiAgICB2YXIgaWdub3JlZF9pbmRpY2VzX2NvdW50ID0gMDtcblxuICAgIC8vIEZJUlNUIFBPSU5UXG4gICAgLy8gbG9vcCB0aHJvdWdoIGJlZ2lubmluZyBwb2ludHMgaWYgZHVwbGljYXRlc1xuICAgIGNvb3JkQ3VyciA9IGxpbmVbaW5kZXhfc3RhcnRdO1xuICAgIGNvb3JkTmV4dCA9IGxpbmVbaW5kZXhfc3RhcnQgKyAxXTtcbiAgICB3aGlsZSAoVmVjdG9yLmlzRXF1YWwoY29vcmRDdXJyLCBjb29yZE5leHQpKSB7XG4gICAgICAgIGluZGV4X3N0YXJ0Kys7XG4gICAgICAgIGNvb3JkQ3VyciA9IGNvb3JkTmV4dDtcbiAgICAgICAgY29vcmROZXh0ID0gbGluZVtpbmRleF9zdGFydCArIDFdO1xuICAgICAgICBpZ25vcmVkX2luZGljZXNfY291bnQrKztcbiAgICAgICAgaWYgKGluZGV4X3N0YXJ0ID09PSBsaW5lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvb3AgdGhyb3VnaCBlbmRpbmcgcG9pbnRzIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVzXG4gICAgd2hpbGUgKFZlY3Rvci5pc0VxdWFsKGxpbmVbaW5kZXhfZW5kXSwgbGluZVtpbmRleF9lbmQgLSAxXSkpIHtcbiAgICAgICAgaW5kZXhfZW5kLS07XG4gICAgICAgIGlnbm9yZWRfaW5kaWNlc19jb3VudCsrO1xuICAgICAgICBpZiAoaW5kZXhfZW5kID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGggPCAyICsgaWdub3JlZF9pbmRpY2VzX2NvdW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBjb29yZE5leHQpKTtcblxuICAgIC8vIFNraXAgdGlsZSBib3VuZGFyeSBsaW5lcyBhbmQgYXBwZW5kIGEgbmV3IGxpbmUgaWYgbmVlZGVkXG4gICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvb3JkQ3VyciwgY29vcmROZXh0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICB2YXIgbm9uQm91bmRhcnlTZWdtZW50ID0gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudChsaW5lLCBpbmRleF9zdGFydCwgdGlsZV9lZGdlX3RvbGVyYW5jZSk7XG4gICAgICAgIGlmIChub25Cb3VuZGFyeVNlZ21lbnQpIHtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobm9uQm91bmRhcnlTZWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uKXtcbiAgICAgICAgLy8gQmVnaW4gdGhlIHBvbHlnb24gd2l0aCBhIGpvaW4gKGNvbm5lY3RpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzKVxuICAgICAgICBub3JtUHJldiA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAobGluZVtpbmRleF9lbmQgLSAxXSwgY29vcmRDdXJyKSk7XG4gICAgICAgIHN0YXJ0UG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIGxpbmUgYmVnaW5zIGF0IGVkZ2UsIGRvbid0IGFkZCBhIGNhcFxuICAgICAgICBpZiAoIWlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgICAgICBhZGRDYXAoY29vcmRDdXJyLCB2LCBub3JtTmV4dCwgY2FwX3R5cGUsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGNhcF90eXBlICE9PSBDQVBfVFlQRS5idXR0KSB7XG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiB2X3NjYWxlICogY29udGV4dC50ZXhjb29yZF93aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBmaXJzdCBwYWlyIG9mIHBvaW50cyBmb3IgdGhlIGxpbmUgc3RyaXBcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIElOVEVSTUVESUFSWSBQT0lOVFNcbiAgICB2ICs9IHZfc2NhbGUgKiBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoY29vcmROZXh0LCBjb29yZEN1cnIpKTtcbiAgICBmb3IgKHZhciBpID0gaW5kZXhfc3RhcnQgKyAxOyBpIDwgaW5kZXhfZW5kOyBpKyspIHtcbiAgICAgICAgdmFyIGN1cnJJbmRleCA9IGk7XG4gICAgICAgIHZhciBuZXh0SW5kZXggPSBpICsgMTtcbiAgICAgICAgY29vcmRDdXJyID0gbGluZVtjdXJySW5kZXhdO1xuICAgICAgICBjb29yZE5leHQgPSBsaW5lW25leHRJbmRleF07XG5cbiAgICAgICAgLy8gU2tpcCByZWR1bmRhbnQgdmVydGljZXNcbiAgICAgICAgaWYgKFZlY3Rvci5pc0VxdWFsKGNvb3JkQ3VyciwgY29vcmROZXh0KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGlsZSBib3VuZGFyaWVzXG4gICAgICAgIGlmIChyZW1vdmVfdGlsZV9lZGdlcyAmJiBvdXRzaWRlVGlsZShjb29yZEN1cnIsIGNvb3JkTmV4dCwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICB2YXIgbm9uQm91bmRhcnlMaW5lcyA9IGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQobGluZSwgY3VyckluZGV4ICsgMSwgdGlsZV9lZGdlX3RvbGVyYW5jZSk7XG4gICAgICAgICAgICBpZiAobm9uQm91bmRhcnlMaW5lcykge1xuICAgICAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobm9uQm91bmRhcnlMaW5lcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub3JtUHJldiA9IG5vcm1OZXh0O1xuICAgICAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBjb29yZE5leHQpKTtcblxuICAgICAgICAvLyBBZGQgam9pblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZE1pdGVyKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBtaXRlcl9sZW5fc3EsIGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdiArPSB2X3NjYWxlICogVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKGNvb3JkTmV4dCwgY29vcmRDdXJyKSk7XG4gICAgfVxuXG4gICAgLy8gTEFTVCBQT0lOVFxuICAgIGNvb3JkQ3VyciA9IGNvb3JkTmV4dDtcbiAgICBub3JtUHJldiA9IG5vcm1OZXh0O1xuXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uKSB7XG4gICAgICAgIC8vIENsb3NlIHRoZSBwb2x5Z29uIHdpdGggYSBtaXRlciBqb2ludCBvciBidXR0IGNhcCBpZiBvbiBhIHRpbGUgYm91bmRhcnlcbiAgICAgICAgbm9ybU5leHQgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGNvb3JkQ3VyciwgbGluZVsxXSkpO1xuICAgICAgICBlbmRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIHYsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gRmluaXNoIHRoZSBsaW5lIHN0cmlwXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBJZiBsaW5lIGVuZHMgYXQgZWRnZSwgZG9uJ3QgYWRkIGEgY2FwXG4gICAgICAgIGlmICghaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIGFkZENhcChjb29yZEN1cnIsIHYsIG5vcm1QcmV2LCBjYXBfdHlwZSwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRUaWxlQm91bmRhcnlJbmRleChsaW5lKXtcbiAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGxpbmVbMF0pKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGJhY2tJbmRleCA9IDA7IGJhY2tJbmRleCA8IGxpbmUubGVuZ3RoOyBiYWNrSW5kZXgrKykge1xuICAgICAgICB2YXIgY29vcmRDdXJyID0gbGluZVtsaW5lLmxlbmd0aCAtIDEgLSBiYWNrSW5kZXhdO1xuICAgICAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCAtIDEgLSBiYWNrSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cblxuLy8gSXRlcmF0ZSB0aHJvdWdoIGxpbmUgZnJvbSBzdGFydEluZGV4IHRvIGZpbmQgYSBzZWdtZW50IG5vdCBvbiBhIHRpbGUgYm91bmRhcnksIGlmIGFueS5cbmZ1bmN0aW9uIGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQgKGxpbmUsIHN0YXJ0SW5kZXgsIHRvbGVyYW5jZSkge1xuICAgIHZhciBlbmRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgd2hpbGUgKGxpbmVbZW5kSW5kZXggKyAxXSAmJiBvdXRzaWRlVGlsZShsaW5lW2VuZEluZGV4XSwgbGluZVtlbmRJbmRleCArIDFdLCB0b2xlcmFuY2UpKSB7XG4gICAgICAgIGVuZEluZGV4Kys7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBsaW5lIHNlZ21lbnQgcmVtYWluaW5nIHRoYXQgaXMgd2l0aGluIHRoZSB0aWxlLCBwdXNoIGl0IHRvIHRoZSBsaW5lcyBhcnJheVxuICAgIHJldHVybiAobGluZS5sZW5ndGggLSBlbmRJbmRleCA+PSAyKSA/IGxpbmUuc2xpY2UoZW5kSW5kZXgpIDogZmFsc2U7XG59XG5cbi8vIEJlZ2luIGEgcG9seWdvbiB3aXRoIGEgam9pbiBjb25uZWN0aW5nIHRvIHRoZSBsYXN0IHNlZ21lbnQgKGlmIHZhbGlkIGpvaW4tdHlwZSBzcGVjaWZpZWQpXG5mdW5jdGlvbiBzdGFydFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgY29udGV4dCl7XG4gICAgLy8gSWYgcG9seWdvbiBzdGFydHMgb24gYSB0aWxlIGJvdW5kYXJ5LCBkb24ndCBhZGQgYSBqb2luXG4gICAgaWYgKGpvaW5fdHlwZSA9PT0gdW5kZWZpbmVkIHx8IGlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgMF0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIDBdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIHBvbHlnb24gc3RhcnRzIHdpdGhpbiBhIHRpbGUsIGFkZCBhIGpvaW5cbiAgICAgICAgdmFyIHYgPSAwO1xuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZE1pdGVyKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBjb250ZXh0Lm1pdGVyX2xlbl9zcSwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBFbmQgYSBwb2x5Z29uIGFwcHJvcHJpYXRlbHlcbmZ1bmN0aW9uIGVuZFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgdiwgY29udGV4dCkge1xuICAgIC8vIElmIHBvbHlnb24gZW5kcyBvbiBhIHRpbGUgYm91bmRhcnksIGRvbid0IGFkZCBhIGpvaW5cbiAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgcG9seWdvbiBlbmRzIHdpdGhpbiBhIHRpbGUsIGFkZCBNaXRlciBvciBubyBqb2ludCAoam9pbiBhZGRlZCBvbiBzdGFydFBvbHlnb24pXG4gICAgICAgIHZhciBtaXRlclZlYyA9IGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCk7XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyICYmIFZlY3Rvci5sZW5ndGhTcShtaXRlclZlYykgPiBjb250ZXh0Lm1pdGVyX2xlbl9zcSkge1xuICAgICAgICAgICAgam9pbl90eXBlID0gSk9JTl9UWVBFLmJldmVsOyAvLyBzd2l0Y2ggdG8gYmV2ZWxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IuYWRkKG5vcm1QcmV2LCBub3JtTmV4dCkpO1xuICAgIHZhciBzY2FsZSA9IDIgLyAoMSArIE1hdGguYWJzKFZlY3Rvci5kb3Qobm9ybVByZXYsIG1pdGVyVmVjKSkpO1xuICAgIHJldHVybiBWZWN0b3IubXVsdChtaXRlclZlYywgc2NhbGUgKiBzY2FsZSk7XG59XG5cbi8vIEFkZCBhIG1pdGVyIHZlY3RvciBvciBhIGpvaW4gaWYgdGhlIG1pdGVyIGlzIHRvbyBzaGFycFxuZnVuY3Rpb24gYWRkTWl0ZXIgKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBtaXRlcl9sZW5fc3EsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcblxuICAgIC8vICBNaXRlciBsaW1pdDogaWYgbWl0ZXIgam9pbiBpcyB0b28gc2hhcnAsIGNvbnZlcnQgdG8gYmV2ZWwgaW5zdGVhZFxuICAgIGlmIChWZWN0b3IubGVuZ3RoU3EobWl0ZXJWZWMpID4gbWl0ZXJfbGVuX3NxKSB7XG4gICAgICAgIGFkZEpvaW4oSk9JTl9UWVBFLm1pdGVyLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgaXNCZWdpbm5pbmcsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBBZGQgYSBiZXZlbCBvciByb3VuZCBqb2luXG5mdW5jdGlvbiBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcbiAgICB2YXIgaXNDbG9ja3dpc2UgPSAobm9ybU5leHRbMF0gKiBub3JtUHJldlsxXSAtIG5vcm1OZXh0WzFdICogbm9ybVByZXZbMF0gPiAwKTtcblxuICAgIGlmIChpc0Nsb2Nrd2lzZSl7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLmJldmVsKSB7XG4gICAgICAgICAgICBhZGRCZXZlbChjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgVmVjdG9yLm5lZyhub3JtUHJldiksIG1pdGVyVmVjLCBWZWN0b3IubmVnKG5vcm1OZXh0KSxcbiAgICAgICAgICAgICAgICBbMCwgdl0sIFsxLCB2XSwgWzAsIHZdLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUucm91bmQpIHtcbiAgICAgICAgICAgIGFkZEZhbihjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgVmVjdG9yLm5lZyhub3JtUHJldiksIG1pdGVyVmVjLCBWZWN0b3IubmVnKG5vcm1OZXh0KSxcbiAgICAgICAgICAgICAgICBbMCwgdl0sIFsxLCB2XSwgWzAsIHZdLFxuICAgICAgICAgICAgICAgIGZhbHNlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUuYmV2ZWwpIHtcbiAgICAgICAgICAgIGFkZEJldmVsKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBub3JtUHJldiwgVmVjdG9yLm5lZyhtaXRlclZlYyksIG5vcm1OZXh0LFxuICAgICAgICAgICAgICAgIFsxLCB2XSwgWzAsIHZdLCBbMSwgdl0sXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5yb3VuZCkge1xuICAgICAgICAgICAgYWRkRmFuKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBub3JtUHJldiwgVmVjdG9yLm5lZyhtaXRlclZlYyksIG5vcm1OZXh0LFxuICAgICAgICAgICAgICAgIFsxLCB2XSwgWzAsIHZdLCBbMSwgdl0sXG4gICAgICAgICAgICAgICAgZmFsc2UsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxufVxuXG4vLyBBZGQgaW5kaWNlcyB0byB2ZXJ0ZXhfZWxlbWVudHNcbmZ1bmN0aW9uIGluZGV4UGFpcnMobnVtX3BhaXJzLCBjb250ZXh0KXtcbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgdmFyIG51bV92ZXJ0aWNlcyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuICAgIHZhciBvZmZzZXQgPSBudW1fdmVydGljZXMgLSAyICogbnVtX3BhaXJzIC0gMjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX3BhaXJzOyBpKyspe1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDMpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkVmVydGV4KGNvb3JkaW5hdGUsIG5vcm1hbCwgdXYsIGNvbnRleHQpIHtcbiAgICB2YXIgdmVydGV4X3RlbXBsYXRlID0gY29udGV4dC52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgdmFyIHZlcnRleF9kYXRhID0gY29udGV4dC52ZXJ0ZXhfZGF0YTtcblxuICAgIGJ1aWxkVmVydGV4VGVtcGxhdGUodmVydGV4X3RlbXBsYXRlLCBjb29yZGluYXRlLCB1diwgbm9ybWFsLCBjb250ZXh0KTtcbiAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWZXJ0ZXhUZW1wbGF0ZSAodmVydGV4X3RlbXBsYXRlLCB2ZXJ0ZXgsIHRleHR1cmVfY29vcmQsIHNjYWxlLCBjb250ZXh0KSB7XG4gICAgLy8gc2V0IHZlcnRleCBwb3NpdGlvblxuICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHZlcnRleFswXTtcbiAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB2ZXJ0ZXhbMV07XG5cbiAgICAvLyBzZXQgVVZzXG4gICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggJiYgdGV4dHVyZV9jb29yZCkge1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC50ZXhjb29yZF9pbmRleCArIDBdID0gdGV4dHVyZV9jb29yZFswXSAqIGNvbnRleHQudGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC50ZXhjb29yZF9pbmRleCArIDFdID0gdGV4dHVyZV9jb29yZFsxXSAqIGNvbnRleHQudGV4Y29vcmRfbm9ybWFsaXplO1xuICAgIH1cblxuICAgIC8vIHNldCBTY2FsaW5nIHZlcnRleCAoWCwgWSBub3JtYWwgZGlyZWN0aW9uICsgWiBoYWxmX3dpZHRoIGFzIGF0dHJpYnV0ZSlcbiAgICBpZiAoY29udGV4dC5zY2FsaW5nX2luZGV4KSB7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAwXSA9IHNjYWxlWzBdICogY29udGV4dC5zY2FsaW5nX25vcm1hbGl6ZTtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDFdID0gc2NhbGVbMV0gKiBjb250ZXh0LnNjYWxpbmdfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMl0gPSBjb250ZXh0LmhhbGZfd2lkdGg7XG4gICAgfVxufVxuXG4vLyAgVGVzc2FsYXRlIGEgRkFOIGdlb21ldHJ5IGJldHdlZW4gcG9pbnRzIEEgICAgICAgQlxuLy8gIHVzaW5nIHRoZWlyIG5vcm1hbHMgZnJvbSBhIGNlbnRlciAgICAgICAgXFwgLiAuIC9cbi8vICBhbmQgaW50ZXJwb2xhdGluZyB0aGVpciBVVnMgICAgICAgICAgICAgICBcXCBwIC9cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwuL1xuZnVuY3Rpb24gYWRkRmFuIChjb29yZCwgbkEsIG5DLCBuQiwgdXZBLCB1dkMsIHV2QiwgaXNDYXAsIGNvbnRleHQpIHtcbiAgICB2YXIgY3Jvc3MgPSBuQVswXSAqIG5CWzFdIC0gbkFbMV0gKiBuQlswXTtcbiAgICB2YXIgZG90ID0gVmVjdG9yLmRvdChuQSwgbkIpO1xuXG4gICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihjcm9zcywgZG90KTtcbiAgICB3aGlsZSAoYW5nbGUgPj0gTWF0aC5QSSkge1xuICAgICAgICBhbmdsZSAtPSAyKk1hdGguUEk7XG4gICAgfVxuXG4gICAgdmFyIG51bVRyaWFuZ2xlcyA9IHRyaWFuZ2xlc1BlckFyYyhhbmdsZSwgY29udGV4dC5oYWxmX3dpZHRoKTtcbiAgICBpZiAobnVtVHJpYW5nbGVzIDwgMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBpdm90SW5kZXggPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5DLCB1dkMsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkEsIHV2QSwgY29udGV4dCk7XG5cbiAgICB2YXIgYmxhZGUgPSBuQTtcblxuICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHV2Q3VycjtcbiAgICAgICAgaWYgKGlzQ2FwKXtcbiAgICAgICAgICAgIHV2Q3VyciA9IFtdO1xuICAgICAgICAgICAgdmFyIGFmZmluZV91dkN1cnIgPSBWZWN0b3Iuc3ViKHV2QSwgdXZDKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHV2Q3VyciA9IFZlY3Rvci5zZXQodXZBKTtcbiAgICAgICAgICAgIHZhciB1dl9kZWx0YSA9IFZlY3Rvci5kaXYoVmVjdG9yLnN1Yih1dkIsIHV2QSksIG51bVRyaWFuZ2xlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYW5nbGVfc3RlcCA9IGFuZ2xlIC8gbnVtVHJpYW5nbGVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVHJpYW5nbGVzOyBpKyspIHtcbiAgICAgICAgYmxhZGUgPSBWZWN0b3Iucm90KGJsYWRlLCBhbmdsZV9zdGVwKTtcblxuICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoaXNDYXApe1xuICAgICAgICAgICAgICAgIC8vIFVWIHRleHR1cmVzIGdvIFwidGhyb3VnaFwiIHRoZSBjYXBcbiAgICAgICAgICAgICAgICBhZmZpbmVfdXZDdXJyID0gVmVjdG9yLnJvdChhZmZpbmVfdXZDdXJyLCBhbmdsZV9zdGVwKTtcbiAgICAgICAgICAgICAgICB1dkN1cnJbMF0gPSBhZmZpbmVfdXZDdXJyWzBdICsgdXZDWzBdO1xuICAgICAgICAgICAgICAgIHV2Q3VyclsxXSA9IGFmZmluZV91dkN1cnJbMV0gKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlICsgdXZDWzFdOyAvLyBzY2FsZSB0aGUgdi1jb29yZGluYXRlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVViB0ZXh0dXJlcyBnbyBcImFyb3VuZFwiIHRoZSBqb2luXG4gICAgICAgICAgICAgICAgdXZDdXJyID0gVmVjdG9yLmFkZCh1dkN1cnIsIHV2X2RlbHRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZCwgYmxhZGUsIHV2Q3VyciwgY29udGV4dCk7XG5cbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIGkgKyAoKGNyb3NzID4gMCkgPyAyIDogMSkpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4KTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIGkgKyAoKGNyb3NzID4gMCkgPyAxIDogMikpO1xuICAgIH1cbn1cblxuLy8gIGFkZEJldmVsICAgIEEgLS0tLS0gQlxuLy8gICAgICAgICAgICAgLyBcXCAgICAgLyBcXFxuLy8gICAgICAgICAgIC8gICAvXFwgICAvXFwgIFxcXG4vLyAgICAgICAgICAgICAgLyAgXFwgLyAgXFwgIFxcXG4vLyAgICAgICAgICAgICAgICAvIEMgXFxcbmZ1bmN0aW9uIGFkZEJldmVsIChjb29yZCwgbkEsIG5DLCBuQiwgdUEsIHVDLCB1QiwgY29udGV4dCkge1xuICAgIHZhciBwaXZvdEluZGV4ID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5DLCB1QywgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQSwgdUEsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkIsIHVCLCBjb250ZXh0KTtcblxuICAgIHZhciBvcmllbnRhdGlvbiA9IG5BWzBdICogbkJbMV0gLSBuQVsxXSAqIG5CWzBdID4gMDtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGlmIChvcmllbnRhdGlvbikge1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAxKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMik7XG4gICAgfVxufVxuXG4vLyAgRnVuY3Rpb24gdG8gYWRkIHRoZSB2ZXJ0ZXggbmVlZCBmb3IgbGluZSBjYXBzLFxuLy8gIGJlY2F1c2UgcmUtdXNlIHRoZSBidWZmZXJzIG5lZWRzIHRvIGJlIGF0IHRoZSBlbmRcbmZ1bmN0aW9uIGFkZENhcCAoY29vcmQsIHYsIG5vcm1hbCwgdHlwZSwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbmVnX25vcm1hbCA9IFZlY3Rvci5uZWcobm9ybWFsKTtcblxuICAgIHN3aXRjaCAodHlwZSl7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUuc3F1YXJlOlxuICAgICAgICAgICAgdmFyIHRhbmdlbnQ7XG4gICAgICAgICAgICBpZiAoaXNCZWdpbm5pbmcpe1xuICAgICAgICAgICAgICAgIHRhbmdlbnQgPSBbbm9ybWFsWzFdLCAtbm9ybWFsWzBdXTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChub3JtYWwsIHRhbmdlbnQpLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChuZWdfbm9ybWFsLCB0YW5nZW50KSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBsZW5ndGggb2Ygc3F1YXJlIGNhcCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5vcm1hbCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5lZ19ub3JtYWwsIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YW5nZW50ID0gWy1ub3JtYWxbMV0sIG5vcm1hbFswXV07XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5vcm1hbCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5lZ19ub3JtYWwsIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgbGVuZ3RoIG9mIHNxdWFyZSBjYXAgdG8gdGV4dHVyZSBjb29yZGluYXRlXG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5vcm1hbCwgdGFuZ2VudCksIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5lZ19ub3JtYWwsIHRhbmdlbnQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUucm91bmQ6XG4gICAgICAgICAgICB2YXIgbkEsIG5CLCB1dkEsIHV2QiwgdXZDO1xuICAgICAgICAgICAgaWYgKGlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgbkEgPSBub3JtYWw7XG4gICAgICAgICAgICAgICAgbkIgPSBuZWdfbm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdXZBID0gWzEsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkIgPSBbMCwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QyA9IFswLjUsIHZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5BID0gbmVnX25vcm1hbDtcbiAgICAgICAgICAgICAgICBuQiA9IG5vcm1hbDtcblxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICB1dkEgPSBbMCwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QiA9IFsxLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZDID0gWzAuNSwgdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRGYW4oY29vcmQsXG4gICAgICAgICAgICAgICAgbkEsIHplcm9fdmVjMiwgbkIsXG4gICAgICAgICAgICAgICAgdXZBLCB1dkMsIHV2QixcbiAgICAgICAgICAgICAgICB0cnVlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5idXR0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbn1cblxuLy8gRm9yIElFIE1hdGgubG9nMiBzdXBwb3J0XG5sZXQgbG9nMiA9IE1hdGgubG9nMiB8fCBmdW5jdGlvbih4KXsgcmV0dXJuIE1hdGgubG9nKHgpICogTWF0aC5MT0cyRTsgfTtcblxuLy8gQ2FsY3VsYXRlIG51bWJlciBvZiB0cmlhbmdsZXMgZm9yIGEgZmFuIGdpdmVuIGFuIGFuZ2xlIGFuZCBsaW5lIHdpZHRoXG5mdW5jdGlvbiB0cmlhbmdsZXNQZXJBcmMgKGFuZ2xlLCB3aWR0aCkge1xuICAgIGlmIChhbmdsZSA8IDApIHtcbiAgICAgICAgYW5nbGUgPSAtYW5nbGU7XG4gICAgfVxuXG4gICAgdmFyIG51bVRyaWFuZ2xlcyA9ICh3aWR0aCA+IDIgKiBERUZBVUxULk1JTl9GQU5fV0lEVEgpID8gbG9nMih3aWR0aCAvIERFRkFVTFQuTUlOX0ZBTl9XSURUSCkgOiAxO1xuICAgIHJldHVybiBNYXRoLmNlaWwoYW5nbGUgLyBNYXRoLlBJICogbnVtVHJpYW5nbGVzKTtcbn1cblxuLy8gQ3ljbGljYWxseSBwZXJtdXRlIGNsb3NlZCBsaW5lIHN0YXJ0aW5nIGF0IGFuIGluZGV4XG5mdW5jdGlvbiBwZXJtdXRlTGluZShsaW5lLCBzdGFydEluZGV4KXtcbiAgICB2YXIgbmV3TGluZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBpbmRleCA9IChpICsgc3RhcnRJbmRleCkgJSBsaW5lLmxlbmd0aDtcbiAgICAgICAgLy8gc2tpcCB0aGUgZmlyc3QgKHJlcGVhdGVkKSBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIG5ld0xpbmUucHVzaChsaW5lW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV3TGluZS5wdXNoKG5ld0xpbmVbMF0pO1xuICAgIHJldHVybiBuZXdMaW5lO1xufSIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IHttYXQ0LCBtYXQzLCB2ZWMzfSBmcm9tICcuL3V0aWxzL2dsLW1hdHJpeCc7XG5cbi8vIEFic3RyYWN0IGJhc2UgY2xhc3NcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBjYW1lcmEgYnkgdHlwZSBuYW1lLCBmYWN0b3J5LXN0eWxlXG4gICAgc3RhdGljIGNyZWF0ZShuYW1lLCB2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaXNvbWV0cmljJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElzb21ldHJpY0NhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICAgICAgY2FzZSAnZmxhdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbGF0Q2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgICAgICBjYXNlICdwZXJzcGVjdGl2ZSc6XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlKCkge1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbmNlIHBlciBmcmFtZSBwZXIgcHJvZ3JhbSAoZS5nLiBmb3IgbWFpbiByZW5kZXIgcGFzcywgdGhlbiBmb3IgZWFjaCBhZGRpdGlvbmFsIHBhc3MgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBldGMuKVxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgfVxuXG4gICAgLy8gU3luYyBjYW1lcmEgcG9zaXRpb24vem9vbSB0byBzY2VuZSB2aWV3XG4gICAgdXBkYXRlVmlldyAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIHx8IHRoaXMuem9vbSkge1xuICAgICAgICAgICAgdmFyIHZpZXcgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmlldyA9IHsgbG5nOiB0aGlzLnBvc2l0aW9uWzBdLCBsYXQ6IHRoaXMucG9zaXRpb25bMV0sIHpvb206IHRoaXMucG9zaXRpb25bMl0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnpvb20pIHtcbiAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSB0aGlzLnpvb207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBtb2RlbC12aWV3IGFuZCBub3JtYWwgbWF0cmljZXNcbiAgICBzZXR1cE1hdHJpY2VzIChtYXRyaWNlcywgcHJvZ3JhbSkge1xuICAgICAgICAvLyBNb2RlbCB2aWV3IG1hdHJpeCAtIHRyYW5zZm9ybSB0aWxlIHNwYWNlIGludG8gdmlldyBzcGFjZSAobWV0ZXJzLCByZWxhdGl2ZSB0byBjYW1lcmEpXG4gICAgICAgIG1hdDQubXVsdGlwbHkobWF0cmljZXMubW9kZWxfdmlldzMyLCB0aGlzLnZpZXdfbWF0cml4LCBtYXRyaWNlcy5tb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWxWaWV3JywgbWF0cmljZXMubW9kZWxfdmlldzMyKTtcblxuICAgICAgICAvLyBOb3JtYWwgbWF0cmljZXMgLSB0cmFuc2Zvcm1zIHN1cmZhY2Ugbm9ybWFscyBpbnRvIHZpZXcgc3BhY2VcbiAgICAgICAgbWF0My5ub3JtYWxGcm9tTWF0NChtYXRyaWNlcy5ub3JtYWwzMiwgbWF0cmljZXMubW9kZWxfdmlldzMyKTtcbiAgICAgICAgbWF0My5pbnZlcnQobWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMiwgbWF0cmljZXMubm9ybWFsMzIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDNmdicsICd1X25vcm1hbE1hdHJpeCcsIG1hdHJpY2VzLm5vcm1hbDMyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXgzZnYnLCAndV9pbnZlcnNlTm9ybWFsTWF0cml4JywgbWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMik7XG4gICAgfVxuXG59XG5cbi8qKlxuICAgIFBlcnNwZWN0aXZlIG1hdHJpeCBwcm9qZWN0aW9uXG5cbiAgICBUaGlzIGlzIGEgc3BlY2lhbGl6ZWQgcGVyc3BlY3RpdmUgY2FtZXJhIHRoYXQsIGdpdmVuIGEgZGVzaXJlZCBjYW1lcmEgZm9jYWwgbGVuZ3RoICh3aGljaCBjYW4gYWxzbyB2YXJ5IGJ5IHpvb20gbGV2ZWwpLFxuICAgIGNvbnN0cmFpbnMgdGhlIGNhbWVyYSBoZWlnaHQgYWJvdmUgdGhlIGdyb3VuZCBwbGFuZSBzdWNoIHRoYXQgdGhlIGRpc3BsYXllZCBncm91bmQgYXJlYSBvZiB0aGUgbWFwIG1hdGNoZXMgdGhhdCBvZlxuICAgIGEgdHJhZGl0aW9uYWwgd2ViIG1lcmNhdG9yIG1hcC4gVGhpcyBtZWFucyB5b3UgY2FuIHNldCB0aGUgY2FtZXJhIGxvY2F0aW9uIGJ5IFtsYXQsIGxuZywgem9vbV0gYXMgeW91IHdvdWxkIGEgdHlwaWNhbFxuICAgIHdlYiBtZXJjYXRvciBtYXAsIHRoZW4gYWRqdXN0IHRoZSBmb2NhbCBsZW5ndGggYXMgbmVlZGVkLlxuXG4gICAgVmFuaXNoaW5nIHBvaW50IGNhbiBhbHNvIGJlIGFkanVzdGVkIHRvIGFjaGlldmUgZGlmZmVyZW50IFwidmlld2luZyBhbmdsZXNcIiwgZS5nLiBpbnN0ZWFkIG9mIGxvb2tpbmcgc3RyYWlnaHQgZG93biBpbnRvXG4gICAgdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQsIHRoZSBjYW1lcmEgYXBwZWFycyB0byBiZSB0aWx0ZWQgYXQgYW4gYW5nbGUuIEZvciBleGFtcGxlOlxuXG4gICAgWzAsIDBdID0gbG9va2luZyB0b3dhcmRzIGNlbnRlciBvZiB2aWV3cG9ydFxuICAgIFstMjUwLCAtMjUwXSA9IGxvb2tpbmcgMjUwIHBpeGVscyBmcm9tIHRoZSB2aWV3cG9ydCBjZW50ZXIgdG8gdGhlIGxvd2VyLWxlZnQgY29ybmVyXG4gICAgWzQwMCwgMF0gPSBsb29raW5nIDQwMCBwaXhlbHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSB2aWV3cG9ydCBjZW50ZXJcbiovXG5jbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdwZXJzcGVjdGl2ZSc7XG5cbiAgICAgICAgLy8gYSBzaW5nbGUgc2NhbGFyLCBvciBwYWlycyBvZiBzdG9wcyBtYXBwaW5nIHpvb20gbGV2ZWxzLCBlLmcuIFt6b29tLCBmb2NhbCBsZW5ndGhdXG4gICAgICAgIHRoaXMuZm9jYWxfbGVuZ3RoID0gb3B0aW9ucy5mb2NhbF9sZW5ndGg7XG4gICAgICAgIHRoaXMuZm92ID0gb3B0aW9ucy5mb3Y7XG4gICAgICAgIGlmICghdGhpcy5mb2NhbF9sZW5ndGggJiYgIXRoaXMuZm92KSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IGZvY2FsIGxlbmd0aCByYW5nZXMgYnkgem9vbVxuICAgICAgICAgICAgdGhpcy5mb2NhbF9sZW5ndGggPSBbWzE2LCAyXSwgWzE3LCAyLjVdLCBbMTgsIDNdLCBbMTksIDRdLCBbMjAsIDZdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50ID0gb3B0aW9ucy52YW5pc2hpbmdfcG9pbnQgfHwgWzAsIDBdOyAvLyBbeCwgeV1cbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnQgPSB0aGlzLnZhbmlzaGluZ19wb2ludC5tYXAocGFyc2VGbG9hdCk7IC8vIHdlIGltcGxpY2l0bHkgb25seSBzdXBwb3J0IHB4IHVuaXRzIGhlcmVcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tldyA9IFtdO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3X21hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5cbiAgICAgICAgLy8gJ2NhbWVyYScgaXMgdGhlIG5hbWUgb2YgdGhlIHNoYWRlciBibG9jaywgZS5nLiBkZXRlcm1pbmVzIHdoZXJlIGluIHRoZSBzaGFkZXIgdGhpcyBjb2RlIGlzIGluamVjdGVkXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdjYW1lcmEnLCBgXG4gICAgICAgICAgICB1bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZXllO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdmFuaXNoaW5nX3BvaW50O1xuXG4gICAgICAgICAgICB2b2lkIGNhbWVyYVByb2plY3Rpb24gKGlub3V0IHZlYzQgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHBvc2l0aW9uO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJhaW5zIHRoZSBjYW1lcmEgc28gdGhhdCB0aGUgdmlld2FibGUgYXJlYSBtYXRjaGVzIGdpdmVuIHRoZSB2aWV3cG9ydCBoZWlnaHRcbiAgICAvLyAoaW4gd29ybGQgc3BhY2UsIGUuZy4gbWV0ZXJzKSwgZ2l2ZW4gZWl0aGVyIGEgY2FtZXJhIGZvY2FsIGxlbmd0aCBvciBmaWVsZC1vZi12aWV3XG4gICAgLy8gKGZvY2FsIGxlbmd0aCBpcyB1c2VkIGlmIGJvdGggYXJlIHBhc3NlZCkuXG4gICAgY29uc3RyYWluQ2FtZXJhKHsgdmlld19oZWlnaHQsIGhlaWdodCwgZm9jYWxfbGVuZ3RoLCBmb3YgfSkge1xuICAgICAgICAvLyBTb2x2ZSBmb3IgY2FtZXJhIGhlaWdodFxuICAgICAgICBpZiAoIWhlaWdodCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb2NhbCBsZW5ndGgsIGNhbGN1bGF0ZSBGT1ZcbiAgICAgICAgICAgIGlmIChmb2NhbF9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3YgPSBNYXRoLmF0YW4oMSAvIGZvY2FsX2xlbmd0aCkgKiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBGT1YsIGNhbGN1bGF0ZSBmb2NhbCBsZW5ndGhcbiAgICAgICAgICAgIGVsc2UgaWYgKGZvdikge1xuICAgICAgICAgICAgICAgIGZvdiA9IGZvdiAqIE1hdGguUEkgLyAxODA7IC8vIGNvbnZlcnQgRk9WIGRlZ3JlZXMgdG8gcmFkaWFuc1xuICAgICAgICAgICAgICAgIGZvY2FsX2xlbmd0aCA9IDEgLyBNYXRoLnRhbihmb3YgLyAyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzdGFuY2UgdGhhdCBjYW1lcmEgc2hvdWxkIGJlIGZyb20gZ3JvdW5kIHN1Y2ggdGhhdCBpdCBmaXRzIHRoZSBmaWVsZCBvZiB2aWV3IGV4cGVjdGVkXG4gICAgICAgICAgICAvLyBmb3IgYSBjb252ZW50aW9uYWwgd2ViIG1lcmNhdG9yIG1hcCBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsIGFuZCBjYW1lcmEgZm9jYWwgbGVuZ3RoXG4gICAgICAgICAgICBoZWlnaHQgPSB2aWV3X2hlaWdodCAvIDIgKiBmb2NhbF9sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29sdmUgZm9yIGNhbWVyYSBmb2NhbCBsZW5ndGggLyBmaWVsZC1vZi12aWV3XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9jYWxfbGVuZ3RoID0gMiAqIGhlaWdodCAvIHZpZXdfaGVpZ2h0O1xuICAgICAgICAgICAgZm92ID0gTWF0aC5hdGFuKDEgLyBmb2NhbF9sZW5ndGgpICogMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHZpZXdfaGVpZ2h0LCBoZWlnaHQsIGZvY2FsX2xlbmd0aCwgZm92IH07XG4gICAgfVxuXG4gICAgdXBkYXRlTWF0cmljZXMoKSB7XG4gICAgICAgIC8vIFRPRE86IG9ubHkgcmUtY2FsY3VsYXRlIHRoZXNlIHZhcnMgd2hlbiBuZWNlc3NhcnlcblxuICAgICAgICAvLyBIZWlnaHQgb2YgdGhlIHZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdmFyIHZpZXdwb3J0X2hlaWdodCA9IHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLnZpZXcubWV0ZXJzX3Blcl9waXhlbDtcblxuICAgICAgICAvLyBDb21wdXRlIGNhbWVyYSBwcm9wZXJ0aWVzIHRvIGZpdCBkZXNpcmVkIHZpZXdcbiAgICAgICAgdmFyIHsgaGVpZ2h0LCBmb3YgfSA9IHRoaXMuY29uc3RyYWluQ2FtZXJhKHtcbiAgICAgICAgICAgIHZpZXdfaGVpZ2h0OiB2aWV3cG9ydF9oZWlnaHQsXG4gICAgICAgICAgICBmb2NhbF9sZW5ndGg6IFV0aWxzLmludGVycG9sYXRlKHRoaXMudmlldy56b29tLCB0aGlzLmZvY2FsX2xlbmd0aCksXG4gICAgICAgICAgICBmb3Y6IFV0aWxzLmludGVycG9sYXRlKHRoaXMudmlldy56b29tLCB0aGlzLmZvdilcbiAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZpZXcgbWF0cml4XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFt0aGlzLnZpZXcuY2VudGVyLm1ldGVycy54LCB0aGlzLnZpZXcuY2VudGVyLm1ldGVycy55LCBoZWlnaHRdO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IHBvc2l0aW9uO1xuXG4gICAgICAgIC8vIG1hdDQubG9va0F0KHRoaXMudmlld19tYXRyaXgsXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMoLi4ucG9zaXRpb24pLFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgaGVpZ2h0IC0gMSksXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCkpO1xuICAgICAgICAvLyBFeGNsdWRlIGNhbWVyYSBoZWlnaHQgZnJvbSB2aWV3IG1hdHJpeFxuICAgICAgICBtYXQ0Lmxvb2tBdCh0aGlzLnZpZXdfbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgMCksXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCAtMSksXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCkpO1xuXG4gICAgICAgIC8vIFByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgZm92LCB0aGlzLnZpZXcuYXNwZWN0LCAxLCBoZWlnaHQgKiAyKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHZhbmlzaGluZyBwb2ludCBmcm9tIHBpeGVscyB0byB2aWV3cG9ydCBzcGFjZVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdID0gdGhpcy52YW5pc2hpbmdfcG9pbnRbMF0gLyB0aGlzLnZpZXcuc2l6ZS5jc3Mud2lkdGg7XG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gPSB0aGlzLnZhbmlzaGluZ19wb2ludFsxXSAvIHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQ7XG5cbiAgICAgICAgLy8gQWRqdXN0IHByb2plY3Rpb24gbWF0cml4IHRvIGluY2x1ZGUgdmFuaXNoaW5nIHBvaW50IHNrZXdcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs4XSA9IC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdICogMjsgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeFxuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzldID0gLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gKiAyOyAvLyB6IGNvbHVtbiBvZiB5IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB5XG5cbiAgICAgICAgLy8gVHJhbnNsYXRlIGdlb21ldHJ5IGludG8gdGhlIGRpc3RhbmNlIHNvIHRoYXQgY2FtZXJhIGlzIGFwcHJvcHJpYXRlIGhlaWdodCBhYm92ZSBncm91bmRcbiAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBhZGp1c3QgeHkgdG8gY29tcGVuc2F0ZSBmb3IgYW55IHZhbmlzaGluZyBwb2ludCBza2V3LCBlLmcuIG1vdmUgZ2VvbWV0cnkgc28gdGhhdCB0aGUgZGlzcGxheWVkIGdcbiAgICAgICAgLy8gcGxhbmUgb2YgdGhlIG1hcCBtYXRjaGVzIHRoYXQgZXhwZWN0ZWQgYnkgYSB0cmFkaXRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwIGF0IHRoaXMgW2xhdCwgbG5nLCB6b29tXS5cbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhcbiAgICAgICAgICAgICAgICB2aWV3cG9ydF9oZWlnaHQvMiAqIHRoaXMudmlldy5hc3BlY3QgKiAoLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gKiAyKSxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydF9oZWlnaHQvMiAqICgtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSAqIDIpLFxuICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbmNsdWRlIGNhbWVyYSBoZWlnaHQgaW4gcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdmVjMy5mcm9tVmFsdWVzKDAsIDAsIC1oZWlnaHQpKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9wcm9qZWN0aW9uJywgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2YnLCAndV9leWUnLCBbMCwgMCwgdGhpcy5wb3NpdGlvbl9tZXRlcnNbMl1dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV92YW5pc2hpbmdfcG9pbnQnLCB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3KTtcbiAgICB9XG5cbn1cblxuLy8gSXNvbWV0cmljLXN0eWxlIHByb2plY3Rpb25cbi8vIE5vdGU6IHRoaXMgaXMgYWN0dWFsbHkgYW4gXCJheG9ub21ldHJpY1wiIHByb2plY3Rpb24sIGJ1dCBJJ20gdXNpbmcgdGhlIGNvbGxvcXVpYWwgdGVybSBpc29tZXRyaWMgYmVjYXVzZSBpdCBpcyBtb3JlIHJlY29nbml6YWJsZS5cbi8vIEFuIGlzb21ldHJpYyBwcm9qZWN0aW9uIGlzIGEgc3BlY2lmaWMgc3Vic2V0IG9mIGF4b25vbWV0cmljIHByb2plY3Rpb25zLlxuLy8gJ2F4aXMnIGRldGVybWluZXMgdGhlIHh5IHNrZXcgYXBwbGllZCB0byBhIHZlcnRleCBiYXNlZCBvbiBpdHMgeiBjb29yZGluYXRlLCBlLmcuIFswLCAxXSBheGlzIGNhdXNlcyBidWlsZGluZ3MgdG8gYmUgZHJhd25cbi8vIHN0cmFpZ2h0IHVwd2FyZHMgb24gc2NyZWVuIGF0IHRoZWlyIHRydWUgaGVpZ2h0LCBbMCwgLjVdIHdvdWxkIGRyYXcgdGhlbSB1cCBhdCBoYWxmLWhlaWdodCwgWzEsIDBdIHdvdWxkIGJlIHNpZGV3YXlzLCBldGMuXG5jbGFzcyBJc29tZXRyaWNDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnaXNvbWV0cmljJztcbiAgICAgICAgdGhpcy5heGlzID0gb3B0aW9ucy5heGlzIHx8IHsgeDogMCwgeTogMSB9O1xuICAgICAgICBpZiAodGhpcy5heGlzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhpcy5heGlzID0geyB4OiB0aGlzLmF4aXNbMF0sIHk6IHRoaXMuYXhpc1sxXSB9OyAvLyBhbGxvdyBheGlzIHRvIGFsc28gYmUgcGFzc2VkIGFzIDItZWxlbSBhcnJheVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdwb3J0X2hlaWdodCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52aWV3X21hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5cbiAgICAgICAgLy8gJ2NhbWVyYScgaXMgdGhlIG5hbWUgb2YgdGhlIHNoYWRlciBibG9jaywgZS5nLiBkZXRlcm1pbmVzIHdoZXJlIGluIHRoZSBzaGFkZXIgdGhpcyBjb2RlIGlzIGluamVjdGVkXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdjYW1lcmEnLCBgXG4gICAgICAgICAgICB1bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZXllO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdmFuaXNoaW5nX3BvaW50O1xuXG4gICAgICAgICAgICB2b2lkIGNhbWVyYVByb2plY3Rpb24gKGlub3V0IHZlYzQgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLnh5ICs9IHBvc2l0aW9uLnogKiB1X2lzb21ldHJpY19heGlzO1xuXG4gICAgICAgICAgICAgICAgLy8gUmV2ZXJzZSB6IGZvciBkZXB0aCBidWZmZXIgc28gdXAgaXMgbmVnYXRpdmUsXG4gICAgICAgICAgICAgICAgLy8gYW5kIHNjYWxlIGRvd24gdmFsdWVzIHNvIG9iamVjdHMgaGlnaGVyIHRoYW4gb25lIHNjcmVlbiBoZWlnaHQgd2lsbCBub3QgZ2V0IGNsaXBwZWRcbiAgICAgICAgICAgICAgICAvLyBwdWxsIGZvcndhcmQgc2xpZ2h0bHkgdG8gYXZvaWQgZ29pbmcgcGFzdCBmYXIgY2xpcHBpbmcgcGxhbmVcbiAgICAgICAgICAgICAgICBwb3NpdGlvbi56ID0gLXBvc2l0aW9uLnogLyAxMDAuICsgMS4gLSAwLjAwMTtcbiAgICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcblxuICAgICAgICB0aGlzLnZpZXdwb3J0X2hlaWdodCA9IHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLnZpZXcubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW3RoaXMudmlldy5jZW50ZXIubWV0ZXJzLngsIHRoaXMudmlldy5jZW50ZXIubWV0ZXJzLnksIHRoaXMudmlld3BvcnRfaGVpZ2h0XTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBwb3NpdGlvbjtcblxuICAgICAgICAvLyBWaWV3XG4gICAgICAgIG1hdDQuaWRlbnRpdHkodGhpcy52aWV3X21hdHJpeCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMudmlld19tYXRyaXgsIHRoaXMudmlld19tYXRyaXgsIHZlYzMuZnJvbVZhbHVlcygtcG9zaXRpb25bMF0sIC1wb3NpdGlvblsxXSwgMCkpO1xuXG4gICAgICAgIC8vIFByb2plY3Rpb25cbiAgICAgICAgbWF0NC5pZGVudGl0eSh0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcblxuICAgICAgICAvLyBhcHBseSBpc29tZXRyaWMgc2tld1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzhdID0gdGhpcy5heGlzLnggLyB0aGlzLnZpZXcuYXNwZWN0OyAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB4XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOV0gPSB0aGlzLmF4aXMueTsgICAgICAgICAgICAgICAgICAgIC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHlcblxuICAgICAgICAvLyBjb252ZXJ0IG1ldGVycyB0byB2aWV3cG9ydFxuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy54LFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueSxcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLnlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X3Byb2plY3Rpb24nLCB0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X2V5ZScsIFswLCAwLCB0aGlzLnZpZXdwb3J0X2hlaWdodF0pO1xuICAgICAgICAvLyBwcm9ncmFtLnVuaWZvcm0oJzNmJywgJ3VfZXllJywgdGhpcy52aWV3cG9ydF9oZWlnaHQgKiB0aGlzLmF4aXMueCwgdGhpcy52aWV3cG9ydF9oZWlnaHQgKiB0aGlzLmF4aXMueSwgdGhpcy52aWV3cG9ydF9oZWlnaHQpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3ZhbmlzaGluZ19wb2ludCcsIFswLCAwXSk7XG4gICAgfVxuXG59XG5cbi8vIEZsYXQgcHJvamVjdGlvbiAoZS5nLiBqdXN0IHRvcC1kb3duLCBubyBwZXJzcGVjdGl2ZSkgLSBhIGRlZ2VuZXJhdGUgaXNvbWV0cmljIGNhbWVyYVxuY2xhc3MgRmxhdENhbWVyYSBleHRlbmRzIElzb21ldHJpY0NhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdmbGF0JztcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vIEF4aXMgaXMgZml4ZWQgdG8gKDAsIDApIGZvciBmbGF0IGNhbWVyYVxuICAgICAgICB0aGlzLmF4aXMueCA9IDA7XG4gICAgICAgIHRoaXMuYXhpcy55ID0gMDtcblxuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICB9XG5cbn1cbiIsIi8vIE1pc2NlbGxhbmVvdXMgZ2VvIGZ1bmN0aW9uc1xuXG52YXIgR2VvO1xuZXhwb3J0IGRlZmF1bHQgR2VvID0ge307XG5cbi8vIFByb2plY3Rpb24gY29uc3RhbnRzXG5HZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb20gPSAxODtcbkdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20gPSAyMDtcbkdlby50aWxlX3NpemUgPSAyNTY7XG5HZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyA9IDIwMDM3NTA4LjM0Mjc4OTI0NDtcbkdlby5jaXJjdW1mZXJlbmNlX21ldGVycyA9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzICogMjtcbkdlby5taW5fem9vbV9tZXRlcnNfcGVyX3BpeGVsID0gR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gR2VvLnRpbGVfc2l6ZTsgLy8gbWluIHpvb20gZHJhd3Mgd29ybGQgYXMgMiB0aWxlcyB3aWRlXG5cbmxldCBtZXRlcnNfcGVyX3BpeGVsID0gW107XG5HZW8ubWV0ZXJzUGVyUGl4ZWwgPSBmdW5jdGlvbiAoeikge1xuICAgIG1ldGVyc19wZXJfcGl4ZWxbel0gPSBtZXRlcnNfcGVyX3BpeGVsW3pdIHx8IEdlby5taW5fem9vbV9tZXRlcnNfcGVyX3BpeGVsIC8gTWF0aC5wb3coMiwgeik7XG4gICAgcmV0dXJuIG1ldGVyc19wZXJfcGl4ZWxbel07XG59O1xuXG5sZXQgbWV0ZXJzX3Blcl90aWxlID0gW107XG5HZW8ubWV0ZXJzUGVyVGlsZSA9IGZ1bmN0aW9uICh6KSB7XG4gICAgbWV0ZXJzX3Blcl90aWxlW3pdID0gbWV0ZXJzX3Blcl90aWxlW3pdIHx8IEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHopO1xuICAgIHJldHVybiBtZXRlcnNfcGVyX3RpbGVbel07XG59O1xuXG4vLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyBiYXNlZCBvbiBhbiBkZWZpbmVkIHRpbGUgc2NhbGVcbkdlby50aWxlX3NjYWxlID0gNDA5NjsgLy8gY29vcmRpbmF0ZXMgYXJlIGxvY2FsbHkgc2NhbGVkIHRvIHRoZSByYW5nZSBbMCwgdGlsZV9zY2FsZV1cbkdlby51bml0c19wZXJfcGl4ZWwgPSBHZW8udGlsZV9zY2FsZSAvIEdlby50aWxlX3NpemU7XG5HZW8uaGVpZ2h0X3NjYWxlID0gMTY7ICAvLyBwcm92aWRlcyBzdWItbWV0ZXIgcHJlY2lzaW9uIGZvciBoZWlnaHQgdmFsdWVzICgxNnRocyBvZiBhIG1ldGVycylcblxubGV0IHVuaXRzX3Blcl9tZXRlciA9IFtdO1xuR2VvLnVuaXRzUGVyTWV0ZXIgPSBmdW5jdGlvbiAoeikge1xuICAgIHVuaXRzX3Blcl9tZXRlclt6XSA9IHVuaXRzX3Blcl9tZXRlclt6XSB8fCBHZW8udGlsZV9zY2FsZSAvIChHZW8udGlsZV9zaXplICogR2VvLm1ldGVyc1BlclBpeGVsKHopKTtcbiAgICByZXR1cm4gdW5pdHNfcGVyX21ldGVyW3pdO1xufTtcblxuLy8gQ29udmVydCB0aWxlIGxvY2F0aW9uIHRvIG1lcmNhdG9yIG1ldGVycyAtIG11bHRpcGx5IGJ5IHBpeGVscyBwZXIgdGlsZSwgdGhlbiBieSBtZXRlcnMgcGVyIHBpeGVsLCBhZGp1c3QgZm9yIG1hcCBvcmlnaW5cbkdlby5tZXRlcnNGb3JUaWxlID0gZnVuY3Rpb24gKHRpbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB0aWxlLnggKiBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB0aWxlLnopIC0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMsXG4gICAgICAgIHk6IC0odGlsZS55ICogR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgdGlsZS56KSAtIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKVxuICAgIH07XG59O1xuXG4vKipcbiAgIEdpdmVuIGEgcG9pbnQgaW4gbWVyY2F0b3IgbWV0ZXJzIGFuZCBhIHpvb20gbGV2ZWwsIHJldHVybiB0aGUgdGlsZSBYL1kvWiB0aGF0IHRoZSBwb2ludCBsaWVzIGluXG4qL1xuR2VvLnRpbGVGb3JNZXRlcnMgPSBmdW5jdGlvbiAoW3gsIHldLCB6b29tKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogTWF0aC5mbG9vcigoeCArIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKSAvIChHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6b29tKSkpLFxuICAgICAgICB5OiBNYXRoLmZsb29yKCgteSArIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKSAvIChHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6b29tKSkpLFxuICAgICAgICB6OiB6b29tXG4gICAgfTtcbn07XG5cbi8vIFdyYXAgYSB0aWxlIHRvIHBvc2l0aXZlICNzIGZvciB6b29tXG4vLyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIGF4ZXMgdG8gd3JhcFxuR2VvLndyYXBUaWxlID0gZnVuY3Rpb24oeyB4LCB5LCB6IH0sIG1hc2sgPSB7IHg6IHRydWUsIHk6IGZhbHNlIH0pIHtcbiAgICB2YXIgbSA9ICgxIDw8IHopIC0gMTtcbiAgICBpZiAobWFzay54KSB7XG4gICAgICAgIHggPSB4ICYgbTtcbiAgICB9XG4gICAgaWYgKG1hc2sueSkge1xuICAgICAgICB5ID0geSAmIG07XG4gICAgfVxuICAgIHJldHVybiB7IHgsIHksIHogfTtcbn07XG5cbi8qKlxuICAgQ29udmVydCBtZXJjYXRvciBtZXRlcnMgdG8gbGF0LWxuZ1xuKi9cbkdlby5tZXRlcnNUb0xhdExuZyA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcblxuICAgIHggLz0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG4gICAgeSAvPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcblxuICAgIHkgPSAoMiAqIE1hdGguYXRhbihNYXRoLmV4cCh5ICogTWF0aC5QSSkpIC0gKE1hdGguUEkgLyAyKSkgLyBNYXRoLlBJO1xuXG4gICAgeCAqPSAxODA7XG4gICAgeSAqPSAxODA7XG5cbiAgICByZXR1cm4gW3gsIHldO1xufTtcblxuLyoqXG4gIENvbnZlcnQgbGF0LWxuZyB0byBtZXJjYXRvciBtZXRlcnNcbiovXG5HZW8ubGF0TG5nVG9NZXRlcnMgPSBmdW5jdGlvbihbeCwgeV0pIHtcblxuICAgIC8vIExhdGl0dWRlXG4gICAgeSA9IE1hdGgubG9nKE1hdGgudGFuKHkqTWF0aC5QSS8zNjAgKyBNYXRoLlBJLzQpKSAvIE1hdGguUEk7XG4gICAgeSAqPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcblxuICAgIC8vIExvbmdpdHVkZVxuICAgIHggKj0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyAxODA7XG5cbiAgICByZXR1cm4gW3gsIHldO1xufTtcblxuR2VvLndyYXBMbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPiAxODAgfHwgeCA8IC0xODApIHtcbiAgICAgICAgeCA9ICgoeCArIDE4MCkgJSAzNjAgKyAzNjApICUgMzYwIC0gMTgwO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn07XG5cbi8vIFJ1biBhbiBpbi1wbGFjZSB0cmFuc2Zvcm0gZnVuY3Rpb24gb24gZWFjaCBjb29vcmRpbmF0ZSBpbiBhIEdlb0pTT04gZ2VvbWV0cnlcbkdlby50cmFuc2Zvcm1HZW9tZXRyeSA9IGZ1bmN0aW9uIChnZW9tZXRyeSwgdHJhbnNmb3JtKSB7XG4gICAgaWYgKGdlb21ldHJ5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBza2lwIGlmIG1pc3NpbmcgZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgfVxuXG4gICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgdHJhbnNmb3JtKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKGNvb3JkaW5hdGVzID0+IGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2gocG9seWdvbiA9PiB7XG4gICAgICAgICAgICBwb2x5Z29uLmZvckVhY2goY29vcmRpbmF0ZXMgPT4gY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IHN1cHBvcnQgR2VvbWV0cnlDb2xsZWN0aW9uXG59O1xuXG5HZW8uYm94SW50ZXJzZWN0ID0gZnVuY3Rpb24gKGIxLCBiMikge1xuICAgIHJldHVybiAhKFxuICAgICAgICBiMi5zdy54ID4gYjEubmUueCB8fFxuICAgICAgICBiMi5uZS54IDwgYjEuc3cueCB8fFxuICAgICAgICBiMi5zdy55ID4gYjEubmUueSB8fFxuICAgICAgICBiMi5uZS55IDwgYjEuc3cueVxuICAgICk7XG59O1xuXG4vLyBGaW5kcyB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBmb3IgYSBwb2x5Z29uXG5HZW8uZmluZEJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICB2YXIgbWluX3ggPSBJbmZpbml0eSxcbiAgICAgICAgbWF4X3ggPSAtSW5maW5pdHksXG4gICAgICAgIG1pbl95ID0gSW5maW5pdHksXG4gICAgICAgIG1heF95ID0gLUluZmluaXR5O1xuXG4gICAgLy8gT25seSBuZWVkIHRvIGV4YW1pbmUgb3V0ZXIgcmluZyAocG9seWdvblswXSlcbiAgICB2YXIgbnVtX2Nvb3JkcyA9IHBvbHlnb25bMF0ubGVuZ3RoO1xuICAgIGZvciAodmFyIGM9MDsgYyA8IG51bV9jb29yZHM7IGMrKykge1xuICAgICAgICB2YXIgY29vcmQgPSBwb2x5Z29uWzBdW2NdO1xuXG4gICAgICAgIGlmIChjb29yZFswXSA8IG1pbl94KSB7XG4gICAgICAgICAgICBtaW5feCA9IGNvb3JkWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFsxXSA8IG1pbl95KSB7XG4gICAgICAgICAgICBtaW5feSA9IGNvb3JkWzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFswXSA+IG1heF94KSB7XG4gICAgICAgICAgICBtYXhfeCA9IGNvb3JkWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFsxXSA+IG1heF95KSB7XG4gICAgICAgICAgICBtYXhfeSA9IGNvb3JkWzFdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFttaW5feCwgbWluX3ksIG1heF94LCBtYXhfeV07XG59O1xuXG4vLyBDb252ZXJ0IGdlb21ldHJ5IHR5cGUgdG8gb25lIG9mOiAncG9pbnQnLCAnbGluZScsICdwb2x5Z29uJ1xuR2VvLmdlb21ldHJ5VHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJldHVybiAncG9seWdvbic7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ2xpbmUnO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgcmV0dXJuICdwb2ludCc7XG4gICAgfVxufTtcblxuR2VvLmNlbnRyb2lkID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICAvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0xlYWZsZXQvTGVhZmxldC9ibG9iL2MxMGY0MDVhMTEyMTQyYjE5Nzg1OTY3Y2UwZTE0MjEzMmE2MDk1YWQvc3JjL2xheWVyL3ZlY3Rvci9Qb2x5Z29uLmpzI0w1N1xuICAgIGxldCB4ID0gMCwgeSA9IDAsIGFyZWEgPSAwO1xuICAgIGxldCByaW5nID0gcG9seWdvblswXTsgLy8gb25seSB1c2UgZmlyc3QgcmluZyBmb3Igbm93XG4gICAgbGV0IGxlbiA9IHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSwgaSsrKSB7XG4gICAgICAgIGxldCBwMCA9IHJpbmdbaV07XG4gICAgICAgIGxldCBwMSA9IHJpbmdbal07XG4gICAgICAgIGxldCBmID0gcDBbMV0gKiBwMVswXSAtIHAxWzFdICogcDBbMF07XG5cbiAgICAgICAgeCArPSAocDBbMF0gKyBwMVswXSkgKiBmO1xuICAgICAgICB5ICs9IChwMFsxXSArIHAxWzFdKSAqIGY7XG4gICAgICAgIGFyZWEgKz0gZiAqIDM7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4IC8gYXJlYSwgeSAvIGFyZWFdO1xufTtcblxuR2VvLm11bHRpQ2VudHJvaWQgPSBmdW5jdGlvbiAocG9seWdvbnMpIHtcbiAgICBsZXQgbiA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBsZXQgY2VudHJvaWQgPSBbMCwgMF07XG5cbiAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICBsZXQgYyA9IEdlby5jZW50cm9pZChwb2x5Z29uc1twXSk7XG4gICAgICAgIGNlbnRyb2lkWzBdICs9IGNbMF07XG4gICAgICAgIGNlbnRyb2lkWzFdICs9IGNbMV07XG4gICAgfVxuXG4gICAgY2VudHJvaWRbMF0gLz0gbjtcbiAgICBjZW50cm9pZFsxXSAvPSBuO1xuXG4gICAgcmV0dXJuIGNlbnRyb2lkO1xufTtcblxuR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bSA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgbGV0IGFyZWEgPSAwO1xuICAgIGxldCBuID0gcmluZy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IHAwID0gcmluZ1tpXTtcbiAgICAgICAgbGV0IHAxID0gcmluZ1tpKzFdO1xuXG4gICAgICAgIGFyZWEgKz0gcDBbMF0gKiBwMVsxXSAtIHAxWzBdICogcDBbMV07XG4gICAgfVxuXG4gICAgYXJlYSArPSByaW5nW24gLSAxXVswXSAqIHJpbmdbMF1bMV0gLSByaW5nWzBdWzBdICogcmluZ1tuIC0gMV1bMV07XG4gICAgcmV0dXJuIGFyZWE7XG59O1xuXG5HZW8ucG9seWdvblJpbmdBcmVhID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bShyaW5nKSkgLyAyO1xufTtcblxuLy8gVE9ETzogc3VidHJhY3QgaW5uZXIgcmluZ3Ncbkdlby5wb2x5Z29uQXJlYSA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgcmV0dXJuIEdlby5wb2x5Z29uUmluZ0FyZWEocG9seWdvblswXSk7XG59O1xuXG5HZW8ubXVsdGlQb2x5Z29uQXJlYSA9IGZ1bmN0aW9uIChwb2x5Z29ucykge1xuICAgIGxldCBhcmVhID0gMDtcblxuICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIGFyZWEgKz0gR2VvLnBvbHlnb25BcmVhKHBvbHlnb25zW3BdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJlYTtcbn07XG5cbkdlby5yaW5nV2luZGluZyA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgbGV0IGFyZWEgPSBHZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtKHJpbmcpO1xuICAgIGlmIChhcmVhID4gMCkge1xuICAgICAgICByZXR1cm4gJ0NXJztcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJlYSA8IDApIHtcbiAgICAgICAgcmV0dXJuICdDQ1cnO1xuICAgIH1cbiAgICAvLyByZXR1cm4gdW5kZWZpbmVkIG9uIHplcm8gYXJlYSBwb2x5Z29uXG59O1xuIiwiLy8gV2ViR0wgY29uc3RhbnRzIC0gbmVlZCB0byBpbXBvcnQgdGhlc2Ugc2VwYXJhdGVseSB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGluIHRoZSB3ZWIgd29ya2VyXG5cbnZhciBnbDtcbmV4cG9ydCBkZWZhdWx0IGdsID0ge307XG5cbi8qIERhdGFUeXBlICovXG5nbC5CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7XG5nbC5VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgPSAweDE0MDE7XG5nbC5TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7XG5nbC5VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgPSAweDE0MDM7XG5nbC5JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDQ7XG5nbC5VTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgPSAweDE0MDU7XG5nbC5GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDY7XG4iLCIvLyBXZWJHTCBjb250ZXh0IHdyYXBwZXJcblxudmFyIENvbnRleHQ7XG5leHBvcnQgZGVmYXVsdCBDb250ZXh0ID0ge307XG5cbmxldCBjb250ZXh0X2lkID0gMDtcblxuLy8gU2V0dXAgYSBXZWJHTCBjb250ZXh0XG4vLyBJZiBubyBjYW52YXMgZWxlbWVudCBpcyBwcm92aWRlZCwgb25lIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5XG5Db250ZXh0LmdldENvbnRleHQgPSBmdW5jdGlvbiBnZXRDb250ZXh0IChjYW52YXMsIG9wdGlvbnMpXG57XG4gICAgdmFyIGZ1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICBpZiAoY2FudmFzID09IG51bGwpIHtcbiAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgICAgICBjYW52YXMuc3R5bGUubGVmdCA9IDA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS56SW5kZXggPSAtMTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgICAgICBmdWxsc2NyZWVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBvcHRpb25zKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgb3B0aW9ucyk7XG4gICAgaWYgKCFnbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBjcmVhdGUgV2ViR0wgY29udGV4dC5cIik7XG4gICAgfVxuICAgIGdsLl90YW5ncmFtX2lkID0gY29udGV4dF9pZCsrO1xuXG4gICAgaWYgKCFmdWxsc2NyZWVuKSB7XG4gICAgICAgIENvbnRleHQucmVzaXplKGdsLCBwYXJzZUZsb2F0KGNhbnZhcy5zdHlsZS53aWR0aCksIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLmhlaWdodCksIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIENvbnRleHQucmVzaXplKGdsLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBDb250ZXh0LnJlc2l6ZShnbCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2w7XG59O1xuXG5Db250ZXh0LnJlc2l6ZSA9IGZ1bmN0aW9uIChnbCwgd2lkdGgsIGhlaWdodCwgZGV2aWNlX3BpeGVsX3JhdGlvKVxue1xuICAgIGRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbyB8fCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICAgIGdsLmNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBnbC5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICBnbC5jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICBnbC5jYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBkZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbn07XG4iLCIvLyBXZWJHTCBleHRlbnNpb24gd3JhcHBlclxuLy8gU3RvcmVzIGV4dGVuc2lvbnMgYnkgbmFtZSBhbmQgR0wgY29udGV4dFxuXG4vLyBsaXN0IG9mIGV4dGVuc2lvbiBhcnJheXMsIGZvciBlYWNoIGVudHJ5LCAxc3QgZWxlbWVudCBHTCBjb250ZXh0LCAybmQgbWFwIG9mIGV4dGVuc2lvbnMgYnkgbmFtZVxubGV0IGV4dGVuc2lvbnMgPSBbXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uIChnbCwgbmFtZSkge1xuICAgIGxldCBleHRzID0gZXh0ZW5zaW9ucy5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgZXh0cyA9IGV4dHMgJiYgZXh0c1sxXTtcblxuICAgIGlmICghZXh0cykge1xuICAgICAgICBleHRlbnNpb25zLnB1c2goW2dsLCB7fV0pO1xuICAgICAgICBleHRzID0gZXh0ZW5zaW9uc1tleHRlbnNpb25zLmxlbmd0aC0xXVsxXTtcbiAgICB9XG5cbiAgICBpZiAoIWV4dHNbbmFtZV0pIHtcbiAgICAgICAgZXh0c1tuYW1lXSA9IGdsLmdldEV4dGVuc2lvbihuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dHNbbmFtZV07XG59XG4iLCJ2YXIgR0xTTCA9IHt9O1xuZXhwb3J0IGRlZmF1bHQgR0xTTDtcblxuLyoqXG4gICAgUGFyc2UgdW5pZm9ybXMgZnJvbSBhIEpTIG9iamVjdCwgaW5mZXJzIHR5cGVzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGVcbiAgICBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gc2V0IHVuaWZvcm0gdmFsdWVzIG9uIGEgR0wgcHJvZ3JhbS4gRWFjaCBvYmplY3QgaW4gdGhlIHJldHVybmVkXG4gICAgYXJyYXkgaGFzIHRoZSBmb3JtOlxuICAgIHsgdHlwZSwgbWV0aG9kLCBuYW1lLCB2YWx1ZSB9XG5cbiAgICB0eXBlOiB0aGUgR0wgdW5pZm9ybSB0eXBlLCBzdWNoIGFzICd2ZWMzJywgJ2Zsb2F0JywgZXRjLlxuICAgIG1ldGhvZDogdGhlIEdMIHVuaWZvcm0gc2V0dGVyIG1ldGhvZCB0byB1c2UsIHN1Y2ggYXMgJzFmJywgJzNmdicsIGV0Yy5cbiAgICBuYW1lOiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEdMIHVuaWZvcm0gbG9jYXRpb24sIGUuZy4gJ2FycmF5WzBdLmZpZWxkJywgZXRjLlxuICAgIHZhbHVlOiB0aGUgdmFsdWUgdG8gYmUgcGFzc2VkIHRvIHRoZSBHTCB1bmlmb3JtIHNldHRlciBmb3IgdGhhdCB0eXBlLCBlLmcuIFsxLCAyLCAzXSBmb3IgYSB2ZWMzXG5cbiAgICBUZXh0dXJlcyBoYXZlIHNwZWNpYWwgYmVoYXZpb3I6IHVuaWZvcm1zIHdpdGggc3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyB0ZXh0dXJlcywgYW5kXG4gICAgdGhlIHN0cmluZyBpcyB1c2VkIGFzIGEgdW5pcXVlIHRleHR1cmUgJ2tleScgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGNhbGxlciAod2hpY2ggaXMgcmVzcG9uc2libGVcbiAgICBmb3IgYWN0dWFsbHkgc2V0dGluZyB0aGUgdW5pZm9ybXMpLiBGb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIGFzIGEga2V5IGludG8gYSBkaWN0aW9uYXJ5IG9mXG4gICAga25vd24gdGV4dHVyZSBuYW1lcywgb3IgaXQgY291bGQgc2ltcGx5IGJlIHVzZWQgYXMgYSBVUkwgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGUgdGV4dHVyZSBmcm9tLlxuKi9cbkdMU0wucGFyc2VVbmlmb3JtcyA9IGZ1bmN0aW9uICh1bmlmb3Jtcykge1xuICAgIHZhciBwYXJzZWQgPSBbXTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgdmFyIGtleSA9IG5hbWU7IC8vIHNhdmUgdGhlIG9yaWdpbmFsIG5hbWVcbiAgICAgICAgdmFyIHVuaWZvcm0gPSB1bmlmb3Jtc1tuYW1lXTtcbiAgICAgICAgdmFyIHU7XG5cbiAgICAgICAgLy8gU2luZ2xlIGZsb2F0XG4gICAgICAgIGlmICh0eXBlb2YgdW5pZm9ybSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJzFmJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXk6IHZlY3RvciwgYXJyYXkgb2YgZmxvYXRzLCBhcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVuaWZvcm0pKSB7XG4gICAgICAgICAgICAvLyBOdW1lcmljIHZhbHVlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmVjJyArIHVuaWZvcm0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgYXJyYXlcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtLmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Zsb2F0W10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnMWZ2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWzBdJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFzc3VtZSBtYXRyaXggZm9yICh0eXBlb2YgPT0gRmxvYXQzMkFycmF5ICYmIGxlbmd0aCA9PSAxNik/XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZm9yICh1PTA7IHUgPCB1bmlmb3JtLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzYW1wbGVyMkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbJyArIHUgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVt1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIGFycmF5cyAtIGJ1dCBvbmx5IGFycmF5cyBvZiB2ZWN0b3JzIGFyZSBhbGxvd2VkIGluIHRoaXMgY2FzZVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtWzBdKSAmJiB0eXBlb2YgdW5pZm9ybVswXVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtWzBdLmxlbmd0aCA+PSAyICYmIHVuaWZvcm1bMF0ubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgICAgICBmb3IgKHU9MDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmVjJyArIHVuaWZvcm1bMF0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdW5pZm9ybVt1XS5sZW5ndGggKyAnZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWycgKyB1ICsgJ10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtczogdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPOiBlbHNlIHdhcm5pbmdcbiAgICAgICAgfVxuICAgICAgICAvLyBCb29sZWFuXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUZXh0dXJlXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzYW1wbGVyMkQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJzFpJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuLyoqXG4gICAgR2VuZXJhdGUgYSBHTFNMIHZhcmlhYmxlIGRlZmluaXRpb24gZnJvbSBhIEpTIG9iamVjdFxuKi9cbkdMU0wuZGVmaW5lVmFyaWFibGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgdHlwZSwgYXJyYXk7XG5cbiAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB0eXBlID0gJ2Zsb2F0JztcbiAgICB9XG4gICAgLy8gTXVsdGlwbGUgZmxvYXRzIC0gdmVjdG9yIG9yIGFycmF5XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gTnVtZXJpYyB2YWx1ZXNcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiYgdmFsdWUubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ3ZlYycgKyB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmbG9hdCBhcnJheVxuICAgICAgICAgICAgZWxzZSB7IC8vaWYgKHZhbHVlLmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ2Zsb2F0JztcbiAgICAgICAgICAgICAgICBhcnJheSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IGFzc3VtZSBtYXRyaXggZm9yICh0eXBlb2YgPT0gRmxvYXQzMkFycmF5ICYmIGxlbmd0aCA9PSAxNik/XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdGV4dHVyZXNcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHlwZSA9ICdzYW1wbGVyMkQnO1xuICAgICAgICAgICAgYXJyYXkgPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQm9vbGVhblxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHR5cGUgPSAnYm9vbCc7XG4gICAgfVxuICAgIC8vIFRleHR1cmVcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnc2FtcGxlcjJEJztcbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgdmFyaWFibGUgZGVmaW5pdGlvblxuICAgIHZhciB2YXJpYWJsZSA9ICcnO1xuICAgIHZhcmlhYmxlICs9IGAke3R5cGV9ICR7bmFtZX1gO1xuICAgIGlmIChhcnJheSkge1xuICAgICAgICB2YXJpYWJsZSArPSBgWyR7YXJyYXl9XWA7XG4gICAgfVxuICAgIHZhcmlhYmxlICs9ICc7XFxuJztcblxuICAgIHJldHVybiB2YXJpYWJsZTtcbn07XG5cbi8qKlxuICAgIEdlbmVyYXRlIGEgR0xTTCB1bmlmb3JtIGRlZmluaXRpb24gZnJvbSBhIEpTIG9iamVjdFxuKi9cbkdMU0wuZGVmaW5lVW5pZm9ybSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiAndW5pZm9ybSAnICsgR0xTTC5kZWZpbmVWYXJpYWJsZShuYW1lLCB2YWx1ZSk7XG59O1xuXG4vKipcbiAgICBDaGVjayBmb3IgYSB1bmlmb3JtIGRlZmluaXRpb24gb2YgJ25hbWUnIGluIHRoZSBwcm92aWRlZCBHTFNMIHNvdXJjZVxuICAgIFNpbXBsZSByZWdleCBjaGVjayBmb3IgJ3VuaWZvcm0nIGtleXdvcmQgYW5kIHZhciBuYW1lLCBkb2VzIG5vdCBhdHRlbXB0IHRvIHBhcnNlL2V4dHJhY3QgR0xTTFxuICAgIE5PVEU6IGFzc3VtZXMgY29tbWVudHMgaGF2ZSBiZWVuIHN0cmlwcGVkIGZyb20gc291cmNlXG4qL1xuR0xTTC5pc1VuaWZvcm1EZWZpbmVkID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIC8vIE1hdGNoLCBpbiBvcmRlcjpcbiAgICAvLyAtIHRoZSBrZXl3b3JkICd1bmlmb3JtJ1xuICAgIC8vIC0gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciB0aGF0IGlzIGFueXRoaW5nIGV4Y2VwdCBhIHNlbWljb2xvbiwgO1xuICAgIC8vIC0gb3B0aW9uYWxseSwgYW55dGhpbmcgZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzLCB7IC4uLiB9IChhbiBpbmxpbmUgc3RydWN0dXJlIGRlZmluaXRpb24gY2FuIGdvIGhlcmUpXG4gICAgLy8gLSBvcHRpb25hbGx5LCBhbnkgIyBvZiBjaGFyYWN0ZXJzIHRoYXQgaXMgbm90IGEgc2VtaWNvbG9uLCA7XG4gICAgLy8gLSB0aGUgbmFtZSBvZiB0aGUgdW5pZm9ybVxuXG4gICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgndW5pZm9ybVteO10rKD86e1tcXFxcc1xcXFxTXSp9KT9bXjtdKlxcXFxiJyArIG5hbWUgKyAnXFxcXGInLCAnZycpO1xuICAgIGlmIChzb3VyY2UubWF0Y2gocmUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAgICBDaGVjayB0aGF0IGEgc3ltYm9sIGlzIHJlZmVyZW5jZWQgaW4gdGhlIEdMU0wgc291cmNlXG4gICAgTk9URTogYXNzdW1lcyBjb21tZW50cyBoYXZlIGJlZW4gc3RyaXBwZWQgZnJvbSBzb3VyY2VcbiovXG5HTFNMLmlzU3ltYm9sUmVmZXJlbmNlZCA9IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2UpIHtcbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdcXFxcYicgKyBuYW1lICsgJ1xcXFxiJywgJ2cnKTtcbiAgICBpZiAoc291cmNlLnNlYXJjaChyZSkgPj0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gICAgRXhwYW5kIGEgc2luZ2xlIHZhbHVlIG9yIDItZWxlbWVudCBhcnJheSBpbnRvIGEgMy1lbGVtZW50IGFycmF5LCB3aXRoIHRoZSBsYXN0ICggeiApXG4gICAgY29vcmRpbmF0ZSBkZWZhdWx0aW5nIHRvIDEgKHdpdGggb3B0aW9uIHRvIHNwZWNpZnkpLiBBbHNvIHJ1bnMgcGFyc2VGbG9hdCB0byB0cnkgdG8gbWFpbnRhaW5cbiAgICBkYXRhIGludGVncml0eS4gUmV0dXJucyBudWxsIGlmIGlucHV0IGNvdWxkbid0IGJlIHBhcnNlZC5cbiovXG5HTFNMLmV4cGFuZFZlYzMgPSBmdW5jdGlvbiAodiwgeiA9IDEpIHtcbiAgICBsZXQgeDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHggPSBbLi4udiwgel0ubWFwKHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHggPSBbdiwgdiwgdl0ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGlmICh4ICYmIHguZXZlcnkobiA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG4pKSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59O1xuXG4vKipcbiAgICBFeHBhbmQgYSBzaW5nbGUgdmFsdWUgb3IgMy1lbGVtZW50IGFycmF5IGludG8gYSA0LWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGxhc3QgKGUuZy4gdyBvciBhKVxuICAgIGNvb3JkaW5hdGUgZGVmYXVsdGluZyB0byAxICh3aXRoIG9wdGlvbiB0byBzcGVjaWZ5KS4gQWxzbyBydW5zIHBhcnNlRmxvYXQgdG8gdHJ5IHRvIG1haW50YWluXG4gICAgZGF0YSBpbnRlZ3JpdHkuIFJldHVybnMgbnVsbCBpZiBpbnB1dCBjb3VsZG4ndCBiZSBwYXJzZWQuXG4qL1xuR0xTTC5leHBhbmRWZWM0ID0gZnVuY3Rpb24gKHYsIHcgPSAxKSB7XG4gICAgbGV0IHg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgaWYgKHYubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB4ID0gWy4uLnYsIHddLm1hcChwYXJzZUZsb2F0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB4ID0gW3YsIHYsIHYsIHddLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG5cbiAgICBpZiAoeCAmJiB4LmV2ZXJ5KG4gPT4gdHlwZW9mIG4gPT09ICdudW1iZXInICYmICFpc05hTihuKSkpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxufTtcblxuXG4iLCJcbmV4cG9ydCBjbGFzcyBSZW5kZXJTdGF0ZSB7XG5cdGNvbnN0cnVjdG9yICh2YWx1ZSwgc2V0dXApIHtcbiAgICAgICAgc2V0dXAodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2V0dXAgPSBzZXR1cDtcbiAgICB9XG5cbiAgICBzZXQgKHZhbHVlKSB7XG4gICAgXHQvLyBpZiB0aGUgc3RhdGVzIGFyZSBkaWZmZXJlbnQsIGNhbGwgdGhlIEdMIGNvbnRleHQgZm9yIGEgc3RhdGUgY2hhbmdlXG4gICAgXHRpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xuICAgIFx0XHR0aGlzLnNldHVwKHZhbHVlKTtcbiAgICBcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIFx0fVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyU3RhdGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yIChnbCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3VsbGluZ1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmN1bGxpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSA9IGdsLkJBQ0s7XG5cbiAgICAgICAgLy8gQmxlbmRpbmdcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyYyA9IGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0ID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmNfYWxwaGEgPSBnbC5PTkU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0X2FscGhhID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcblxuICAgICAgICAvLyBEZXB0aCB0ZXN0L3dyaXRlXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuZGVwdGhfd3JpdGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmRlcHRoX3Rlc3QgPSB0cnVlO1xuICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVTUyk7IC8vIGRlcHRoIGZ1bmN0aW9uIG9ubHkgbmVlZHMgdG8gYmUgc2V0IG9uY2VcblxuICAgIFx0Ly8gQ3VsbGluZ1xuICAgICAgICB0aGlzLmN1bGxpbmcgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGN1bGw6IHRoaXMuZGVmYXVsdHMuY3VsbGluZywgZmFjZTogdGhpcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgfSxcbiAgICBcdFx0KHZhbHVlKSA9PiB7XG4gICAgXHRcdFx0aWYgKHZhbHVlLmN1bGwpIHtcbiAgICBcdFx0XHRcdGdsLmVuYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgICAgICAgICAgXHRcdGdsLmN1bGxGYWNlKHZhbHVlLmZhY2UpO1xuICAgIFx0XHRcdH0gZWxzZSB7XG4gICAgXHRcdFx0XHRnbC5kaXNhYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBCbGVuZGluZyBtb2RlXG4gICAgICAgIHRoaXMuYmxlbmRpbmcgPSBuZXcgUmVuZGVyU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJsZW5kOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nLFxuICAgICAgICAgICAgICAgIHNyYzogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmMsXG4gICAgICAgICAgICAgICAgZHN0OiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdCxcbiAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjX2FscGhhLFxuICAgICAgICAgICAgICAgIGRzdF9hbHBoYTogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3RfYWxwaGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuYmxlbmQpIHtcbiAgICAgICAgICAgIFx0XHRnbC5lbmFibGUoZ2wuQkxFTkQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zcmNfYWxwaGEgJiYgdmFsdWUuZHN0X2FscGhhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZSh2YWx1ZS5zcmMsIHZhbHVlLmRzdCwgdmFsdWUuc3JjX2FscGhhLCB2YWx1ZS5kc3RfYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jKHZhbHVlLnNyYywgdmFsdWUuZHN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFx0XHRcdH0gZWxzZSB7XG4gICAgXHRcdFx0XHRnbC5kaXNhYmxlKGdsLkJMRU5EKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIERlcHRoIHdyaXRlXG4gICAgICAgIHRoaXMuZGVwdGhfd3JpdGUgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGRlcHRoX3dyaXRlOiB0aGlzLmRlZmF1bHRzLmRlcHRoX3dyaXRlIH0sXG4gICAgXHRcdCh2YWx1ZSkgPT4ge1xuICAgICAgICBcdFx0Z2wuZGVwdGhNYXNrKHZhbHVlLmRlcHRoX3dyaXRlKTtcbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gRGVwdGggdGVzdFxuICAgICAgICB0aGlzLmRlcHRoX3Rlc3QgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGRlcHRoX3Rlc3Q6IHRoaXMuZGVmYXVsdHMuZGVwdGhfdGVzdCB9LFxuICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgXHRcdFx0aWYgKHZhbHVlLmRlcHRoX3Rlc3QpIHtcbiAgICAgICAgICAgIFx0XHRnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICAgICAgICAgIFx0XHRnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIH1cblxufVxuIiwiLy8gR0wgcHJvZ3JhbSB3cmFwcGVyIHRvIGNhY2hlIHVuaWZvcm0gbG9jYXRpb25zL3ZhbHVlcywgZG8gY29tcGlsZS10aW1lIHByZS1wcm9jZXNzaW5nXG4vLyAoaW5qZWN0aW5nICNkZWZpbmVzIGFuZCAjcHJhZ21hIGJsb2NrcyBpbnRvIHNoYWRlcnMpLCBldGMuXG5cbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2xzbCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xuaW1wb3J0IGdldEV4dGVuc2lvbiBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5pbXBvcnQgc3RyaXAgZnJvbSAnc3RyaXAtY29tbWVudHMnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBwYXJzZVNoYWRlckVycm9ycyB9IGZyb20gJ2dsLXNoYWRlci1lcnJvcnMnO1xuXG4vLyBSZWdleCBwYXR0ZXJuc1xuY29uc3QgcmVfcHJhZ21hID0gL15cXHMqI3ByYWdtYS4qJC9nbTsgICAvLyBmb3IgcmVtb3ZpbmcgdW51c2VkIHByYWdtYXMgYWZ0ZXIgc2hhZGVyIGJsb2NrIGluamVjdGlvblxuY29uc3QgcmVfY29udGludWVfbGluZSA9IC9cXFxcXFxzKlxcbi9tZzsgICAvLyBmb3IgcmVtb3ZpbmcgYmFja3NsYXNoIGxpbmUgY29udGludWF0aW9uc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFkZXJQcm9ncmFtIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB2ZXJ0ZXhfc291cmNlLCBmcmFnbWVudF9zb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgICAgIC8vIGtleS92YWx1ZXMgaW5zZXJ0ZWQgYXMgI2RlZmluZXMgaW50byBzaGFkZXJzIGF0IGNvbXBpbGUtdGltZVxuICAgICAgICB0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmRlZmluZXN8fHt9KTtcblxuICAgICAgICAvLyBrZXkvdmFsdWVzIGZvciBibG9ja3MgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgaW50byBzaGFkZXJzIGF0IGNvbXBpbGUtdGltZVxuICAgICAgICB0aGlzLmJsb2NrcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuYmxvY2tzfHx7fSk7XG4gICAgICAgIHRoaXMuYmxvY2tfc2NvcGVzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5ibG9ja19zY29wZXN8fHt9KTtcblxuICAgICAgICAvLyBsaXN0IG9mIGV4dGVuc2lvbnMgdG8gYWN0aXZhdGVcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gb3B0aW9ucy5leHRlbnNpb25zIHx8IFtdO1xuXG4gICAgICAgIC8vIEpTLW9iamVjdCB1bmlmb3JtcyB0aGF0IGFyZSBleHBlY3RlZCBieSB0aGlzIHByb2dyYW1cbiAgICAgICAgLy8gSWYgdGhleSBhcmUgbm90IGZvdW5kIGluIHRoZSBleGlzdGluZyBzaGFkZXIgc291cmNlLCB0aGVpciB0eXBlcyB3aWxsIGJlIGluZmVycmVkIGFuZCBkZWZpbml0aW9uc1xuICAgICAgICAvLyBmb3IgZWFjaCB3aWxsIGJlIGluamVjdGVkLlxuICAgICAgICB0aGlzLmRlcGVuZGVudF91bmlmb3JtcyA9IG9wdGlvbnMudW5pZm9ybXM7XG5cbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IHt9OyAvLyBwcm9ncmFtIGxvY2F0aW9ucyBvZiB1bmlmb3JtcywgbGF6aWx5IGFkZGVkIGFzIGVhY2ggdW5pZm9ybSBpcyBzZXRcbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307IC8vIHByb2dyYW0gbG9jYXRpb25zIG9mIHZlcnRleCBhdHRyaWJ1dGVzLCBsYXppbHkgYWRkZWQgYXMgZWFjaCBhdHRyaWJ1dGUgaXMgYWNjZXNzZWRcblxuICAgICAgICB0aGlzLnZlcnRleF9zb3VyY2UgPSB2ZXJ0ZXhfc291cmNlO1xuICAgICAgICB0aGlzLmZyYWdtZW50X3NvdXJjZSA9IGZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICB0aGlzLmlkID0gU2hhZGVyUHJvZ3JhbS5pZCsrO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7IC8vIGNhbiBwcm92aWRlIGEgcHJvZ3JhbSBuYW1lICh1c2VmdWwgZm9yIGRlYnVnZ2luZylcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2dyYW0gd3JhcHBlciB3aXRoIHNpbXBsZSBzdGF0ZSBjYWNoZVxuICAgIHVzZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU2hhZGVyUHJvZ3JhbS5jdXJyZW50ICE9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICBTaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSB0aGlzO1xuICAgIH1cblxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGluZykge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBTaGFkZXJQcm9ncmFtLmNvbXBpbGUoKTogc2tpcHBpbmcgZm9yICR7dGhpcy5pZH0gKCR7dGhpcy5uYW1lfSkgYmVjYXVzZSBhbHJlYWR5IGNvbXBpbGluZ2ApKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBpbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8gQ29weSBzb3VyY2VzIGZyb20gcHJlLW1vZGlmaWVkIHRlbXBsYXRlXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMudmVydGV4X3NvdXJjZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZXh0ZW5zaW9uIGF2YWlsYWJpbGl0eVxuICAgICAgICBsZXQgZXh0ZW5zaW9ucyA9IHRoaXMuY2hlY2tFeHRlbnNpb25zKCk7XG5cbiAgICAgICAgLy8gTWFrZSBsaXN0IG9mIGRlZmluZXMgdG8gYmUgaW5qZWN0ZWQgbGF0ZXJcbiAgICAgICAgdmFyIGRlZmluZXMgPSB0aGlzLmJ1aWxkRGVmaW5lTGlzdCgpO1xuXG4gICAgICAgIC8vIEluamVjdCB1c2VyLWRlZmluZWQgYmxvY2tzIChhcmJpdHJhcnkgY29kZSBwb2ludHMgbWF0Y2hpbmcgbmFtZWQgI3ByYWdtYXMpXG4gICAgICAgIC8vIFJlcGxhY2UgYWNjb3JkaW5nIHRvIHRoaXMgcGF0dGVybjpcbiAgICAgICAgLy8gI3ByYWdtYSB0YW5ncmFtOiBba2V5XVxuICAgICAgICAvLyBlLmcuICNwcmFnbWEgdGFuZ3JhbTogZ2xvYmFsXG5cbiAgICAgICAgLy8gR2F0aGVyIGFsbCBibG9jayBjb2RlIHNuaXBwZXRzXG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLmJ1aWxkU2hhZGVyQmxvY2tMaXN0KCk7XG4gICAgICAgIHZhciByZWdleHA7XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGJsb2Nrcykge1xuICAgICAgICAgICAgdmFyIGJsb2NrID0gYmxvY2tzW2tleV07XG4gICAgICAgICAgICBpZiAoIWJsb2NrIHx8IChBcnJheS5pc0FycmF5KGJsb2NrKSAmJiBibG9jay5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IGZpbmQgY29kZSByZXBsYWNlIHBvaW50cyBpbiBzaGFkZXJzXG4gICAgICAgICAgICByZWdleHAgPSBuZXcgUmVnRXhwKCdeXFxcXHMqI3ByYWdtYVxcXFxzK3RhbmdyYW06XFxcXHMrJyArIGtleSArICdcXFxccyokJywgJ20nKTtcbiAgICAgICAgICAgIHZhciBpbmplY3RfdmVydGV4ID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLm1hdGNoKHJlZ2V4cCk7XG4gICAgICAgICAgICB2YXIgaW5qZWN0X2ZyYWdtZW50ID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UubWF0Y2gocmVnZXhwKTtcblxuICAgICAgICAgICAgLy8gQXZvaWQgbmV0d29yayByZXF1ZXN0IGlmIG5vdGhpbmcgdG8gcmVwbGFjZVxuICAgICAgICAgICAgaWYgKGluamVjdF92ZXJ0ZXggPT0gbnVsbCAmJiBpbmplY3RfZnJhZ21lbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBibG9ja3MgaW50byBvbmUgc3RyaW5nXG4gICAgICAgICAgICB2YXIgc291cmNlID0gJyc7XG4gICAgICAgICAgICBibG9jay5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTWFyayBzdGFydCBhbmQgZW5kIG9mIGVhY2ggYmxvY2sgd2l0aCBtZXRhZGF0YSAod2hpY2ggY2FuIGJlIGV4dHJhY3RlZCBmcm9tXG4gICAgICAgICAgICAgICAgLy8gZmluYWwgc291cmNlIGZvciBlcnJvciBoYW5kbGluZywgZGVidWdnaW5nLCBldGMuKVxuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gYCR7dmFsLnNjb3BlfSwgJHt2YWwua2V5fSwgJHt2YWwubnVtfWA7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IGBcXG4vLyB0YW5ncmFtLWJsb2NrLXN0YXJ0OiAke21hcmt9XFxuYDtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gdmFsLnNvdXJjZTtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gYFxcbi8vIHRhbmdyYW0tYmxvY2stZW5kOiAke21hcmt9XFxuYDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJbmplY3RcbiAgICAgICAgICAgIGlmIChpbmplY3RfdmVydGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZWdleHAsIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5qZWN0X2ZyYWdtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVnZXhwLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgYSAjZGVmaW5lIGZvciB0aGlzIGluamVjdGlvbiBwb2ludFxuICAgICAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9CTE9DS18nICsga2V5LnJlcGxhY2UoL1tcXHMtXSsvZywgJ18nKS50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbi11cCBhbnkgI3ByYWdtYXMgdGhhdCB3ZXJlbid0IHJlcGxhY2VkICh0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzKVxuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZV9wcmFnbWEsICcnKTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlX3ByYWdtYSwgJycpO1xuXG4gICAgICAgIC8vIERldGVjdCB1bmlmb3JtIGRlZmluaXRpb25zLCBpbmplY3QgYW55IG1pc3Npbmcgb25lc1xuICAgICAgICB0aGlzLmVuc3VyZVVuaWZvcm1zKHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zKTtcblxuICAgICAgICAvLyBCdWlsZCAmIGluamVjdCBleHRlbnNpb25zICYgZGVmaW5lc1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgKmFmdGVyKiBjb2RlIGluamVjdGlvbiBzbyB0aGF0IHdlIGNhbiBhZGQgZGVmaW5lcyBmb3Igd2hpY2ggY29kZSBwb2ludHMgd2VyZSBpbmplY3RlZFxuICAgICAgICBsZXQgcHJlY2lzaW9uID0gJyc7XG4gICAgICAgIGxldCBoaWdoID0gdGhpcy5nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQodGhpcy5nbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZ2wuSElHSF9GTE9BVCk7XG4gICAgICAgIGlmIChoaWdoICYmIGhpZ2gucHJlY2lzaW9uID4gMCkge1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gJ3ByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbic7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX1ZFUlRFWF9TSEFERVInXSA9IHRydWU7XG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fRlJBR01FTlRfU0hBREVSJ10gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID1cbiAgICAgICAgICAgIHByZWNpc2lvbiArXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nKGRlZmluZXMpICtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcblxuICAgICAgICAvLyBQcmVjaXNpb24gcXVhbGlmaWVyIG9ubHkgdmFsaWQgaW4gZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgIC8vIE5COiAnI2V4dGVuc2lvbicgc3RhdGVtZW50cyBhZGRlZCB0byBmcmFnbWVudCBzaGFkZXIgb25seSwgYXMgSUUxMSB0aHJvd3MgZXJyb3Igd2hlbiB0aGV5IGFwcGVhciBpblxuICAgICAgICAvLyB2ZXJ0ZXggc2hhZGVyIChldmVuIHdoZW4gZ3VhcmRlZCBieSAjaWZkZWYpLCBhbmQgbm8gV2ViR0wgZXh0ZW5zaW9ucyByZXF1aXJlICcjZXh0ZW5zaW9uJyBpbiB2ZXJ0ZXggc2hhZGVyc1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX1ZFUlRFWF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0ZSQUdNRU5UX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPVxuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZEV4dGVuc2lvblN0cmluZyhleHRlbnNpb25zKSArXG4gICAgICAgICAgICBwcmVjaXNpb24gK1xuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZERlZmluZVN0cmluZyhkZWZpbmVzKSArXG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICAvLyBSZXBsYWNlIG11bHRpLWxpbmUgYmFja3NsYXNoZXNcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVfY29udGludWVfbGluZSwgJycpO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVfY29udGludWVfbGluZSwgJycpO1xuXG4gICAgICAgIC8vIENvbXBpbGUgJiBzZXQgdW5pZm9ybXMgdG8gY2FjaGVkIHZhbHVlc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gU2hhZGVyUHJvZ3JhbS51cGRhdGVQcm9ncmFtKHRoaXMuZ2wsIHRoaXMucHJvZ3JhbSwgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLCB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXG4gICAgICAgICAgICAvLyBzaGFkZXIgZXJyb3IgaW5mb1xuICAgICAgICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICd2ZXJ0ZXgnIHx8IGVycm9yLnR5cGUgPT09ICdmcmFnbWVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcl9lcnJvcnMgPSBlcnJvci5lcnJvcnM7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJfZXJyb3JzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUudHlwZSA9IGVycm9yLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGUuYmxvY2sgPSB0aGlzLmJsb2NrKGVycm9yLnR5cGUsIGUubGluZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgU2hhZGVyUHJvZ3JhbS5jb21waWxlKCk6IHByb2dyYW0gJHt0aGlzLmlkfSAoJHt0aGlzLm5hbWV9KSBlcnJvcjpgLCBlcnJvcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2UoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVW5pZm9ybXMoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQXR0cmlidXRlcygpO1xuICAgIH1cblxuICAgIC8vIE1ha2UgbGlzdCBvZiBkZWZpbmVzIChnbG9iYWwsIHRoZW4gcHJvZ3JhbS1zcGVjaWZpYylcbiAgICBidWlsZERlZmluZUxpc3QoKSB7XG4gICAgICAgIHZhciBkLCBkZWZpbmVzID0ge307XG4gICAgICAgIGZvciAoZCBpbiBTaGFkZXJQcm9ncmFtLmRlZmluZXMpIHtcbiAgICAgICAgICAgIGRlZmluZXNbZF0gPSBTaGFkZXJQcm9ncmFtLmRlZmluZXNbZF07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChkIGluIHRoaXMuZGVmaW5lcykge1xuICAgICAgICAgICAgZGVmaW5lc1tkXSA9IHRoaXMuZGVmaW5lc1tkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lcztcbiAgICB9XG5cbiAgICAvLyBNYWtlIGxpc3Qgb2Ygc2hhZGVyIGJsb2NrcyAoZ2xvYmFsLCB0aGVuIHByb2dyYW0tc3BlY2lmaWMpXG4gICAgYnVpbGRTaGFkZXJCbG9ja0xpc3QoKSB7XG4gICAgICAgIGxldCBrZXksIGJsb2NrcyA9IHt9O1xuXG4gICAgICAgIC8vIEdsb2JhbCBibG9ja3NcbiAgICAgICAgZm9yIChrZXkgaW4gU2hhZGVyUHJvZ3JhbS5ibG9ja3MpIHtcbiAgICAgICAgICAgIGJsb2Nrc1trZXldID0gW107XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4uU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XS5tYXAoKHNvdXJjZSwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBrZXksIHNvdXJjZSwgbnVtLCBzY29wZTogJ1NoYWRlclByb2dyYW0nIH07XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldID0gW3sga2V5LCBzb3VyY2U6IFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0sIG51bTogMCwgc2NvcGU6ICdTaGFkZXJQcm9ncmFtJyB9XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2dyYW0tc3BlY2lmaWMgYmxvY2tzXG4gICAgICAgIGZvciAoa2V5IGluIHRoaXMuYmxvY2tzKSB7XG4gICAgICAgICAgICBibG9ja3Nba2V5XSA9IGJsb2Nrc1trZXldIHx8IFtdO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmJsb2Nrc1trZXldKSkge1xuICAgICAgICAgICAgICAgIGxldCBzY29wZXMgPSAodGhpcy5ibG9ja19zY29wZXMgJiYgdGhpcy5ibG9ja19zY29wZXNba2V5XSkgfHwgW107XG4gICAgICAgICAgICAgICAgbGV0IGN1cl9zY29wZSA9IG51bGwsIG51bSA9IDA7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCB0aGlzLmJsb2Nrc1trZXldLmxlbmd0aDsgYisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvdW50IGJsb2NrcyByZWxhdGl2ZSB0byBjdXJyZW50IHNjb3BlXG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZXNbYl0gIT09IGN1cl9zY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3Njb3BlID0gc2NvcGVzW2JdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmJsb2Nrc1trZXldW2JdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6IGN1cl9zY29wZSB8fCB0aGlzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbnVtKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkcmVzcyBkaXNjcmVwYW5jeSBpbiBhcnJheSB2cy4gc2luZ2xlLXZhbHVlIGJsb2Nrc1xuICAgICAgICAgICAgICAgIC8vIHN0eWxlcyBhc3N1bWUgYXJyYXkgd2hlbiB0cmFja2luZyBibG9jayBzY29wZXNcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKHsga2V5LCBzb3VyY2U6IHRoaXMuYmxvY2tzW2tleV0sIG51bTogMCwgc2NvcGU6IHRoaXMubmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2tzO1xuICAgIH1cblxuICAgIC8vIERldGVjdCB1bmlmb3JtIGRlZmluaXRpb25zLCBpbmplY3QgYW55IG1pc3Npbmcgb25lc1xuICAgIGVuc3VyZVVuaWZvcm1zKHVuaWZvcm1zKSB7XG4gICAgICAgIGlmICghdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2cyA9IHN0cmlwKHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSk7XG4gICAgICAgIHZhciBmcyA9IHN0cmlwKHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlKTtcbiAgICAgICAgdmFyIGluamVjdCwgdnNfaW5qZWN0aW9ucyA9IFtdLCBmc19pbmplY3Rpb25zID0gW107XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIG1pc3NpbmcgdW5pZm9ybSBkZWZpbml0aW9uc1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBpbmplY3QgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB2ZXJ0ZXggc2hhZGVyXG4gICAgICAgICAgICBpZiAoIUdMU0wuaXNVbmlmb3JtRGVmaW5lZChuYW1lLCB2cykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3QgPSBHTFNMLmRlZmluZVVuaWZvcm0obmFtZSwgdW5pZm9ybXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFByb2dyYW0gJHt0aGlzLm5hbWV9OiAke25hbWV9IG5vdCBkZWZpbmVkIGluIHZlcnRleCBzaGFkZXIsIGluamVjdGluZzogJyR7aW5qZWN0fSdgKTtcbiAgICAgICAgICAgICAgICB2c19pbmplY3Rpb25zLnB1c2goaW5qZWN0KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgICAgICBpZiAoIUdMU0wuaXNVbmlmb3JtRGVmaW5lZChuYW1lLCBmcykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3QgPSBHTFNMLmRlZmluZVVuaWZvcm0obmFtZSwgdW5pZm9ybXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFByb2dyYW0gJHt0aGlzLm5hbWV9OiAke25hbWV9IG5vdCBkZWZpbmVkIGluIGZyYWdtZW50IHNoYWRlciwgaW5qZWN0aW5nOiAnJHtpbmplY3R9J2ApO1xuICAgICAgICAgICAgICAgIGZzX2luamVjdGlvbnMucHVzaChpbmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5qZWN0IG1pc3NpbmcgdW5pZm9ybXNcbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGluamVjdGVkIGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgc2hhZGVycywgZXZlbiBiZWZvcmUgYW55ICNkZWZpbmVzIG9yICNwcmFnbWFzIGFyZSBhZGRlZFxuICAgICAgICAvLyB0aGlzIGNvdWxkIGNhdXNlIHNvbWUgaXNzdWVzIHdpdGggY2VydGFpbiAjcHJhZ21hcywgb3Igb3RoZXIgZnVuY3Rpb25zIHRoYXQgbWlnaHQgZXhwZWN0ICNkZWZpbmVzXG4gICAgICAgIGlmICh2c19pbmplY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHZzX2luamVjdGlvbnMuam9pbignXFxuJykgKyB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnNfaW5qZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IGZzX2luamVjdGlvbnMuam9pbignXFxuJykgKyB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCB3aXRoIGluZmVycmVkIHR5cGVzXG4gICAgc2V0VW5pZm9ybXModW5pZm9ybXMsIHJlc2V0X3RleHR1cmVfdW5pdCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBvbmx5IHVwZGF0ZSB1bmlmb3JtcyB3aGVuIGNoYW5nZWRcblxuICAgICAgICAvLyBUZXh0dXJlIHVuaXRzIG11c3QgYmUgdHJhY2tlZCBhbmQgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgdGV4dHVyZSBzYW1wbGVyIHVuaWZvcm0gaXMgc2V0LlxuICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgdGV4dHVyZSB1bml0IGlzIHJlc2V0IHRvIDAgZWFjaCB0aW1lIHNldFVuaWZvcm1zIGlzIGNhbGxlZCwgYnV0IHRoZXkgY2FuXG4gICAgICAgIC8vIGFsc28gYmUgcHJlc2VydmVkLCBmb3IgZXhhbXBsZSBpbiBjYXNlcyB3aGVyZSBtdWx0aXBsZSBjYWxscyB0byBzZXRVbmlmb3JtcyBhcmUgZXhwZWN0ZWRcbiAgICAgICAgLy8gKGUuZy4gcHJvZ3JhbS1zcGVjaWZpYyB1bmlmb3JtcyBmb2xsb3dlZCBieSBtZXNoLXNwZWNpZmljIG9uZXMpLlxuICAgICAgICBpZiAocmVzZXRfdGV4dHVyZV91bml0KSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSB1bmlmb3JtIHR5cGVzIGFuZCB2YWx1ZXMgZnJvbSB0aGUgSlMgb2JqZWN0XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEdMU0wucGFyc2VVbmlmb3Jtcyh1bmlmb3Jtcyk7XG5cbiAgICAgICAgLy8gU2V0IGVhY2ggdW5pZm9ybVxuICAgICAgICBmb3IgKGxldCB1PTA7IHUgPCBwYXJzZWQubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm0gPSBwYXJzZWRbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybS50eXBlID09PSAnc2FtcGxlcjJEJykge1xuICAgICAgICAgICAgICAgIC8vIEZvciB0ZXh0dXJlcywgd2UgbmVlZCB0byB0cmFjayB0ZXh0dXJlIHVuaXRzLCBzbyB3ZSBoYXZlIGEgc3BlY2lhbCBzZXR0ZXJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHR1cmVVbmlmb3JtKHVuaWZvcm0ubmFtZSwgdW5pZm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuaWZvcm0odW5pZm9ybS5tZXRob2QsIHVuaWZvcm0ubmFtZSwgdW5pZm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWNoZSBzb21lIG9yIGFsbCB1bmlmb3JtIHZhbHVlcyBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZFxuICAgIHNhdmVVbmlmb3JtcyhzdWJzZXQpIHtcbiAgICAgICAgbGV0IHVuaWZvcm1zID0gc3Vic2V0IHx8IHRoaXMudW5pZm9ybXM7XG4gICAgICAgIGZvciAobGV0IHUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybS5zYXZlZF92YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zYXZlZF90ZXh0dXJlX3VuaXQgPSB0aGlzLnRleHR1cmVfdW5pdCB8fCAwO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgc29tZSBvciBhbGwgdW5pZm9ybXMgdG8gc2F2ZWQgdmFsdWVzXG4gICAgcmVzdG9yZVVuaWZvcm1zKHN1YnNldCkge1xuICAgICAgICBsZXQgdW5pZm9ybXMgPSBzdWJzZXQgfHwgdGhpcy51bmlmb3JtcztcbiAgICAgICAgZm9yIChsZXQgdSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0gJiYgdW5pZm9ybS5zYXZlZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm0udmFsdWUgPSB1bmlmb3JtLnNhdmVkX3ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCA9IHRoaXMuc2F2ZWRfdGV4dHVyZV91bml0IHx8IDA7XG4gICAgfVxuXG4gICAgLy8gU2V0IGEgdGV4dHVyZSB1bmlmb3JtLCBmaW5kcyB0ZXh0dXJlIGJ5IG5hbWUgb3IgY3JlYXRlcyBhIG5ldyBvbmVcbiAgICBzZXRUZXh0dXJlVW5pZm9ybSh1bmlmb3JtX25hbWUsIHRleHR1cmVfbmFtZSkge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdGV4dHVyZV9uYW1lXTtcbiAgICAgICAgaWYgKHRleHR1cmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYENhbm5vdCBmaW5kIHRleHR1cmUgJyR7dGV4dHVyZV9uYW1lfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRleHR1cmUuYmluZCh0aGlzLnRleHR1cmVfdW5pdCk7XG4gICAgICAgIHRoaXMudW5pZm9ybSgnMWknLCB1bmlmb3JtX25hbWUsIHRoaXMudGV4dHVyZV91bml0KTtcbiAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQrKzsgLy8gVE9ETzogdHJhY2sgbWF4IHRleHR1cmUgdW5pdHMgYW5kIGxvZy90aHJvdyBlcnJvcnNcbiAgICB9XG5cbiAgICAvLyBleDogcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAncG9zaXRpb24nLCBbeCwgeSwgel0pO1xuICAgIC8vIFRPRE86IG9ubHkgdXBkYXRlIHVuaWZvcm1zIHdoZW4gY2hhbmdlZFxuICAgIHVuaWZvcm0obWV0aG9kLCBuYW1lLCB2YWx1ZSkgeyAvLyAndmFsdWUnIGlzIGEgbWV0aG9kLWFwcHJvcHJpYXRlIGFyZ3VtZW50cyBsaXN0XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51bmlmb3Jtc1tuYW1lXSA9IHRoaXMudW5pZm9ybXNbbmFtZV0gfHwge307XG4gICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1tuYW1lXTtcbiAgICAgICAgdW5pZm9ybS5uYW1lID0gbmFtZTtcbiAgICAgICAgaWYgKHVuaWZvcm0ubG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pZm9ybS5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHVuaWZvcm0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgIH1cblxuICAgIC8vIFNldCBhIHNpbmdsZSB1bmlmb3JtXG4gICAgdXBkYXRlVW5pZm9ybSh1bmlmb3JtKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1bmlmb3JtIHx8IHVuaWZvcm0ubG9jYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2UoKTtcbiAgICAgICAgdGhpcy5jb21taXRVbmlmb3JtKHVuaWZvcm0pO1xuICAgIH1cblxuICAgIC8vIENvbW1pdHMgdGhlIHVuaWZvcm0gdG8gdGhlIEdQVVxuICAgIGNvbW1pdFVuaWZvcm0odW5pZm9ybSl7XG4gICAgICAgIGxldCBsb2NhdGlvbiA9IHVuaWZvcm0ubG9jYXRpb247XG4gICAgICAgIGxldCB2YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG5cbiAgICAgICAgc3dpdGNoICh1bmlmb3JtLm1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSAnMWknOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0Zic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFpdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWl2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczaXYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00ZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ01hdHJpeDNmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTWF0cml4NGZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIHVuaWZvcm0gbG9jYXRpb25zIGFuZCBzZXQgdG8gbGFzdCBjYWNoZWQgdmFsdWVzXG4gICAgcmVmcmVzaFVuaWZvcm1zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHUgaW4gdGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgdSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZyZXNoQXR0cmlidXRlcygpIHtcbiAgICAgICAgLy8gdmFyIGxlbiA9IHRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIHRoaXMuZ2wuQUNUSVZFX0FUVFJJQlVURVMpO1xuICAgICAgICAvLyBmb3IgKHZhciBpPTA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyAgICAgdmFyIGEgPSB0aGlzLmdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLnByb2dyYW0sIGkpO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgYSB2ZXJ0ZXggYXR0cmlidXRlXG4gICAgYXR0cmlidXRlKG5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXR0cmliID0gKHRoaXMuYXR0cmlic1tuYW1lXSA9IHRoaXMuYXR0cmlic1tuYW1lXSB8fCB7fSk7XG4gICAgICAgIGlmIChhdHRyaWIubG9jYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYi5uYW1lID0gbmFtZTtcbiAgICAgICAgYXR0cmliLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sIG5hbWUpO1xuXG4gICAgICAgIC8vIHZhciBpbmZvID0gdGhpcy5nbC5nZXRBY3RpdmVBdHRyaWIodGhpcy5wcm9ncmFtLCBhdHRyaWIubG9jYXRpb24pO1xuICAgICAgICAvLyBhdHRyaWIudHlwZSA9IGluZm8udHlwZTtcbiAgICAgICAgLy8gYXR0cmliLnNpemUgPSBpbmZvLnNpemU7XG5cbiAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2hhZGVyIHNvdXJjZSBhcyBzdHJpbmdcbiAgICBzb3VyY2UodHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3ZlcnRleCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHNoYWRlciBzb3VyY2UgYXMgYXJyYXkgb2YgbGluZSBzdHJpbmdzXG4gICAgbGluZXModHlwZSkge1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zb3VyY2UodHlwZSk7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3BsaXQoJ1xcbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYSBzcGVjaWZpYyBsaW5lIGZyb20gc2hhZGVyIHNvdXJjZVxuICAgIGxpbmUodHlwZSwgbnVtKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmxpbmVzKHR5cGUpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlW251bV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgaW5mbyBvbiB3aGljaCBzaGFkZXIgYmxvY2sgKGlmIGFueSkgYSBwYXJ0aWN1bGFyIGxpbmUgbnVtYmVyIGluIGEgc2hhZGVyIGlzIGluXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGluZm8gaWYgYSBibG9jayBpcyBmb3VuZDogeyBuYW1lLCBsaW5lLCBzb3VyY2UgfVxuICAgIC8vICBzY29wZTogd2hlcmUgdGhlIHNoYWRlciBibG9jayBvcmlnaW5hdGVkLCBlaXRoZXIgYSBzdHlsZSBuYW1lLCBvciBnbG9iYWwgc3VjaCBhcyBTaGFkZXJQcm9ncmFtXG4gICAgLy8gIG5hbWU6IHNoYWRlciBibG9jayBuYW1lIChlLmcuICdjb2xvcicsICdwb3NpdGlvbicsICdnbG9iYWwnKVxuICAgIC8vICBudW06IHRoZSBibG9jayBudW1iZXIgKndpdGhpbiogbG9jYWwgc2NvcGUgKGUuZy4gaWYgYSBzdHlsZSBoYXMgbXVsdGlwbGUgJ2NvbG9yJyBibG9ja3MpXG4gICAgLy8gIGxpbmU6IGxpbmUgbnVtYmVyICp3aXRoaW4qIHRoZSBzaGFkZXIgYmxvY2sgKG5vdCB0aGUgd2hvbGUgc2hhZGVyIHByb2dyYW0pLCB1c2VmdWwgZm9yIGVycm9yIGhpZ2hsaWdodGluZ1xuICAgIC8vICBzb3VyY2U6IHRoZSBjb2RlIGZvciB0aGUgbGluZVxuICAgIC8vIE5PVEU6IHRoaXMgZG9lcyBhIGJydXRlZm9yY2UgbG9vcCBvdmVyIHRoZSBzaGFkZXIgc291cmNlIGFuZCBsb29rcyBmb3Igc2hhZGVyIGJsb2NrIHN0YXJ0L2VuZCBtYXJrZXJzXG4gICAgLy8gV2UgY291bGQgdHJhY2sgbGluZSByYW5nZXMgZm9yIHNoYWRlciBibG9ja3MgYXMgdGhleSBhcmUgaW5zZXJ0ZWQsIGJ1dCBhcyB0aGlzIGNvZGUgaXMgb25seSB1c2VkIGZvclxuICAgIC8vIGVycm9yIGhhbmRsaW5nIG9uIGNvbXBpbGF0aW9uIGZhaWx1cmUsIGl0IHdhcyBzaW1wbGVyIHRvIGtlZXAgaXQgc2VwYXJhdGUgdGhhbiB0byBidXJkZW4gdGhlIGNvcmVcbiAgICAvLyBjb21waWxhdGlvbiBwYXRoLlxuICAgIGJsb2NrKHR5cGUsIG51bSkge1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmxpbmVzKHR5cGUpO1xuICAgICAgICBsZXQgYmxvY2s7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG51bSAmJiBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC9cXC9cXC8gdGFuZ3JhbS1ibG9jay1zdGFydDogKFtBLVphLXowLTlfLV0rKSwgKFtBLVphLXowLTlfLV0rKSwgKFxcZCspLyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgY3VycmVudCBibG9ja1xuICAgICAgICAgICAgICAgIGJsb2NrID0ge1xuICAgICAgICAgICAgICAgICAgICBzY29wZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICBudW06IG1hdGNoWzNdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGNoID0gbGluZS5tYXRjaCgvXFwvXFwvIHRhbmdyYW0tYmxvY2stZW5kOiAoW0EtWmEtejAtOV8tXSspLCAoW0EtWmEtejAtOV8tXSspLCAoXFxkKykvKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBibG9jayA9IG51bGw7IC8vIGNsZWFyIGN1cnJlbnQgYmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsaW5lICMgYW5kIGNvbnRlbnRcbiAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgIC8vIGluaXQgdG8gLTEgc28gdGhhdCBsaW5lIDAgaXMgZmlyc3QgYWN0dWFsIGxpbmUgb2YgYmxvY2sgY29kZSwgYWZ0ZXIgY29tbWVudCBtYXJrZXJcbiAgICAgICAgICAgICAgICBibG9jay5saW5lID0gKGJsb2NrLmxpbmUgPT0gbnVsbCkgPyAtMSA6IGJsb2NrLmxpbmUgKyAxO1xuICAgICAgICAgICAgICAgIGJsb2NrLnNvdXJjZSA9IGxpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucyBmcm9tIHRob3NlIHJlcXVlc3RlZFxuICAgIC8vIFNldHMgaW50ZXJuYWwgI2RlZmluZXMgaW5kaWNhdGluZyBhdmFpbGFiaWxpdHkgb2YgZWFjaCByZXF1ZXN0ZWQgZXh0ZW5zaW9uXG4gICAgY2hlY2tFeHRlbnNpb25zKCkge1xuICAgICAgICBsZXQgZXh0cyA9IFtdO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24odGhpcy5nbCwgbmFtZSk7XG4gICAgICAgICAgICBsZXQgZGVmID0gYFRBTkdSQU1fRVhURU5TSU9OXyR7bmFtZX1gO1xuXG4gICAgICAgICAgICB0aGlzLmRlZmluZXNbZGVmXSA9IChleHQgIT0gbnVsbCk7XG5cbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICBleHRzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYENvdWxkIG5vdCBlbmFibGUgZXh0ZW5zaW9uICcke25hbWV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV4dHM7XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljIG1ldGhvZHMgYW5kIHN0YXRlXG5TaGFkZXJQcm9ncmFtLmlkID0gMDsgICAgICAgICAgICAgICAgICAgLy8gYXNzaWduIGVhY2ggcHJvZ3JhbSBhIHVuaXF1ZSBpZFxuU2hhZGVyUHJvZ3JhbS5jdXJyZW50ID0gbnVsbDsgICAgICAgICAgIC8vIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtXG5cbi8vIEdsb2JhbCBjb25maWcgYXBwbGllZCB0byBhbGwgcHJvZ3JhbXMgKGR1cGxpY2F0ZSBwcm9wZXJ0aWVzIGZvciBhIHNwZWNpZmljIHByb2dyYW0gd2lsbCB0YWtlIHByZWNlZGVuY2UpXG5TaGFkZXJQcm9ncmFtLmRlZmluZXMgPSB7fTtcblNoYWRlclByb2dyYW0uYmxvY2tzID0ge307XG5cbi8vIFJlc2V0IHByb2dyYW0gYW5kIHNoYWRlciBjYWNoZXNcblNoYWRlclByb2dyYW0ucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc19ieV9zb3VyY2UgPSB7fTsgIC8vIEdMIHByb2dyYW0gb2JqZWN0cyBieSBleGFjdCB2ZXJ0ZXggKyBmcmFnbWVudCBzaGFkZXIgc291cmNlXG4gICAgU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZSA9IHt9OyAgIC8vIEdMIHNoYWRlciBvYmplY3RzIGJ5IGV4YWN0IHNvdXJjZVxufTtcblNoYWRlclByb2dyYW0ucmVzZXQoKTtcblxuLy8gVHVybiBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGludG8gc2luZ2xlIHN0cmluZyBvZiAjZGVmaW5lIHN0YXRlbWVudHNcblNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcgPSBmdW5jdGlvbiAoZGVmaW5lcykge1xuICAgIHZhciBkZWZpbmVfc3RyID0gXCJcIjtcbiAgICBmb3IgKHZhciBkIGluIGRlZmluZXMpIHtcbiAgICAgICAgaWYgKGRlZmluZXNbZF0gPT0gbnVsbCB8fCBkZWZpbmVzW2RdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZXNbZF0gPT09ICdib29sZWFuJyAmJiBkZWZpbmVzW2RdID09PSB0cnVlKSB7IC8vIGJvb2xlYW5zIGFyZSBzaW1wbGUgZGVmaW5lcyB3aXRoIG5vIHZhbHVlXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmVzW2RdID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGRlZmluZXNbZF0pID09PSBkZWZpbmVzW2RdKSB7IC8vIGludCB0byBmbG9hdCBjb252ZXJzaW9uIHRvIHNhdGlzZnkgR0xTTCBmbG9hdHNcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiIFwiICsgZGVmaW5lc1tkXS50b0ZpeGVkKDEpICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gYW55IG90aGVyIGZsb2F0IG9yIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCIgXCIgKyBkZWZpbmVzW2RdICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lX3N0cjtcbn07XG5cbi8vIFR1cm4gYSBsaXN0IG9mIGV4dGVuc2lvbiBuYW1lcyBpbnRvIHNpbmdsZSBzdHJpbmcgb2YgI2V4dGVuc2lvbiBzdGF0ZW1lbnRzXG5TaGFkZXJQcm9ncmFtLmJ1aWxkRXh0ZW5zaW9uU3RyaW5nID0gZnVuY3Rpb24gKGV4dGVuc2lvbnMpIHtcbiAgICBleHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCBbXTtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBleHRlbnNpb25zLmZvckVhY2goZXh0ID0+IHtcbiAgICAgICAgc3RyICs9IGAjaWZkZWYgR0xfJHtleHR9XFxuI2V4dGVuc2lvbiBHTF8ke2V4dH0gOiBlbmFibGVcXG4jZW5kaWZcXG5gO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHI7XG59O1xuXG5TaGFkZXJQcm9ncmFtLmFkZEJsb2NrID0gZnVuY3Rpb24gKGtleSwgLi4uYmxvY2tzKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSA9IFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gfHwgW107XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XS5wdXNoKC4uLmJsb2Nrcyk7XG59O1xuXG4vLyBSZW1vdmUgYWxsIGdsb2JhbCBzaGFkZXIgYmxvY2tzIGZvciBhIGdpdmVuIGtleVxuU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldID0gW107XG59O1xuXG5TaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jayA9IGZ1bmN0aW9uIChrZXksIC4uLmJsb2Nrcykge1xuICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soa2V5KTtcbiAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKGtleSwgLi4uYmxvY2tzKTtcbn07XG5cbi8vIENvbXBpbGUgJiBsaW5rIGEgV2ViR0wgcHJvZ3JhbSBmcm9tIHByb3ZpZGVkIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZXNcbi8vIHVwZGF0ZSBhIHByb2dyYW0gaWYgb25lIGlzIHBhc3NlZCBpbi4gQ3JlYXRlIG9uZSBpZiBub3QuIEFsZXJ0IGFuZCBkb24ndCB1cGRhdGUgYW55dGhpbmcgaWYgdGhlIHNoYWRlcnMgZG9uJ3QgY29tcGlsZS5cblNoYWRlclByb2dyYW0udXBkYXRlUHJvZ3JhbSA9IGZ1bmN0aW9uIChnbCwgcHJvZ3JhbSwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UpIHtcbiAgICAvLyBQcm9ncmFtIHdpdGggdGhpcyBleGFjdCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzIGFscmVhZHkgY2FjaGVkP1xuICAgIGxldCBrZXkgPSBnbC5fdGFuZ3JhbV9pZCArICc6OicgKyB2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSArICc6OicgKyBmcmFnbWVudF9zaGFkZXJfc291cmNlO1xuICAgIGlmIChTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZVtrZXldKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCAnUmV1c2luZyBpZGVudGljYWwgc291cmNlIEdMIHByb2dyYW0gb2JqZWN0Jyk7XG4gICAgICAgIHJldHVybiBTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZVtrZXldO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIHZhciB2ZXJ0ZXhfc2hhZGVyID0gU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIoZ2wsIHZlcnRleF9zaGFkZXJfc291cmNlLCBnbC5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgdmFyIGZyYWdtZW50X3NoYWRlciA9IFNoYWRlclByb2dyYW0uY3JlYXRlU2hhZGVyKGdsLCBmcmFnbWVudF9zaGFkZXJfc291cmNlLCBnbC5GUkFHTUVOVF9TSEFERVIpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgbG9nKCdlcnJvcicsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgaWYgKHByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgICB2YXIgb2xkX3NoYWRlcnMgPSBnbC5nZXRBdHRhY2hlZFNoYWRlcnMocHJvZ3JhbSk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBvbGRfc2hhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZ2wuZGV0YWNoU2hhZGVyKHByb2dyYW0sIG9sZF9zaGFkZXJzW2ldKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnRleF9zaGFkZXIgPT0gbnVsbCB8fCBmcmFnbWVudF9zaGFkZXIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcHJvZ3JhbTtcbiAgICB9XG5cbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4X3NoYWRlcik7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50X3NoYWRlcik7XG5cbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKTtcblxuICAgIC8vIFRPRE86IHJlZmVyZW5jZSBjb3VudCBhbmQgZGVsZXRlIHNoYWRlciBvYmplY3RzIHdoZW4gbm8gcHJvZ3JhbXMgcmVmZXJlbmNlIHRoZW1cblxuICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgV2ViR0wgcHJvZ3JhbSBlcnJvcjpcbiAgICAgICAgICAgIFZBTElEQVRFX1NUQVRVUzogJHtnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUyl9XG4gICAgICAgICAgICBFUlJPUjogJHtnbC5nZXRFcnJvcigpfVxuICAgICAgICAgICAgLS0tIFZlcnRleCBTaGFkZXIgLS0tXG4gICAgICAgICAgICAke3ZlcnRleF9zaGFkZXJfc291cmNlfVxuICAgICAgICAgICAgLS0tIEZyYWdtZW50IFNoYWRlciAtLS1cbiAgICAgICAgICAgICR7ZnJhZ21lbnRfc2hhZGVyX3NvdXJjZX1gKTtcblxuICAgICAgICBsZXQgZXJyb3IgPSB7IHR5cGU6ICdwcm9ncmFtJywgbWVzc2FnZSB9O1xuICAgICAgICBsb2coJ2Vycm9yJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV0gPSBwcm9ncmFtOyAvLyBjYWNoZSBieSBleGFjdCBzb3VyY2VcbiAgICByZXR1cm4gcHJvZ3JhbTtcbn07XG5cbi8vIENvbXBpbGUgYSB2ZXJ0ZXggb3IgZnJhZ21lbnQgc2hhZGVyIGZyb20gcHJvdmlkZWQgc291cmNlXG5TaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlciA9IGZ1bmN0aW9uIChnbCwgc291cmNlLCBzdHlwZSkge1xuICAgIC8vIFByb2dyYW0gd2l0aCBpZGVudGljYWwgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlcyBhbHJlYWR5IGNhY2hlZD9cbiAgICBsZXQga2V5ID0gZ2wuX3RhbmdyYW1faWQgKyAnOjonICsgc291cmNlO1xuICAgIGlmIChTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV0pIHtcbiAgICAgICAgbG9nKCd0cmFjZScsICdSZXVzaW5nIGlkZW50aWNhbCBzb3VyY2UgR0wgc2hhZGVyIG9iamVjdCcpO1xuICAgICAgICByZXR1cm4gU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZVtrZXldO1xuICAgIH1cblxuICAgIGxldCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoc3R5cGUpO1xuXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG5cbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICBsZXQgdHlwZSA9IChzdHlwZSA9PT0gZ2wuVkVSVEVYX1NIQURFUiA/ICd2ZXJ0ZXgnIDogJ2ZyYWdtZW50Jyk7XG4gICAgICAgIGxldCBtZXNzYWdlID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpO1xuICAgICAgICBsZXQgZXJyb3JzID0gcGFyc2VTaGFkZXJFcnJvcnMobWVzc2FnZSk7XG4gICAgICAgIHRocm93IHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzIH07XG4gICAgfVxuXG4gICAgU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZVtrZXldID0gc2hhZGVyOyAvLyBjYWNoZSBieSBleGFjdCBzb3VyY2VcbiAgICByZXR1cm4gc2hhZGVyO1xufTtcbiIsIi8vIFRleHR1cmUgbWFuYWdlbWVudFxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuLy8gR0wgdGV4dHVyZSB3cmFwcGVyIG9iamVjdCBmb3Iga2VlcGluZyB0cmFjayBvZiBhIGdsb2JhbCBzZXQgb2YgdGV4dHVyZXMsIGtleWVkIGJ5IGEgdW5pcXVlIHVzZXItZGVmaW5lZCBuYW1lXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCBuYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMucmV0YWluX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7ICAgIC8vIGEgUHJvbWlzZSBvYmplY3QgdG8gdHJhY2sgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhpcyB0ZXh0dXJlXG4gICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7ICAgIC8vIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYXMgZXhwZWN0ZWRcbiAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSBvcHRpb25zLmZpbHRlcmluZztcbiAgICAgICAgdGhpcy5zcHJpdGVzID0gb3B0aW9ucy5zcHJpdGVzO1xuICAgICAgICB0aGlzLnRleGNvb3JkcyA9IHt9OyAgICAvLyBzcHJpdGUgVVZzIChbMCwgMV0gcmFuZ2UpXG4gICAgICAgIHRoaXMuc2l6ZXMgPSB7fTsgICAgICAgIC8vIHNwcml0ZSBzaXplcyAocGl4ZWwgc2l6ZSlcblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGEgMS1waXhlbCBibGFjayB0ZXh0dXJlIHNvIHdlIGNhbiBzYWZlbHkgcmVuZGVyIHdoaWxlIHdlIHdhaXQgZm9yIGFuIGltYWdlIHRvIGxvYWRcbiAgICAgICAgLy8gU2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyMjQ3L3dlYmdsLXdhaXQtZm9yLXRleHR1cmUtdG8tbG9hZFxuICAgICAgICB0aGlzLnNldERhdGEoMSwgMSwgbmV3IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDI1NV0pLCB7IGZpbHRlcmluZzogJ25lYXJlc3QnIH0pO1xuXG4gICAgICAgIC8vIERlc3Ryb3kgcHJldmlvdXMgdGV4dHVyZSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0pIHtcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHByZXZpb3VzIHJldGFpbiBjb3VudFxuICAgICAgICAgICAgdGhpcy5yZXRhaW5fY291bnQgPSBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0ucmV0YWluX2NvdW50O1xuICAgICAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdLnJldGFpbl9jb3VudCA9IDA7IC8vIGFsbG93IHRvIGJlIGZyZWVkXG4gICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgdGV4dHVyZSBpbnN0YW5jZSBhbmQgZGVmaW5pdGlvblxuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0gPSB0aGlzO1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVfY29uZmlnc1t0aGlzLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7IG5hbWUgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5sb2FkKG9wdGlvbnMpO1xuICAgICAgICBsb2coJ3RyYWNlJywgYGNyZWF0aW5nIFRleHR1cmUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJveSBhIHNpbmdsZSB0ZXh0dXJlIGluc3RhbmNlXG4gICAgZGVzdHJveSh7IGZvcmNlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPiAwICYmICFmb3JjZSkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBkZXN0cm95aW5nIHRleHR1cmUgd2l0aCByZXRhaW4gY291bnQgb2YgJyR7dGhpcy5yZXRhaW5fY291bnR9J2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRoaXMudGV4dHVyZSk7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRhdGE7XG4gICAgICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV07XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGBkZXN0cm95aW5nIFRleHR1cmUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0YWluICgpIHtcbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQrKztcbiAgICB9XG5cbiAgICByZWxlYXNlICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluX2NvdW50IDw9IDApIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogcmVsZWFzaW5nIHRleHR1cmUgd2l0aCByZXRhaW4gY291bnQgb2YgJyR7dGhpcy5yZXRhaW5fY291bnR9J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQtLTtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluX2NvdW50IDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZCh1bml0ID0gMCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUZXh0dXJlLmFjdGl2ZVVuaXQgIT09IHVuaXQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkUwICsgdW5pdCk7XG4gICAgICAgICAgICBUZXh0dXJlLmFjdGl2ZVVuaXQgPSB1bml0O1xuICAgICAgICAgICAgVGV4dHVyZS5ib3VuZFRleHR1cmUgPSBudWxsOyAvLyB0ZXh0dXJlIG11c3QgYmUgcmUtYm91bmQgd2hlbiB1bml0IGNoYW5nZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUZXh0dXJlLmJvdW5kVGV4dHVyZSAhPT0gdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICAgIFRleHR1cmUuYm91bmRUZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9ICd1cmwnO1xuICAgICAgICAgICAgdGhpcy5zZXRVcmwob3B0aW9ucy51cmwsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9ICdlbGVtZW50JztcbiAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudChvcHRpb25zLmVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLndpZHRoICYmIG9wdGlvbnMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ2RhdGEnO1xuICAgICAgICAgICAgdGhpcy5zZXREYXRhKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0LCBvcHRpb25zLmRhdGEsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID1cbiAgICAgICAgICAgICh0aGlzLmxvYWRpbmcgJiYgdGhpcy5sb2FkaW5nLnRoZW4oKCkgPT4geyB0aGlzLmNhbGN1bGF0ZVNwcml0ZXMoKTsgcmV0dXJuIHRoaXM7IH0pKSB8fFxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGV4dHVyZSBmcm9tIGFuIHVybFxuICAgIHNldFVybCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXJsID0gdXJsOyAvLyBzYXZlIFVSTCByZWZlcmVuY2UgKHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiBlbGVtZW50IGlzIGxvYWRlZCBiZWxvdylcbiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnVybDtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICd1cmwnO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudChpbWFnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBmcm9tICR7dGhpcy5zb3VyY2V9YCwgZXJyb3I6IGUsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIHJlc29sdmUgb24gZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gU2FmYXJpIGhhcyBhIGJ1ZyBsb2FkaW5nIGRhdGEtVVJMIGltYWdlcyB3aXRoIENPUlMgZW5hYmxlZCwgc28gaXQgbXVzdCBiZSBkaXNhYmxlZCBpbiB0aGF0IGNhc2VcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM5NzhcbiAgICAgICAgICAgIGlmICghKFV0aWxzLmlzU2FmYXJpKCkgJiYgdGhpcy5zb3VyY2Uuc2xpY2UoMCwgNSkgPT09ICdkYXRhOicpKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdGhpcy5zb3VyY2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGV4dHVyZSB0byBhIHJhdyBpbWFnZSBidWZmZXJcbiAgICBzZXREYXRhKHdpZHRoLCBoZWlnaHQsIGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICdkYXRhJztcblxuICAgICAgICAvLyBDb252ZXJ0IHJlZ3VsYXIgYXJyYXkgdG8gdHlwZWQgYXJyYXlcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldEZpbHRlcmluZyhvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRoZSB0ZXh0dXJlIHRvIHRyYWNrIGEgZWxlbWVudCAoY2FudmFzL2ltYWdlKVxuICAgIHNldEVsZW1lbnQoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgZWwgPSBlbGVtZW50O1xuXG4gICAgICAgIC8vIGEgc3RyaW5nIGVsZW1lbnQgaXMgaW50ZXJwZXRlZCBhcyBhIENTUyBzZWxlY3RvclxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8XG4gICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBlbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICdlbGVtZW50JztcblxuICAgICAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcmluZyhvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbXNnID0gYHRoZSAnZWxlbWVudCcgcGFyYW1ldGVyIChcXGBlbGVtZW50OiAke0pTT04uc3RyaW5naWZ5KGVsKX1cXGApIG11c3QgYmUgYSBDU1MgYDtcbiAgICAgICAgICAgIG1zZyArPSBgc2VsZWN0b3Igc3RyaW5nLCBvciBhIDxjYW52YXM+LCA8aW1hZ2U+IG9yIDx2aWRlbz4gb2JqZWN0YDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiAke21zZ31gLCBvcHRpb25zKTtcbiAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgYmVjYXVzZSAke21zZ31gLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gVXBsb2FkcyBjdXJyZW50IGltYWdlIG9yIGJ1ZmZlciB0byB0aGUgR1BVIChjYW4gYmUgdXNlZCB0byB1cGRhdGUgYW5pbWF0ZWQgdGV4dHVyZXMgb24gdGhlIGZseSlcbiAgICB1cGRhdGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCAob3B0aW9ucy5VTlBBQ0tfRkxJUF9ZX1dFQkdMID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSkpO1xuICAgICAgICB0aGlzLmdsLnBpeGVsU3RvcmVpKHRoaXMuZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBvcHRpb25zLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCB8fCBmYWxzZSk7XG5cbiAgICAgICAgLy8gSW1hZ2Ugb3IgQ2FudmFzIGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuc291cmNlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgdGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8XG4gICAgICAgICAgICAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICYmIHRoaXMuc291cmNlLmNvbXBsZXRlKSkge1xuXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5zb3VyY2Uud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuc291cmNlLmhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYXcgaW1hZ2UgYnVmZmVyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc291cmNlX3R5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFRleHR1cmUudHJpZ2dlcigndXBkYXRlJywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lcyBhcHByb3ByaWF0ZSBmaWx0ZXJpbmcgbW9kZVxuICAgIHNldEZpbHRlcmluZyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nIHx8ICdsaW5lYXInO1xuXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIC8vIEZvciBwb3dlci1vZi0yIHRleHR1cmVzLCB0aGUgZm9sbG93aW5nIHByZXNldHMgYXJlIGF2YWlsYWJsZTpcbiAgICAgICAgLy8gbWlwbWFwOiBsaW5lYXIgYmxlbmQgZnJvbSBuZWFyZXN0IG1pcFxuICAgICAgICAvLyBsaW5lYXI6IGxpbmVhciBibGVuZCBmcm9tIG9yaWdpbmFsIGltYWdlIChubyBtaXBzKVxuICAgICAgICAvLyBuZWFyZXN0OiBuZWFyZXN0IHBpeGVsIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMsICdibG9ja3knIGxvb2spXG4gICAgICAgIGlmIChVdGlscy5pc1Bvd2VyT2YyKHRoaXMud2lkdGgpICYmIFV0aWxzLmlzUG93ZXJPZjIodGhpcy5oZWlnaHQpKSB7XG4gICAgICAgICAgICB0aGlzLnBvd2VyX29mXzIgPSB0cnVlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgb3B0aW9ucy5URVhUVVJFX1dSQVBfUyB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIG9wdGlvbnMuVEVYVFVSRV9XUkFQX1QgfHwgKG9wdGlvbnMucmVwZWF0ICYmIGdsLlJFUEVBVCkgfHwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ21pcG1hcCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdtaXBtYXAnO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUik7IC8vIFRPRE86IHVzZSB0cmlsaW5lYXIgZmlsdGVyaW5nIGJ5IGRlZnVhbHQgaW5zdGVhZD9cbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbmVhcmVzdCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlYkdMIGhhcyBzdHJpY3QgcmVxdWlyZW1lbnRzIG9uIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzOlxuICAgICAgICAgICAgLy8gTm8gbWlwbWFwcyBhbmQgbXVzdCBjbGFtcCB0byBlZGdlXG4gICAgICAgICAgICB0aGlzLnBvd2VyX29mXzIgPSBmYWxzZTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbmVhcmVzdCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBkZWZhdWx0IHRvIGxpbmVhciBmb3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdsaW5lYXInO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBQcmUtY2FsYyBzcHJpdGUgcmVnaW9ucyBmb3IgYSB0ZXh0dXJlIHNwcml0ZSBpbiBVViBbMCwgMV0gc3BhY2VcbiAgICBjYWxjdWxhdGVTcHJpdGVzKCkge1xuICAgICAgICBpZiAodGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRoaXMuc3ByaXRlcykge1xuICAgICAgICAgICAgICAgIGxldCBzcHJpdGUgPSB0aGlzLnNwcml0ZXNbc107XG5cbiAgICAgICAgICAgICAgICAvLyBNYXAgWzAsIDBdIHRvIFsxLCAxXSBjb29yZHMgdG8gdGhlIGFwcHJvcHJpYXRlIHNwcml0ZSBzdWItYXJlYSBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgICAgICAgIHRoaXMudGV4Y29vcmRzW3NdID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgIFtzcHJpdGVbMF0sIHNwcml0ZVsxXV0sXG4gICAgICAgICAgICAgICAgICAgIFtzcHJpdGVbMl0sIHNwcml0ZVszXV0sXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLndpZHRoLCB0aGlzLmhlaWdodF1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZSBvZiBzcHJpdGVcbiAgICAgICAgICAgICAgICB0aGlzLnNpemVzW3NdID0gW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5cbi8vIFN0YXRpYy9jbGFzcyBtZXRob2RzIGFuZCBzdGF0ZVxuXG5UZXh0dXJlLmNyZWF0ZSA9IGZ1bmN0aW9uIChnbCwgbmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVGV4dHVyZShnbCwgbmFtZSwgb3B0aW9ucyk7XG59O1xuXG5UZXh0dXJlLnJldGFpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZXRhaW4oKTtcbiAgICB9XG59O1xuXG5UZXh0dXJlLnJlbGVhc2UgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChUZXh0dXJlLnRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbbmFtZV0ucmVsZWFzZSgpO1xuICAgIH1cbn07XG5cbi8vIERlc3Ryb3kgYWxsIHRleHR1cmUgaW5zdGFuY2VzIGZvciBhIGdpdmVuIEdMIGNvbnRleHRcblRleHR1cmUuZGVzdHJveSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHZhciB0ZXh0dXJlcyA9IE9iamVjdC5rZXlzKFRleHR1cmUudGV4dHVyZXMpO1xuICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0XTtcbiAgICAgICAgaWYgKHRleHR1cmUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICB0ZXh0dXJlLmRlc3Ryb3koeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuLy8gR2V0IHNwcml0ZSBwaXhlbCBzaXplIGFuZCBVVnNcblRleHR1cmUuZ2V0U3ByaXRlSW5mbyA9IGZ1bmN0aW9uICh0ZXhuYW1lLCBzcHJpdGUpIHtcbiAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdGV4bmFtZV07XG4gICAgcmV0dXJuIHRleHR1cmUgJiYgeyBzaXplOiB0ZXh0dXJlLnNpemVzW3Nwcml0ZV0sIHRleGNvb3JkczogdGV4dHVyZS50ZXhjb29yZHNbc3ByaXRlXSB9O1xufTtcblxuLy8gUmUtc2NhbGUgVVZzIGZyb20gWzAsIDFdIHJhbmdlIHRvIGEgc21hbGxlciBhcmVhIHdpdGhpbiB0aGUgaW1hZ2VcblRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlID0gZnVuY3Rpb24gKGFyZWFfb3JpZ2luLCBhcmVhX3NpemUsIHRleF9zaXplKSB7XG4gICAgdmFyIGFyZWFfb3JpZ2luX3kgPSB0ZXhfc2l6ZVsxXSAtIGFyZWFfb3JpZ2luWzFdIC0gYXJlYV9zaXplWzFdO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgYXJlYV9vcmlnaW5bMF0gLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgYXJlYV9vcmlnaW5feSAvIHRleF9zaXplWzFdLFxuICAgICAgICAoYXJlYV9zaXplWzBdICsgYXJlYV9vcmlnaW5bMF0pIC8gdGV4X3NpemVbMF0sXG4gICAgICAgIChhcmVhX3NpemVbMV0gKyBhcmVhX29yaWdpbl95KSAvIHRleF9zaXplWzFdXG4gICAgXTtcbn07XG5cbi8vIENyZWF0ZSBhIHNldCBvZiB0ZXh0dXJlcyBrZXllZCBpbiBhbiBvYmplY3Rcbi8vIE9wdGlvbmFsbHkgbG9hZCBlYWNoIGlmIGl0IGhhcyBhIFVSTCBzcGVjaWZpZWRcblRleHR1cmUuY3JlYXRlRnJvbU9iamVjdCA9IGZ1bmN0aW9uIChnbCwgdGV4dHVyZXMpIHtcbiAgICBsZXQgbG9hZGluZyA9IFtdO1xuICAgIGlmICh0ZXh0dXJlcykge1xuICAgICAgICBmb3IgKGxldCB0ZXhuYW1lIGluIHRleHR1cmVzKSB7XG4gICAgICAgICAgICBsZXQgY29uZmlnID0gdGV4dHVyZXNbdGV4bmFtZV07XG5cbiAgICAgICAgICAgIC8vIElmIHRleHR1cmUgYWxyZWFkeSBleGlzdHMgYW5kIGRlZmluaXRpb24gaGFzbid0IGNoYW5nZWQsIG5vIG5lZWQgdG8gcmUtY3JlYXRlXG4gICAgICAgICAgICAvLyBOb3RlOiB0byBhdm9pZCBmbGlja2VyIHdoZW4gb3RoZXIgdGV4dHVyZXMvc2NlbmUgaXRlbXMgY2hhbmdlXG4gICAgICAgICAgICBpZiAoIVRleHR1cmUuY2hhbmdlZCh0ZXhuYW1lLCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS5jcmVhdGUoZ2wsIHRleG5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICBsb2FkaW5nLnB1c2godGV4dHVyZS5sb2FkaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobG9hZGluZyk7XG59O1xuXG4vLyBDcmVhdGUgYSAnZGVmYXVsdCcgdGV4dHVyZSAoMXgxIHBpeGVsKSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXJcbi8vIChmb3IgZXhhbXBsZSB0byBwcmV2ZW50IEdMIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgdW5ib3VuZCB0ZXh0dXJlcylcblRleHR1cmUuZGVmYXVsdCA9ICdfX2RlZmF1bHQnO1xuVGV4dHVyZS5jcmVhdGVEZWZhdWx0ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgcmV0dXJuIFRleHR1cmUuY3JlYXRlKGdsLCBUZXh0dXJlLmRlZmF1bHQpO1xufTtcblxuLy8gSW5kaWNhdGUgaWYgYSB0ZXh0dXJlIGRlZmluaXRpb24gd291bGQgYmUgYSBjaGFuZ2UgZnJvbSB0aGUgY3VycmVudCBjYWNoZVxuVGV4dHVyZS5jaGFuZ2VkID0gZnVuY3Rpb24gKG5hbWUsIGNvbmZpZykge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4dHVyZSkgeyAvLyBjYWNoZWQgdGV4dHVyZVxuICAgICAgICAvLyBjYW52YXMvaW1hZ2UtYmFzZWQgdGV4dHVyZXMgYXJlIGNvbnNpZGVyZWQgZHluYW1pYyBhbmQgYWx3YXlzIHJlZnJlc2hcbiAgICAgICAgaWYgKHRleHR1cmUuY29uZmlnX3R5cGUgPT09ICdlbGVtZW50JyB8fCBjb25maWcuZWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbXBhcmUgZGVmaW5pdGlvbnNcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KFRleHR1cmUudGV4dHVyZV9jb25maWdzW25hbWVdKSA9PT1cbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oeyBuYW1lIH0sIGNvbmZpZykpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBHZXQgbWV0YWRhdGEgZm9yIGEgdGV4dHVyZSBieSBuYW1lXG4vLyBSZXR1cm5zIHZpYSBwcm9taXNlLCBpbiBjYXNlIHRleHR1cmUgaXMgc3RpbGwgbG9hZGluZ1xuLy8gQ2FuIGJlIGNhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gc3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG5UZXh0dXJlLmdldEluZm8gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIC8vIEdldCBpbmZvIGZvciBhbGwgdGV4dHVyZXMgYnkgZGVmYXVsdFxuICAgIGlmICghbmFtZSkge1xuICAgICAgICBuYW1lID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IG11bHRpcGxlIHRleHR1cmVzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5hbWUubWFwKG4gPT4gVGV4dHVyZS5nZXRJbmZvKG4pKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNpbmdsZSB0ZXh0dXJlXG4gICAgdmFyIHRleCA9IFRleHR1cmUudGV4dHVyZXNbbmFtZV07XG4gICAgaWYgKHRleCkge1xuICAgICAgICAvLyBXYWl0IGZvciB0aGlzIHRleHR1cmUgdG8gZmluaXNoIGxvYWRpbmcsIG9yIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICB2YXIgbG9hZGluZyA9IHRleC5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0ZXgpO1xuICAgICAgICByZXR1cm4gbG9hZGluZy50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFJldHVybiBhIHN1YnNldCBvZiB0ZXh0dXJlIGluZm9cbiAgICAgICAgICAgIC8vIChjb21wYXRpYmxlIHcvc3RydWN0dXJlZCBjbG9uaW5nLCBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBhIHdvcmtlcilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGV4Lm5hbWUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRleC53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRleC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgc3ByaXRlczogdGV4LnNwcml0ZXMsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRzOiB0ZXgudGV4Y29vcmRzLFxuICAgICAgICAgICAgICAgIHNpemVzOiB0ZXguc2l6ZXMsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiB0ZXguZmlsdGVyaW5nLFxuICAgICAgICAgICAgICAgIHBvd2VyX29mXzI6IHRleC5wb3dlcl9vZl8yLFxuICAgICAgICAgICAgICAgIHZhbGlkOiB0ZXgudmFsaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTm8gdGV4dHVyZSBmb3VuZFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbn07XG5cbi8vIFN5bmMgdGV4dHVyZSBpbmZvIHRvIHdvcmtlclxuLy8gQ2FsbGVkIGZyb20gd29ya2VyLCBnZXRzIGluZm8gb24gb25lIG9yIG1vcmUgdGV4dHVyZXMgaW5mbyBmcm9tIG1haW4gdGhyZWFkIHZpYSByZW1vdGUgY2FsbCwgdGhlbiBzdG9yZXMgaXRcbi8vIGxvY2FsbHkgaW4gd29ya2VyLiAndGV4dHVyZXMnIGNhbiBiZSBhbiBhcnJheSBvZiB0ZXh0dXJlIG5hbWVzIHRvIHN5bmMsIG9yIGlmIG51bGwsIGFsbCB0ZXh0dXJlcyBhcmUgc3luY2VkLlxuVGV4dHVyZS5zeW5jVGV4dHVyZXNUb1dvcmtlciA9IGZ1bmN0aW9uIChuYW1lcykge1xuICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ1RleHR1cmUuZ2V0SW5mbycsIG5hbWVzKS5cbiAgICAgICAgdGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgICAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0ZXgubmFtZV0gPSB0ZXg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzO1xuICAgICAgICB9KTtcbn07XG5cbi8vIFJlcG9ydCBtYXggdGV4dHVyZSBzaXplIGZvciBhIEdMIGNvbnRleHRcblRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpO1xufTtcblxuLy8gR2xvYmFsIHNldCBvZiB0ZXh0dXJlcywgYnkgbmFtZVxuVGV4dHVyZS50ZXh0dXJlcyA9IHt9O1xuVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3MgPSB7fTtcblRleHR1cmUuYm91bmRUZXh0dXJlID0gbnVsbDtcblRleHR1cmUuYWN0aXZlVW5pdCA9IG51bGw7XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ1RleHR1cmUnLCBUZXh0dXJlKTtcbnN1YnNjcmliZU1peGluKFRleHR1cmUpO1xuIiwiLy8gQ3JlYXRlcyBhIFZlcnRleCBBcnJheSBPYmplY3QgaWYgdGhlIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUsIG9yIGZhbGxzIGJhY2sgb24gc3RhbmRhcmQgYXR0cmlidXRlIGNhbGxzXG5cbmltcG9ydCBnZXRFeHRlbnNpb24gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGRlZmF1bHQge1xuXG4gICAgZGlzYWJsZWQ6IGZhbHNlLCAvLyBzZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIFZBT3MgZXZlbiBpZiBleHRlbnNpb24gaXMgYXZhaWxhYmxlXG4gICAgYm91bmRfdmFvOiBbXSwgICAvLyBjdXJyZW50bHkgYm91bmQgVkFPLCBieSBHTCBjb250ZXh0XG5cbiAgICBpbml0IChnbCkge1xuICAgICAgICBsZXQgZXh0O1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCdpbmZvJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIGF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBOT1QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gZm9yY2UgZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGUgKGdsLCBzZXR1cCwgdGVhcmRvd24pIHtcbiAgICAgICAgbGV0IHZhbyA9IHt9O1xuICAgICAgICB2YW8uc2V0dXAgPSBzZXR1cDtcbiAgICAgICAgdmFvLnRlYXJkb3duID0gdGVhcmRvd247XG5cbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFvLl92YW8gPSBleHQuY3JlYXRlVmVydGV4QXJyYXlPRVMoKTtcbiAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFvLnNldHVwKHRydWUpO1xuXG4gICAgICAgIHJldHVybiB2YW87XG4gICAgfSxcblxuICAgIGdldEN1cnJlbnRCaW5kaW5nIChnbCkge1xuICAgICAgICBsZXQgYm91bmQgPSB0aGlzLmJvdW5kX3Zhby5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgICAgIHJldHVybiBib3VuZCAmJiBib3VuZFsxXTtcbiAgICB9LFxuXG4gICAgc2V0Q3VycmVudEJpbmRpbmcgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGJvdW5kX3ZhbyA9IHRoaXMuYm91bmRfdmFvO1xuICAgICAgICBsZXQgYmluZGluZyA9IGJvdW5kX3Zhby5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGJvdW5kX3Zhby5wdXNoKFtnbCwgdmFvXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBiaW5kaW5nWzFdID0gdmFvO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGJpbmQgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmICh2YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGV4dCAhPSBudWxsICYmIHZhby5fdmFvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBleHQuYmluZFZlcnRleEFycmF5T0VTKHZhby5fdmFvKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRCaW5kaW5nKGdsLCB2YW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFvLnNldHVwKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBib3VuZF92YW8gPSB0aGlzLmdldEN1cnJlbnRCaW5kaW5nKGdsKTtcbiAgICAgICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVMobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChib3VuZF92YW8gIT0gbnVsbCAmJiB0eXBlb2YgYm91bmRfdmFvLnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYm91bmRfdmFvLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRCaW5kaW5nKGdsLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZXN0cm95IChnbCwgdmFvKSB7XG4gICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0LmRlbGV0ZVZlcnRleEFycmF5T0VTKHZhby5fdmFvKTtcbiAgICAgICAgICAgIHZhby5fdmFvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBkZXN0cm95IGlzIGEgbm8tb3AgaWYgVkFPIGV4dGVuc2lvbiBpc24ndCBhdmFpbGFibGVcbiAgICB9XG5cbn07XG4iLCIvLyBNYW5hZ2UgcmVuZGVyaW5nIGZvciBwcmltaXRpdmVzXG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL3Zhbyc7XG5cbi8vIEEgc2luZ2xlIG1lc2gvVkJPLCBkZXNjcmliZWQgYnkgYSB2ZXJ0ZXggbGF5b3V0LCB0aGF0IGNhbiBiZSBkcmF3biB3aXRoIG9uZSBvciBtb3JlIHByb2dyYW1zXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWQk9NZXNoICB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgdmVydGV4X2RhdGEsIGVsZW1lbnRfZGF0YSwgdmVydGV4X2xheW91dCwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudmVydGV4X2RhdGEgPSB2ZXJ0ZXhfZGF0YTsgLy8gdHlwZWQgYXJyYXlcbiAgICAgICAgdGhpcy5lbGVtZW50X2RhdGEgPSBlbGVtZW50X2RhdGE7IC8vIHR5cGVkIGFycmF5XG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IHZlcnRleF9sYXlvdXQ7XG4gICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZHJhd19tb2RlID0gb3B0aW9ucy5kcmF3X21vZGUgfHwgdGhpcy5nbC5UUklBTkdMRVM7XG4gICAgICAgIHRoaXMuZGF0YV91c2FnZSA9IG9wdGlvbnMuZGF0YV91c2FnZSB8fCB0aGlzLmdsLlNUQVRJQ19EUkFXO1xuICAgICAgICB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeSA9IDM7IC8vIFRPRE86IHN1cHBvcnQgbGluZXMsIHN0cmlwLCBmYW4sIGV0Yy5cbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IG9wdGlvbnMudW5pZm9ybXM7XG4gICAgICAgIHRoaXMucmV0YWluID0gb3B0aW9ucy5yZXRhaW4gfHwgZmFsc2U7IC8vIHdoZXRoZXIgdG8gcmV0YWluIG1lc2ggZGF0YSBpbiBDUFUgYWZ0ZXIgdXBsb2FkaW5nIHRvIEdQVVxuICAgICAgICB0aGlzLmNyZWF0ZWRfYXQgPSArbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSBvcHRpb25zLmZhZGVfaW5fdGltZSB8fCAwOyAvLyBvcHRpb25hbCB0aW1lIHRvIGZhZGUgaW4gbWVzaFxuXG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50ID0gdGhpcy52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RoIC8gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZTtcbiAgICAgICAgdGhpcy52YW9zID0ge307IC8vIG1hcCBvZiBWZXJ0ZXhBcnJheU9iamVjdHMsIGtleWVkIGJ5IHByb2dyYW1cblxuICAgICAgICB0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRfZGF0YSl7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9jb3VudCA9IHRoaXMuZWxlbWVudF9kYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnlfY291bnQgPSB0aGlzLmVsZW1lbnRfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF90eXBlID0gKHRoaXMuZWxlbWVudF9kYXRhLmNvbnN0cnVjdG9yID09PSBVaW50MTZBcnJheSkgPyB0aGlzLmdsLlVOU0lHTkVEX1NIT1JUOiB0aGlzLmdsLlVOU0lHTkVEX0lOVDtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9idWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMudmVydGV4X2NvdW50IC8gdGhpcy52ZXJ0aWNlc19wZXJfZ2VvbWV0cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfZGF0YSwgdGhpcy5kYXRhX3VzYWdlKTtcblxuICAgICAgICBpZiAoIXRoaXMucmV0YWluKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52ZXJ0ZXhfZGF0YTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnRfZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIsIGJ5IGRlZmF1bHQgd2l0aCBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbSwgb3Igb3RoZXJ3aXNlIHdpdGggb3B0aW9uYWxseSBwcm92aWRlZCBvbmVcbiAgICAvLyBSZXR1cm5zIHRydWUgaWYgbWVzaCByZXF1ZXN0cyBhIHJlbmRlciBvbiBuZXh0IGZyYW1lIChlLmcuIGZvciBmYWRlIGFuaW1hdGlvbnMpXG4gICAgcmVuZGVyKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtIHx8IFNoYWRlclByb2dyYW0uY3VycmVudDtcbiAgICAgICAgcHJvZ3JhbS51c2UoKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5zYXZlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1zKHRoaXMudW5pZm9ybXMsIGZhbHNlKTsgLy8gZG9uJ3QgcmVzZXQgdGV4dHVyZSB1bml0XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlzaWJsZV90aW1lID0gKCtuZXcgRGF0ZSgpIC0gdGhpcy5jcmVhdGVkX2F0KSAvIDEwMDA7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV92aXNpYmxlX3RpbWUnLCB2aXNpYmxlX3RpbWUpO1xuXG4gICAgICAgIHRoaXMuYmluZChwcm9ncmFtKTtcblxuICAgICAgICBpZiAodGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSl7XG4gICAgICAgICAgICB0aGlzLmdsLmRyYXdFbGVtZW50cyh0aGlzLmRyYXdfbW9kZSwgdGhpcy5lbGVtZW50X2NvdW50LCB0aGlzLmVsZW1lbnRfdHlwZSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRyYXdBcnJheXModGhpcy5kcmF3X21vZGUsIDAsIHRoaXMudmVydGV4X2NvdW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmJpbmQodGhpcy5nbCwgbnVsbCk7XG5cbiAgICAgICAgaWYgKHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHByb2dyYW0ucmVzdG9yZVVuaWZvcm1zKHRoaXMudW5pZm9ybXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVxdWVzdCBuZXh0IHJlbmRlciBpZiBtZXNoIGlzIGZhZGluZyBpblxuICAgICAgICByZXR1cm4gKHZpc2libGVfdGltZSA8IHRoaXMuZmFkZV9pbl90aW1lKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGJ1ZmZlcnMgYW5kIHZlcnRleCBhdHRyaWJ1dGVzIHRvIHByZXBhcmUgZm9yIHJlbmRlcmluZ1xuICAgIGJpbmQocHJvZ3JhbSkge1xuICAgICAgICAvLyBCaW5kIFZBTyBmb3IgdGhpcyBwcm9nYW0sIG9yIGNyZWF0ZSBvbmVcbiAgICAgICAgbGV0IHZhbyA9IHRoaXMudmFvc1twcm9ncmFtLmlkXTtcbiAgICAgICAgaWYgKHZhbykge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCB2YW8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YW9zW3Byb2dyYW0uaWRdID0gVmVydGV4QXJyYXlPYmplY3QuY3JlYXRlKHRoaXMuZ2wsIChmb3JjZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudmVydGV4X2xheW91dC5lbmFibGUodGhpcy5nbCwgcHJvZ3JhbSwgZm9yY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgdiBpbiB0aGlzLnZhb3MpIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmRlc3Ryb3kodGhpcy5nbCwgdGhpcy52YW9zW3ZdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZygndHJhY2UnLCAnVkJPTWVzaC5kZXN0cm95OiBkZWxldGUgYnVmZmVyJyArICh0aGlzLnZlcnRleF9kYXRhID8gYCBvZiBzaXplICR7dGhpcy52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RofWAgOiAnJykpO1xuXG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9idWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy52ZXJ0ZXhfZGF0YTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IGdsIGZyb20gJy4vY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBWZXJ0ZXhFbGVtZW50cyBmcm9tICcuL3ZlcnRleF9lbGVtZW50cyc7XG5cbi8vIE1hcHMgR0wgdHlwZXMgdG8gSlMgYXJyYXkgdHlwZXNcbmxldCBhcnJheV90eXBlcyA9IHtcbiAgICBbZ2wuRkxPQVRdOiBGbG9hdDMyQXJyYXksXG4gICAgW2dsLkJZVEVdOiBJbnQ4QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0JZVEVdOiBVaW50OEFycmF5LFxuICAgIFtnbC5JTlRdOiBJbnQzMkFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9JTlRdOiBVaW50MzJBcnJheSxcbiAgICBbZ2wuU0hPUlRdOiBJbnQxNkFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9TSE9SVF06IFVpbnQxNkFycmF5XG59O1xuXG4vLyBBbiBpbnRlcm1lZGlhcnkgb2JqZWN0IHRoYXQgaG9sZHMgdmVydGV4IGRhdGEgaW4gdHlwZWQgYXJyYXlzLCBhY2NvcmRpbmcgdG8gYSBnaXZlbiB2ZXJ0ZXggbGF5b3V0XG4vLyBVc2VkIHRvIGNvbnN0cnVjdCBhIG1lc2gvVkJPIGZvciByZW5kZXJpbmdcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlcnRleERhdGEge1xuXG4gICAgY29uc3RydWN0b3IgKHZlcnRleF9sYXlvdXQsIHsgcHJlYWxsb2MgPSA1MDAgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IHZlcnRleF9sYXlvdXQ7XG4gICAgICAgIHRoaXMudmVydGV4X2VsZW1lbnRzID0gbmV3IFZlcnRleEVsZW1lbnRzKCk7XG5cbiAgICAgICAgaWYgKFZlcnRleERhdGEuYXJyYXlfcG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBWZXJ0ZXhEYXRhLmFycmF5X3Bvb2wucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBNYXRoLmZsb29yKHRoaXMuYnl0ZV9sZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKTtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmVydGV4RGF0YTogcmV1c2VkIGJ1ZmZlciBvZiBieXRlcyAke3RoaXMuYnl0ZV9sZW5ndGh9LCAke3RoaXMuc2l6ZX0gdmVydGljZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHByZWFsbG9jOyAvLyAjIG9mIHZlcnRpY2VzIHRvIGFsbG9jYXRlXG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSAqIHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnl0ZV9sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDsgICAgICAgICAgICAgLy8gYnl0ZSBvZmZzZXQgaW50byBjdXJyZW50bHkgYWxsb2NhdGVkIGJ1ZmZlclxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aGlzLnZlcnRleF9sYXlvdXQuY29tcG9uZW50cy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goWy4uLnRoaXMudmVydGV4X2xheW91dC5jb21wb25lbnRzW2NdXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnJlYWxsb2NfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnNldEJ1ZmZlclZpZXdzKCk7XG4gICAgfVxuXG4gICAgLy8gKFJlLSlhbGxvY2F0ZSB0eXBlZCB2aWV3cyBpbnRvIHRoZSBtYWluIGJ1ZmZlciAtIG9ubHkgY3JlYXRlIHRoZSB0eXBlcyB3ZSBuZWVkIGZvciB0aGlzIGxheW91dFxuICAgIHNldEJ1ZmZlclZpZXdzICgpIHtcbiAgICAgICAgdGhpcy52aWV3cyA9IHt9O1xuICAgICAgICB0aGlzLnZpZXdzW2dsLlVOU0lHTkVEX0JZVEVdID0gdGhpcy52ZXJ0ZXhfYnVmZmVyO1xuICAgICAgICBmb3IgKGxldCBhPTA7IGEgPCB0aGlzLnZlcnRleF9sYXlvdXQuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgY29uc3QgYXR0cmliID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmF0dHJpYnNbYV07XG5cbiAgICAgICAgICAgIC8vIE5lZWQgdmlldyBmb3IgdGhpcyB0eXBlP1xuICAgICAgICAgICAgaWYgKHRoaXMudmlld3NbYXR0cmliLnR5cGVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlfdHlwZSA9IGFycmF5X3R5cGVzW2F0dHJpYi50eXBlXTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW2F0dHJpYi50eXBlXSA9IG5ldyBhcnJheV90eXBlKHRoaXMudmVydGV4X2J1ZmZlci5idWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCBidWZmZXIgcG9pbnRlcnNcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGhpcy5jb21wb25lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBjb21wb25lbnRbMV0gPSB0aGlzLnZpZXdzW2NvbXBvbmVudFswXV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbGxvY2F0ZWQgYnVmZmVyIHNpemUsIGV4cGFuZC9yZWFsbG9jIGJ1ZmZlciBpZiBuZWVkZWRcbiAgICBjaGVja0J1ZmZlclNpemUgKCkge1xuICAgICAgICBpZiAoKHRoaXMub2Zmc2V0ICsgdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSkgPiB0aGlzLmJ5dGVfbGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBNYXRoLmZsb29yKHRoaXMuc2l6ZSAqIDEuNSk7XG4gICAgICAgICAgICB0aGlzLnNpemUgLT0gdGhpcy5zaXplICUgNDtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdmFyIG5ld192aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICBuZXdfdmlldy5zZXQodGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gY29weSBleGlzdGluZyBkYXRhIHRvIG5ldyBidWZmZXJcbiAgICAgICAgICAgIFZlcnRleERhdGEuYXJyYXlfcG9vbC5wdXNoKHRoaXMudmVydGV4X2J1ZmZlcik7IC8vIHNhdmUgcHJldmlvdXMgYnVmZmVyIGZvciB1c2UgYnkgbmV4dCB0aWxlXG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBuZXdfdmlldztcbiAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvY19jb3VudCsrO1xuICAgICAgICAgICAgLy8gbG9nKCdpbmZvJywgYFZlcnRleERhdGE6IGV4cGFuZGVkIHZlcnRleCBibG9jayB0byAke3RoaXMuc2l6ZX0gdmVydGljZXNgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhIHZlcnRleCwgY29waWVkIGZyb20gYSBwbGFpbiBKUyBhcnJheSBvZiBlbGVtZW50cyBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgLy8gTm90ZTogdXNlcyBwcmUtY2FsY3VsYXRlZCBpbmZvIGFib3V0IGVhY2ggYXR0cmlidXRlLCBpbmNsdWRpbmcgcG9pbnRlciB0byBhcHByb3ByaWF0ZSB0eXBlZCBhcnJheVxuICAgIC8vIHZpZXcgYW5kIG9mZnNldCBpbnRvIGl0LiBUaGlzIHdhcyB0aGUgZmFzdGVzdCBtZXRob2QgcHJvZmlsZWQgc28gZmFyIGZvciBmaWxsaW5nIGEgbWl4ZWQtdHlwZVxuICAgIC8vIHZlcnRleCBsYXlvdXQgKHRob3VnaCBzdGlsbCBzbG93ZXIgdGhhbiB0aGUgcHJldmlvdXMgbWV0aG9kIHRoYXQgb25seSBzdXBwb3J0ZWQgRmxvYXQzMkFycmF5IGF0dHJpYnV0ZXMpLlxuICAgIGFkZFZlcnRleCAodmVydGV4KSB7XG4gICAgICAgIHRoaXMuY2hlY2tCdWZmZXJTaXplKCk7XG4gICAgICAgIHZhciBpPTA7XG5cbiAgICAgICAgdmFyIGNsZW4gPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCBjbGVuOyBjKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBjb21wb25lbnRbMV1bKHRoaXMub2Zmc2V0ID4+IGNvbXBvbmVudFsyXSkgKyBjb21wb25lbnRbM11dID0gdmVydGV4W2krK107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9mZnNldCArPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCsrO1xuICAgIH1cblxuICAgIC8vIEZpbmFsaXplIHZlcnRleCBidWZmZXIgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgYSBtZXNoXG4gICAgZW5kICgpIHtcbiAgICAgICAgLy8gQ2xpcCB0aGUgYnVmZmVyIHRvIHNpemUgdXNlZCBmb3IgdGhpcyBWQk9cbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfYnVmZmVyLnN1YmFycmF5KDAsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMudmVydGV4X2VsZW1lbnRzLmVuZCgpO1xuXG4gICAgICAgIGxvZygndHJhY2UnLCBgVmVydGV4RGF0YTogJHt0aGlzLnNpemV9IHZlcnRpY2VzIHRvdGFsLCByZWFsbG9jIGNvdW50ICR7dGhpcy5yZWFsbG9jX2NvdW50fWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxufVxuXG5WZXJ0ZXhEYXRhLmFycmF5X3Bvb2wgPSBbXTsgLy8gcG9vbCBvZiBjdXJyZW50bHkgYXZhaWxhYmxlIChwcmV2aW91c2x5IHVzZWQpIGJ1ZmZlcnMgKHVpbnQ4KVxuIiwiaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxubGV0IE1BWF9WQUxVRSA9IE1hdGgucG93KDIsIDE2KSAtIDE7XG5sZXQgVWludDMyX2ZsYWcgPSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RWxlbWVudHMge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICB9XG4gICAgcHVzaCAodmFsdWUpIHtcbiAgICAgICAgLy8gSWYgdmFsdWVzIGhhdmUgb3ZlcmZsb3duIGFuZCBubyBVaW50MzIgb3B0aW9uIGlzIGF2YWlsYWJsZSwgZG8gbm90IHB1c2ggdmFsdWVzXG4gICAgICAgIGlmICh0aGlzLmhhc19vdmVyZmxvd24gJiYgIVVpbnQzMl9mbGFnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIG92ZXJmbG93IGlmIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBVaW50MTYgbWF4XG4gICAgICAgIGlmICh2YWx1ZSA+IE1BWF9WQUxVRSkge1xuICAgICAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFycmF5LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbmQgKCkge1xuICAgICAgICBpZiAodGhpcy5hcnJheS5sZW5ndGgpe1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlcih0aGlzLmFycmF5LCB0aGlzLmhhc19vdmVyZmxvd24pO1xuICAgICAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5WZXJ0ZXhFbGVtZW50cy5zZXRVaW50MzJGbGFnID0gZnVuY3Rpb24oZmxhZykge1xuICAgIFVpbnQzMl9mbGFnID0gZmxhZztcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihhcnJheSwgb3ZlcmZsb3duKSB7XG4gICAgdmFyIHR5cGVkQXJyYXkgPSAob3ZlcmZsb3duICYmIFVpbnQzMl9mbGFnKSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXk7XG4gICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5KGFycmF5KTtcbn1cblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVmVydGV4RWxlbWVudHMnLCBWZXJ0ZXhFbGVtZW50cyk7XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleERhdGEgZnJvbSAnLi92ZXJ0ZXhfZGF0YSc7XG5cbi8vIERlc2NyaWJlcyBhIHZlcnRleCBsYXlvdXQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIG1hbnkgZGlmZmVyZW50IEdMIHByb2dyYW1zLlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4TGF5b3V0IHtcbiAgICAvLyBBdHRyaWJzIGFyZSBhbiBhcnJheSwgaW4gbGF5b3V0IG9yZGVyLCBvZjogbmFtZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZFxuICAgIC8vIGV4OiB7IG5hbWU6ICdwb3NpdGlvbicsIHNpemU6IDMsIHR5cGU6IGdsLkZMT0FULCBub3JtYWxpemVkOiBmYWxzZSB9XG4gICAgY29uc3RydWN0b3IgKGF0dHJpYnMpIHtcbiAgICAgICAgdGhpcy5hdHRyaWJzID0gYXR0cmliczsgLy8gYXJyYXkgb2YgYXR0cmlidXRlcywgc3BlY2lmaWVkIGFzIHN0YW5kYXJkIEdMIGF0dHJpYiBvcHRpb25zXG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdOyAgIC8vIGxpc3Qgb2YgdHlwZSBhbmQgb2Zmc2V0IGluZm8gYWJvdXQgZWFjaCBhdHRyaWJ1dGUgY29tcG9uZW50XG4gICAgICAgIHRoaXMuaW5kZXggPSB7fTsgICAgICAgIC8vIGxpbmVhciBidWZmZXIgaW5kZXggb2YgZWFjaCBhdHRyaWJ1dGUgY29tcG9uZW50LCBlLmcuIHRoaXMuaW5kZXgucG9zaXRpb24ueFxuXG4gICAgICAgIC8vIENhbGMgdmVydGV4IHN0cmlkZVxuICAgICAgICB0aGlzLnN0cmlkZSA9IDA7XG5cbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgZm9yIChsZXQgYT0wOyBhIDwgdGhpcy5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBsZXQgYXR0cmliID0gdGhpcy5hdHRyaWJzW2FdO1xuICAgICAgICAgICAgYXR0cmliLm9mZnNldCA9IHRoaXMuc3RyaWRlO1xuICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSA9IGF0dHJpYi5zaXplO1xuICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDtcblxuICAgICAgICAgICAgc3dpdGNoIChhdHRyaWIudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgZ2wuRkxPQVQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5JTlQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5VTlNJR05FRF9JTlQ6XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYi5ieXRlX3NpemUgKj0gNDtcbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlNIT1JUOlxuICAgICAgICAgICAgICAgIGNhc2UgZ2wuVU5TSUdORURfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYi5ieXRlX3NpemUgKj0gMjtcbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgNC1ieXRlIGFsaWdubWVudCBvbiBhdHRyaWJ1dGVzXG4gICAgICAgICAgICB0aGlzLnN0cmlkZSArPSBhdHRyaWIuYnl0ZV9zaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RyaWRlICYgMykgeyAvLyBwYWQgdG8gbXVsdGlwbGUgb2YgNCBieXRlc1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyaWRlICs9IDQgLSAodGhpcy5zdHJpZGUgJiAzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIGluZm8gdG8gbGlzdCBvZiBhdHRyaWJ1dGUgY29tcG9uZW50c1xuICAgICAgICAgICAgLy8gVXNlZCB0byBidWlsZCB0aGUgdmVydGV4IGRhdGEsIHByb3ZpZGVzIHBvaW50ZXJzIGFuZCBvZmZzZXRzIGludG8gZWFjaCB0eXBlZCBhcnJheSB2aWV3XG4gICAgICAgICAgICAvLyBFYWNoIGNvbXBvbmVudCBpcyBhbiBhcnJheSBvZjpcbiAgICAgICAgICAgIC8vIFtHTCBhdHRyaWIgdHlwZSwgcG9pbnRlciB0byB0eXBlZCBhcnJheSB2aWV3LCBiaXRzIHRvIHNoaWZ0IHJpZ2h0IHRvIGRldGVybWluZSBidWZmZXIgb2Zmc2V0LCBhZGRpdGlvbmFsIGJ1ZmZlciBvZmZzZXQgZm9yIHRoZSBjb21wb25lbnRdXG4gICAgICAgICAgICB2YXIgb2Zmc2V0X3R5cGVkID0gYXR0cmliLm9mZnNldCA+PiBzaGlmdDtcbiAgICAgICAgICAgIGlmIChhdHRyaWIuc2l6ZSA+IDEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBhdHRyaWIuc2l6ZTsgcysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKFthdHRyaWIudHlwZSwgbnVsbCwgc2hpZnQsIG9mZnNldF90eXBlZCsrXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goW2F0dHJpYi50eXBlLCBudWxsLCBzaGlmdCwgb2Zmc2V0X3R5cGVkXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb3ZpZGUgYW4gaW5kZXggaW50byB0aGUgdmVydGV4IGRhdGEgYnVmZmVyIGZvciBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnRcbiAgICAgICAgICAgIHRoaXMuaW5kZXhbYXR0cmliLm5hbWVdID0gY291bnQ7XG4gICAgICAgICAgICBjb3VudCArPSBhdHRyaWIuc2l6ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldHVwIGEgdmVydGV4IGxheW91dCBmb3IgYSBzcGVjaWZpYyBHTCBwcm9ncmFtXG4gICAgLy8gQXNzdW1lcyB0aGF0IHRoZSBkZXNpcmVkIHZlcnRleCBidWZmZXIgKFZCTykgaXMgYWxyZWFkeSBib3VuZFxuICAgIC8vIElmIGEgZ2l2ZW4gcHJvZ3JhbSBkb2Vzbid0IGluY2x1ZGUgYWxsIGF0dHJpYnV0ZXMsIGl0IGNhbiBzdGlsbCB1c2UgdGhlIHZlcnRleCBsYXlvdXRcbiAgICAvLyB0byByZWFkIHRob3NlIGF0dHJpYnMgdGhhdCBpdCBkb2VzIHJlY29nbml6ZSwgdXNpbmcgdGhlIGF0dHJpYiBvZmZzZXRzIHRvIHNraXAgb3RoZXJzLlxuICAgIGVuYWJsZSAoZ2wsIHByb2dyYW0sIGZvcmNlKVxuICAgIHtcbiAgICAgICAgdmFyIGF0dHJpYiwgbG9jYXRpb247XG5cbiAgICAgICAgLy8gRW5hYmxlIGFsbCBhdHRyaWJ1dGVzIGZvciB0aGlzIGxheW91dFxuICAgICAgICBmb3IgKHZhciBhPTA7IGEgPCB0aGlzLmF0dHJpYnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGF0dHJpYiA9IHRoaXMuYXR0cmlic1thXTtcbiAgICAgICAgICAgIGxvY2F0aW9uID0gcHJvZ3JhbS5hdHRyaWJ1dGUoYXR0cmliLm5hbWUpLmxvY2F0aW9uO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXSB8fCBmb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIobG9jYXRpb24sIGF0dHJpYi5zaXplLCBhdHRyaWIudHlwZSwgYXR0cmliLm5vcm1hbGl6ZWQsIHRoaXMuc3RyaWRlLCBhdHRyaWIub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXSA9IHByb2dyYW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhYmxlIGFueSBwcmV2aW91c2x5IGJvdW5kIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgZm9yIHRoaXMgbGF5b3V0XG4gICAgICAgIGZvciAobG9jYXRpb24gaW4gVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlicykge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVW51c2VkQXR0cmlidXRlKGdsLCBsb2NhdGlvbiwgcHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIGFuIGF0dHJpYnV0ZSBpZiBpdCB3YXMgbm90IGVuYWJsZWQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbVxuICAgIC8vIE5PVEU6IHRoaXMgd2FzIG1vdmVkIG91dCBvZiB0aGUgaW5uZXIgbG9vcCBpbiBlbmFibGUoKSB0byBhc3Npc3Qgdy9WTSBvcHRpbWl6YXRpb25cbiAgICBkaXNhYmxlVW51c2VkQXR0cmlidXRlIChnbCwgbG9jYXRpb24sIHByb2dyYW0pIHtcbiAgICAgICAgaWYgKFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dICE9PSBwcm9ncmFtKSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobG9jYXRpb24pO1xuICAgICAgICAgICAgZGVsZXRlIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlVmVydGV4RGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmVydGV4RGF0YSh0aGlzKTtcbiAgICB9XG5cbn1cblxuLy8gVHJhY2sgY3VycmVudGx5IGVuYWJsZWQgYXR0cmlicywgYnkgdGhlIHByb2dyYW0gdGhleSBhcmUgYm91bmQgdG9cbi8vIFN0YXRpYyBjbGFzcyBwcm9wZXJ0eSB0byByZWZsZWN0IGdsb2JhbCBHTCBzdGF0ZVxuVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlicyA9IHt9O1xuIiwiaW1wb3J0IFJlcGVhdEdyb3VwIGZyb20gJy4vcmVwZWF0X2dyb3VwJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxudmFyIENvbGxpc2lvbjtcblxuZXhwb3J0IGRlZmF1bHQgQ29sbGlzaW9uID0ge1xuXG4gICAgdGlsZXM6IHt9LFxuXG4gICAgc3RhcnRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV0gPSB7XG4gICAgICAgICAgICBiYm94ZXM6IHsgICAgICAgICAgIC8vIGN1cnJlbnQgc2V0IG9mIHBsYWNlZCBib3VuZGluZyBib3hlc1xuICAgICAgICAgICAgICAgIGFhYmI6IFtdLFxuICAgICAgICAgICAgICAgIG9iYjogW11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RzOiB7fSwgICAgICAgIC8vIG9iamVjdHMgdG8gY29sbGlkZSwgZ3JvdXBlZCBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICAgICAga2VlcDoge30sICAgICAgICAgICAvLyBvYmplY3RzIHRoYXQgd2VyZSBrZXB0IGFmdGVyIGNvbGxpc2lvbiwgZ3JvdXBlZCBieSBzdHlsZVxuICAgICAgICAgICAgc3R5bGVzOiB7fSAgICAgICAgICAvLyBzdHlsZXMgY29udHJpYnV0aW5nIGNvbGxpc2lvbiBvYmplY3RzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZCB3aGVuIGFsbCByZWdpc3RlcmVkIHN0eWxlcyBoYXZlIGFkZGVkIG9iamVjdHNcbiAgICAgICAgc3RhdGUuY29tcGxldGUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc2V0VGlsZSAodGlsZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50aWxlc1t0aWxlXTtcbiAgICB9LFxuXG4gICAgLy8gQWRkIGEgc3R5bGUgdG8gdGhlIHBlbmRpbmcgc2V0LCBjb2xsaXNpb24gd2lsbCBibG9jayBvbiBhbGwgc3R5bGVzIHN1Ym1pdHRpbmcgdG8gY29sbGlzaW9uIHNldFxuICAgIGFkZFN0eWxlIChzdHlsZSwgdGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVzW3RpbGVdLnN0eWxlc1tzdHlsZV0gPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgY29sbGlzaW9uIG9iamVjdHMgZm9yIGEgc3R5bGVcbiAgICBjb2xsaWRlIChvYmplY3RzLCBzdHlsZSwgdGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0NvbGxpc2lvbi5jb2xsaWRlKCkgY2FsbGVkIHdpdGggbnVsbCB0aWxlJywgdGlsZSwgdGhpcy50aWxlcywgc3R5bGUsIG9iamVjdHMpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHcm91cCBieSBwcmlvcml0eSBhbmQgc3R5bGVcbiAgICAgICAgbGV0IHRpbGVfb2JqZWN0cyA9IHN0YXRlLm9iamVjdHM7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvYmogPSBvYmplY3RzW2ldO1xuICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gb2JqLmxhYmVsLmxheW91dC5wcmlvcml0eTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV0gPSB0aWxlX29iamVjdHNbcHJpb3JpdHldIHx8IHt9O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0gPSB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSB8fCBbXTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdLnB1c2gob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIHBlbmRpbmcgc3R5bGUgc2V0LCBpZiBubyBtb3JlIHN0eWxlcywgZG8gY29sbGlzaW9uICYgZmluaXNoIHRpbGVcbiAgICAgICAgZGVsZXRlIHN0YXRlLnN0eWxlc1tzdHlsZV07XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmRUaWxlKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3Igb2JqZWN0cyB0byBiZSBhZGRlZCBmcm9tIGFsbCBzdHlsZXNcbiAgICAgICAgcmV0dXJuIHN0YXRlLmNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmtlZXBbc3R5bGVdIHx8IFtdO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gVGVzdCBsYWJlbHMgZm9yIGNvbGxpc2lvbnMsIGhpZ2hlciB0byBsb3dlciBwcmlvcml0eVxuICAgIC8vIFdoZW4gdHdvIGNvbGxpZGUsIGRpc2NhcmQgdGhlIGxvd2VyLXByaW9yaXR5IGxhYmVsXG4gICAgZW5kVGlsZSAodGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBsZXQga2VlcCA9IHN0YXRlLmtlZXA7XG5cbiAgICAgICAgUmVwZWF0R3JvdXAuY2xlYXIodGlsZSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBsYWJlbHMgYnkgcHJpb3JpdHksIHRoZW4gYnkgc3R5bGVcbiAgICAgICAgbGV0IHByaW9yaXRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5vYmplY3RzKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHByaW9yaXRpZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIGxldCBzdHlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0c1twcmlvcml0aWVzW3BdXTtcbiAgICAgICAgICAgIGlmICghc3R5bGVfb2JqZWN0cykgeyAvLyBubyBsYWJlbHMgYXQgdGhpcyBwcmlvcml0eSwgc2tpcCB0byBuZXh0XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIHN0eWxlXG4gICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdHMgPSBzdHlsZV9vYmplY3RzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXSA9IGtlZXBbc3R5bGVdIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3QgPSBvYmplY3RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5CZVBsYWNlZChvYmplY3QsIHRpbGUsIG9iamVjdC5saW5rZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIG9iamVjdCBpZiBpdCBpc24ndCBkZXBlbmRlbnQgb24gYSBwYXJlbnQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC5saW5rZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXS5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb2JqZWN0IGlzIGRlcGVuZGVudCBvbiBhIHBhcmVudCwgb25seSBrZWVwIGlmIGJvdGggY2FuIGJlIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jYW5CZVBsYWNlZChvYmplY3QubGlua2VkLCB0aWxlLCBvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFtzdHlsZV0ucHVzaChvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LCB0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdC5saW5rZWQsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICB9LFxuXG4gICAgLy8gUnVuIGNvbGxpc2lvbiBhbmQgcmVwZWF0IGNoZWNrIHRvIHNlZSBpZiBsYWJlbCBjYW4gY3VycmVudGx5IGJlIHBsYWNlZFxuICAgIGNhbkJlUGxhY2VkIChvYmplY3QsIHRpbGUsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IG9iamVjdC5sYWJlbDtcbiAgICAgICAgbGV0IGxheW91dCA9IG9iamVjdC5sYWJlbC5sYXlvdXQ7XG5cbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZCAoZS5nLiBieSBwYXJlbnQgb2JqZWN0KVxuICAgICAgICBpZiAobGFiZWwucGxhY2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsYWJlbC5wbGFjZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUZXN0IHRoZSBsYWJlbCBmb3IgaW50ZXJzZWN0aW9ucyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgICAgICBsZXQgYmJveGVzID0gdGhpcy50aWxlc1t0aWxlXS5iYm94ZXM7XG4gICAgICAgIGlmICghbGF5b3V0LmNvbGxpZGUgfHwgIWxhYmVsLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlICYmIGV4Y2x1ZGUubGFiZWwpKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgcmVwZWF0c1xuICAgICAgICAgICAgbGV0IHJlcGVhdCA9IFJlcGVhdEdyb3VwLmNoZWNrKGxhYmVsLCBsYXlvdXQsIHRpbGUpO1xuICAgICAgICAgICAgaWYgKHJlcGVhdCkge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgZGlzY2FyZCBsYWJlbCAnJHtsYWJlbC50ZXh0fScsIChvbmVfcGVyX2dyb3VwOiAke3JlcGVhdC5vbmVfcGVyX2dyb3VwfSksIGRpc3QgJHtNYXRoLnNxcnQocmVwZWF0LmRpc3Rfc3EpL2xheW91dC51bml0c19wZXJfcGl4ZWx9IDwgJHtNYXRoLnNxcnQocmVwZWF0LnJlcGVhdF9kaXN0X3NxKS9sYXlvdXQudW5pdHNfcGVyX3BpeGVsfWApO1xuICAgICAgICAgICAgICAgIGxhYmVsLnBsYWNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGF5b3V0LmNvbGxpZGUpIHtcbiAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgZGlzY2FyZCBsYWJlbCAnJHtsYWJlbC50ZXh0fScgZHVlIHRvIGNvbGxpc2lvbmApO1xuICAgICAgICAgICAgbGFiZWwucGxhY2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsLnBsYWNlZDtcbiAgICB9LFxuXG4gICAgLy8gUGxhY2UgbGFiZWxcbiAgICBwbGFjZSAoeyBsYWJlbCB9LCB0aWxlKSB7XG4gICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWQgKGUuZy4gYnkgcGFyZW50IG9iamVjdClcbiAgICAgICAgaWYgKGxhYmVsLnBsYWNlZCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWdpc3RlciBhcyBwbGFjZWQgZm9yIGZ1dHVyZSBjb2xsaXNpb24gYW5kIHJlcGVhdCBjdWxsaW5nXG4gICAgICAgIFJlcGVhdEdyb3VwLmFkZChsYWJlbCwgbGFiZWwubGF5b3V0LCB0aWxlKTtcbiAgICAgICAgbGFiZWwuYWRkKHRoaXMudGlsZXNbdGlsZV0uYmJveGVzKTtcbiAgICB9XG5cbn07XG4iLCJcbi8vIERvIEFBQkIgYGFgIGFuZCBgYmAgaW50ZXJzZWN0P1xuZXhwb3J0IGZ1bmN0aW9uIGJveEludGVyc2VjdHNCb3ggKGEsIGIpIHtcbiAgICBpZiAoYVsyXSA8IGJbMF0gfHwgLy8gYSBpcyBsZWZ0IG9mIGJcbiAgICAgICAgYVswXSA+IGJbMl0gfHwgLy8gYSBpcyByaWdodCBvZiBiXG4gICAgICAgIGFbM10gPCBiWzFdIHx8IC8vIGEgaXMgYWJvdmUgYlxuICAgICAgICBhWzFdID4gYlszXSkgeyAvLyBhIGlzIGJlbG93IGJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTsgLy8gYm94ZXMgb3ZlcmxhcFxufVxuXG4vLyBEb2VzIEFBQkIgYGFgIGludGVyc2VjdCBhbnkgb2YgdGhlIEFBQkJzIGluIGFycmF5IGBib3hlc2A/XG4vLyBJbnZva2VzIGBjYWxsYmFja2Agd2l0aCBpbmRleCBvZiBpbnRlcnNlY3RpbmcgYm94XG4vLyBTdG9wcyBpbnRlcnNlY3RpbmcgaWYgYGNhbGxiYWNrYCByZXR1cm5zIG5vbi1udWxsIHZhbHVlIChjb250aW51ZXMgb3RoZXJ3aXNlKVxuZXhwb3J0IGZ1bmN0aW9uIGJveEludGVyc2VjdHNMaXN0IChhLCBib3hlcywgY2FsbGJhY2spIHtcbiAgICBmb3IgKGxldCBpPTA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYm94SW50ZXJzZWN0c0JveChhLCBib3hlc1tpXSkpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IHtib3hJbnRlcnNlY3RzTGlzdH0gZnJvbSAnLi9pbnRlcnNlY3QnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcbi8vIGltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGFiZWwge1xuXG4gICAgY29uc3RydWN0b3IgKHNpemUsIGxheW91dCA9IHt9KSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3IgPSBBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikgPyB0aGlzLmxheW91dC5hbmNob3JbMF0gOiB0aGlzLmxheW91dC5hbmNob3I7IC8vIGluaXRpYWwgYW5jaG9yXG4gICAgICAgIHRoaXMucGxhY2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBsYXlvdXQub2Zmc2V0O1xuICAgICAgICB0aGlzLmFhYmIgPSBudWxsO1xuICAgICAgICB0aGlzLm9iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gZmFsc2U7ICAgIC8vIGlmIGxhYmVsIGRvZXMgbm90IGZpdCAoZXhjZWVkcyB0aWxlIGJvdW5kYXJ5LCBldGMpIHRoaXMgYm9vbGVhbiB3aWxsIGJlIHRydWVcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLmFsaWduID0gdGhpcy5sYXlvdXQuYWxpZ24gfHwgUG9pbnRBbmNob3IuYWxpZ25Gb3JBbmNob3IodGhpcy5hbmNob3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciBvdmVybGFwcyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgIG9jY2x1ZGVkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBpbnRlcnNlY3QgPSBmYWxzZTtcbiAgICAgICAgbGV0IGFhYmJzID0gYmJveGVzLmFhYmI7XG4gICAgICAgIGxldCBvYmJzID0gYmJveGVzLm9iYjtcblxuICAgICAgICAvLyBCcm9hZCBwaGFzZVxuICAgICAgICBpZiAoYWFiYnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYm94SW50ZXJzZWN0c0xpc3QodGhpcy5hYWJiLCBhYWJicywgKGopID0+IHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogYnJvYWQgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLmFhYmIsIGFhYmJzW2pdKTtcblxuICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29sbGlkaW5nIHdpdGggZXhjbHVkZWQgbGFiZWxcbiAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZSAmJiBhYWJic1tqXSA9PT0gZXhjbHVkZS5hYWJiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwcGluZyBkdWUgdG8gZXhwbGljaXQgZXhjbHVzaW9uJywgdGhpcywgZXhjbHVkZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTa2lwIG5hcnJvdyBwaGFzZSBjb2xsaXNpb24gaWYgbm8gcm90YXRpb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmIuYW5nbGUgPT09IDAgJiYgb2Jic1tqXS5hbmdsZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogc2tpcCBuYXJyb3cgcGhhc2UgY29sbGlkZSBiZWNhdXNlIG5laXRoZXIgaXMgcm90YXRlZCcsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBwaGFzZVxuICAgICAgICAgICAgICAgIGlmIChPQkIuaW50ZXJzZWN0KHRoaXMub2JiLCBvYmJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogbmFycm93IHBoYXNlIGNvbGxpZGUnLCB0aGlzLmxheW91dC5pZCwgdGhpcywgdGhpcy5vYmIsIG9iYnNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50ZXJzZWN0O1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGlzIGxhYmVsJ3MgYm91bmRpbmcgYm94IHRvIHRoZSBwcm92aWRlZCBzZXRcbiAgICBhZGQgKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGJib3hlcy5hYWJiLnB1c2godGhpcy5hYWJiKTtcbiAgICAgICAgYmJveGVzLm9iYi5wdXNoKHRoaXMub2JiKTtcbiAgICB9XG5cbiAgICAvLyBjaGVja3Mgd2hldGhlciB0aGUgbGFiZWwgaXMgd2l0aGluIHRoZSB0aWxlIGJvdW5kYXJpZXNcbiAgICBpblRpbGVCb3VuZHMgKCkge1xuICAgICAgICBsZXQgbWluID0gWyB0aGlzLmFhYmJbMF0sIHRoaXMuYWFiYlsxXSBdO1xuICAgICAgICBsZXQgbWF4ID0gWyB0aGlzLmFhYmJbMl0sIHRoaXMuYWFiYlszXSBdO1xuXG4gICAgICAgIGlmICghVXRpbHMucG9pbnRJblRpbGUobWluKSB8fCAhVXRpbHMucG9pbnRJblRpbGUobWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGJlIGRpc2NhcmRlZFxuICAgIC8vIERlcGVuZHMgb24gd2hldGhlciBsYWJlbCBtdXN0IGZpdCBpbiB0aGUgdGlsZSBib3VuZHMsIGFuZCBpZiBzbywgY2FuIGl0IGJlIG1vdmVkIHRvIGZpdCB0aGVyZVxuICAgIGRpc2NhcmQoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy50aHJvd19hd2F5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vY2NsdWRlZChiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgIH1cbn1cblxuTGFiZWwuZXBzaWxvbiA9IDAuOTk5OTsgLy8gdG9sZXJhbmNlIGFyb3VuZCBjb2xsaXNpb24gYm94ZXMsIHByZXZlbnQgcGVyZmVjdGx5IGFkamFjZW50IG9iamVjdHMgZnJvbSBjb2xsaWRpbmdcbiIsImltcG9ydCBMYWJlbCBmcm9tICcuL2xhYmVsJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcblxuY29uc3QgUExBQ0VNRU5UID0ge1xuICAgIE1JRF9QT0lOVDogMCxcbiAgICBDT1JORVI6IDFcbn07XG5cbmNvbnN0IE1BWF9BTkdMRSA9IE1hdGguUEkgLyAyOyAgICAgIC8vIG1heGltdW0gYW5nbGUgZm9yIGFydGljdWxhdGVkIGxhYmVsc1xuY29uc3QgTElORV9FWENFRURfU1RSQUlHSFQgPSAwLjc7ICAgLy8gbWluaW1hbCByYXRpbyBmb3Igc3RyYWlnaHQgbGFiZWxzIChsYWJlbCBsZW5ndGgpIC8gKGxpbmUgbGVuZ3RoKVxuY29uc3QgTElORV9FWENFRURfS0lOS0VEID0gMC42OyAgICAgLy8gbWluaW1hbCByYXRpbyBmb3Iga2lua2VkIGxhYmVsc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbExpbmUge1xuXG4gICAgY29uc3RydWN0b3IgKHNpemUsIGxpbmVzLCBsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgICAgICAgdGhpcy5zcGFjZV93aWR0aCA9IGxheW91dC5zcGFjZV93aWR0aDsgLy8gd2lkdGggb2Ygc3BhY2UgZm9yIHRoZSBmb250IHVzZWRcbiAgICAgICAgdGhpcy5udW1fc2VnbWVudHMgPSBzaXplLmxlbmd0aDsgLy8gbnVtYmVyIG9mIGxhYmVsIHNlZ21lbnRzXG4gICAgICAgIHRoaXMudG90YWxfbGVuZ3RoID0gc2l6ZS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCl7IHJldHVybiBwcmV2ICsgbmV4dFswXTsgfSwgMCkgKyAoc2l6ZS5sZW5ndGggLSAxKSAqIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgIHRoaXMudG90YWxfaGVpZ2h0ID0gc2l6ZVswXVsxXTtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAobGF5b3V0LnBsYWNlbWVudCA9PT0gdW5kZWZpbmVkKSA/IFBMQUNFTUVOVC5NSURfUE9JTlQgOiBsYXlvdXQucGxhY2VtZW50O1xuXG4gICAgICAgIHRoaXMua2lua19pbmRleCA9IDA7IC8vIGluZGV4IGF0IHdoaWNoIGFuIGFydGljdWxhdGVkIGxhYmVsIHdpbGwga2luayAoZS5nLiwgMSBtZWFucyBhIGtpbmsgX2FmdGVyXyB0aGUgZmlyc3Qgc2VnbWVudClcbiAgICAgICAgdGhpcy5zcHJlYWRfZmFjdG9yID0gMC41OyAvLyBzcGFjZXMgb3V0IGFkamFjZW50IHdvcmRzIHRvIHByZXZlbnQgb3ZlcmxhcFxuICAgICAgICB0aGlzLmZpdG5lc3MgPSAwOyAvLyBtZWFzdXJlIG9mIHF1YWxpdHkgb2YgZml0XG5cbiAgICAgICAgLy8gQXJyYXlzIGZvciBMYWJlbCBwcm9wZXJ0aWVzLiBUT0RPOiBjcmVhdGUgYXJyYXkgb2YgTGFiZWwgdHlwZXMsIHdoZXJlIExhYmVsTGluZSBhY3RzIGFzIGEgXCJncm91cGVkIGxhYmVsXCJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLmFuZ2xlID0gW107XG4gICAgICAgIHRoaXMub2Zmc2V0cyA9IFtdO1xuICAgICAgICB0aGlzLm9iYnMgPSBbXTtcbiAgICAgICAgdGhpcy5hYWJicyA9IFtdO1xuXG4gICAgICAgIC8vIG9wdGlvbmFsbHkgbGltaXQgdGhlIGxpbmUgc2VnbWVudHMgdGhhdCB0aGUgbGFiZWwgbWF5IGJlIHBsYWNlZCBpbiwgYnkgc3BlY2lmeWluZyBhIHNlZ21lbnQgaW5kZXggcmFuZ2VcbiAgICAgICAgLy8gdXNlZCBhcyBhIGNvYXJzZSBzdWJkaXZpZGUgZm9yIHBsYWNpbmcgbXVsdGlwbGUgbGFiZWxzIHBlciBsaW5lIGdlb21ldHJ5XG4gICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCA9IGxheW91dC5zZWdtZW50X2luZGV4IHx8IGxheW91dC5zZWdtZW50X3N0YXJ0IHx8IDA7XG4gICAgICAgIHRoaXMuc2VnbWVudF9tYXggPSBsYXlvdXQuc2VnbWVudF9lbmQgfHwgdGhpcy5saW5lcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gRmlyc3QgZml0dGluZyBzZWdtZW50XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXROZXh0Rml0dGluZ1NlZ21lbnQodGhpcy5nZXRDdXJyZW50U2VnbWVudCgpKTtcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gKCFzZWdtZW50KTtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpbmUgZ2VvbWV0cnkgY3JlYXRpbmcgdGhlIG5leHQgdmFsaWQgbGFiZWwuXG4gICAgc3RhdGljIG5leHRMYWJlbChsYWJlbCkge1xuICAgICAgICAvLyBpbmNyZW1lbnQgc2VnbWVudFxuICAgICAgICBsZXQgaGFzTmV4dCA9IGxhYmVsLmdldE5leHRTZWdtZW50KCk7XG4gICAgICAgIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xvbmUgb3B0aW9uc1xuICAgICAgICBsZXQgbGF5b3V0ID0gT2JqZWN0LmNyZWF0ZShsYWJlbC5sYXlvdXQpO1xuICAgICAgICBsYXlvdXQuc2VnbWVudF9pbmRleCA9IGxhYmVsLnNlZ21lbnRfaW5kZXg7XG4gICAgICAgIGxheW91dC5wbGFjZW1lbnQgPSBsYWJlbC5wbGFjZW1lbnQ7XG5cbiAgICAgICAgLy8gY3JlYXRlIG5ldyBsYWJlbFxuICAgICAgICBsZXQgbmV4dExhYmVsID0gbmV3IExhYmVsTGluZShsYWJlbC5zaXplLCBsYWJlbC5saW5lcywgbGF5b3V0KTtcblxuICAgICAgICByZXR1cm4gKG5leHRMYWJlbC50aHJvd19hd2F5KSA/IGZhbHNlIDogbmV4dExhYmVsO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IGZvciByZXR1cm5pbmcgdGhlIG5leHQgc2VnbWVudC4gQXNzdW1lcyBhbiBcIm9yZGVyaW5nXCIgb2YgcG9zc2libGUgc2VnbWVudHNcbiAgICAvLyB0YWtpbmcgaW50byBhY2NvdW50IGJvdGggc3RyYWlnaHQgYW5kIGFydGljdWxhdGVkIHNlZ21lbnRzLiBSZXR1cm5zIGZhbHNlIGlmIGFsbCBwb3NzaWJpbGl0aWVzXG4gICAgLy8gaGF2ZSBiZWVuIGV4aGF1c3RlZFxuICAgIGdldE5leHRTZWdtZW50KCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuTUlEX1BPSU5UO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRfaW5kZXggPj0gdGhpcy5saW5lcy5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaXplLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuQ09STkVSO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRfaW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGluZSBzZWdtZW50cyBuZWNlc3NhcnkgZm9yIG90aGVyIGNhbGN1bGF0aW9ucyBhdCB0aGUgY3VycmVudCBsaW5lIHNlZ21lbnQgaW5kZXguXG4gICAgLy8gVGhpcyBpcyB0aGUgY3VycmVudCBhbmQgbmV4dCBzZWdtZW50IGZvciBhIHN0cmFpZ2h0IGxpbmUsIGFuZCB0aGUgcHJldmlvdXMsIGN1cnJlbnQgYW5kIG5leHRcbiAgICAvLyBmb3IgYW4gYXJ0aWN1bGF0ZWQgc2VnbWVudC5cbiAgICBnZXRDdXJyZW50U2VnbWVudCgpIHtcbiAgICAgICAgbGV0IHAxLCBwMiwgc2VnbWVudDtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggLSAxXTtcbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4XTtcbiAgICAgICAgICAgICAgICBsZXQgcDMgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCArIDFdO1xuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBbIHAxLCBwMiwgcDMgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4XTtcbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IFsgcDEsIHAyIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIG5leHQgc2VnbWVudCB0aGF0IGlzIHZhbGlkICh3aXRoaW4gdGlsZSwgaW5zaWRlIGFuZ2xlIHJlcXVpcmVtZW50cyBhbmQgd2l0aGluIGxpbmUgZ2VvbWV0cnkpLlxuICAgIGdldE5leHRGaXR0aW5nU2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIHNlZ21lbnQgPSBzZWdtZW50IHx8IHRoaXMuZ2V0TmV4dFNlZ21lbnQoKTtcbiAgICAgICAgaWYgKCFzZWdtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kb2VzU2VnbWVudEZpdChzZWdtZW50KSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluVGlsZUJvdW5kcygpICYmIHRoaXMuaW5BbmdsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXROZXh0Rml0dGluZ1NlZ21lbnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGN1cnJlbnQgc2VnbWVudCBpcyB2YWxpZFxuICAgIGRvZXNTZWdtZW50Rml0KHNlZ21lbnQpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpdEtpbmtlZFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml0U3RyYWlnaHRTZWdtZW50KHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBraW5rZWQgc2VnbWVudCBpcyB2YWxpZFxuICAgIC8vIEN5Y2xlcyB0aHJvdWdoIHZhcmlvdXMgd2F5cyBvZiBraW5raW5nIHRoZSBsYWJlbHMgYXJvdW5kIHRoZSBzZWdtZW50J3MgcGl2b3QsXG4gICAgLy8gZmluZGluZyB0aGUgYmVzdCBmaXQsIGFuZCBkZXRlcm1pbmVzIHRoZSBraW5rX2luZGV4LlxuICAgIGZpdEtpbmtlZFNlZ21lbnQoc2VnbWVudCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuXG4gICAgICAgIGxldCBwMHAxID0gVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgbGV0IHAxcDIgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgIC8vIERvbid0IGZpdCBpZiBzZWdtZW50IGRvZXNuJ3QgcGFzcyB0aGUgdmVydGljYWwgbGluZSB0ZXN0LCByZXN1bHRpbmcgaW4gdXBzaWRlLWRvd24gbGFiZWxzXG4gICAgICAgIGlmIChwMHAxWzBdICogcDFwMlswXSA8IDAgJiYgcDBwMVsxXSAqIHAxcDJbMV0gPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGluZV9sZW5ndGgxID0gVmVjdG9yLmxlbmd0aChwMHAxKSAvIHVwcDtcbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoMiA9IFZlY3Rvci5sZW5ndGgocDFwMikgLyB1cHA7XG5cbiAgICAgICAgLy8gYnJlYWsgdXAgbXVsdGlwbGUgc2VnbWVudHMgaW50byB0d28gY2h1bmtzIChOLTEgb3B0aW9ucylcbiAgICAgICAgbGV0IGxhYmVsX2xlbmd0aDEgPSB0aGlzLnRvdGFsX2xlbmd0aDtcbiAgICAgICAgbGV0IGxhYmVsX2xlbmd0aDIgPSAwO1xuICAgICAgICBsZXQgd2lkdGgsIGZpdG5lc3MgPSAwO1xuICAgICAgICBsZXQga2lua19pbmRleCA9IHRoaXMubnVtX3NlZ21lbnRzIC0gMTtcbiAgICAgICAgbGV0IGZpdG5lc3NlcyA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChraW5rX2luZGV4ID4gMCkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLnNpemVba2lua19pbmRleF1bMF0gKyB0aGlzLnNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICBsYWJlbF9sZW5ndGgxIC09IHdpZHRoO1xuICAgICAgICAgICAgbGFiZWxfbGVuZ3RoMiArPSB3aWR0aDtcblxuICAgICAgICAgICAgZml0bmVzcyA9IE1hdGgubWF4KGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoMSwgbGFiZWxfbGVuZ3RoMSksIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoMiwgbGFiZWxfbGVuZ3RoMikpO1xuICAgICAgICAgICAgZml0bmVzc2VzLnVuc2hpZnQoZml0bmVzcyk7XG5cbiAgICAgICAgICAgIGtpbmtfaW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhfZml0bmVzcyA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGZpdG5lc3Nlcyk7XG5cbiAgICAgICAgaWYgKG1heF9maXRuZXNzIDwgTElORV9FWENFRURfS0lOS0VEKSB7XG4gICAgICAgICAgICB0aGlzLmtpbmtfaW5kZXggPSBmaXRuZXNzZXMuaW5kZXhPZihtYXhfZml0bmVzcykgKyAxO1xuICAgICAgICAgICAgdGhpcy5maXRuZXNzID0gbWF4X2ZpdG5lc3M7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMua2lua19pbmRleCA9IDA7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHN0cmFpZ2h0IHNlZ21lbnQgaXMgdmFsaWRcbiAgICAvLyBBIHN0cmFpZ2h0IHNlZ21lbnQgaXMgcGxhY2VkIGF0IHRoZSBtaWRwb2ludCBhbmQgaXMgdmFsaWQgaWYgdGhlIGxhYmVsJ3MgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBhXG4gICAgLy8gZmFjdG9yIChMSU5FX0VYQ0VFRF9TVFJBSUdIVCkgb2YgdGhlIGxpbmUgc2VnbWVudCdzIGxlbmd0aFxuICAgIGZpdFN0cmFpZ2h0U2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIGxldCBsaW5lX2xlbmd0aCA9IFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKSkgLyB1cHA7XG4gICAgICAgIGxldCBmaXRuZXNzID0gY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgsIHRoaXMudG90YWxfbGVuZ3RoKTtcblxuICAgICAgICBpZiAoZml0bmVzcyA8IExJTkVfRVhDRUVEX1NUUkFJR0hUKXtcbiAgICAgICAgICAgIHRoaXMuZml0bmVzcyA9IGZpdG5lc3M7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uY2UgYSBmaXR0aW5nIHNlZ21lbnQgaXMgZm91bmQsIGRldGVybWluZSBpdHMgYW5nbGVzLCBwb3NpdGlvbnMgYW5kIGJvdW5kaW5nIGJveGVzXG4gICAgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLmFuZ2xlID0gdGhpcy5nZXRDdXJyZW50QW5nbGUoKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQkJveGVzKCk7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudEFuZ2xlKCkge1xuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICAgICAgbGV0IGFuZ2xlcyA9IFtdO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgdGhldGExID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEyID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAgICAgICAgIGxldCBwMHAxID0gVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgb3JpZW50YXRpb24gPSAocDBwMVswXSA+PSAwICYmIHAxcDJbMF0gPj0gMCkgPyAxIDogLTE7XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0aGlzLmtpbmtfaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAob3JpZW50YXRpb24gPiAwKSA/IHRoZXRhMiA6IHRoZXRhMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gKG9yaWVudGF0aW9uID4gMCkgPyB0aGV0YTEgOiB0aGV0YTI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYW5nbGVzLnB1c2goYW5nbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlcy5wdXNoKHRoZXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5nbGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbGFiZWxcbiAgICBnZXRDdXJyZW50UG9zaXRpb24oKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgcG9zaXRpb247XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gc2VnbWVudFsxXS5zbGljZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgICAgICAgICAwLjUgKiAoc2VnbWVudFswXVswXSArIHNlZ21lbnRbMV1bMF0pLFxuICAgICAgICAgICAgICAgICAgICAwLjUgKiAoc2VnbWVudFswXVsxXSArIHNlZ21lbnRbMV1bMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYXJ0aWN1bGF0ZWQgbGFiZWxzIHRvIGJlIHdpdGhpbiBhbiBhbmdsZSByYW5nZSBbLU1BWF9BTkdMRSwgK01BWF9BTkdMRV1cbiAgICBpbkFuZ2xlQm91bmRzKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMCA9IHRoaXMuYW5nbGVbMF07XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlMCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUwICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhbmdsZTEgPSB0aGlzLmFuZ2xlWzFdO1xuICAgICAgICAgICAgICAgIGlmIChhbmdsZTEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlMSArPSAyICogTWF0aC5QSTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBNYXRoLmFicyhhbmdsZTEgLSBhbmdsZTApO1xuICAgICAgICAgICAgICAgIHRoZXRhID0gTWF0aC5taW4oMiAqIE1hdGguUEkgLSB0aGV0YSwgdGhldGEpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZXRhIDw9IE1BWF9BTkdMRTtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBib3VuZGluZyBib3hlc1xuICAgIHVwZGF0ZUJCb3hlcygpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgbGV0IGhlaWdodCA9ICh0aGlzLnRvdGFsX2hlaWdodCArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdXBwICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAvLyByZXNldCBib3VuZGluZyBib3hlc1xuICAgICAgICB0aGlzLm9iYnMgPSBbXTtcbiAgICAgICAgdGhpcy5hYWJicyA9IFtdO1xuXG4gICAgICAgIC8vIGZ1ZGdlIHdpZHRoIHZhbHVlIGFzIHRleHQgbWF5IG92ZXJmbG93IGJvdW5kaW5nIGJveCBpZiBpdCBoYXMgaXRhbGljLCBib2xkLCBldGMgc3R5bGVcbiAgICAgICAgbGV0IGl0YWxpY3NfYnVmZmVyID0gKHRoaXMubGF5b3V0Lml0YWxpYykgPyA1ICogdXBwIDogMDtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMCA9IHRoaXMuYW5nbGVbdGhpcy5raW5rX2luZGV4IC0gMV07IC8vIGFuZ2xlIGJlZm9yZSBraW5rXG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMSA9IHRoaXMuYW5nbGVbdGhpcy5raW5rX2luZGV4XTsgLy8gYW5nbGUgYWZ0ZXIga2lua1xuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IE1hdGguYWJzKGFuZ2xlMSAtIGFuZ2xlMCk7IC8vIGFuZ2xlIGRlbHRhXG5cbiAgICAgICAgICAgICAgICAvLyBBIHNwcmVhZCBmYWN0b3Igb2YgMCBwaXZvdHMgdGhlIGJveGVzIG9uIHRoZWlyIGhvcml6b250YWwgY2VudGVyLCBsb29raW5nIGxpa2U6IFwiWFwiXG4gICAgICAgICAgICAgICAgLy8gYSBzcHJlYWQgZmFjdG9yIG9mIDEgb2Zmc2V0cyB0aGUgYm94ZXMgc28gdGhhdCB0aGVpciBjb3JuZXJzIHRvdWNoLCBsb29raW5nIGxpa2U6IFwiXFwvXCIgb3IgXCIvXFxcIlxuICAgICAgICAgICAgICAgIGxldCBkeCA9IHRoaXMuc3ByZWFkX2ZhY3RvciAqIE1hdGguYWJzKHRoaXMudG90YWxfaGVpZ2h0ICogTWF0aC50YW4oMC41ICogdGhldGEpKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVkZ2UgPSAwLjUgKiAoLWR4IC0gdGhpcy5zcGFjZV93aWR0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBQbGFjZSBsYWJlbHMgYmFja3dhcmRzIGZyb20ga2luayBpbmRleFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmtpbmtfaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlIC09IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtudWRnZSAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCArIGl0YWxpY3NfYnVmZmVyLCBoZWlnaHQsIGFuZ2xlLCB0aGlzLm9mZnNldCwgdXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFhYmIgPSBvYmIuZ2V0RXh0ZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmJzLnB1c2gob2JiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYWJicy5wdXNoKGFhYmIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFswXSArIG51ZGdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHggKyB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBmb3J3YXJkcyBmcm9tIGtpbmsgaW5kZXhcbiAgICAgICAgICAgICAgICBudWRnZSA9IDAuNSAqIChkeCArIHRoaXMuc3BhY2Vfd2lkdGgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlICs9IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtudWRnZSAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCArIGl0YWxpY3NfYnVmZmVyLCBoZWlnaHQsIGFuZ2xlLCB0aGlzLm9mZnNldCwgdXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFhYmIgPSBvYmIuZ2V0RXh0ZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmJzLnB1c2gob2JiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYWJicy5wdXNoKGFhYmIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFswXSArIG51ZGdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgKz0gMC41ICogd2lkdGhfcHggKyB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBsZXQgc2hpZnQgPSAtMC41ICogdGhpcy50b3RhbF9sZW5ndGg7IC8vIHNoaWZ0IGZvciBjZW50ZXJpbmcgdGhlIGxhYmVsc1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoX3B4ID0gdGhpcy5zaXplW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW3NoaWZ0ICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgc2hpZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja3MgZWFjaCBzZWdtZW50IHRvIHNlZSBpZiBpdCBpcyB3aXRoaW4gdGhlIHRpbGUuIElmIGFueSBzZWdtZW50IGZhaWxzIHRoaXMgdGVzdCwgdGhleSBhbGwgZmFpbC5cbiAgICAvLyBUT0RPOiBsYWJlbCBncm91cFxuICAgIGluVGlsZUJvdW5kcygpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFhYmJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JqID0geyBhYWJiIH07XG4gICAgICAgICAgICBsZXQgaW5fYm91bmRzID0gTGFiZWwucHJvdG90eXBlLmluVGlsZUJvdW5kcy5jYWxsKG9iaik7XG4gICAgICAgICAgICBpZiAoIWluX2JvdW5kcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBZGRzIGVhY2ggc2VnbWVudCB0byB0aGUgY29sbGlzaW9uIHBhc3MgYXMgaXRzIG93biBib3VuZGluZyBib3hcbiAgICAvLyBUT0RPOiBsYWJlbCBncm91cFxuICAgIGFkZChiYm94ZXMpIHtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWFiYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmIgPSB0aGlzLm9iYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JqID0geyBhYWJiLCBvYmIgfTtcbiAgICAgICAgICAgIExhYmVsLnByb3RvdHlwZS5hZGQuY2FsbChvYmosIGJib3hlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja3MgZWFjaCBzZWdtZW50IHRvIHNlZSBpZiBpdCBzaG91bGQgYmUgZGlzY2FyZGVkICh2aWEgY29sbGlzaW9uKS4gSWYgYW55IHNlZ21lbnQgZmFpbHMgdGhpcyB0ZXN0LCB0aGV5IGFsbCBmYWlsLlxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLnRocm93X2F3YXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9iYnMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iYiA9IHRoaXMub2Jic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIsIG9iYiB9O1xuXG4gICAgICAgICAgICBsZXQgc2hvdWxkRGlzY2FyZCA9IExhYmVsLnByb3RvdHlwZS5vY2NsdWRlZC5jYWxsKG9iaiwgYmJveGVzLCBleGNsdWRlKTtcbiAgICAgICAgICAgIGlmIChzaG91bGREaXNjYXJkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBtZXRob2QgdG8gY2FsY3VsYXRlIG9yaWVudGVkIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgb2Zmc2V0LCB1cHApIHtcbiAgICBsZXQgcDAsIHAxO1xuICAgIC8vIGFwcGx5IG9mZnNldCwgeCBwb3NpdGl2ZSwgeSBwb2ludGluZyBkb3duXG4gICAgaWYgKG9mZnNldCAmJiAob2Zmc2V0WzBdICE9PSAwIHx8IG9mZnNldFsxXSAhPT0gMCkpIHtcbiAgICAgICAgb2Zmc2V0ID0gVmVjdG9yLnJvdChvZmZzZXQsIGFuZ2xlKTtcbiAgICAgICAgcDAgPSBwb3NpdGlvblswXSArIChvZmZzZXRbMF0gKiB1cHApO1xuICAgICAgICBwMSA9IHBvc2l0aW9uWzFdIC0gKG9mZnNldFsxXSAqIHVwcCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwMCA9IHBvc2l0aW9uWzBdO1xuICAgICAgICBwMSA9IHBvc2l0aW9uWzFdO1xuICAgIH1cblxuICAgIC8vIHRoZSBhbmdsZSBvZiB0aGUgb2JiIGlzIG5lZ2F0aXZlIHNpbmNlIGl0J3MgdGhlIHRpbGUgc3lzdGVtIHkgYXhpcyBpcyBwb2ludGluZyBkb3duXG4gICAgcmV0dXJuIG5ldyBPQkIocDAsIHAxLCAtYW5nbGUsIHdpZHRoLCBoZWlnaHQpO1xufVxuXG4vLyBQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgdGhlIGFuZ2xlIG9mIGEgc2VnbWVudC5cbi8vIFRyYW5zZm9ybXMgdGhlIGFuZ2xlIHRvIGxpZSB3aXRoaW4gdGhlIHJhbmdlIFswLCBQSS8yXSBhbmQgWzMqUEkvMiwgMipQSV0gKDFzdCBvciA0dGggcXVhZHJhbnRzKVxuLy8gYXMgb3RoZXIgcmFuZ2VzIHByb2R1Y2UgXCJ1cHNpZGUgZG93blwiIGxhYmVsc1xuZnVuY3Rpb24gZ2V0QW5nbGVGcm9tU2VnbWVudChwdDEsIHB0Mikge1xuICAgIGxldCBQSSA9IE1hdGguUEk7XG4gICAgbGV0IFBJXzIgPSBQSSAvIDI7XG4gICAgbGV0IHAxcDIgPSBWZWN0b3Iuc3ViKHB0MSwgcHQyKTtcbiAgICBsZXQgdGhldGEgPSBNYXRoLmF0YW4yKHAxcDJbMF0sIHAxcDJbMV0pICsgUElfMjtcblxuICAgIGlmICh0aGV0YSA+IFBJXzIpIHtcbiAgICAgICAgLy8gSWYgaW4gMm5kIHF1YWRyYW50LCBtb3ZlIHRvIDR0aCBxdWFkcmFudFxuICAgICAgICB0aGV0YSArPSBQSTtcbiAgICAgICAgdGhldGEgJT0gMiAqIE1hdGguUEk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoZXRhIDwgMCkge1xuICAgICAgICAvLyBJZiBpbiA0dGggcXVhZHJhbnQsIG1ha2UgYSBwb3NpdGl2ZSBhbmdsZVxuICAgICAgICB0aGV0YSArPSAyICogUEk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoZXRhO1xufVxuXG5mdW5jdGlvbiBjYWxjRml0bmVzcyhsaW5lX2xlbmd0aCwgbGFiZWxfbGVuZ3RoKXtcbiAgICByZXR1cm4gMSAtIGxpbmVfbGVuZ3RoIC8gbGFiZWxfbGVuZ3RoO1xufVxuIiwiaW1wb3J0IExhYmVsIGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IFBvaW50QW5jaG9yIGZyb20gJy4vcG9pbnRfYW5jaG9yJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbFBvaW50IGV4dGVuZHMgTGFiZWwge1xuXG4gICAgY29uc3RydWN0b3IgKHBvc2l0aW9uLCBzaXplLCBsYXlvdXQpIHtcbiAgICAgICAgc3VwZXIoc2l6ZSwgbGF5b3V0KTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFtwb3NpdGlvblswXSwgcG9zaXRpb25bMV1dO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHRoaXMubGF5b3V0LnBhcmVudDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICB0aGlzLnN0YXJ0X2FuY2hvcl9pbmRleCA9IDE7XG4gICAgICAgIHRoaXMuZGVnZW5lcmF0ZSA9ICF0aGlzLnNpemVbMF0gJiYgIXRoaXMuc2l6ZVsxXSAmJiAhdGhpcy5sYXlvdXQuYnVmZmVyWzBdICYmICF0aGlzLmxheW91dC5idWZmZXJbMV07XG4gICAgICAgIHRoaXMudGhyb3dfYXdheSA9ICF0aGlzLmdldE5leHRGaXQoKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbXB1dGVPZmZzZXQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICB9XG5cbiAgICBjb21wdXRlT2Zmc2V0ICgpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBbdGhpcy5sYXlvdXQub2Zmc2V0WzBdLCB0aGlzLmxheW91dC5vZmZzZXRbMV1dO1xuXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgYW5jaG9yL29mZnNldCBmb3IgcG9pbnQ6XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgLy8gcG9pbnQncyBvd24gYW5jaG9yLCB0ZXh0IGFuY2hvciBhcHBsaWVkIHRvIHBvaW50LCBhZGRpdGlvbmFsIHBvaW50IG9mZnNldFxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCBwYXJlbnQuc2l6ZSwgcGFyZW50LmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCBwYXJlbnQuc2l6ZSwgdGhpcy5hbmNob3IsIFBvaW50QW5jaG9yLnplcm9fYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQub2Zmc2V0ICE9PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAgICAgICAgLy8gcG9pbnQgaGFzIGFuIG9mZnNldFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA9PT0gU3R5bGVQYXJzZXIuemVyb1BhaXIpIHsgICAgICAvLyBubyB0ZXh0IG9mZnNldCwgdXNlIHBvaW50J3NcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBwYXJlbnQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGV4dCBoYXMgb2Zmc2V0LCBhZGQgcG9pbnQnc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldFswXSArPSBwYXJlbnQub2Zmc2V0WzBdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldFsxXSArPSBwYXJlbnQub2Zmc2V0WzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gUG9pbnRBbmNob3IuY29tcHV0ZU9mZnNldCh0aGlzLm9mZnNldCwgdGhpcy5zaXplLCB0aGlzLmFuY2hvcik7XG4gICAgfVxuXG4gICAgdXBkYXRlQkJveGVzICgpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gKHRoaXMuc2l6ZVswXSArIHRoaXMubGF5b3V0LmJ1ZmZlclswXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcbiAgICAgICAgbGV0IGhlaWdodCA9ICh0aGlzLnNpemVbMV0gKyB0aGlzLmxheW91dC5idWZmZXJbMV0gKiAyKSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgLy8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuaXRhbGljKXtcbiAgICAgICAgICAgIHdpZHRoICs9IDUgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcCA9IFtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKyAodGhpcy5vZmZzZXRbMF0gKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwpLFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtICh0aGlzLm9mZnNldFsxXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLm9iYiA9IG5ldyBPQkIocFswXSwgcFsxXSwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuYWFiYiA9IHRoaXMub2JiLmdldEV4dGVudCgpO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBsYWJlbCBpbnRvIHRoZSB0aWxlIGJvdW5kc1xuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBsYWJlbCB3YXMgbW92ZWQgaW50byB0aWxlLCBmYWxzZSBpZiBpdCBjb3VsZG4ndCBiZSBtb3ZlZFxuICAgIG1vdmVJbnRvVGlsZSAoKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlswXSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKz0gLXRoaXMuYWFiYlswXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsyXSA+PSBHZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSAtPSB0aGlzLmFhYmJbMl0gLSBHZW8udGlsZV9zY2FsZSArIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFhYmJbM10gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC09IHRoaXMuYWFiYlszXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsxXSA8PSAtR2VvLnRpbGVfc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzFdICsgR2VvLnRpbGVfc2NhbGUgLSAxO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH1cblxuICAgIGdldE5leHRGaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXQuY3VsbF9mcm9tX3RpbGUgfHwgdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQubW92ZV9pbnRvX3RpbGUpe1xuICAgICAgICAgICAgdGhpcy5tb3ZlSW50b1RpbGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG9uIHNlY29uZCBhbmNob3IgKGZpcnN0IGFuY2hvciB3YXMgc2V0IG9uIGNyZWF0aW9uKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5sYXlvdXQuYW5jaG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gdGhpcy5sYXlvdXQuYW5jaG9yW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRfYW5jaG9yX2luZGV4ID0gaTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIGFuY2hvcnMgcmVzdWx0IGluIGZpdFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzY2FyZCAoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5kZWdlbmVyYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VwZXIuZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUpKSB7XG4gICAgICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGFuY2hvciBzcGVjaWZpZWQsIHRyeSB0aGVtIGluIG9yZGVyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb24gc2Vjb25kIGFuY2hvciAoZmlyc3QgYW5jaG9yIHdhcyBzZXQgb24gY3JlYXRpb24pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT10aGlzLnN0YXJ0X2FuY2hvcl9pbmRleDsgaSA8IHRoaXMubGF5b3V0LmFuY2hvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuY2hvciA9IHRoaXMubGF5b3V0LmFuY2hvcltpXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQuY3VsbF9mcm9tX3RpbGUgJiYgIXRoaXMuaW5UaWxlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cblxuLy8gUGxhY2VtZW50IHN0cmF0ZWdpZXNcbkxhYmVsUG9pbnQuUExBQ0VNRU5UID0ge1xuICAgIFZFUlRFWDogMCwgICAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGF0IGVuZHBvaW50cyBvZiBsaW5lIHNlZ21lbnRzXG4gICAgTUlEUE9JTlQ6IDEsICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgbWlkcG9pbnRzIG9mIGxpbmUgc2VnbWVudHNcbiAgICBTUEFDRUQ6IDIsICAgICAgICAgIC8vIHBsYWNlIGxhYmVscyBlcXVhbGx5IHNwYWNlZCBhbG9uZyBsaW5lXG4gICAgQ0VOVFJPSUQ6IDMgICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgY2VudGVyIG9mIHBvbHlnb25zXG59O1xuIiwiLy8gU2V0cyBvZiB2YWx1ZXMgdG8gbWF0Y2ggZm9yIGRpcmVjdGlvbmFsIGFuZCBjb3JuZXIgYW5jaG9yc1xuY29uc3QgbGVmdHMgPSBbJ2xlZnQnLCAndG9wLWxlZnQnLCAnYm90dG9tLWxlZnQnXTtcbmNvbnN0IHJpZ2h0cyA9IFsncmlnaHQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1yaWdodCddO1xuY29uc3QgdG9wcyA9IFsndG9wJywgJ3RvcC1sZWZ0JywgJ3RvcC1yaWdodCddO1xuY29uc3QgYm90dG9tcyA9IFsnYm90dG9tJywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCddO1xuXG5sZXQgUG9pbnRBbmNob3I7XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50QW5jaG9yID0ge1xuXG4gICAgY29tcHV0ZU9mZnNldCAob2Zmc2V0LCBzaXplLCBhbmNob3IsIGJ1ZmZlciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFhbmNob3IgfHwgYW5jaG9yID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvZmZzZXQyID0gW29mZnNldFswXSwgb2Zmc2V0WzFdXTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyIHx8IHRoaXMuZGVmYXVsdF9idWZmZXI7XG5cbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgbGVmdC9yaWdodCBvZmZzZXRcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMF0gLT0gc2l6ZVswXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzBdIC09IGJ1ZmZlclswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmlnaHRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlswXSArPSBzaXplWzBdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzBdICs9IGJ1ZmZlclsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuIG9wdGlvbmFsIHRvcC9ib3R0b20gb2Zmc2V0XG4gICAgICAgIGlmICh0aGlzLmlzVG9wQW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMV0gLT0gc2l6ZVsxXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMV0gLT0gYnVmZmVyWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNCb3R0b21BbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlsxXSArPSBzaXplWzFdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlsxXSArPSBidWZmZXJbM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Zmc2V0MjtcbiAgICB9LFxuXG4gICAgYWxpZ25Gb3JBbmNob3IgKGFuY2hvcikge1xuICAgICAgICBpZiAoYW5jaG9yICYmIGFuY2hvciAhPT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVmdEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmlnaHRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgIH0sXG5cbiAgICBpc0xlZnRBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKGxlZnRzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNSaWdodEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAocmlnaHRzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNUb3BBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKHRvcHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc0JvdHRvbUFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAoYm90dG9tcy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIC8vIEJ1ZmZlcnM6IFtsZWZ0LCByaWdodCwgdG9wLCBib3R0b21dXG4gICAgZGVmYXVsdF9idWZmZXI6IFsyLjUsIDIuNSwgMS41LCAwLjc1XSxcbiAgICB6ZXJvX2J1ZmZlcjogWzAsIDAsIDAsIDBdXG5cbn07XG4iLCIvLyBMb2dpYyBmb3IgcGxhY2luZyBwb2ludCBsYWJlbHMgYWxvbmcgYSBsaW5lIGdlb21ldHJ5XG5cbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4vbGFiZWxfcG9pbnQnO1xuaW1wb3J0IHtpc0Nvb3JkT3V0c2lkZVRpbGV9IGZyb20gJy4uL2J1aWxkZXJzL2NvbW1vbic7XG5cbmNvbnN0IFBMQUNFTUVOVCA9IExhYmVsUG9pbnQuUExBQ0VNRU5UO1xuY29uc3QgZGVmYXVsdF9zcGFjaW5nID0gODA7IC8vIHNwYWNpbmcgb2YgcG9pbnRzIGFsb25nIGxpbmUgaW4gcGl4ZWxzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBsYWNlUG9pbnRzT25MaW5lIChsaW5lLCBzaXplLCBvcHRpb25zKSB7XG4gICAgbGV0IGxhYmVscyA9IFtdO1xuICAgIGxldCBzdHJhdGVneSA9IG9wdGlvbnMucGxhY2VtZW50O1xuICAgIGxldCBtaW5fbGVuZ3RoID0gTWF0aC5tYXgoc2l6ZVswXSwgc2l6ZVsxXSkgKiBvcHRpb25zLnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvICogb3B0aW9ucy51bml0c19wZXJfcGl4ZWw7XG5cbiAgICBzd2l0Y2ggKHN0cmF0ZWd5KXtcbiAgICAgICAgY2FzZSBQTEFDRU1FTlQuU1BBQ0VEOlxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdldFBvc2l0aW9uc0FuZEFuZ2xlcyhsaW5lLCBtaW5fbGVuZ3RoLCBvcHRpb25zKTtcbiAgICAgICAgICAgIC8vIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQgaWYgbGluZSBoYXZlIG5vIGxlbmd0aFxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSByZXN1bHQucG9zaXRpb25zO1xuICAgICAgICAgICAgbGV0IGFuZ2xlcyA9IHJlc3VsdC5hbmdsZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gcG9zaXRpb25zW2ldO1xuICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IGFuZ2xlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHBvc2l0aW9uLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBhbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5WRVJURVg6XG4gICAgICAgICAgICBsZXQgcCwgcSwgbGFiZWw7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKXtcbiAgICAgICAgICAgICAgICBwID0gbGluZVtpXTtcbiAgICAgICAgICAgICAgICBxID0gbGluZVtpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZV9lZGdlcyA9PT0gdHJ1ZSB8fCAhaXNDb29yZE91dHNpZGVUaWxlKHApKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsUG9pbnQocCwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLmFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCBsYXN0IGVuZHBvaW50XG4gICAgICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHEsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURQT0lOVDpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICAgICAgICAgIGxldCBwID0gbGluZVtpXTtcbiAgICAgICAgICAgICAgICBsZXQgcSA9IGxpbmVbaSArIDFdO1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFtcbiAgICAgICAgICAgICAgICAgICAgMC41ICogKHBbMF0gKyBxWzBdKSxcbiAgICAgICAgICAgICAgICAgICAgMC41ICogKHBbMV0gKyBxWzFdKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZV9lZGdlcyA9PT0gdHJ1ZSB8fCAhaXNDb29yZE91dHNpZGVUaWxlKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbl9sZW5ndGggfHwgbm9ybShwLCBxKSA+IG1pbl9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHBvc2l0aW9uLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLmFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVscztcbn1cblxuZnVuY3Rpb24gZ2V0UG9zaXRpb25zQW5kQW5nbGVzKGxpbmUsIG1pbl9sZW5ndGgsIG9wdGlvbnMpe1xuICAgIGxldCB1cHAgPSBvcHRpb25zLnVuaXRzX3Blcl9waXhlbDtcbiAgICBsZXQgc3BhY2luZyA9IChvcHRpb25zLnBsYWNlbWVudF9zcGFjaW5nIHx8IGRlZmF1bHRfc3BhY2luZykgKiB1cHA7XG5cbiAgICBsZXQgbGVuZ3RoID0gZ2V0TGluZUxlbmd0aChsaW5lKTtcbiAgICBpZiAobGVuZ3RoIDw9IG1pbl9sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBudW1fbGFiZWxzID0gTWF0aC5tYXgoTWF0aC5mbG9vcihsZW5ndGggLyBzcGFjaW5nKSwgMSk7XG4gICAgbGV0IHJlbWFpbmRlciA9IGxlbmd0aCAtIChudW1fbGFiZWxzIC0gMSkgKiBzcGFjaW5nO1xuICAgIGxldCBwb3NpdGlvbnMgPSBbXTtcbiAgICBsZXQgYW5nbGVzID0gW107XG5cbiAgICBsZXQgZGlzdGFuY2UgPSAwLjUgKiByZW1haW5kZXI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1fbGFiZWxzOyBpKyspe1xuICAgICAgICBsZXQge3Bvc2l0aW9uLCBhbmdsZX0gPSBpbnRlcnBvbGF0ZUxpbmUobGluZSwgZGlzdGFuY2UsIG1pbl9sZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICBpZiAocG9zaXRpb24gIT0gbnVsbCAmJiBhbmdsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChwb3NpdGlvbik7XG4gICAgICAgICAgICBhbmdsZXMucHVzaChhbmdsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzdGFuY2UgKz0gc3BhY2luZztcbiAgICB9XG5cbiAgICByZXR1cm4ge3Bvc2l0aW9ucywgYW5nbGVzfTtcbn1cblxuZnVuY3Rpb24gZ2V0QW5nbGUocCwgcSwgYW5nbGUgPSAwKXtcbiAgICByZXR1cm4gKGFuZ2xlID09PSAnYXV0bycpID8gTWF0aC5hdGFuMihxWzBdIC0gcFswXSwgcVsxXSAtIHBbMV0pIDogYW5nbGU7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVMZW5ndGgobGluZSl7XG4gICAgbGV0IGRpc3RhbmNlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKXtcbiAgICAgICAgZGlzdGFuY2UgKz0gbm9ybShsaW5lW2ldLCBsaW5lW2krMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGFuY2U7XG59XG5cbmZ1bmN0aW9uIG5vcm0ocCwgcSl7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwWzBdIC0gcVswXSwgMikgKyBNYXRoLnBvdyhwWzFdIC0gcVsxXSwgMikpO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUxpbmUobGluZSwgZGlzdGFuY2UsIG1pbl9sZW5ndGgsIG9wdGlvbnMpe1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGxldCBwb3NpdGlvbiwgYW5nbGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aC0xOyBpKyspe1xuICAgICAgICBsZXQgcCA9IGxpbmVbaV07XG4gICAgICAgIGxldCBxID0gbGluZVtpKzFdO1xuXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IG5vcm0ocCwgcSk7XG4gICAgICAgIGlmIChsZW5ndGggPD0gbWluX2xlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdW0gKz0gbGVuZ3RoO1xuXG4gICAgICAgIGlmIChzdW0gPiBkaXN0YW5jZSl7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGludGVycG9sYXRlU2VnbWVudChwLCBxLCBzdW0gLSBkaXN0YW5jZSk7XG4gICAgICAgICAgICBhbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtwb3NpdGlvbiwgYW5nbGV9O1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVNlZ21lbnQocCwgcSwgZGlzdGFuY2Upe1xuICAgIGxldCBsZW5ndGggPSBub3JtKHAsIHEpO1xuICAgIGxldCByYXRpbyA9IGRpc3RhbmNlIC8gbGVuZ3RoO1xuICAgIHJldHVybiBbXG4gICAgICAgIHJhdGlvICogcFswXSArICgxIC0gcmF0aW8pICogcVswXSxcbiAgICAgICAgcmF0aW8gKiBwWzFdICsgKDEgLSByYXRpbykgKiBxWzFdXG4gICAgXTtcbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwZWF0R3JvdXAge1xuXG4gICAgY29uc3RydWN0b3IgKGtleSwgcmVwZWF0X2Rpc3QsIG1heF9yZXBlYXRfZGlzdCkge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5yZXBlYXRfZGlzdCA9IHJlcGVhdF9kaXN0O1xuICAgICAgICB0aGlzLnJlcGVhdF9kaXN0X3NxID0gdGhpcy5yZXBlYXRfZGlzdCAqIHRoaXMucmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxID0gbWF4X3JlcGVhdF9kaXN0ICogbWF4X3JlcGVhdF9kaXN0O1xuICAgICAgICB0aGlzLm9uZV9wZXJfZ3JvdXAgPSAodGhpcy5yZXBlYXRfZGlzdF9zcSA+PSB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gW107XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYW4gb2JqZWN0IHRvIHNlZSBpZiBpdCdzIGEgcmVwZWF0IGluIHRoaXMgZ3JvdXBcbiAgICBjaGVjayAob2JqKSB7XG4gICAgICAgIC8vIElmIG9ubHkgb25lIG9iamVjdCBhbGxvd2VkIHBlciBncm91cCwgc2hvcnRjdXQgZGlzdGFuY2UgbG9naWNcbiAgICAgICAgaWYgKHRoaXMub25lX3Blcl9ncm91cCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBkaXN0YW5jZSBtYXhlcyBvdXQgYXQgdGhyZXNob2xkIGluIHRoaXMgY2FzZVxuICAgICAgICAgICAgICAgIC8vIChub3QgdHJ1ZSBkaXN0IHZhbHVlIHNpbmNlIHdlIHNraXBwZWQgY2FsY3VsYXRpbmcgaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdF9zcTogdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIHJlcGVhdF9kaXN0X3NxOiB0aGlzLnJlcGVhdF9kaXN0X3NxLFxuICAgICAgICAgICAgICAgICAgICBvbmVfcGVyX2dyb3VwOiB0aGlzLm9uZV9wZXJfZ3JvdXBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBvYmplY3QgZm9yIHRoaXMgZ3JvdXAgeWV0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBkaXN0YW5jZSBmcm9tIG5ldyBvYmplY3QgdG8gb2JqZWN0cyBhbHJlYWR5IGluIGdyb3VwXG4gICAgICAgIGxldCBwMSA9IG9iai5wb3NpdGlvbjtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdGhpcy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwMiA9IHRoaXMucG9zaXRpb25zW2ldO1xuICAgICAgICAgICAgbGV0IGR4ID0gcDFbMF0gLSBwMlswXTtcbiAgICAgICAgICAgIGxldCBkeSA9IHAxWzFdIC0gcDJbMV07XG4gICAgICAgICAgICBsZXQgZGlzdF9zcSA9IGR4ICogZHggKyBkeSAqIGR5O1xuXG4gICAgICAgICAgICAvLyBGb3VuZCBhbiBleGlzdGluZyBvYmplY3Qgd2l0aGluIGFsbG93ZWQgZGlzdGFuY2VcbiAgICAgICAgICAgIGlmIChkaXN0X3NxIDwgdGhpcy5yZXBlYXRfZGlzdF9zcSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIHJlcGVhdF9kaXN0X3NxOiB0aGlzLnJlcGVhdF9kaXN0X3NxXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBvYmplY3QgdG8gdGhpcyBncm91cFxuICAgIGFkZCAob2JqKSB7XG4gICAgICAgIC8vIG9ubHkgc3RvcmUgb2JqZWN0J3MgcG9zaXRpb24sIHRvIHNhdmUgc3BhY2UgLyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKG9iaiAmJiBvYmoucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zLnB1c2gob2JqLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXRpYyBtZXRob2RzIGFyZSB1c2VkIHRvIG1hbmFnZSByZXBlYXQgZ3JvdXBzLCB3aXRoaW4gYW5kIGFjcm9zcyB0aWxlc1xuXG4gICAgLy8gUmVzZXQgYWxsIGdyb3VwcyBmb3IgdGhpcyB0aWxlXG4gICAgc3RhdGljIGNsZWFyICh0aWxlKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdID0ge307XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYW4gb2JqZWN0IHRvIHNlZSBpZiBpdCdzIGEgcmVwZWF0IHdpdGhpbiBpdHMgZGVzaWduYXRlZCBncm91cFxuICAgIHN0YXRpYyBjaGVjayAob2JqLCBsYXlvdXQsIHRpbGUpIHtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UgJiYgbGF5b3V0LnJlcGVhdF9ncm91cCAmJiB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdLmNoZWNrKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgYW4gb2JqZWN0IHRvIGl0cyBkZXNpZ25hdGVkIGdyb3VwXG4gICAgc3RhdGljIGFkZCAob2JqLCBsYXlvdXQsIHRpbGUpIHtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UgJiYgbGF5b3V0LnJlcGVhdF9ncm91cCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXSA9IG5ldyBSZXBlYXRHcm91cChcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCxcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgUmVwZWF0R3JvdXAubWF4X3JlcGVhdF9kaXN0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdLmFkZChvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbi8vIEN1cnJlbnQgc2V0IG9mIHJlcGVhdCBncm91cHMsIGdyb3VwZWQgYW5kIGtleWVkIGJ5IHRpbGVcblJlcGVhdEdyb3VwLmdyb3VwcyA9IHt9O1xuXG4vLyBNYXggcmVwZWF0IGRpc3Q6IGZvciBncm91cHMgd2l0aCBhIHJlcGVhdCBkaXN0IGJleW9uZCB0aGlzIHRocmVzaG9sZCwgb25seSBvbmUgbGFiZWxcbi8vIHdpbGwgYmUgYWxsb3dlZCBwZXIgZ3JvdXAsIGUuZy4gc2V0IHRvIHRpbGUgc2l6ZSBmb3Igb25lLWxhYmVsLXBlci10aWxlXG5SZXBlYXRHcm91cC5tYXhfcmVwZWF0X2Rpc3QgPSBHZW8udGlsZV9zY2FsZTtcbiIsImltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFNjZW5lIGZyb20gJy4vc2NlbmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5cbi8vIEV4cG9ydHMgbXVzdCBhcHBlYXIgb3V0c2lkZSBhIGZ1bmN0aW9uLCBidXQgd2lsbCBvbmx5IGJlIGRlZmluZWQgaW4gbWFpbiB0aHJlYWQgKGJlbG93KVxuZXhwb3J0IHZhciBMZWFmbGV0TGF5ZXI7XG5leHBvcnQgZnVuY3Rpb24gbGVhZmxldExheWVyKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZXh0ZW5kTGVhZmxldChvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kTGVhZmxldChvcHRpb25zKSB7XG5cbiAgICAvLyBJZiBMZWFmbGV0TGF5ZXIgaXMgYWxyZWFkeSBkZWZpbmVkIHdoZW4gdGhpcyBpcyBjYWxsZWQganVzdCByZXR1cm4gdGhhdCBpbW1lZGlhdGVseVxuICAgIC8vIGUuZy4gaWYgeW91IGNhbGwgbGVhZmxldExheWVyIG11bHRpcGxlIHRpbWVzICh3aGljaCBpcyB2YWxpZClcbiAgICBpZiAodHlwZW9mIExlYWZsZXRMYXllciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMZWFmbGV0TGF5ZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gTGVhZmxldCBsYXllciBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgZGVmaW5lZCBpbiBtYWluIHRocmVhZFxuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuXG4gICAgICAgIGxldCBMID0gb3B0aW9ucy5sZWFmbGV0IHx8IHdpbmRvdy5MO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB3ZSBhcmUgZXh0ZW5kaW5nIHRoZSBsZWFmbGV0IDAuNy54IFRpbGVMYXllciBjbGFzcywgb3IgdGhlIG5ld2VyXG4gICAgICAgIC8vIGxlYWZsZXQgMS54IEdyaWRMYXllciBjbGFzcy5cbiAgICAgICAgbGV0IGxheWVyQmFzZUNsYXNzID0gTC5HcmlkTGF5ZXIgPyBMLkdyaWRMYXllciA6IEwuVGlsZUxheWVyO1xuICAgICAgICBsZXQgbGVhZmxldFZlcnNpb24gPSBsYXllckJhc2VDbGFzcyA9PT0gTC5HcmlkTGF5ZXIgPyAnMS54JyA6ICcwLjcueCc7XG4gICAgICAgIGxldCBsYXllckNsYXNzQ29uZmlnID0ge307XG5cbiAgICAgICAgLy8gSWYgZXh0ZW5kaW5nIGxlYWZsZXQgMC43LnggVGlsZUxheWVyLCBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbnMgYXJlIG5lZWRlZFxuICAgICAgICBpZiAobGF5ZXJCYXNlQ2xhc3MgPT09IEwuVGlsZUxheWVyKSB7XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9hZGRUaWxlID0gZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fcmVtb3ZlVGlsZSA9IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX3Jlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLl9yZXNldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIC8vIHJlLWFkZCB0aGUgY2FudmFzIHNpbmNlIGJhc2UgY2xhc3MgYHZpZXdyZXNldGAgZXZlbnQgY2FuIHJlbW92ZSBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lICYmIHRoaXMuc2NlbmUuY29udGFpbmVyICYmIHRoaXMuc2NlbmUuY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2NlbmUuY2FudmFzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmaW5lIGN1c3RvbSBsYXllciBtZXRob2RzXG4gICAgICAgIE9iamVjdC5hc3NpZ24obGF5ZXJDbGFzc0NvbmZpZywge1xuXG4gICAgICAgICAgICBpbml0aWFsaXplIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3dEZWJ1ZyA9ICghb3B0aW9ucy5zaG93RGVidWcgPyBmYWxzZSA6IHRydWUpO1xuXG4gICAgICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2NlbmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjcmVhdGVTY2VuZSAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZSA9IFNjZW5lLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNjZW5lLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1Xb3JrZXJzOiB0aGlzLm9wdGlvbnMubnVtV29ya2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZVVwZGF0ZTogdGhpcy5vcHRpb25zLnByZVVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RVcGRhdGU6IHRoaXMub3B0aW9ucy5wb3N0VXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91c1pvb206IChMZWFmbGV0TGF5ZXIubGVhZmxldFZlcnNpb24gPT09ICcxLngnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hEZW5zaXR5RGlzcGxheTogdGhpcy5vcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiB0aGlzLm9wdGlvbnMubG9nTGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0aGlzLm9wdGlvbnMuaW50cm9zcGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2VkIG9wdGlvbiwgYXBwIHdpbGwgaGF2ZSB0byBtYW51YWxseSBjYWxsZWQgc2NlbmUudXBkYXRlKCkgcGVyIGZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVuZGVyTG9vcDogdGhpcy5vcHRpb25zLmRpc2FibGVSZW5kZXJMb29wLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZWQgb3B0aW9uLCB3aWxsIHJlcXVpcmUgbGlicmFyeSB0byBiZSBzZXJ2ZWQgYXMgc2FtZSBob3N0IGFzIHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93Q3Jvc3NEb21haW5Xb3JrZXJzOiB0aGlzLm9wdGlvbnMuYWxsb3dDcm9zc0RvbWFpbldvcmtlcnNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGaW5pc2ggaW5pdGlhbGl6aW5nIHNjZW5lIGFuZCBzZXR1cCBldmVudHMgd2hlbiBsYXllciBpcyBhZGRlZCB0byBtYXBcbiAgICAgICAgICAgIG9uQWRkIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5vbkFkZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5yZXNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdyZXNpemUnLCB0aGlzLmhvb2tzLnJlc2l6ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBtYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IE1hdGgubWluKG1hcC5nZXRab29tKCksIG1hcC5nZXRNYXhab29tKCkgfHwgR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuaW1tZWRpYXRlUmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdmUnLCB0aGlzLmhvb2tzLm1vdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy56b29tc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnN0YXJ0Wm9vbSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3pvb21zdGFydCcsIHRoaXMuaG9va3Muem9vbXN0YXJ0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MuZHJhZ3N0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0UGFubmluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3ZlZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0UGFubmluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5ob29rcy5tb3ZlZW5kKTtcblxuICAgICAgICAgICAgICAgIC8vIEZvcmNlIGxlYWZsZXQgem9vbSBhbmltYXRpb25zIG9mZlxuICAgICAgICAgICAgICAgIG1hcC5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBNb2RpZnkgZGVmYXVsdCBMZWFmbGV0IGJlaGF2aW9yc1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5U2Nyb2xsV2hlZWxCZWhhdmlvcihtYXApO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5RG91YmxlQ2xpY2tab29tKG1hcCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzKG1hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25FdmVudHModGhpcy5vcHRpb25zLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgR0wgY2FudmFzIHRvIGxheWVyIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgdmlld1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplT25GaXJzdFZpc2libGUoKTtcblxuICAgICAgICAgICAgICAgIC8vIFN1YnNjcmliZSB0byB0YW5ncmFtIGV2ZW50c1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZTogdGhpcy5vblRhbmdyYW1WaWV3VXBkYXRlLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIFVzZSBsZWFmbGV0J3MgZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGFzIHRoZSBjYWxsYmFjayBtZWNoYW5pc21cbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmxvYWQodGhpcy5vcHRpb25zLnNjZW5lLFxuICAgICAgICAgICAgICAgICAgICB7IGNvbmZpZ19wYXRoOiB0aGlzLm9wdGlvbnMuc2NlbmVCYXNlUGF0aCwgYmxvY2tpbmc6IGZhbHNlIH0pLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnaW5pdCcpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uUmVtb3ZlIChtYXApIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUub25SZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3ZlJywgdGhpcy5ob29rcy5tb3ZlKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCd6b29tc3RhcnQnLCB0aGlzLmhvb2tzLnpvb21zdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLmhvb2tzLm1vdmVlbmQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ2NsaWNrJywgdGhpcy5ob29rcy5jbGljayk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMuaG9va3MudmlzaWJpbGl0eWNoYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVRpbGUgKGNvb3Jkcykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBjb29yZHMueCArICcvJyArIGNvb3Jkcy55ICsgJy8nICsgY29vcmRzLno7XG4gICAgICAgICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGlsZS1rZXknLCBrZXkpO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS53aWR0aCA9ICcyNTZweCc7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9ICcyNTZweCc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dEZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVidWdfb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnRleHRDb250ZW50ID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5sZWZ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS50b3AgPSAwO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5mb250U2l6ZSA9ICcxNnB4JztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS50ZXh0T3V0bGluZSA9ICcxcHggIzAwMDAwMCc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUucGFkZGluZyA9ICc4cHgnO1xuXG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkZWJ1Z19vdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlclN0eWxlID0gJ3NvbGlkJztcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlckNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlcldpZHRoID0gJzFweCc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpdjtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIE1vZGlmeSBsZWFmbGV0J3MgZGVmYXVsdCBzY3JvbGwgd2hlZWwgYmVoYXZpb3IgdG8gcmVuZGVyIGZyYW1lcyBtb3JlIGZyZXF1ZW50bHlcbiAgICAgICAgICAgIC8vIChzaG91bGQgZ2VuZXJhbGx5IGxlYWQgdG8gc21vb3RoZXIgc2Nyb2xsIHdpdGggVGFuZ3JhbSBmcmFtZSByZS1yZW5kZXIpXG4gICAgICAgICAgICBtb2RpZnlTY3JvbGxXaGVlbEJlaGF2aW9yIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZS52aWV3LmNvbnRpbnVvdXNfem9vbSAmJiBtYXAuc2Nyb2xsV2hlZWxab29tICYmIHRoaXMub3B0aW9ucy5tb2RpZnlTY3JvbGxXaGVlbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLm9wdGlvbnMuem9vbVNuYXAgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5kaXNhYmxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hyb21lIGFuZCBTYWZhcmkgaGF2ZSBzbW9vdGhlciBzY3JvbGwtem9vbSB3aXRob3V0IGFjdGl2ZWx5IHRocm90dGxpbmcgdGhlIG1vdXNlIHdoZWVsLFxuICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBGRiBhbmQgRWRnZS9JRSBkbyBiZXR0ZXIgd2l0aCB0aHJvdHRsaW5nLlxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYXkgYmUgcmVsYXRlZCB0byBzeW5jaW5nIGRpZmZlcmVuY2VzIHdpdGggcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGxvb3AsIGludmVzdGlnYXRlIGZ1cnRoZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEwuQnJvd3Nlci5jaHJvbWUgfHwgTC5Ccm93c2VyLnNhZmFyaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5fb25XaGVlbFNjcm9sbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gTC5Eb21FdmVudC5nZXRXaGVlbERlbHRhKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbHRhICs9IGRlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RNb3VzZVBvcyA9IHRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wZXJmb3JtWm9vbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQuc3RvcChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy53aGVlbERlYm91bmNlVGltZSA9IDIwOyAvLyBiZXR0ZXIgZGVmYXVsdCBmb3IgRkYgYW5kIEVkZ2UvSUVcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uX3BlcmZvcm1ab29tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gbWFwLmdldFpvb20oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9zdG9wKCk7IC8vIHN0b3AgcGFubmluZyBhbmQgZmx5IGFuaW1hdGlvbnMgaWYgYW55XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IHRoaXMuX2RlbHRhIC8gKHRoaXMuX21hcC5vcHRpb25zLndoZWVsUHhQZXJab29tTGV2ZWwgKiA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbHRhID0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh6b29tICsgZGVsdGEpID49IHRoaXMuX21hcC5nZXRNYXhab29tKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IHRoaXMuX21hcC5nZXRNYXhab29tKCkgLSB6b29tOyAvLyBkb24ndCBnbyBwYXN0IG1heCB6b29tXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVsdGEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldFpvb20oem9vbSArIGRlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldFpvb21Bcm91bmQodGhpcy5fbGFzdE1vdXNlUG9zLCB6b29tICsgZGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gTW9kaWZ5IGxlYWZsZXQncyBkZWZhdWx0IGRvdWJsZS1jbGljayB6b29tIGJlaGF2aW9yLCB0byBtYXRjaCB0eXBpY2FsIHZlY3RvciBiYXNlbWFwIHByb2R1Y3RzXG4gICAgICAgICAgICBtb2RpZnlEb3VibGVDbGlja1pvb20gKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLnZpZXcuY29udGludW91c196b29tICYmIG1hcC5kb3VibGVDbGlja1pvb20gJiYgdGhpcy5vcHRpb25zLm1vZGlmeURvdWJsZUNsaWNrWm9vbSAhPT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZmllZCB2ZXJzaW9uIG9mIExlYWZsZXQncyBzZXRab29tQXJvdW5kIHRoYXQgZG9lc24ndCB0cmlnZ2VyIGEgbW92ZUVuZCBldmVudFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXRab29tQXJvdW5kTm9Nb3ZlRW5kID0gZnVuY3Rpb24gKG1hcCwgbGF0bG5nLCB6b29tLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGUgPSBtYXAuZ2V0Wm9vbVNjYWxlKHpvb20pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdIYWxmID0gbWFwLmdldFNpemUoKS5kaXZpZGVCeSgyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQb2ludCA9IGxhdGxuZyBpbnN0YW5jZW9mIEwuUG9pbnQgPyBsYXRsbmcgOiBtYXAubGF0TG5nVG9Db250YWluZXJQb2ludChsYXRsbmcpLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyT2Zmc2V0ID0gY29udGFpbmVyUG9pbnQuc3VidHJhY3Qodmlld0hhbGYpLm11bHRpcGx5QnkoMSAtIDEgLyBzY2FsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2VudGVyID0gbWFwLmNvbnRhaW5lclBvaW50VG9MYXRMbmcodmlld0hhbGYuYWRkKGNlbnRlck9mZnNldCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLl9tb3ZlKG5ld0NlbnRlciwgem9vbSwgeyBmbHlUbzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGlmaWVkIHZlcnNpb24gb2YgTGVhZmxldCdzIGZseVRvLCBmb3Igc2hvcnQgYW5pbWF0aW9ucyB6b29taW5nIGFyb3VuZCBhIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZseUFyb3VuZCA9IGZ1bmN0aW9uIChtYXAsIHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSB8fCAhTC5Ccm93c2VyLmFueTNkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcC5zZXRWaWV3KHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fc3RvcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRab29tID0gbWFwLl96b29tO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIgPSBMLmxhdExuZyh0YXJnZXRDZW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Wm9vbSA9IHRhcmdldFpvb20gPT09IHVuZGVmaW5lZCA/IHN0YXJ0Wm9vbSA6IHRhcmdldFpvb207XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRab29tID0gTWF0aC5taW4odGFyZ2V0Wm9vbSwgbWFwLmdldE1heFpvb20oKSk7IC8vIGRvbid0IGdvIHBhc3QgbWF4IHpvb21cblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyb20gPSBtYXAucHJvamVjdChtYXAuZ2V0Q2VudGVyKCksIHN0YXJ0Wm9vbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSBtYXAucHJvamVjdCh0YXJnZXRDZW50ZXIsIHN0YXJ0Wm9vbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uID8gMTAwMCAqIG9wdGlvbnMuZHVyYXRpb24gOiA3NTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnJhbWUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIGR1cmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXVzZSBpbnRlcm5hbCBmbHlUbyBmcmFtZSB0byBlbnN1cmUgdGhlc2UgYW5pbWF0aW9ucyBhcmUgY2FuY2VsZWQgbGlrZSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9mbHlUb0ZyYW1lID0gTC5VdGlsLnJlcXVlc3RBbmltRnJhbWUoZnJhbWUsIG1hcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbnRlciA9IGZyb20uYWRkKHRvLnN1YnRyYWN0KGZyb20pLm11bHRpcGx5QnkodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBbY2VudGVyLngsIGNlbnRlci55XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gR2VvLm1ldGVyc1RvTGF0TG5nKGNlbnRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFpvb21Bcm91bmROb01vdmVFbmQobWFwLCB0YXJnZXRDZW50ZXIsIHN0YXJ0Wm9vbSArICh0YXJnZXRab29tIC0gc3RhcnRab29tKSAqIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFpvb21Bcm91bmROb01vdmVFbmQobWFwLCB0YXJnZXRDZW50ZXIsIHRhcmdldFpvb20pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX21vdmVFbmQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuX21vdmVTdGFydCh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuY2FsbChtYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZnkgdGhlIGRvdWJsZS1jbGljayB6b29tIGhhbmRsZXIgdG8gZG8gYSBzaG9ydCB6b29tIGFuaW1hdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmFibGVkID0gbWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20uZGlzYWJsZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20uX29uRG91YmxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRab29tID0gbWFwLmdldFpvb20oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IG1hcC5vcHRpb25zLnpvb21EZWx0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gZS5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5ID8gb2xkWm9vbSAtIGRlbHRhIDogb2xkWm9vbSArIGRlbHRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLm9wdGlvbnMuZG91YmxlQ2xpY2tab29tID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseUFyb3VuZChtYXAsIG1hcC5nZXRDZW50ZXIoKSwgem9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseUFyb3VuZChtYXAsIG1hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKGUuY29udGFpbmVyUG9pbnQpLCB6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHVwZGF0ZVZpZXcgKCkge1xuICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IE1hdGgubWluKHRoaXMuX21hcC5nZXRab29tKCksIHRoaXMuX21hcC5nZXRNYXhab29tKCkgfHwgR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVTaXplICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXNpemVNYXAoc2l6ZS54LCBzaXplLnkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcmVzaXplT25GaXJzdFZpc2libGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdF92aXNpYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnZpc2liaWxpdHljaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdF92aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF92aXNpYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5ob29rcy52aXNpYmlsaXR5Y2hhbmdlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uVGFuZ3JhbVZpZXdVcGRhdGUgKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFwIHx8IHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZpZXcgY2hhbmdlZD9cbiAgICAgICAgICAgICAgICBsZXQgbWFwX2NlbnRlciA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICBsZXQgdmlld19jZW50ZXIgPSB0aGlzLnNjZW5lLnZpZXcuY2VudGVyO1xuICAgICAgICAgICAgICAgIGlmIChtYXBfY2VudGVyLmxuZyA9PT0gdmlld19jZW50ZXIubG5nICYmXG4gICAgICAgICAgICAgICAgICAgIG1hcF9jZW50ZXIubGF0ID09PSB2aWV3X2NlbnRlci5sYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmdldFpvb20oKSA9PT0gdGhpcy5zY2VuZS52aWV3Lnpvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXRWaWV3KFt0aGlzLnNjZW5lLnZpZXcuY2VudGVyLmxhdCwgdGhpcy5zY2VuZS52aWV3LmNlbnRlci5sbmddLCB0aGlzLnNjZW5lLnZpZXcuem9vbSwgeyBhbmltYXRlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZW5kZXIgKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudXBkYXRlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBDU1MgcG9zaXRpb25pbmcgTGVhZmxldCBhcHBsaWVzIHRvIHRoZSBsYXllciwgc2luY2UgVGFuZ3JhbSdzIFdlYkdMIGNhbnZhc1xuICAgICAgICAgICAgLy8gaXMgZXhwZWN0ZWQgdG8gYmUgJ2Fic29sdXRlbHknIHBvc2l0aW9uZWQuXG4gICAgICAgICAgICByZXZlcnNlVHJhbnNmb3JtICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21hcCB8fCAhdGhpcy5zY2VuZSB8fCAhdGhpcy5zY2VuZS5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciB0b3BfbGVmdCA9IHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChbMCwgMF0pO1xuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5zZXRQb3NpdGlvbih0aGlzLnNjZW5lLmNvbnRhaW5lciwgdG9wX2xlZnQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gVGllIExlYWZsZXQgZXZlbnQgaGFuZGxlcnMgdG8gVGFuZ3JhbSBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzIChtYXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzID0ge307XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLmNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5jbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRGZWF0dXJlQXQoZXZlbnQuY29udGFpbmVyUG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24sIHsgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuY2xpY2socmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignY2xpY2snLCB0aGlzLmhvb2tzLmNsaWNrKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW91c2Vtb3ZlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRGZWF0dXJlQXQoZXZlbnQuY29udGFpbmVyUG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24sIHsgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIocmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3VzZW91dCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1vdXNlIGxlYXZlcyBtYXAsIHNlbmQgYW4gYWRkaXRpb25hbCBzZWxlY3Rpb24gZXZlbnQgdG8gaW5kaWNhdGUgbm8gZmVhdHVyZSBpcyBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIoeyBjaGFuZ2VkOiB0cnVlLCBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW91dCcsIHRoaXMuaG9va3MubW91c2VvdXQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gU2V0IHVzZXItZGVmaW5lZCBoYW5kbGVycyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24gZXZlbnRzXG4gICAgICAgICAgICAvLyBDdXJyZW50bHkgb25seSBvbmUgaGFuZGxlciBjYW4gYmUgZGVmaW5lZCBmb3IgZWFjaCBldmVudCB0eXBlXG4gICAgICAgICAgICAvLyBFdmVudCB0eXBlcyBhcmU6IGBjbGlja2AsIGBob3ZlcmAgKGxlYWZsZXQgYG1vdXNlbW92ZWApXG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25FdmVudHMgKGV2ZW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3NlbGVjdGlvbl9ldmVudHMsIGV2ZW50cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBsYXllciBjbGFzc1xuICAgICAgICBMZWFmbGV0TGF5ZXIgPSBsYXllckJhc2VDbGFzcy5leHRlbmQobGF5ZXJDbGFzc0NvbmZpZyk7XG5cbiAgICAgICAgLy8gUG9seWZpbGwgc29tZSAxLjAgbWV0aG9kc1xuICAgICAgICBpZiAodHlwZW9mIExlYWZsZXRMYXllci5yZW1vdmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIExlYWZsZXRMYXllci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncmVtb3ZlJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgTGVhZmxldExheWVyLmxheWVyQmFzZUNsYXNzID0gbGF5ZXJCYXNlQ2xhc3M7XG4gICAgICAgIExlYWZsZXRMYXllci5sZWFmbGV0VmVyc2lvbiA9IGxlYWZsZXRWZXJzaW9uO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGVhZmxldExheWVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuL3ZlY3Rvcic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5jb25zdCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9hbWJpZW50TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvZGlyZWN0aW9uYWxMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9wb2ludExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3Nwb3RMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvc3BvdExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuXG4vLyBBYnN0cmFjdCBsaWdodFxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcblxuICAgICAgICBpZiAoY29uZmlnLmFtYmllbnQgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLmFtYmllbnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLmFtYmllbnQgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5hbWJpZW50KS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZGlmZnVzZSA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuZGlmZnVzZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuZGlmZnVzZSAhPSBudWxsID8gY29uZmlnLmRpZmZ1c2UgOiAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLmRpZmZ1c2UpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5zcGVjdWxhciA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuc3BlY3VsYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5zcGVjdWxhciB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5zcGVjdWxhcikuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBsaWdodCBieSB0eXBlIG5hbWUsIGZhY3Rvcnktc3R5bGVcbiAgICAvLyAnY29uZmlnJyBtdXN0IGluY2x1ZGUgJ25hbWUnIGFuZCAndHlwZScsIGFsb25nIHdpdGggYW55IG90aGVyIHR5cGUtc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHN0YXRpYyBjcmVhdGUgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBpZiAoTGlnaHQudHlwZXNbY29uZmlnLnR5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpZ2h0LnR5cGVzW2NvbmZpZy50eXBlXSh2aWV3LCBjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGxpZ2h0IGZvciBhIHN0eWxlOiBmcmFnbWVudCBsaWdodGluZywgdmVydGV4IGxpZ2h0aW5nLCBvciBub25lXG4gICAgc3RhdGljIHNldE1vZGUgKG1vZGUsIHN0eWxlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtb2RlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfVxuICAgICAgICBtb2RlID0gTGlnaHQuZW5hYmxlZCAmJiAoKG1vZGUgIT0gbnVsbCkgPyBtb2RlIDogJ2ZyYWdtZW50Jyk7IC8vIGRlZmF1bHQgdG8gZnJhZ21lbnQgbGlnaHRpbmdcbiAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9MSUdIVElOR19GUkFHTUVOVCddID0gKG1vZGUgPT09ICdmcmFnbWVudCcpO1xuICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX0xJR0hUSU5HX1ZFUlRFWCddID0gKG1vZGUgPT09ICd2ZXJ0ZXgnKTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3QgYWxsIHByb3ZpZGVkIGxpZ2h0IGRlZmluaXRpb25zLCBhbmQgY2FsY3VsYXRlIGN1bXVsYXRpdmUgbGlnaHQgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0IChsaWdodHMpIHtcbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgaW5qZWN0aW9uc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKExpZ2h0LmJsb2NrKTtcblxuICAgICAgICAvLyBJZiBsaWdodGluZyBpcyBnbG9iYWxseSBkaXNhYmxlZCwgbm90aGluZyBpcyBpbmplY3RlZCAobW9zdGx5IGZvciBkZWJ1Z2dpbmcgb3IgbGl2ZSBlZGl0aW5nKVxuICAgICAgICBpZiAoIUxpZ2h0LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cnVjdCBjb2RlIHRvIGNhbGN1bGF0ZSBlYWNoIGxpZ2h0IGluc3RhbmNlXG4gICAgICAgIGxldCBjYWxjdWxhdGVMaWdodHMgPSBcIlwiO1xuICAgICAgICBpZiAobGlnaHRzICYmIE9iamVjdC5rZXlzKGxpZ2h0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCB1bmlxdWVzIHR5cGVzIG9mIGxpZ2h0c1xuICAgICAgICAgICAgbGV0IHR5cGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBsaWdodF9uYW1lIGluIGxpZ2h0cykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2xpZ2h0c1tsaWdodF9uYW1lXS50eXBlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBlYWNoIHR5cGUgb2YgbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gdHlwZXMpIHtcbiAgICAgICAgICAgICAgICBMaWdodC50eXBlc1t0eXBlXS5pbmplY3QoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IHBlci1pbnN0YW5jZSBibG9ja3MgYW5kIGNvbnN0cnVjdCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIGVhY2ggbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IGxpZ2h0X25hbWUgaW4gbGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmaW5lIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgbGlnaHRzW2xpZ2h0X25hbWVdLmluamVjdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB0byB0aGUgbGlzdFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUxpZ2h0cyArPSBgY2FsY3VsYXRlTGlnaHQoJHtsaWdodF9uYW1lfSwgX2V5ZVRvUG9pbnQsIF9ub3JtYWwpO1xcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHbHVlIHRvZ2V0aGVyIHRoZSBmaW5hbCBsaWdodGluZyBmdW5jdGlvbiB0aGF0IHN1bXMgYWxsIHRoZSBsaWdodHNcbiAgICAgICAgbGV0IGNhbGN1bGF0ZUZ1bmN0aW9uID0gYFxuICAgICAgICAgICAgdmVjNCBjYWxjdWxhdGVMaWdodGluZyhpbiB2ZWMzIF9leWVUb1BvaW50LCBpbiB2ZWMzIF9ub3JtYWwsIGluIHZlYzQgX2NvbG9yKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBpbml0aWFsIG1hdGVyaWFsIGNhbGN1bGF0aW9ucyBvdmVyIG5vcm1hbCwgZW1pc3Npb24sIGFtYmllbnQsIGRpZmZ1c2UgYW5kIHNwZWN1bGFyIHZhbHVlc1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1hdGVyaWFsKF9leWVUb1BvaW50LF9ub3JtYWwpO1xuXG4gICAgICAgICAgICAgICAgLy8gVW4gcm9sbCB0aGUgbG9vcCBvZiBpbmRpdmlkdWFsIGxpZ3RocyB0byBjYWxjdWxhdGVcbiAgICAgICAgICAgICAgICAke2NhbGN1bGF0ZUxpZ2h0c31cblxuICAgICAgICAgICAgICAgIC8vICBGaW5hbCBsaWdodCBpbnRlbnNpdHkgY2FsY3VsYXRpb25cbiAgICAgICAgICAgICAgICB2ZWM0IGNvbG9yID0gdmVjNCh2ZWMzKDAuKSwgX2NvbG9yLmEpOyAvLyBzdGFydCB3aXRoIHZlcnRleCBjb2xvciBhbHBoYVxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRU1JU1NJT05cbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiID0gbWF0ZXJpYWwuZW1pc3Npb24ucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmVtaXNzaW9uLmE7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9BTUJJRU5UXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50LnJnYiAqIF9jb2xvci5yZ2IgKiBtYXRlcmlhbC5hbWJpZW50LnJnYjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSAqPSBtYXRlcmlhbC5hbWJpZW50LmE7XG4gICAgICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2FtYmllbnQucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmRpZmZ1c2UucmdiO1xuICAgICAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2RpZmZ1c2UucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmRpZmZ1c2UucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmRpZmZ1c2UuYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX1NQRUNVTEFSXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9zcGVjdWxhci5yZ2IgKiBtYXRlcmlhbC5zcGVjdWxhci5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuc3BlY3VsYXIuYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgIC8vIENsYW1wIGZpbmFsIGNvbG9yXG4gICAgICAgICAgICAgICAgY29sb3IgPSBjbGFtcChjb2xvciwgMC4wLCAxLjApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yO1xuICAgICAgICAgICAgfWA7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgY2FsY3VsYXRlRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIENvbW1vbiBpbnN0YW5jZSBkZWZpbml0aW9uXG4gICAgaW5qZWN0ICgpIHtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gIGBcbiAgICAgICAgICAgIHVuaWZvcm0gJHt0aGlzLnN0cnVjdF9uYW1lfSB1XyR7dGhpcy5uYW1lfTtcbiAgICAgICAgICAgICR7dGhpcy5zdHJ1Y3RfbmFtZX0gJHt0aGlzLm5hbWV9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgbGV0IGFzc2lnbiA9IGBcbiAgICAgICAgICAgICR7dGhpcy5uYW1lfSA9IHVfJHt0aGlzLm5hbWV9O1xcblxuICAgICAgICBgO1xuXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIGluc3RhbmNlKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnc2V0dXAnLCBhc3NpZ24pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb25jZSBwZXIgZnJhbWUgcGVyIHByb2dyYW0gKGUuZy4gZm9yIG1haW4gcmVuZGVyIHBhc3MsIHRoZW4gZm9yIGVhY2ggYWRkaXRpb25hbFxuICAgIC8vIHBhc3MgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBldGMuKVxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgLy8gIFRocmVlIGNvbW1vbiBsaWdodCBwcm9wZXJ0aWVzXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5hbWJpZW50YCwgdGhpcy5hbWJpZW50KTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpZmZ1c2VgLCB0aGlzLmRpZmZ1c2UpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uc3BlY3VsYXJgLCB0aGlzLnNwZWN1bGFyKTtcbiAgICB9XG5cbn1cblxuTGlnaHQudHlwZXMgPSB7fTsgLy8gcmVmZXJlbmNlcyB0byBzdWJjbGFzc2VzIGJ5IHNob3J0IG5hbWVcbkxpZ2h0LmJsb2NrID0gJ2xpZ2h0aW5nJzsgLy8gc2hhZGVyIGJsb2NrIG5hbWVcbkxpZ2h0LmVuYWJsZWQgPSB0cnVlOyAvLyBsaWdodGluZyBjYW4gYmUgZ2xvYmFsbHkgZW5hYmxlZC9kaXNhYmxlZFxuXG5cbi8vIExpZ2h0IHN1YmNsYXNzZXNcbmNsYXNzIEFtYmllbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnYW1iaWVudCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnQW1iaWVudExpZ2h0JztcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0KCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5hbWJpZW50YCwgdGhpcy5hbWJpZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydhbWJpZW50J10gPSBBbWJpZW50TGlnaHQ7XG5cbmNsYXNzIERpcmVjdGlvbmFsTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2RpcmVjdGlvbmFsJztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuICAgICAgICBpZiAoY29uZmlnLmRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gY29uZmlnLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgZGlyZWN0aW9uYWwgbGlnaHQgbWFpbnRhaW5zIGZ1bGwgaW50ZW5zaXR5IG9uIGdyb3VuZCwgd2l0aCBiYXNpYyBleHRydXNpb24gc2hhZGluZ1xuICAgICAgICAgICAgbGV0IHRoZXRhID0gMTM1OyAvLyBhbmdsZSBvZiBsaWdodCBpbiB4eSBwbGFuZSAocm90YXRlZCBhcm91bmQgeiBheGlzKVxuICAgICAgICAgICAgbGV0IHNjYWxlID0gTWF0aC5zaW4oTWF0aC5QSSo2MC8xODApOyAvLyBzY2FsaW5nIGZhY3RvciB0byBrZWVwIHRvdGFsIGRpcmVjdGlvbmFsIGludGVuc2l0eSB0byAwLjVcbiAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFtcbiAgICAgICAgICAgICAgICBNYXRoLmNvcyhNYXRoLlBJKnRoZXRhLzE4MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICBNYXRoLnNpbihNYXRoLlBJKnRoZXRhLzE4MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAtMC41XG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnLmFtYmllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IEdMU0wuZXhwYW5kVmVjMygwLjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5fZGlyZWN0aW9uLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG5cbiAgICBnZXQgZGlyZWN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgZGlyZWN0aW9uICh2KSB7XG4gICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFZlY3Rvci5ub3JtYWxpemUodik7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX2RpcmVjdGlvbmFsTGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpcmVjdGlvbmAsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydkaXJlY3Rpb25hbCddID0gRGlyZWN0aW9uYWxMaWdodDtcblxuXG5jbGFzcyBQb2ludExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncG9pbnQnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ1BvaW50TGlnaHQnO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBjb25maWcucG9zaXRpb24gfHwgWzAsIDAsICcxMDBweCddO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZSA9IFtdOyAvLyBwb3NpdGlvbiBpbiBleWVzcGFjZVxuICAgICAgICB0aGlzLm9yaWdpbiA9IGNvbmZpZy5vcmlnaW4gfHwgJ2dyb3VuZCc7XG4gICAgICAgIHRoaXMuYXR0ZW51YXRpb24gPSAhaXNOYU4ocGFyc2VGbG9hdChjb25maWcuYXR0ZW51YXRpb24pKSA/IHBhcnNlRmxvYXQoY29uZmlnLmF0dGVudWF0aW9uKSA6IDA7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5yYWRpdXMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5yYWRpdXMpICYmIGNvbmZpZy5yYWRpdXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBjb25maWcucmFkaXVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBbbnVsbCwgY29uZmlnLnJhZGl1c107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3BvaW50TGlnaHQpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBpc250YW5jZS1zcGVjaWZpYyBzZXR0aW5nc1xuICAgIGluamVjdCgpIHtcbiAgICAgICAgc3VwZXIuaW5qZWN0KCk7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fRVhQT05FTlQnXSA9ICh0aGlzLmF0dGVudWF0aW9uICE9PSAwKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fSU5ORVJfUkFESVVTJ10gPSAodGhpcy5yYWRpdXMgIT0gbnVsbCAmJiB0aGlzLnJhZGl1c1swXSAhPSBudWxsKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fT1VURVJfUkFESVVTJ10gPSAodGhpcy5yYWRpdXMgIT0gbnVsbCk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVFeWVQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHVwZGF0ZUV5ZVBvc2l0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMub3JpZ2luID09PSAnd29ybGQnKSB7XG4gICAgICAgICAgICAvLyBGb3Igd29ybGQgb3JpZ2luLCBmb3JtYXQgaXM6IFtsb25naXR1ZGUsIGxhdGl0dWRlLCBtZXRlcnMgKGRlZmF1bHQpIG9yIHBpeGVscyB3L3B4IHVuaXRzXVxuXG4gICAgICAgICAgICAvLyBNb3ZlIGxpZ2h0J3Mgd29ybGQgcG9zaXRpb24gaW50byBjYW1lcmEgc3BhY2VcbiAgICAgICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnModGhpcy5wb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVswXSA9IHggLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1swXTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzFdID0geSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzFdO1xuXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnBvc2l0aW9uWzJdLFxuICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSk7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IHRoaXMucG9zaXRpb25fZXllWzJdIC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5vcmlnaW4gPT09ICdncm91bmQnIHx8IHRoaXMub3JpZ2luID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgLy8gRm9yIGNhbWVyYSBvciBncm91bmQgb3JpZ2luLCBmb3JtYXQgaXM6IFt4LCB5LCB6XSBpbiBtZXRlcnMgKGRlZmF1bHQpIG9yIHBpeGVscyB3L3B4IHVuaXRzXG5cbiAgICAgICAgICAgIC8vIExpZ2h0IGlzIGluIGNhbWVyYSBzcGFjZSBieSBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZSA9IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9yaWdpbiA9PT0gJ2dyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBMZWF2ZSBsaWdodCdzIHh5IGluIGNhbWVyYSBzcGFjZSwgYnV0IHogbmVlZHMgdG8gYmUgbW92ZWQgcmVsYXRpdmUgdG8gZ3JvdW5kIHBsYW5lXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMl0gPSB0aGlzLnBvc2l0aW9uX2V5ZVsyXSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zaXRpb25fZXllWzNdID0gMTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIHN1cGVyLnNldHVwUHJvZ3JhbShfcHJvZ3JhbSk7XG5cbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfJHt0aGlzLm5hbWV9LnBvc2l0aW9uYCwgdGhpcy5wb3NpdGlvbl9leWUpO1xuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0VYUE9ORU5UJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LmF0dGVudWF0aW9uRXhwb25lbnRgLCB0aGlzLmF0dGVudWF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0lOTkVSX1JBRElVUyddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5pbm5lclJhZGl1c2AsXG4gICAgICAgICAgICAgICAgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucmFkaXVzWzBdLFxuICAgICAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX09VVEVSX1JBRElVUyddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5vdXRlclJhZGl1c2AsXG4gICAgICAgICAgICAgICAgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucmFkaXVzWzFdLFxuICAgICAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkxpZ2h0LnR5cGVzWydwb2ludCddID0gUG9pbnRMaWdodDtcblxuXG5jbGFzcyBTcG90TGlnaHQgZXh0ZW5kcyBQb2ludExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3Nwb3RsaWdodCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnU3BvdExpZ2h0JztcblxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMuX2RpcmVjdGlvbiA9IChjb25maWcuZGlyZWN0aW9uIHx8IFswLCAwLCAtMV0pLm1hcChwYXJzZUZsb2F0KTsgLy8gW3gsIHksIHpdXG4gICAgICAgIHRoaXMuZXhwb25lbnQgPSBjb25maWcuZXhwb25lbnQgPyBwYXJzZUZsb2F0KGNvbmZpZy5leHBvbmVudCkgOiAwLjI7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBjb25maWcuYW5nbGUgPyBwYXJzZUZsb2F0KGNvbmZpZy5hbmdsZSkgOiAyMDtcbiAgICB9XG5cbiAgICBnZXQgZGlyZWN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgZGlyZWN0aW9uICh2KSB7XG4gICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFZlY3Rvci5ub3JtYWxpemUodik7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19zcG90TGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcblxuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlyZWN0aW9uYCwgdGhpcy5kaXJlY3Rpb24pO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5zcG90Q29zQ3V0b2ZmYCwgTWF0aC5jb3ModGhpcy5hbmdsZSAqIDMuMTQxNTkgLyAxODApKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uc3BvdEV4cG9uZW50YCwgdGhpcy5leHBvbmVudCk7XG4gICAgfVxuXG59XG5MaWdodC50eXBlc1snc3BvdGxpZ2h0J10gPSBTcG90TGlnaHQ7XG4iLCJpbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19tYXRlcmlhbCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvbWF0ZXJpYWwuZ2xzbCcsICd1dGY4Jyk7XG5cbmNvbnN0IG1hdGVyaWFsX3Byb3BzID0gWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0ZXJpYWwge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcblxuICAgICAgICBjb25maWcgPSBjb25maWcgfHwge307XG5cbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhbGwgaGF2ZSB0aGUgc2FtZSBkZWZhdWx0cywgc28gdGhleSBjYW4gYmUgc2V0IGluIGJ1bGtcbiAgICAgICAgbWF0ZXJpYWxfcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZTogdmFsdWUudGV4dHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmc6IHZhbHVlLm1hcHBpbmcgfHwgJ3NwaGVyZW1hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogR0xTTC5leHBhbmRWZWMzKHZhbHVlLnNjYWxlICE9IG51bGwgPyB2YWx1ZS5zY2FsZSA6IDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiBHTFNMLmV4cGFuZFZlYzQodmFsdWUuYW1vdW50ICE9IG51bGwgPyB2YWx1ZS5hbW91bnQgOiAxKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7IGFtb3VudDogR0xTTC5leHBhbmRWZWM0KHZhbHVlKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7IGFtb3VudDogU3R5bGVQYXJzZXIucGFyc2VDb2xvcih2YWx1ZSkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dHJhIHNwZWN1bGFyIHByb3BzXG4gICAgICAgIGlmICh0aGlzLnNwZWN1bGFyKSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyLnNoaW5pbmVzcyA9IGNvbmZpZy5zaGluaW5lc3MgPyBwYXJzZUZsb2F0KGNvbmZpZy5zaGluaW5lc3MpIDogMC4yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgaWYgKGNvbmZpZy5ub3JtYWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5ub3JtYWwgPSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZTogY29uZmlnLm5vcm1hbC50ZXh0dXJlLFxuICAgICAgICAgICAgICAgIG1hcHBpbmc6IGNvbmZpZy5ub3JtYWwubWFwcGluZyB8fCAndHJpcGxhbmFyJyxcbiAgICAgICAgICAgICAgICBzY2FsZTogR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5ub3JtYWwuc2NhbGUgIT0gbnVsbCA/IGNvbmZpZy5ub3JtYWwuc2NhbGUgOiAxKSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IGNvbmZpZy5ub3JtYWwuYW1vdW50ICE9IG51bGwgPyBjb25maWcubm9ybWFsLmFtb3VudCA6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgYSBtYXRlcmlhbCBjb25maWcgYmxvY2sgaGFzIHN1ZmZpY2llbnQgcHJvcGVydGllcyB0byBjcmVhdGUgYSBtYXRlcmlhbFxuICAgIHN0YXRpYyBpc1ZhbGlkIChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLmVtaXNzaW9uID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5hbWJpZW50ID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5kaWZmdXNlID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5zcGVjdWxhciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpbmplY3QgKHN0eWxlKSB7XG4gICAgICAgIC8vIEZvciBlYWNoIHByb3BlcnR5LCBzZXRzIGRlZmluZXMgdG8gY29uZmlndXJlIHRleHR1cmUgbWFwcGluZywgd2l0aCBhIHBhdHRlcm4gbGlrZTpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0UsIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRV9URVhUVVJFLCBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VfVEVYVFVSRV9TUEhFUkVNQVBcbiAgICAgICAgLy8gQWxzbyBzZXRzIGZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgZWFjaCB1bmlxdWUgbWFwcGluZyB0eXBlIGJlaW5nIHVzZWQsIGUuZy46XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICAvLyBFbmFibGVzIHRleHR1cmUgY29vcmRpbmF0ZXMgaWYgbmVlZGVkIGFuZCBub3QgYWxyZWFkeSBvblxuICAgICAgICBtYXRlcmlhbF9wcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgbGV0IGRlZiA9IGBUQU5HUkFNX01BVEVSSUFMXyR7cHJvcC50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICAgICAgICBsZXQgdGV4ZGVmID0gZGVmICsgJ19URVhUVVJFJztcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbZGVmXSA9ICh0aGlzW3Byb3BdICE9IG51bGwpO1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0gJiYgdGhpc1twcm9wXS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1t0ZXhkZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW3RleGRlZiArICdfJyArIHRoaXNbcHJvcF0ubWFwcGluZy50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpc1twcm9wXS5tYXBwaW5nLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpc1twcm9wXS5tYXBwaW5nID09PSAndXYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgLy8gQXMgYW5vdmUsIHNldHMgZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHVuaXF1ZSBtYXBwaW5nIHR5cGUgYmVpbmcgdXNlZCwgZS5nLjpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIGlmICh0aGlzLm5vcm1hbCAmJiB0aGlzLm5vcm1hbC50ZXh0dXJlKSB7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX01BVEVSSUFMX05PUk1BTF9URVhUVVJFJ10gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9NQVRFUklBTF9OT1JNQUxfVEVYVFVSRV8nICsgdGhpcy5ub3JtYWwubWFwcGluZy50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzW2BUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfJHt0aGlzLm5vcm1hbC5tYXBwaW5nLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3R5bGUudGV4Y29vcmRzIHx8ICh0aGlzLm5vcm1hbC5tYXBwaW5nID09PSAndXYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnJlcGxhY2VTaGFkZXJCbG9jayhNYXRlcmlhbC5ibG9jaywgc2hhZGVyU3JjX21hdGVyaWFsLCAnTWF0ZXJpYWwnKTtcbiAgICAgICAgc3R5bGUuYWRkU2hhZGVyQmxvY2soJ3NldHVwJywgJ1xcbm1hdGVyaWFsID0gdV9tYXRlcmlhbDtcXG4nLCAnTWF0ZXJpYWwnKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIC8vIEZvciBlYWNoIHByb3BlcnR5LCBzZXRzIHVuaWZvcm1zIGluIHRoZSBwYXR0ZXJuOlxuICAgICAgICAvLyB1X21hdGVyaWFsLmRpZmZ1c2UsIHVfbWF0ZXJpYWwuZGlmZnVzZVNjYWxlIHVfbWF0ZXJpYWxfZGlmZnVzZV90ZXh0dXJlXG4gICAgICAgIG1hdGVyaWFsX3Byb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpc1twcm9wXSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0uc2V0VGV4dHVyZVVuaWZvcm0oYHVfbWF0ZXJpYWxfJHtwcm9wfV90ZXh0dXJlYCwgdGhpc1twcm9wXS50ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfVNjYWxlYCwgdGhpc1twcm9wXS5zY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1gLCB0aGlzW3Byb3BdLmFtb3VudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzW3Byb3BdLmFtb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9YCwgdGhpc1twcm9wXS5hbW91bnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwuc2hpbmluZXNzJywgdGhpcy5zcGVjdWxhci5zaGluaW5lc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsICYmIHRoaXMubm9ybWFsLnRleHR1cmUpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnNldFRleHR1cmVVbmlmb3JtKCd1X21hdGVyaWFsX25vcm1hbF90ZXh0dXJlJywgdGhpcy5ub3JtYWwudGV4dHVyZSk7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXRlcmlhbC5ub3JtYWxTY2FsZScsIHRoaXMubm9ybWFsLnNjYWxlKTtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwubm9ybWFsQW1vdW50JywgdGhpcy5ub3JtYWwuYW1vdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuTWF0ZXJpYWwuYmxvY2sgPSAnbWF0ZXJpYWwnO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuaW1wb3J0ICcuL3V0aWxzL3BvbHlmaWxscyc7XG5cbi8vIFRoZSBsZWFmbGV0IGxheWVyIHBsdWdpbiBpcyBjdXJyZW50bHkgdGhlIHByaW1hcnkgcHVibGljIEFQSVxuaW1wb3J0IHtsZWFmbGV0TGF5ZXJ9IGZyb20gJy4vbGVhZmxldF9sYXllcic7XG5cbi8vIFRoZSBzY2VuZSB3b3JrZXIgaXMgb25seSBhY3RpdmF0ZWQgd2hlbiBhIHdvcmtlciB0aHJlYWQgaXMgaW5zdGFudGlhdGVkLCBidXQgbXVzdCBhbHdheXMgYmUgbG9hZGVkXG5pbXBvcnQgU2NlbmUgZnJvbSAnLi9zY2VuZSc7XG5pbXBvcnQge1NjZW5lV29ya2VyfSBmcm9tICcuL3NjZW5lX3dvcmtlcic7XG5cbi8vIEFkZGl0aW9uYWwgbW9kdWxlcyBhcmUgZXhwb3NlZCBmb3IgZGVidWdnaW5nXG5pbXBvcnQgdmVyc2lvbiBmcm9tICcuL3V0aWxzL3ZlcnNpb24nO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuL3ZlY3Rvcic7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0ICcuL3NvdXJjZXMvZ2VvanNvbic7XG5pbXBvcnQgJy4vc291cmNlcy90b3BvanNvbic7XG5pbXBvcnQgJy4vc291cmNlcy9tdnQnO1xuaW1wb3J0ICcuL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhEYXRhIGZyb20gJy4vZ2wvdmVydGV4X2RhdGEnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCB7bGF5ZXJfY2FjaGV9IGZyb20gJy4vc3R5bGVzL2xheWVyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgQ2FudmFzVGV4dCBmcm9tICcuL3N0eWxlcy90ZXh0L2NhbnZhc190ZXh0JztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4vdXRpbHMvZGVidWdfc2V0dGluZ3MnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBKU1ppcCBmcm9tICdqc3ppcCc7XG5cbi8vIE1ha2Ugc29tZSBtb2R1bGVzIGFjY2Vzc2libGUgZm9yIGRlYnVnZ2luZ1xudmFyIGRlYnVnID0ge1xuICAgIGxvZyxcbiAgICB5YW1sLFxuICAgIFRocmVhZCxcbiAgICBVdGlscyxcbiAgICBHZW8sXG4gICAgVmVjdG9yLFxuICAgIERhdGFTb3VyY2UsXG4gICAgR0xTTCxcbiAgICBTaGFkZXJQcm9ncmFtLFxuICAgIFZlcnRleERhdGEsXG4gICAgVGV4dHVyZSxcbiAgICBNYXRlcmlhbCxcbiAgICBMaWdodCxcbiAgICBTY2VuZSxcbiAgICBTY2VuZVdvcmtlcixcbiAgICBXb3JrZXJCcm9rZXIsXG4gICAgbGF5ZXJfY2FjaGUsXG4gICAgU3R5bGVNYW5hZ2VyLFxuICAgIFN0eWxlUGFyc2VyLFxuICAgIENvbGxpc2lvbixcbiAgICBGZWF0dXJlU2VsZWN0aW9uLFxuICAgIENhbnZhc1RleHQsXG4gICAgZGVidWdTZXR0aW5nc1xufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgVXRpbHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoKTtcblxuICAgIC8vIEF0dGFjaCBQcm9taXNlIHBvbHlmaWxsIHRvIHdpbmRvd1xuICAgIC8vIEFsbG93cyBGb250RmFjZU9ic2VydmVyIHRvIHVzZSBwb2x5ZmlsbCAod2l0aG91dCBuZWVkaW5nIHRvIGluY2x1ZGUgaXRzIG93biBkdXBsaWNhdGUgcG9seWZpbGwpXG4gICAgaWYgKHdpbmRvdy5Qcm9taXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2luZG93LlByb21pc2UgPSBQcm9taXNlO1xuICAgICAgICBKU1ppcC5leHRlcm5hbC5Qcm9taXNlID0gUHJvbWlzZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGxlYWZsZXRMYXllcixcbiAgICBkZWJ1ZyxcbiAgICB2ZXJzaW9uXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi9nbC9jb250ZXh0JztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL2dsL3Zhbyc7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuL3N0eWxlcy9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFNjZW5lTG9hZGVyIGZyb20gJy4vc2NlbmVfbG9hZGVyJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodCc7XG5pbXBvcnQgVGlsZU1hbmFnZXIgZnJvbSAnLi90aWxlX21hbmFnZXInO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBSZW5kZXJTdGF0ZU1hbmFnZXIgZnJvbSAnLi9nbC9yZW5kZXJfc3RhdGUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vc3R5bGVzL3RleHQvZm9udF9tYW5hZ2VyJztcbmltcG9ydCBNZWRpYUNhcHR1cmUgZnJvbSAnLi91dGlscy9tZWRpYV9jYXB0dXJlJztcblxuLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uOiBwYXNzIGFuIG9iamVjdCBkaXJlY3RseSwgb3IgYSBVUkwgYXMgc3RyaW5nIHRvIGxvYWQgcmVtb3RlbHlcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lIHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ19zb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTY2VuZS5pZCsrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDsgLy8gd2lsbCBiZSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNjZW5lIGlzIGxvYWRlZFxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgVmlldyh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBuZXcgVGlsZU1hbmFnZXIoeyBzY2VuZTogdGhpcywgdmlldzogdGhpcy52aWV3IH0pO1xuICAgICAgICB0aGlzLm51bV93b3JrZXJzID0gb3B0aW9ucy5udW1Xb3JrZXJzIHx8IDI7XG4gICAgICAgIHRoaXMud29ya2VyX3VybCA9IG9wdGlvbnMud29ya2VyVXJsO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXNhYmxlVmVydGV4QXJyYXlPYmplY3RzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgPSBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXkgOiB0cnVlO1xuICAgICAgICBVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19idW5kbGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyID0gbmV3IFN0eWxlTWFuYWdlcigpO1xuXG4gICAgICAgIHRoaXMuYnVpbGRpbmcgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrcyBjdXJyZW50IHNjZW5lIGJ1aWxkaW5nIHN0YXRlICh0aWxlcyBiZWluZyBidWlsdCwgZXRjLilcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBhIHJlZHJhd1xuICAgICAgICB0aGlzLmFuaW1hdGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHJlZHJhdyBldmVyeSBmcmFtZVxuICAgICAgICB0aGlzLnByZVVwZGF0ZSA9IG9wdGlvbnMucHJlVXBkYXRlOyAgICAgICAgICAgICAvLyBvcHRpb25hbCBwcmUtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICB0aGlzLnBvc3RVcGRhdGUgPSBvcHRpb25zLnBvc3RVcGRhdGU7ICAgICAgICAgICAvLyBvcHRpb25hbCBwb3N0LXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcCA9ICFvcHRpb25zLmRpc2FibGVSZW5kZXJMb29wOyAgLy8gZGlzYWJsZSByZW5kZXIgbG9vcCAtIGFwcCB3aWxsIGhhdmUgdG8gbWFudWFsbHkgY2FsbCBTY2VuZS5yZW5kZXIoKSBwZXIgZnJhbWVcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9zdG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5sYXN0X3JlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmFtZSA9IDA7XG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZSA9IG5ldyBNZWRpYUNhcHR1cmUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFRpbWUoKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuXG4gICAgICAgIHRoaXMubGlnaHRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gbnVsbDtcblxuICAgICAgICB0aGlzLmNyZWF0ZUxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnVwZGF0aW5nID0gMDtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gU2NlbmUuZ2VuZXJhdGlvbjsgLy8gYW4gaWQgdGhhdCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIHNjZW5lIGNvbmZpZyBpcyBpbnZhbGlkYXRlZFxuICAgICAgICB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbiA9IFNjZW5lLmdlbmVyYXRpb247IC8vIGxhc3QgZ2VuZXJhdGlvbiBpZCB3aXRoIGEgY29tcGxldGUgdmlld1xuICAgICAgICB0aGlzLnNldHVwRGVidWcoKTtcblxuICAgICAgICB0aGlzLmxvZ19sZXZlbCA9IG9wdGlvbnMubG9nTGV2ZWwgfHwgJ3dhcm4nO1xuICAgICAgICBsb2cuc2V0TGV2ZWwodGhpcy5sb2dfbGV2ZWwpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUgKGNvbmZpZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NlbmUoY29uZmlnLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjZW5lIChvciByZWxvYWQgZXhpc3Rpbmcgc2NlbmUgaWYgbm8gbmV3IHNvdXJjZSBzcGVjaWZpZWQpXG4gICAgLy8gT3B0aW9uczpcbiAgICAvLyAgIGBjb25maWdfcGF0aGA6IGJhc2UgVVJMIGFnYWluc3Qgd2hpY2ggcm9vIHNjZW5lIHJlc291cmNlcyBzaG91bGQgYmUgcmVzb2x2ZWQgKHVzZWZ1bCBmb3IgUGxheSkgKGRlZmF1bHQgbnVsbGwpXG4gICAgLy8gICBgYmxvY2tpbmdgOiBzaG91bGQgcmVuZGVyaW5nIGJsb2NrIG9uIHNjZW5lIGxvYWQgY29tcGxldGlvbiAoZGVmYXVsdCB0cnVlKVxuICAgIGxvYWQoY29uZmlnX3NvdXJjZSA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsdHkgZm9yIHBhc3NpbmcgYGNvbmZpZ19wYXRoYCBzdHJpbmcgYXMgc2Vjb25kIGFyZ3VtZW50XG4gICAgICAgIC8vIChzaW5jZSB0cmFuc2l0aW9uZWQgdG8gdXNpbmcgb3B0aW9ucyBhcmd1bWVudCB0byBhY2NlcHQgbW9yZSBwYXJhbWV0ZXJzKVxuICAgICAgICBvcHRpb25zID0gKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykgPyB7IGNvbmZpZ19wYXRoOiBvcHRpb25zIH0gOiBvcHRpb25zO1xuICAgICAgICBsZXQgY29uZmlnX3BhdGggPSBvcHRpb25zLmNvbmZpZ19wYXRoO1xuXG4gICAgICAgIC8vIFNob3VsZCByZW5kZXJpbmcgYmxvY2sgb24gbG9hZCAobm90IGRlc2lyYWJsZSBmb3IgaW5pdGlhbCBsb2FkLCBvZnRlbiBkZXNpcmVkIGZvciBsaXZlIHN0eWxlLXN3aXRjaGluZylcbiAgICAgICAgb3B0aW9ucy5ibG9ja2luZyA9IChvcHRpb25zLmJsb2NraW5nICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5ibG9ja2luZyA6IHRydWU7XG5cbiAgICAgICAgLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uIChzb3VyY2VzLCBzdHlsZXMsIGV0Yy4pLCB0aGVuIGNyZWF0ZSBzdHlsZXMgJiB3b3JrZXJzXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FudmFzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdGhpcy5sb2FkU2NlbmUoY29uZmlnX3NvdXJjZSwgY29uZmlnX3BhdGgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmNyZWF0ZVdvcmtlcnMoKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmVhdHVyZVNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2NlbmUgbG9hZGVkIGZyb20gYSBKUyBvYmplY3QsIG9yIG1vZGlmaWVkIGJ5IGEgYGxvYWRgIGV2ZW50LCBtYXkgY29udGFpbiBjb21waWxlZCBKUyBmdW5jdGlvbnNcbiAgICAgICAgICAgICAgICAvLyB3aGljaCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQsIHdoaWxlIG9uZSBsb2FkZWQgb25seSBmcm9tIGEgVVJMIGRvZXMgbm90LlxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZV9mdW5jcyA9ICgodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ29iamVjdCcpIHx8IHRoaXMuaGFzU3Vic2NyaWJlcnNGb3IoJ2xvYWQnKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGluZyA9IHRoaXMudXBkYXRlQ29uZmlnKHsgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NraW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0aW5nLS07XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlID0gdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCA9IHRoaXMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJfbG9vcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cFJlbmRlckxvb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuXG4gICAgICAgICAgICAvLyBSZXBvcnQgYW5kIHJldmVydCB0byBsYXN0IHZhbGlkIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCB0eXBlLCBtZXNzYWdlO1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdZQU1MRXhjZXB0aW9uJykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAneWFtbCc7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBwYXJzaW5nIHNjZW5lIFlBTUwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBlcnJvciB0eXBlc1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnRXJyb3IgaW5pdGlhbGl6aW5nIHNjZW5lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGUsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IHRoaXMuY29uZmlnX3NvdXJjZSB9KTtcblxuICAgICAgICAgICAgbWVzc2FnZSA9IGBTY2VuZS5sb2FkKCkgZmFpbGVkIHRvIGxvYWQgJHt0aGlzLmNvbmZpZ19zb3VyY2V9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmUubG9hZCgpIHJldmVydGluZyB0byBsYXN0IHZhbGlkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlLCB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXppbmc7XG4gICAgfVxuXG4gICAgLy8gRm9yIEFQSSBjb21wYXRpYmlsaXR5XG4gICAgcmVsb2FkKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBjb25maWdfcGF0aCA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZChjb25maWdfc291cmNlLCBjb25maWdfcGF0aCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSB0cnVlOyAvLyBzY2hlZHVsZSByZW5kZXIgbG9vcCB0byBzdG9wXG5cbiAgICAgICAgdGhpcy5kZXN0cm95TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuY2FudmFzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBUZXh0dXJlLmRlc3Ryb3kodGhpcy5nbCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0ge307XG5cbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0ucmVzZXQoKTtcblxuICAgICAgICAgICAgLy8gRm9yY2UgY29udGV4dCBsb3NzXG4gICAgICAgICAgICBsZXQgZXh0ID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2xvc2VfY29udGV4dCcpO1xuICAgICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgICAgIGV4dC5sb3NlQ29udGV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmdsID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMuZGVzdHJveVdvcmtlcnMoKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlciA9IG51bGw7XG4gICAgfVxuXG4gICAgY3JlYXRlQ2FudmFzKCkge1xuICAgICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXIgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcblxuICAgICAgICAvLyBGb3JjZSB0YW5ncmFtIGNhbnZhcyB1bmRlcm5lYXRoIGFsbCBsZWFmbGV0IGxheWVycywgYW5kIHNldCBiYWNrZ3JvdW5kIHRvIHRyYW5zcGFyZW50XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5nbCA9IENvbnRleHQuZ2V0Q29udGV4dCh0aGlzLmNhbnZhcywge1xuICAgICAgICAgICAgICAgIGFscGhhOiB0cnVlLCBwcmVtdWx0aXBsaWVkQWxwaGE6IHRydWUsIC8vIFRPRE86IHZhcnkgdy9zY2VuZSBhbHBoYVxuICAgICAgICAgICAgICAgIGRldmljZV9waXhlbF9yYXRpbzogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZG4ndCBjcmVhdGUgV2ViR0wgY29udGV4dC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiWW91ciBicm93c2VyIG1heSBub3Qgc3VwcG9ydCBXZWJHTCwgb3IgaXQncyB0dXJuZWQgb2ZmPyBcIiArXG4gICAgICAgICAgICAgICAgXCJWaXNpdCBodHRwOi8vd2ViZ2xyZXBvcnQuY29tLyBmb3IgbW9yZSBpbmZvLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemVNYXAodGhpcy5jb250YWluZXIuY2xpZW50V2lkdGgsIHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodCk7XG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmluaXQodGhpcy5nbCk7XG4gICAgICAgIHRoaXMucmVuZGVyX3N0YXRlcyA9IG5ldyBSZW5kZXJTdGF0ZU1hbmFnZXIodGhpcy5nbCk7XG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZS5zZXRDYW52YXModGhpcy5jYW52YXMpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgVVJMIHRvIGxvYWQgdGhlIHdlYiB3b3JrZXIgZnJvbVxuICAgIGdldFdvcmtlclVybCgpIHtcbiAgICAgICAgbGV0IHdvcmtlcl91cmwgPSB0aGlzLndvcmtlcl91cmwgfHwgVVJMcy5maW5kQ3VycmVudFVSTCgndGFuZ3JhbS5kZWJ1Zy5qcycsICd0YW5ncmFtLm1pbi5qcycpO1xuXG4gICAgICAgIGlmICghd29ya2VyX3VybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgbG9hZCB3b3JrZXIgYmVjYXVzZSBjb3VsZG4ndCBmaW5kIGJhc2UgVVJMIHRoYXQgbGlicmFyeSB3YXMgbG9hZGVkIGZyb21cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgY3VzdG9tIGRhdGEgc291cmNlIHNjcmlwdHMgYWxvbmdzaWRlIGNvcmUgbGlicmFyeVxuICAgICAgICAvLyBOT1RFOiB3b3JrYXJvdW5kIGZvciBpc3N1ZSB3aGVyZSBsYXJnZSBsaWJyYXJpZXMgaW50ZXJtaXR0ZW50bHkgZmFpbCB0byBsb2FkIGluIHdlYiB3b3JrZXJzLFxuICAgICAgICAvLyB3aGVuIG11bHRpcGxlIGltcG9ydFNjcmlwdHMoKSBjYWxscyBhcmUgdXNlZC4gTG9hZGluZyBhbGwgc2NyaXB0cyAoaW5jbHVkaW5nIFRhbmdyYW0gaXRzZWxmKVxuICAgICAgICAvLyBpbiBvbmUgY2FsbCBhdCBhdCB3b3JrZXIgY3JlYXRpb24gdGltZSBoYXMgbm90IGV4aGliaXRlZCB0aGUgc2FtZSBpc3N1ZS5cbiAgICAgICAgbGV0IHVybHMgPSBbLi4udGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzXTtcbiAgICAgICAgdXJscy5wdXNoKHdvcmtlcl91cmwpOyAvLyBsb2FkIFRhbmdyYW0gKmxhc3QqIChoYXMgYmVlbiBtb3JlIHJlbGlhYmxlLCB0aG91Z2ggcmVhc29uIHVua25vd24pXG4gICAgICAgIGxldCBib2R5ID0gYGltcG9ydFNjcmlwdHMoJHt1cmxzLm1hcCh1cmwgPT4gYCcke3VybH0nYCkuam9pbignLCcpfSk7YDtcbiAgICAgICAgcmV0dXJuIFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtib2R5XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsaXN0IG9mIGFueSBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyAoaWYgYW55KVxuICAgIHVwZGF0ZURhdGFTb3VyY2VTY3JpcHRzICgpIHtcbiAgICAgICAgbGV0IHByZXZfc2NyaXB0cyA9IFsuLi4odGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzfHxbXSldOyAvLyBzYXZlIGxpc3Qgb2YgcHJldmlvdXNseSBsb2FkZWQgc2NyaXB0c1xuICAgICAgICBsZXQgc2NyaXB0cyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLnNvdXJjZXMpLm1hcChzID0+IHRoaXMuY29uZmlnLnNvdXJjZXNbc10uc2NyaXB0cykuZmlsdGVyKHggPT4geCk7XG4gICAgICAgIGlmIChzY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCAnbG9hZGluZyBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyBpbiB3b3JrZXI6Jywgc2NyaXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzID0gW10uY29uY2F0KC4uLnNjcmlwdHMpLnNvcnQoKTtcblxuICAgICAgICAvLyBTY3JpcHRzIGNoYW5nZWQ/XG4gICAgICAgIHJldHVybiAhKHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cy5sZW5ndGggPT09IHByZXZfc2NyaXB0cy5sZW5ndGggJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gcHJldl9zY3JpcHRzW2ldKSk7XG4gICAgfVxuXG4gICAgLy8gV2ViIHdvcmtlcnMgaGFuZGxlIGhlYXZ5IGR1dHkgdGlsZSBjb25zdHJ1Y3Rpb246IG5ldHdvcmtpbmcsIGdlb21ldHJ5IHByb2Nlc3NpbmcsIGV0Yy5cbiAgICBjcmVhdGVXb3JrZXJzKCkge1xuICAgICAgICAvLyBSZXNldCBvbGQgd29ya2VycyAoaWYgYW55KSBpZiB3ZSBuZWVkIHRvIHJlLWluc3RhbnRpYXRlIHdpdGggbmV3IGV4dGVybmFsIHNjcmlwdHNcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlRGF0YVNvdXJjZVNjcmlwdHMoKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95V29ya2VycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VXb3JrZXJzKHRoaXMuZ2V0V29ya2VyVXJsKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YW50aWF0ZSB3b3JrZXJzIGZyb20gVVJMLCBpbml0IGV2ZW50IGhhbmRsZXJzXG4gICAgbWFrZVdvcmtlcnModXJsKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMud29ya2VycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZD0wOyBpZCA8IHRoaXMubnVtX3dvcmtlcnM7IGlkKyspIHtcbiAgICAgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKHVybCk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnNbaWRdID0gd29ya2VyO1xuXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyKHdvcmtlcik7XG5cbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmUubWFrZVdvcmtlcnM6IGluaXRpYWxpemluZyB3b3JrZXIgJHtpZH1gKTtcbiAgICAgICAgICAgIGxldCBfaWQgPSBpZDtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuaW5pdCcsIHRoaXMuaWQsIGlkLCB0aGlzLm51bV93b3JrZXJzLCB0aGlzLmxvZ19sZXZlbCwgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKS50aGVuKFxuICAgICAgICAgICAgICAgIChpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lLm1ha2VXb3JrZXJzOiBpbml0aWFsaXplZCB3b3JrZXIgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgU2NlbmUubWFrZVdvcmtlcnM6IGZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtlciAke19pZH06YCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9IDA7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChxdWV1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsb2cuc2V0V29ya2Vycyh0aGlzLndvcmtlcnMpO1xuXG4gICAgICAgICAgICAvLyBMZXQgVmVydGV4RWxlbWVudHMga25vdyBpZiAzMiBiaXQgaW5kaWNlcyBmb3IgZWxlbWVudCBhcnJheXMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgICAgbGV0IFVpbnQzMl9mbGFnID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oXCJPRVNfZWxlbWVudF9pbmRleF91aW50XCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ1ZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcnLCBVaW50MzJfZmxhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc3Ryb3lXb3JrZXJzKCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLndvcmtlcnMpKSB7XG4gICAgICAgICAgICBsb2cuc2V0V29ya2VycyhudWxsKTtcbiAgICAgICAgICAgIHRoaXMud29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gdGlsZSB0byB3b3JrZXIgdGhyZWFkIGJhc2VkIG9uIGRhdGEgc291cmNlXG4gICAgZ2V0V29ya2VyRm9yRGF0YVNvdXJjZShzb3VyY2UpIHtcbiAgICAgICAgbGV0IHdvcmtlcjtcblxuICAgICAgICBpZiAoc291cmNlLnRpbGVkKSB7XG4gICAgICAgICAgICAvLyBSb3VuZCByb2JpbiB0aWxlZCBzb3VyY2VzIGFjcm9zcyBhbGwgd29ya2Vyc1xuICAgICAgICAgICAgd29ya2VyID0gdGhpcy53b3JrZXJzW3RoaXMubmV4dF93b3JrZXJdO1xuICAgICAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9ICh0aGlzLm5leHRfd29ya2VyICsgMSkgJSB0aGlzLndvcmtlcnMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUGluIGFsbCB0aWxlcyBmcm9tIGVhY2ggbm9uLXRpbGVkIHNvdXJjZSB0byBhIHNpbmdsZSB3b3JrZXJcbiAgICAgICAgICAgIC8vIFByZXZlbnRzIGRhdGEgZm9yIHRoZXNlIHNvdXJjZXMgZnJvbSBiZWluZyBsb2FkZWQgbW9yZSB0aGFuIG9uY2VcbiAgICAgICAgICAgIHdvcmtlciA9IHRoaXMud29ya2Vyc1tzb3VyY2UuaWQgJSB0aGlzLndvcmtlcnMubGVuZ3RoXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfVxuXG4gICAgLy8gU2NlbmUgaXMgcmVhZHkgZm9yIHJlbmRlcmluZ1xuICAgIHJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMudmlldy5yZWFkeSgpIHx8IE9iamVjdC5rZXlzKHRoaXMuc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlc2l6ZSB0aGUgbWFwIHdoZW4gZGV2aWNlIHBpeGVsIHJhdGlvIGNoYW5nZXMsIGUuZy4gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkaXNwbGF5c1xuICAgIHVwZGF0ZURldmljZVBpeGVsUmF0aW8gKCkge1xuICAgICAgICBpZiAoVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi51cGRhdGVEZXZpY2VQaXhlbFJhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVidWlsZCgpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVzaXplTWFwKHRoaXMudmlldy5zaXplLmNzcy53aWR0aCwgdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzaXplTWFwKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlldy5zZXRWaWV3cG9ydFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBDb250ZXh0LnJlc2l6ZSh0aGlzLmdsLCB3aWR0aCwgaGVpZ2h0LCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBzY2VuZSBiZSByZWRyYXduIGF0IG5leHQgYW5pbWF0aW9uIGxvb3BcbiAgICByZXF1ZXN0UmVkcmF3KCkge1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZWRyYXcgc2NlbmUgaW1tZWRpYXRlbHkgLSBkb24ndCB3YWl0IGZvciBhbmltYXRpb24gbG9vcFxuICAgIC8vIFVzZSBzcGFyaW5nbHksIGJ1dCBmb3IgY2FzZXMgd2hlcmUgeW91IG5lZWQgdGhlIGNsb3Nlc3QgcG9zc2libGUgc3luYyB3aXRoIG90aGVyIFVJIGVsZW1lbnRzLFxuICAgIC8vIHN1Y2ggYXMgb3RoZXIsIG5vbi1XZWJHTCBtYXAgbGF5ZXJzIChlLmcuIExlYWZsZXQgcmFzdGVyIGxheWVycywgbWFya2VycywgZXRjLilcbiAgICBpbW1lZGlhdGVSZWRyYXcoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHJlbmRlckxvb3AgKCkge1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IHRydWU7IC8vIG9ubHkgbGV0IHRoZSByZW5kZXIgbG9vcCBpbnN0YW50aWF0ZSBvbmNlXG5cbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgc2NlbmVcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSBuZXh0IGZyYW1lIGlmIG5vdCBzY2hlZHVsZWQgdG8gc3RvcFxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyX2xvb3Bfc3RvcCkge1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlckxvb3AuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXR1cCB0aGUgcmVuZGVyIGxvb3BcbiAgICBzZXR1cFJlbmRlckxvb3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnJlbmRlckxvb3AoKTsgfSwgMCk7IC8vIGRlbGF5IHN0YXJ0IGJ5IG9uZSB0aWNrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vIFJlbmRlciBvbiBkZW1hbmRcbiAgICAgICAgdmFyIHdpbGxfcmVuZGVyID0gIShcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgdGhpcy51cGRhdGluZyA+IDAgfHxcbiAgICAgICAgICAgIHRoaXMucmVhZHkoKSA9PT0gZmFsc2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBQcmUtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnByZVVwZGF0ZSh3aWxsX3JlbmRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYWlsIGlmIG5vIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgIGlmICghd2lsbF9yZW5kZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7IC8vIHN1YmNsYXNzZXMgY2FuIHNldCB0aGlzIGJhY2sgdG8gdHJ1ZSB3aGVuIGFuaW1hdGlvbiBpcyBuZWVkZWRcblxuICAgICAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgICAgIHRoaXMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdDb21wbGV0ZSgpOyAvLyBmaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlLmNvbXBsZXRlU2NyZWVuc2hvdCgpOyAvLyBjb21wbGV0ZXMgc2NyZWVuc2hvdCBjYXB0dXJlIGlmIHJlcXVlc3RlZFxuXG4gICAgICAgIC8vIFBvc3QtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucG9zdFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5wb3N0VXBkYXRlKHdpbGxfcmVuZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZHJhdyBldmVyeSBmcmFtZSBpZiBhbmltYXRpbmdcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQgPT09IHRydWUgfHwgdGhpcy52aWV3LmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mcmFtZSsrO1xuICAgICAgICBsb2coJ3RyYWNlJywgJ1NjZW5lLnJlbmRlcigpJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcblxuICAgICAgICAvLyBVcGRhdGUgc3R5bGVzLCBjYW1lcmEsIGxpZ2h0c1xuICAgICAgICB0aGlzLnZpZXcudXBkYXRlKCk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMubGlnaHRzKS5mb3JFYWNoKGkgPT4gdGhpcy5saWdodHNbaV0udXBkYXRlKCkpO1xuXG4gICAgICAgIC8vIFJlbmRlciBtYWluIHBhc3NcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSB0aGlzLnJlbmRlclBhc3MoKTtcblxuICAgICAgICAvLyBSZW5kZXIgc2VsZWN0aW9uIHBhc3MgKGlmIG5lZWRlZClcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLnBlbmRpbmdSZXF1ZXN0cygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclBlbmRpbmdSZXF1ZXN0cygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uYmluZCgpOyAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBGQk9cbiAgICAgICAgICAgIHRoaXMucmVuZGVyUGFzcyhcbiAgICAgICAgICAgICAgICAnc2VsZWN0aW9uX3Byb2dyYW0nLCAgICAgICAgICAgICAgICAvLyByZW5kZXIgdy9hbHRlcm5hdGUgcHJvZ3JhbVxuICAgICAgICAgICAgICAgIHsgYWxsb3dfYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVhZCgpOyAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcmVzdWx0cyBmcm9tIHNlbGVjdGlvbiBidWZmZXJcblxuICAgICAgICAgICAgLy8gUmVzZXQgdG8gc2NyZWVuIGJ1ZmZlclxuICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJfY291bnQgIT09IHRoaXMubGFzdF9yZW5kZXJfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkudGhlbihzaXplID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSkgeyAvLyByZXR1cm5zIHVuZGVmaW5lZCBpZiBwcmV2aW91cyByZXF1ZXN0IHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFNjZW5lOiByZW5kZXJlZCAke3RoaXMucmVuZGVyX2NvdW50fSBwcmltaXRpdmVzICgke3NpemV9IGZlYXR1cmVzIGluIHNlbGVjdGlvbiBtYXApYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0X3JlbmRlcl9jb3VudCA9IHRoaXMucmVuZGVyX2NvdW50O1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBhbGwgYWN0aXZlIHN0eWxlcywgZ3JvdXBlZCBieSBibGVuZC9kZXB0aCB0eXBlIChvcGFxdWUsIG92ZXJsYXksIGV0Yy4pIGFuZCBieSBwcm9ncmFtIChzdHlsZSlcbiAgICAvLyBDYWxsZWQgYm90aCBmb3IgbWFpbiByZW5kZXIgcGFzcywgYW5kIGZvciBzZWNvbmRhcnkgcGFzc2VzIGxpa2Ugc2VsZWN0aW9uIGJ1ZmZlclxuICAgIHJlbmRlclBhc3MocHJvZ3JhbV9rZXkgPSAncHJvZ3JhbScsIHsgYWxsb3dfYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsbHkgZm9yY2UgYWxwaGEgb2ZmIChlLmcuIGZvciBzZWxlY3Rpb24gcGFzcylcbiAgICAgICAgYWxsb3dfYmxlbmQgPSAoYWxsb3dfYmxlbmQgPT0gbnVsbCkgPyB0cnVlIDogYWxsb3dfYmxlbmQ7XG5cbiAgICAgICAgdGhpcy5jbGVhckZyYW1lKHsgY2xlYXJfY29sb3I6IHRydWUsIGNsZWFyX2RlcHRoOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIFNvcnQgc3R5bGVzIGJ5IGJsZW5kIG9yZGVyXG4gICAgICAgIGxldCBzdHlsZXMgPSB0aGlzLnRpbGVfbWFuYWdlci5nZXRBY3RpdmVTdHlsZXMoKS5cbiAgICAgICAgICAgIG1hcChzID0+IHRoaXMuc3R5bGVzW3NdKS5cbiAgICAgICAgICAgIGZpbHRlcihzID0+IHMpLiAvLyBndWFyZCBhZ2FpbnN0IG1pc3Npbmcgc3R5bGVzLCBzdWNoIGFzIHdoaWxlIGxvYWRpbmcgYSBuZXcgc2NlbmVcbiAgICAgICAgICAgIHNvcnQoU3R5bGUuYmxlbmRPcmRlclNvcnQpO1xuXG4gICAgICAgIC8vIFJlbmRlciBzdHlsZXNcbiAgICAgICAgbGV0IGNvdW50ID0gMDsgLy8gaG93IG1hbnkgcHJpbWl0aXZlcyB3ZXJlIHJlbmRlcmVkXG4gICAgICAgIGxldCBsYXN0X2JsZW5kO1xuICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzdHlsZXMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1tzXTtcblxuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgcmVuZGVyIHN0YXRlIHdoZW4gYmxlbmQgbW9kZSBjaGFuZ2VzXG4gICAgICAgICAgICBpZiAoc3R5bGUuYmxlbmQgIT09IGxhc3RfYmxlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LFxuICAgICAgICAgICAgICAgICAgICBTdHlsZS5yZW5kZXJfc3RhdGVzW3N0eWxlLmJsZW5kXSwgICAgICAgLy8gcmVuZGVyIHN0YXRlIGZvciBibGVuZCBtb2RlXG4gICAgICAgICAgICAgICAgICAgIHsgYmxlbmQ6IChhbGxvd19ibGVuZCAmJiBzdHlsZS5ibGVuZCkgfSAvLyBlbmFibGUvZGlzYWJsZSBibGVuZGluZyAoZS5nLiBubyBibGVuZCBmb3Igc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJTdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCArPSB0aGlzLnJlbmRlclN0eWxlKHN0eWxlLm5hbWUsIHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgIGxhc3RfYmxlbmQgPSBzdHlsZS5ibGVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICByZW5kZXJTdHlsZShzdHlsZV9uYW1lLCBwcm9ncmFtX2tleSkge1xuICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tzdHlsZV9uYW1lXTtcbiAgICAgICAgbGV0IGZpcnN0X2Zvcl9zdHlsZSA9IHRydWU7XG4gICAgICAgIGxldCByZW5kZXJfY291bnQgPSAwO1xuICAgICAgICBsZXQgcHJvZ3JhbTtcblxuICAgICAgICAvLyBSZW5kZXIgdGlsZSBHTCBnZW9tZXRyaWVzXG4gICAgICAgIGxldCByZW5kZXJhYmxlX3RpbGVzID0gdGhpcy50aWxlX21hbmFnZXIuZ2V0UmVuZGVyYWJsZVRpbGVzKCk7XG4gICAgICAgIGZvciAobGV0IHQ9MDsgdCA8IHJlbmRlcmFibGVfdGlsZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gcmVuZGVyYWJsZV90aWxlc1t0XTtcblxuICAgICAgICAgICAgaWYgKHRpbGUubWVzaGVzW3N0eWxlX25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3R5bGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIC8vIE9ubHkgc2V0dXAgc3R5bGUgaWYgcmVuZGVyaW5nIGZvciBmaXJzdCB0aW1lIHRoaXMgZnJhbWVcbiAgICAgICAgICAgIC8vIChsYXp5IGluaXQsIG5vdCBhbGwgc3R5bGVzIHdpbGwgYmUgdXNlZCBpbiBhbGwgc2NyZWVuIHZpZXdzOyBzb21lIHN0eWxlcyBtaWdodCBiZSBkZWZpbmVkIGJ1dCBuZXZlciB1c2VkKVxuICAgICAgICAgICAgaWYgKGZpcnN0X2Zvcl9zdHlsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZpcnN0X2Zvcl9zdHlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHByb2dyYW0gPSB0aGlzLnNldHVwU3R5bGUoc3R5bGUsIHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lwIHByb3h5IHRpbGVzIGlmIG5ldyB0aWxlcyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgdGhpcyBzdHlsZVxuICAgICAgICAgICAgaWYgKCF0aWxlLnNob3VsZFByb3h5Rm9yU3R5bGUoc3R5bGVfbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYFNjZW5lLnJlbmRlclN0eWxlKCk6IFNraXAgcHJveHkgdGlsZSBmb3Igc3R5bGUgJyR7c3R5bGVfbmFtZX0nIGAsIHRpbGUsIHRpbGUucHJveHlfZm9yKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGlsZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgICAgICAgdGhpcy52aWV3LnNldHVwVGlsZSh0aWxlLCBwcm9ncmFtKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIHRpbGVcbiAgICAgICAgICAgIGxldCBtZXNoID0gdGlsZS5tZXNoZXNbc3R5bGVfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUucmVuZGVyKG1lc2gpKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgaW5jdXIgYWRkaXRpb25hbCByZW5kZXJzIHdoaWxlIHZpZXdwb3J0IGlzIG1vdmluZ1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMudmlldy5wYW5uaW5nIHx8IHRoaXMudmlldy56b29taW5nKSkge1xuICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbmRlcl9jb3VudCArPSBtZXNoLmdlb21ldHJ5X2NvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcl9jb3VudDtcbiAgICB9XG5cbiAgICBzZXR1cFN0eWxlKHN0eWxlLCBwcm9ncmFtX2tleSkge1xuICAgICAgICAvLyBHZXQgc2hhZGVyIHByb2dyYW0gZnJvbSBzdHlsZSwgbGF6aWx5IGNvbXBpbGluZyBpZiBuZWNlc3NhcnlcbiAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gc3R5bGUuZ2V0UHJvZ3JhbShwcm9ncmFtX2tleSk7XG4gICAgICAgICAgICBpZiAoIXByb2dyYW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignd2FybmluZycsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3R5bGVzJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgY29tcGlsaW5nIHN0eWxlICR7c3R5bGUubmFtZX1gLFxuICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgIHNoYWRlcl9lcnJvcnM6IHN0eWxlLnByb2dyYW0gJiYgc3R5bGUucHJvZ3JhbS5zaGFkZXJfZXJyb3JzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2dyYW0udXNlKCk7XG4gICAgICAgIHN0eWxlLnNldHVwKCk7XG5cbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3RpbWUnLCB0aGlzLmFuaW1hdGVkID8gKCgoK25ldyBEYXRlKCkpIC0gdGhpcy5zdGFydF90aW1lKSAvIDEwMDApIDogMCk7XG4gICAgICAgIHRoaXMudmlldy5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5saWdodHMpIHtcbiAgICAgICAgICAgIHRoaXMubGlnaHRzW2ldLnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIGNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvciwgY2xlYXJfZGVwdGggfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgY2xlYXJfY29sb3IgPSAoY2xlYXJfY29sb3IgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGNsZWFyX2RlcHRoID0gKGNsZWFyX2RlcHRoID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7IC8vIGRlZmF1bHQgdHJ1ZVxuXG4gICAgICAgIC8vIFNldCBHTCBzdGF0ZVxuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMuZGVwdGhfd3JpdGUuc2V0KHsgZGVwdGhfd3JpdGU6IGNsZWFyX2RlcHRoIH0pO1xuXG4gICAgICAgIGxldCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmIChjbGVhcl9jb2xvciB8fCBjbGVhcl9kZXB0aCkge1xuICAgICAgICAgICAgbGV0IG1hc2sgPSAoY2xlYXJfY29sb3IgJiYgZ2wuQ09MT1JfQlVGRkVSX0JJVCkgfCAoY2xlYXJfZGVwdGggJiYgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgICAgICAgICBnbC5jbGVhcihtYXNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJlbmRlclN0YXRlKHsgZGVwdGhfdGVzdCwgZGVwdGhfd3JpdGUsIGN1bGxfZmFjZSwgYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgLy8gVE9ETzogd2hlbiB3ZSBhYnN0cmFjdCBvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmVuZGVyIHBhc3NlcywgdGhlc2UgY2FuIGJlIHBlci1wYXNzIGNvbmZpZyBvcHRpb25zXG4gICAgICAgIGxldCByZW5kZXJfc3RhdGVzID0gdGhpcy5yZW5kZXJfc3RhdGVzO1xuICAgICAgICBkZXB0aF90ZXN0ID0gKGRlcHRoX3Rlc3QgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5kZXB0aF90ZXN0OyAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBkZXB0aF93cml0ZSA9IChkZXB0aF93cml0ZSA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmRlcHRoX3dyaXRlOyAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBjdWxsX2ZhY2UgPSAoY3VsbF9mYWNlID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuY3VsbGluZzsgICAgICAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBibGVuZCA9IChibGVuZCAhPSBudWxsKSA/IGJsZW5kIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5ibGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZmFsc2VcblxuICAgICAgICAvLyBSZXNldCBmcmFtZSBzdGF0ZVxuICAgICAgICBsZXQgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuZGVwdGhfdGVzdC5zZXQoeyBkZXB0aF90ZXN0OiBkZXB0aF90ZXN0IH0pO1xuICAgICAgICByZW5kZXJfc3RhdGVzLmRlcHRoX3dyaXRlLnNldCh7IGRlcHRoX3dyaXRlOiBkZXB0aF93cml0ZSB9KTtcbiAgICAgICAgcmVuZGVyX3N0YXRlcy5jdWxsaW5nLnNldCh7IGN1bGw6IGN1bGxfZmFjZSwgZmFjZTogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgfSk7XG5cbiAgICAgICAgLy8gQmxlbmRpbmcgb2YgYWxwaGEgY2hhbm5lbCBpcyBtb2RpZmllZCB0byBhY2NvdW50IGZvciBXZWJHTCBhbHBoYSBiZWhhdmlvciwgc2VlOlxuICAgICAgICAvLyBodHRwOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvd2ViZ2wtYW5kLWFscGhhLmh0bWxcbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTE1MzM0MTZcbiAgICAgICAgaWYgKGJsZW5kKSB7XG4gICAgICAgICAgICAvLyBPcGFxdWU6IGFsbCBzb3VyY2UsIG5vIGRlc3RpbmF0aW9uXG4gICAgICAgICAgICBpZiAoYmxlbmQgPT09ICdvcGFxdWUnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRyYWRpdGlvbmFsIGFscGhhIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ292ZXJsYXknIHx8IGJsZW5kID09PSAnaW5sYXknKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5TUkNfQUxQSEEsIGRzdDogZ2wuT05FX01JTlVTX1NSQ19BTFBIQSxcbiAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhOiBnbC5PTkUsIGRzdF9hbHBoYTogZ2wuT05FX01JTlVTX1NSQ19BTFBIQVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWRkaXRpdmUgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnYWRkJykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuT05FLCBkc3Q6IGdsLk9ORVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTXVsdGlwbGljYXRpdmUgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnbXVsdGlwbHknKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5aRVJPLCBkc3Q6IGdsLlNSQ19DT0xPUlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoeyBibGVuZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGZlYXR1cmUgc2VsZWN0aW9uIGF0IGdpdmVuIHBpeGVsLiBSdW5zIGFzeW5jIGFuZCByZXR1cm5zIHJlc3VsdHMgdmlhIGEgcHJvbWlzZS5cbiAgICBnZXRGZWF0dXJlQXQocGl4ZWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgXCJTY2VuZS5nZXRGZWF0dXJlQXQoKSBjYWxsZWQgYmVmb3JlIHNjZW5lIHdhcyBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvaW50IHNjYWxlZCB0byBbMC4uMV0gcmFuZ2VcbiAgICAgICAgdmFyIHBvaW50ID0ge1xuICAgICAgICAgICAgeDogcGl4ZWwueCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAvIHRoaXMudmlldy5zaXplLmRldmljZS53aWR0aCxcbiAgICAgICAgICAgIHk6IHBpeGVsLnkgKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gLyB0aGlzLnZpZXcuc2l6ZS5kZXZpY2UuaGVpZ2h0XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7IC8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBzY2VuZSByZS1yZW5kZXJzIGZvciB0aGVzZSB0byBiZSBwcm9jZXNzZWRcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldEZlYXR1cmVBdChwb2ludCkuXG4gICAgICAgICAgICB0aGVuKHNlbGVjdGlvbiA9PiBPYmplY3QuYXNzaWduKHNlbGVjdGlvbiwgeyBwaXhlbCB9KSkuXG4gICAgICAgICAgICBjYXRjaChlcnJvciA9PiBQcm9taXNlLnJlc29sdmUoeyBlcnJvciB9KSk7XG4gICAgfVxuXG4gICAgLy8gUmVidWlsZCBnZW9tZXRyeSwgd2l0aG91dCByZS1wYXJzaW5nIHRoZSBjb25maWcgb3IgcmUtY29tcGlsaW5nIHN0eWxlc1xuICAgIC8vIFRPRE86IGRldGVjdCB3aGljaCBlbGVtZW50cyBuZWVkIHRvIGJlIHJlZnJlc2hlZC9yZWJ1aWx0IChzdHlsZXNoZWV0IGNoYW5nZXMsIGV0Yy4pXG4gICAgcmVidWlsZChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGRHZW9tZXRyeShvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBSZWJ1aWxkIGFsbCB0aWxlc1xuICAgIC8vIHN5bmM6IGJvb2xlYW4gb2Ygd2hldGhlciB0byBzeW5jIHRoZSBjb25maWcgb2JqZWN0IHRvIHRoZSB3b3JrZXJcbiAgICAvLyBzb3VyY2VzOiBvcHRpb25hbCBhcnJheSBvZiBkYXRhIHNvdXJjZXMgdG8gc2VsZWN0aXZlbHkgcmVidWlsZCAoYnkgZGVmYXVsdCBhbGwgb3VyIHJlYnVpbHQpXG4gICAgcmVidWlsZEdlb21ldHJ5KHsgc3luYyA9IHRydWUsIHNvdXJjZXMgPSBudWxsLCBzZXJpYWxpemVfZnVuY3MsIHByb2ZpbGUgPSBmYWxzZSwgZmFkZV9pbiA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gU2tpcCByZWJ1aWxkIGlmIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVldWUgdXAgdG8gb25lIHJlYnVpbGQgY2FsbCBhdCBhIHRpbWUsIG9ubHkgc2F2ZSBsYXN0IHJlcXVlc3RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZy5xdWV1ZWQgJiYgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBwcmV2aW91cyByZXF1ZXN0IHRoYXQgaXQgZGlkIG5vdCBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgJ1NjZW5lLnJlYnVpbGQ6IHJlcXVlc3Qgc3VwZXJjZWRlZCBieSBhIG5ld2VyIGNhbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVzb2x2ZShmYWxzZSk7IC8vIGZhbHNlIGZsYWcgaW5kaWNhdGVzIHJlYnVpbGQgcmVxdWVzdCB3YXMgc3VwZXJjZWRlZFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNhdmUgcXVldWVkIHJlcXVlc3RcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHsgc3luYywgc291cmNlcywgc2VyaWFsaXplX2Z1bmNzLCBwcm9maWxlLCBmYWRlX2luIH07XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQgPSB7IHJlc29sdmUsIHJlamVjdCwgb3B0aW9ucyB9O1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU2NlbmUucmVidWlsZCgpOiBxdWV1aW5nIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuXG4gICAgICAgICAgICAvLyBQcm9maWxpbmdcbiAgICAgICAgICAgIGlmIChwcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZmlsZSgnU2NlbmUucmVidWlsZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgY29uZmlnIChpbiBjYXNlIEpTIG9iamVjdHMgd2VyZSBtYW5pcHVsYXRlZCBkaXJlY3RseSlcbiAgICAgICAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmVhdHVyZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZXNldFRpbWUoKTtcblxuICAgICAgICAgICAgLy8gUmVidWlsZCB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5wcnVuZVRvVmlzaWJsZVRpbGVzKCk7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZXMgfHwgc291cmNlcy5pbmRleE9mKHRpbGUuc291cmNlLm5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuYnVpbGRUaWxlKHRpbGUsIHsgZmFkZV9pbiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnVwZGF0ZVRpbGVzRm9yVmlldygpOyAvLyBwaWNrcyB1cCBhZGRpdGlvbmFsIHRpbGVzIGZvciBhbnkgbmV3L2NoYW5nZWQgZGF0YSBzb3VyY2VzXG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5jaGVja0J1aWxkUXVldWUoKTsgICAgLy8gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBubyB0aWxlcyB0byBidWlsZFxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9maWxlRW5kKCdTY2VuZS5yZWJ1aWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRpbGUgbWFuYWdlciBmaW5pc2hlZCBidWlsZGluZyB0aWxlc1xuICAgIC8vIFRPRE8gbW92ZSB0byB0aWxlIG1hbmFnZXJcbiAgICB0aWxlTWFuYWdlckJ1aWxkRG9uZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcpIHtcbiAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZTogYnVpbGQgZ2VvbWV0cnkgZmluaXNoZWRgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFub3RoZXIgcmVidWlsZCBxdWV1ZWQ/XG4gICAgICAgICAgICB2YXIgcXVldWVkID0gdGhpcy5idWlsZGluZy5xdWV1ZWQ7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lOiBzdGFydGluZyBxdWV1ZWQgcmVidWlsZCgpIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGQocXVldWVkLm9wdGlvbnMpLnRoZW4ocXVldWVkLnJlc29sdmUsIHF1ZXVlZC5yZWplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgTG9hZCAob3IgcmVsb2FkKSB0aGUgc2NlbmUgY29uZmlnXG4gICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgIGxvYWRTY2VuZShjb25maWdfc291cmNlID0gbnVsbCwgY29uZmlnX3BhdGggPSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19zb3VyY2UgfHwgdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19nbG9iYWxzX2FwcGxpZWQgPSBbXTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVUkxzLnBhdGhGb3JVUkwoY29uZmlnX3BhdGggfHwgdGhpcy5jb25maWdfc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVUkxzLnBhdGhGb3JVUkwoY29uZmlnX3BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFNjZW5lTG9hZGVyLmxvYWRTY2VuZSh0aGlzLmNvbmZpZ19zb3VyY2UsIHRoaXMuY29uZmlnX3BhdGgpLnRoZW4oKHtjb25maWcsIGJ1bmRsZX0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy5jb25maWdfYnVuZGxlID0gYnVuZGxlO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkJywgeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc291cmNlIHRvIGEgc2NlbmUsIGFyZ3VtZW50cyBgbmFtZWAgYW5kIGBjb25maWdgIG5lZWQgdG8gYmUgcHJvdmlkZWQ6XG4gICAgLy8gIC0gSWYgdGhlIG5hbWUgZG9lc24ndCBtYXRjaCBhIHNvdXJjZXMgaXQgd2lsbCBjcmVhdGUgaXRcbiAgICAvLyAgLSB0aGUgYGNvbmZpZ2Agb2JqIGZvbGxvdyB0aGUgWUFNTCBzY2VuZSBzcGVjLCBleDogYGBge3R5cGU6ICdUb3BvSlNPTicsIHVybDogXCIvL3ZlY3Rvci5tYXB6ZW4uY29tL29zbS9hbGwve3p9L3t4fS97eX0udG9wb2pzb25cIl19YGBgXG4gICAgLy8gICAgdGhhdCBsb29rcyBsaWtlOlxuICAgIC8vXG4gICAgLy8gICAgICBzY2VuZS5zZXREYXRhU291cmNlKFwib3NtXCIsIHt0eXBlOiAnVG9wb0pTT04nLCB1cmw6IFwiLy92ZWN0b3IubWFwemVuLmNvbS9vc20vYWxsL3t6fS97eH0ve3l9LnRvcG9qc29uXCIgfSk7XG4gICAgLy9cbiAgICAvLyAgLSBhbHNvIGNhbiBiZSBwYXNzIGEgYGBgZGF0YWBgYCBvYmo6IGBgYHt0eXBlOiAnR2VvSlNPTicsIGRhdGE6IEpTT2JqIF19YGBgXG4gICAgLy9cbiAgICAvLyAgICAgIHZhciBnZW9qc29uX2RhdGEgPSB7fTtcbiAgICAvLyAgICAgIC4uLlxuICAgIC8vICAgICAgc2NlbmUuc2V0RGF0YVNvdXJjZShcImR5bmFtaWNfZGF0YVwiLCB7dHlwZTogJ0dlb0pTT04nLCBkYXRhOiBnZW9qc29uX2RhdGEgfSk7XG4gICAgLy9cbiAgICBzZXREYXRhU291cmNlIChuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFuYW1lIHx8ICFjb25maWcgfHwgIWNvbmZpZy50eXBlIHx8ICghY29uZmlnLnVybCAmJiAhY29uZmlnLmRhdGEpKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgXCJObyBuYW1lIHByb3ZpZGVkIG9yIG5vdCBhIHZhbGlkIGNvbmZpZzpcIiwgbmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2FkID0gKHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV0gPT0gbnVsbCk7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHJhdyBkYXRhIGludG8gYmxvYiBVUkxcbiAgICAgICAgaWYgKHNvdXJjZS5kYXRhICYmIHR5cGVvZiBzb3VyY2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHNvdXJjZS51cmwgPSBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoc291cmNlLmRhdGEpXSkpO1xuICAgICAgICAgICAgZGVsZXRlIHNvdXJjZS5kYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBwYXRocyByZWxhdGl2ZSB0byByb290IHNjZW5lIGJ1bmRsZVxuICAgICAgICBTY2VuZUxvYWRlci5ub3JtYWxpemVEYXRhU291cmNlKHNvdXJjZSwgdGhpcy5jb25maWdfYnVuZGxlKTtcblxuICAgICAgICBpZiAobG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogeyBzb3VyY2VzOiBbbmFtZV0gfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGQoeyBzb3VyY2VzOiBbbmFtZV0gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVEYXRhU291cmNlcygpIHtcbiAgICAgICAgbGV0IHJlc2V0ID0gW107IC8vIHNvdXJjZXMgdG8gcmVzZXRcbiAgICAgICAgbGV0IHByZXZfc291cmNlX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKTtcbiAgICAgICAgbGV0IHNvdXJjZV9pZCA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLmNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gdGhpcy5jb25maWcuc291cmNlc1tuYW1lXTtcbiAgICAgICAgICAgIGxldCBwcmV2X3NvdXJjZSA9IHRoaXMuc291cmNlc1tuYW1lXTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLCB7IG5hbWUsIGlkOiBzb3VyY2VfaWQrKyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbbmFtZV0gPSBEYXRhU291cmNlLmNyZWF0ZShjb25maWcsIHRoaXMuc291cmNlcyk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNvdXJjZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNvdXJjZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgQ291bGQgbm90IGNyZWF0ZSBkYXRhIHNvdXJjZTogJHtlLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgU2NlbmU6ICR7bWVzc2FnZX1gLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignd2FybmluZycsIHsgdHlwZTogJ3NvdXJjZXMnLCBzb3VyY2UsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERhdGEgc291cmNlIGNoYW5nZWQ/XG4gICAgICAgICAgICBpZiAoRGF0YVNvdXJjZS5jaGFuZ2VkKHRoaXMuc291cmNlc1tuYW1lXSwgcHJldl9zb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgcmVzZXQucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvdXJjZXMgdGhhdCB3ZXJlIHJlbW92ZWRcbiAgICAgICAgcHJldl9zb3VyY2VfbmFtZXMuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcuc291cmNlc1tzXSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNvdXJjZXNbc107IC8vIFRPRE86IHJlbW92ZSBmcm9tIHdvcmtlcnMgdG9vP1xuICAgICAgICAgICAgICAgIHJlc2V0LnB1c2gocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlcyBmcm9tIHNvdXJjZXMgdGhhdCBoYXZlIGNoYW5nZWRcbiAgICAgICAgaWYgKHJlc2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnJlbW92ZVRpbGVzKHRpbGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAocmVzZXQuaW5kZXhPZih0aWxlLnNvdXJjZS5uYW1lKSA+IC0xKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBzb3VyY2VzIHRoYXQgd2lsbCBnZW5lcmF0ZSBnZW9tZXRyeSB0aWxlc1xuICAgICAgICAvLyAoYWxsIGV4Y2VwdCB0aG9zZSB0aGF0IGFyZSBvbmx5IHJhc3RlciBzb3VyY2VzIGF0dGFjaGVkIHRvIG90aGVyIHNvdXJjZXMpXG4gICAgICAgIGZvciAobGV0IGxuIGluIHRoaXMuY29uZmlnLmxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gdGhpcy5jb25maWcubGF5ZXJzW2xuXTtcbiAgICAgICAgICAgIGlmIChsYXllci5kYXRhICYmIHRoaXMuc291cmNlc1tsYXllci5kYXRhLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbbGF5ZXIuZGF0YS5zb3VyY2VdLmJ1aWxkc19nZW9tZXRyeV90aWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCB0ZXh0dXJlcyBpbiB0aGUgc2NlbmUgZGVmaW5pdGlvblxuICAgIGxvYWRUZXh0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIFRleHR1cmUuY3JlYXRlRnJvbU9iamVjdCh0aGlzLmdsLCB0aGlzLmNvbmZpZy50ZXh0dXJlcykuXG4gICAgICAgICAgICB0aGVuKCgpID0+IFRleHR1cmUuY3JlYXRlRGVmYXVsdCh0aGlzLmdsKSk7IC8vIGNyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlIGZvciBwbGFjZWhvbGRlcnNcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgKGN1cnJlbnRseSBtYW51YWxseSkgYWZ0ZXIgc3R5bGVzIGFyZSB1cGRhdGVkIGluIHN0eWxlc2hlZXRcbiAgICB1cGRhdGVTdHlsZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCAmJiAhdGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2NlbmUudXBkYXRlU3R5bGVzKCkgY2FsbGVkIGJlZm9yZSBzY2VuZSB3YXMgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIChSZSlidWlsZCBzdHlsZXMgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB0aGlzLnN0eWxlX21hbmFnZXIuYnVpbGQodGhpcy5jb25maWcuc3R5bGVzKTtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmluaXRTdHlsZXModGhpcyk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSBzZXQgR0wgY29udGV4dCAodXNlZCB3aGVuIGluaXRpYWxpemluZyBvciByZS1pbml0aWFsaXppbmcgR0wgcmVzb3VyY2VzKVxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc3R5bGVdLnNldEdMKHRoaXMuZ2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGV4cGxpY2l0bHkgc2V0IHNjZW5lIGFuaW1hdGlvbiBmbGFnIGlmIGRlZmluZWQsIG90aGVyd2lzZSB0dXJuIG9uIGFuaW1hdGlvbiBpZiB0aGVyZSBhcmUgYW55IGFuaW1hdGVkIHN0eWxlc1xuICAgICAgICB0aGlzLmFuaW1hdGVkID1cbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjZW5lLmFuaW1hdGVkICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjZW5lLmFuaW1hdGVkIDpcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnN0eWxlcykuc29tZShzID0+IHRoaXMuc3R5bGVzW3NdLmFuaW1hdGVkKTtcblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LnNldEFjdGl2ZUNhbWVyYShuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbGlnaHRpbmdcbiAgICBjcmVhdGVMaWdodHMoKSB7XG4gICAgICAgIHRoaXMubGlnaHRzID0ge307XG4gICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5jb25maWcubGlnaHRzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmxpZ2h0c1tpXSB8fCB0eXBlb2YgdGhpcy5jb25maWcubGlnaHRzW2ldICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGxpZ2h0ID0gdGhpcy5jb25maWcubGlnaHRzW2ldO1xuICAgICAgICAgICAgbGlnaHQubmFtZSA9IGkucmVwbGFjZSgnLScsICdfJyk7IC8vIGxpZ2h0IG5hbWVzIGFyZSBpbmplY3RlZCBpbiBzaGFkZXJzLCBjYW4ndCBoYXZlIGh5cGhlbnNcbiAgICAgICAgICAgIGxpZ2h0LnZpc2libGUgPSAobGlnaHQudmlzaWJsZSA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICAgICAgaWYgKGxpZ2h0LnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpZ2h0c1tsaWdodC5uYW1lXSA9IExpZ2h0LmNyZWF0ZSh0aGlzLnZpZXcsIGxpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBMaWdodC5pbmplY3QodGhpcy5saWdodHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgc2V0QmFja2dyb3VuZCgpIHtcbiAgICAgICAgbGV0IGJnID0gdGhpcy5jb25maWcuc2NlbmUuYmFja2dyb3VuZDtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0ge307XG4gICAgICAgIGlmIChiZyAmJiBiZy5jb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLmNvbG9yID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihiZy5jb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmJhY2tncm91bmQuY29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZC5jb2xvciA9IFswLCAwLCAwLCAwXTsgLy8gZGVmYXVsdCBiYWNrZ3JvdW5kIFRPRE86IHZhcnkgdy9zY2VuZSBhbHBoYVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgYmFja2dyb3VuZCBpcyBmdWxseSBvcGFxdWUsIHNldCBjYW52YXMgYmFja2dyb3VuZCB0byBtYXRjaFxuICAgICAgICBpZiAodGhpcy5iYWNrZ3JvdW5kLmNvbG9yWzNdID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPVxuICAgICAgICAgICAgICAgIGByZ2JhKCR7dGhpcy5iYWNrZ3JvdW5kLmNvbG9yLm1hcChjID0+IE1hdGguZmxvb3IoYyAqIDI1NSkpLmpvaW4oJywgJyl9KWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbC5jbGVhckNvbG9yKC4uLnRoaXMuYmFja2dyb3VuZC5jb2xvcik7XG4gICAgfVxuXG4gICAgLy8gVHVybiBpbnRyb3NwZWN0aW9uIG1vZGUgb24vb2ZmXG4gICAgc2V0SW50cm9zcGVjdGlvbiAodmFsKSB7XG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IHZhbCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVDb25maWcoKS50aGVuKCgpID0+IHRoaXMudXBkYXRpbmctLSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNjZW5lIGNvbmZpZywgYW5kIG9wdGlvbmFsbHkgcmVidWlsZCBnZW9tZXRyeVxuICAgIC8vIHJlYnVpbGQgY2FuIGJlIGJvb2xlYW4sIG9yIGFuIG9iamVjdCBjb250YWluaW5nIHJlYnVpbGQgb3B0aW9ucyB0byBwYXNzdGhyb3VnaFxuICAgIHVwZGF0ZUNvbmZpZyh7IHJlYnVpbGQgPSB0cnVlLCBzZXJpYWxpemVfZnVuY3MsIGZhZGVfaW4gPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gKytTY2VuZS5nZW5lcmF0aW9uO1xuICAgICAgICB0aGlzLnVwZGF0aW5nKys7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBTY2VuZUxvYWRlci5hcHBseUdsb2JhbFByb3BlcnRpZXModGhpcy5jb25maWcsIHRoaXMuY29uZmlnX2dsb2JhbHNfYXBwbGllZCk7XG4gICAgICAgIFNjZW5lTG9hZGVyLmhvaXN0VGV4dHVyZXModGhpcy5jb25maWcpOyAvLyBtb3ZlIGlubGluZSB0ZXh0dXJlcyBpbnRvIGdsb2JhbCB0ZXh0dXJlIHNldFxuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuaW5pdCgpO1xuICAgICAgICB0aGlzLnZpZXcucmVzZXQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMaWdodHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEYXRhU291cmNlcygpO1xuICAgICAgICB0aGlzLmxvYWRUZXh0dXJlcygpO1xuICAgICAgICB0aGlzLnNldEJhY2tncm91bmQoKTtcbiAgICAgICAgRm9udE1hbmFnZXIubG9hZEZvbnRzKHRoaXMuY29uZmlnLmZvbnRzKTtcblxuICAgICAgICAvLyBUT0RPOiBkZXRlY3QgY2hhbmdlcyB0byBzdHlsZXM/IGFscmVhZHkgKGN1cnJlbnRseSkgbmVlZCB0byByZWNvbXBpbGUgYW55d2F5IHdoZW4gY2FtZXJhIG9yIGxpZ2h0cyBjaGFuZ2VcbiAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoKTtcblxuICAgICAgICAvLyBPcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAgICAgbGV0IGRvbmUgPSByZWJ1aWxkID9cbiAgICAgICAgICAgIHRoaXMucmVidWlsZChPYmplY3QuYXNzaWduKHsgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luIH0sIHR5cGVvZiByZWJ1aWxkID09PSAnb2JqZWN0JyAmJiByZWJ1aWxkKSkgOlxuICAgICAgICAgICAgdGhpcy5zeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgfSk7IC8vIHJlYnVpbGQoKSBhbHNvIHN5bmNzIGNvbmZpZ1xuXG4gICAgICAgIC8vIEZpbmlzaCBieSB1cGRhdGluZyBib3VuZHMgYW5kIHJlLXJlbmRlcmluZ1xuICAgICAgICB0aGlzLnVwZGF0aW5nLS07XG4gICAgICAgIHRoaXMudmlldy51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG5cbiAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIGNvbmZpZyBhbmQgc2VuZCB0byB3b3JrZXJcbiAgICBzeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgPSB0cnVlIH0gPSB7fSkge1xuICAgICAgICAvLyBUZWxsIHdvcmtlcnMgd2UncmUgYWJvdXQgdG8gcmVidWlsZCAoc28gdGhleSBjYW4gdXBkYXRlIHN0eWxlcywgZXRjLilcbiAgICAgICAgdGhpcy5jb25maWdfc2VyaWFsaXplZCA9XG4gICAgICAgICAgICBzZXJpYWxpemVfZnVuY3MgPyBVdGlscy5zZXJpYWxpemVXaXRoRnVuY3Rpb25zKHRoaXMuY29uZmlnKSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnVwZGF0ZUNvbmZpZycsIHtcbiAgICAgICAgICAgIGNvbmZpZzogdGhpcy5jb25maWdfc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGludHJvc3BlY3Rpb246IHRoaXMuaW50cm9zcGVjdGlvblxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMaXN0ZW4gdG8gcmVsYXRlZCBvYmplY3RzXG4gICAgY3JlYXRlTGlzdGVuZXJzICgpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcblxuICAgICAgICB0aGlzLmxpc3RlbmVycy52aWV3ID0ge1xuICAgICAgICAgICAgbW92ZTogKCkgPT4gdGhpcy50cmlnZ2VyKCdtb3ZlJylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy52aWV3LnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy52aWV3KTtcblxuICAgICAgICB0aGlzLmxpc3RlbmVycy50ZXh0dXJlID0ge1xuICAgICAgICAgICAgdXBkYXRlOiAoKSA9PiB0aGlzLmRpcnR5ID0gdHJ1ZSxcbiAgICAgICAgICAgIHdhcm5pbmc6IChkYXRhKSA9PiB0aGlzLnRyaWdnZXIoJ3dhcm5pbmcnLCBPYmplY3QuYXNzaWduKHsgdHlwZTogJ3RleHR1cmVzJyB9LCBkYXRhKSlcbiAgICAgICAgfTtcbiAgICAgICAgVGV4dHVyZS5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudGV4dHVyZSk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2NlbmVfbG9hZGVyID0ge1xuICAgICAgICAgICAgZXJyb3I6IChkYXRhKSA9PiB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgT2JqZWN0LmFzc2lnbih7IHR5cGU6ICdzY2VuZScgfSwgZGF0YSkpXG4gICAgICAgIH07XG4gICAgICAgIFNjZW5lTG9hZGVyLnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIpO1xuICAgIH1cblxuICAgIGRlc3Ryb3lMaXN0ZW5lcnMgKCkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlQWxsKCk7XG4gICAgICAgIHRoaXMudmlldy51bnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy52aWV3KTtcbiAgICAgICAgVGV4dHVyZS51bnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy50ZXh0dXJlKTtcbiAgICAgICAgU2NlbmVMb2FkZXIudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMuc2NlbmVfbG9hZGVyKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBudWxsO1xuICAgIH1cblxuICAgIHJlc2V0RmVhdHVyZVNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgRmVhdHVyZVNlbGVjdGlvbih0aGlzLmdsLCB0aGlzLndvcmtlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMud29ya2Vycykge1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucmVzZXRGZWF0dXJlU2VsZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXRzIHRoZSBjdXJyZW50IGZlYXR1cmUgc2VsZWN0aW9uIG1hcCBzaXplIGFjcm9zcyBhbGwgd29ya2Vycy4gUmV0dXJucyBhIHByb21pc2UuXG4gICAgZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmZldGNoaW5nX3NlbGVjdGlvbl9tYXApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gcmV0dXJuIHVuZGVmaW5lZCBpZiBhbHJlYWR5IHBlbmRpbmdcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZldGNoaW5nX3NlbGVjdGlvbl9tYXAgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5nZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZScpXG4gICAgICAgICAgICAudGhlbihzaXplcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpemVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgaW50ZXJuYWwgY2xvY2ssIG1vc3RseSB1c2VmdWwgZm9yIGNvbnNpc3RlbnQgZXhwZXJpZW5jZSB3aGVuIGNoYW5naW5nIHN0eWxlcy9kZWJ1Z2dpbmdcbiAgICByZXNldFRpbWUoKSB7XG4gICAgICAgIHRoaXMuc3RhcnRfdGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIEZpcmVzIGV2ZW50IHdoZW4gcmVuZGVyZWQgdGlsZSBzZXQgb3Igc3R5bGUgY2hhbmdlc1xuICAgIHVwZGF0ZVZpZXdDb21wbGV0ZSAoKSB7XG4gICAgICAgIGlmICgodGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCB8fCB0aGlzLmdlbmVyYXRpb24gIT09IHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uKSAmJlxuICAgICAgICAgICAgIXRoaXMudGlsZV9tYW5hZ2VyLmlzTG9hZGluZ1Zpc2libGVUaWxlcygpKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbiA9IHRoaXMuZ2VuZXJhdGlvbjtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcigndmlld19jb21wbGV0ZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRWaWV3Q29tcGxldGUgKCkge1xuICAgICAgICB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGFrZSBhIHNjcmVlbnNob3RcbiAgICAvLyBBc3luY2hyb25vdXMgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXQgZm9yIG5leHQgcmVuZGVyIHRvIGNhcHR1cmUgYnVmZmVyXG4gICAgLy8gUmV0dXJucyBhIHByb21pc2VcbiAgICBzY3JlZW5zaG90ICgpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc2NyZWVuc2hvdCgpO1xuICAgIH1cblxuICAgIHN0YXJ0VmlkZW9DYXB0dXJlICgpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc3RhcnRWaWRlb0NhcHR1cmUoKTtcbiAgICB9XG5cbiAgICBzdG9wVmlkZW9DYXB0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFfY2FwdHVyZS5zdG9wVmlkZW9DYXB0dXJlKCk7XG4gICAgfVxuXG5cbiAgICAvLyBTdGF0cy9kZWJ1Zy9wcm9maWxpbmcgbWV0aG9kc1xuXG4gICAgLy8gUHJvZmlsZSBoZWxwZXJzLCBpc3N1ZXMgYSBwcm9maWxlIG9uIG1haW4gdGhyZWFkICYgYWxsIHdvcmtlcnNcbiAgICBfcHJvZmlsZShuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZShgbWFpbiB0aHJlYWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucHJvZmlsZScsIG5hbWUpO1xuICAgIH1cblxuICAgIF9wcm9maWxlRW5kKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlRW5kKGBtYWluIHRocmVhZDogJHtuYW1lfWApO1xuICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5wcm9maWxlRW5kJywgbmFtZSk7XG4gICAgfVxuXG4gICAgLy8gRGVidWcgY29uZmlnIGFuZCBmdW5jdGlvbnNcbiAgICBzZXR1cERlYnVnICgpIHtcbiAgICAgICAgbGV0IHNjZW5lID0gdGhpcztcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IHtcbiAgICAgICAgICAgIC8vIFJlYnVpbGQgZ2VvbWV0cnkgYSBnaXZlbiAjIG9mIHRpbWVzIGFuZCBwcmludCBhdmVyYWdlLCBtaW4sIG1heCB0aW1pbmdzXG4gICAgICAgICAgICB0aW1lUmVidWlsZCAobnVtID0gMSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGN5Y2xlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgc2NlbmUucmVidWlsZChvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzLnB1c2goK25ldyBEYXRlKCkgLSBzdGFydCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lcy5sZW5ndGggPCBudW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF2ZyA9IH5+KHRpbWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpIC8gdGltZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgUHJvZmlsZWQgcmVidWlsZCAke251bX0gdGltZXM6ICR7YXZnfSBhdmcgKCR7TWF0aC5taW4oLi4udGltZXMpfSBtaW4sICR7TWF0aC5tYXgoLi4udGltZXMpfSBtYXgpYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFJldHVybiBnZW9tZXRyeSBjb3VudHMgb2YgdmlzaWJsZSB0aWxlcywgZ3JvdXBlZCBieSBzdHlsZSBuYW1lXG4gICAgICAgICAgICBnZW9tZXRyeUNvdW50QnlTdHlsZSAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50cyA9IHt9O1xuICAgICAgICAgICAgICAgIHNjZW5lLnRpbGVfbWFuYWdlci5nZXRSZW5kZXJhYmxlVGlsZXMoKS5mb3JFYWNoKHRpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0aWxlLm1lc2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzW3N0eWxlXSA9IGNvdW50c1tzdHlsZV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tzdHlsZV0gKz0gdGlsZS5tZXNoZXNbc3R5bGVdLmdlb21ldHJ5X2NvdW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdlb21ldHJ5Q291bnRCeUJhc2VTdHlsZSAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlX2NvdW50cyA9IHNjZW5lLmRlYnVnLmdlb21ldHJ5Q291bnRCeVN0eWxlKCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50cyA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHN0eWxlX2NvdW50cykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHNjZW5lLnN0eWxlc1tzdHlsZV0uYmFzZVN0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50c1tiYXNlXSA9IGNvdW50c1tiYXNlXSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudHNbYmFzZV0gKz0gc3R5bGVfY291bnRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbn1cblxuU2NlbmUuaWQgPSAwOyAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgYSBzY2VuZSBpbnN0YW5jZVxuU2NlbmUuZ2VuZXJhdGlvbiA9IDA7IC8vIGlkIHRoYXQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgc2NlbmUgY29uZmlnIGlzIHJlLXBhcnNlZFxuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuL3V0aWxzL3VybHMnO1xuXG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmV4cG9ydCBjbGFzcyBTY2VuZUJ1bmRsZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHBhdGgsIHBhcmVudCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG5cbiAgICAgICAgLy8gSWYgYSBiYXNlIHBhdGggd2FzIHByb3ZpZGVkLCB1c2UgaXQgZm9yIHJlc29sdmluZyBsb2NhbCBidW5kbGUgcmVzb3VyY2VzIG9ubHkgaWZcbiAgICAgICAgLy8gdGhlIGJhc2UgcGF0aCBpcyBhYnNvbHV0ZSwgb3IgdGhpcyBidW5kbGUncyBwYXRoIGlzIHJlbGF0aXZlXG4gICAgICAgIGlmIChwYXRoICYmICghVVJMcy5pc1JlbGF0aXZlVVJMKHBhdGgpIHx8IFVSTHMuaXNSZWxhdGl2ZVVSTCh0aGlzLnVybCkpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gVVJMcy5wYXRoRm9yVVJMKHRoaXMudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGF0aF9mb3JfcGFyZW50ID0gcGF0aCB8fCB0aGlzLnBhdGg7IC8vIGZvciByZXNvbHZpbmcgcGF0aHMgcmVsYXRpdmUgdG8gYSBwYXJlbnQgYnVuZGxlXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gICAgICAgIC8vIEFuIGFuY2VzdG9yIGJ1bmRsZSBtYXkgYmUgYSBjb250YWluZXIgKGUuZy4gemlwIGZpbGUpIHRoYXQgbmVlZHMgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRoc1xuICAgICAgICAvLyBmb3IgYW55IHNjZW5lcyBpdCBjb250YWlucywgZS5nLiBgcm9vdC56aXBgIGhhcyBhIGByb290LnlhbWxgIHRoYXQgaW5jbHVkZXMgYSBgZm9sZGVyL2NoaWxkLnlhbWxgOlxuICAgICAgICAvLyByZXNvdXJjZXMgd2l0aGluIGBjaGlsZC55YW1sYCBtdXN0IGJlIHJlc29sdmVkIHRocm91Z2ggdGhlIGJ1bmRsZSBmb3IgYHJvb3QuemlwYFxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQuY29udGFpbmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQuaXNDb250YWluZXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gbG9hZFJlc291cmNlKHRoaXMudXJsKTtcbiAgICB9XG5cbiAgICAvLyBJbmZvIGZvciByZXRyaWV2aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgZnJvbSB0aGlzIGJ1bmRsZVxuICAgIC8vIHVybDogZnVsbHkgcXVhbGlmaWVkIFVSTCB0byByZXRyaWV2ZSB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UgKGUuZy4gemlwcyB3aWxsIHRyYW5zZm9ybSB0aGlzIHRvIGJsb2IgVVJMKVxuICAgIC8vIHBhdGg6IG9yaWdpbmFsIHBhdGggb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgYnVuZGxlIChmb3IgcmVzb2x2aW5nIHBhdGhzIHVwIHRoZSBidW5kbGUgdHJlZSlcbiAgICAvLyB0eXBlOiBmaWxlIGV4dGVuc2lvbiAodXNlZCBmb3IgZGV0ZXJtaW5pbmcgYnVuZGxlIHR5cGUsIGB5YW1sYCBvciBgemlwYClcbiAgICByZXNvdXJjZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVybDogdGhpcy51cmxGb3IodXJsKSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aEZvcih1cmwpLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlRm9yKHVybClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB1cmxGb3IodXJsKSB7XG4gICAgICAgIGlmIChpc0dsb2JhbCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpICYmIHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQudXJsRm9yKHRoaXMucGF0aF9mb3JfcGFyZW50ICsgdXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVVJMcy5hZGRCYXNlVVJMKHVybCwgdGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgICBwYXRoRm9yKHVybCkge1xuICAgICAgICByZXR1cm4gVVJMcy5wYXRoRm9yVVJMKHVybCk7XG4gICAgfVxuXG4gICAgdHlwZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHVybCk7XG4gICAgfVxuXG4gICAgaXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIFppcFNjZW5lQnVuZGxlIGV4dGVuZHMgU2NlbmVCdW5kbGUge1xuXG4gICAgY29uc3RydWN0b3IodXJsLCBwYXRoLCBwYXJlbnQpIHtcbiAgICAgICAgc3VwZXIodXJsLCBwYXRoLCBwYXJlbnQpO1xuICAgICAgICB0aGlzLnppcCA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXRoID0gJyc7XG4gICAgfVxuXG4gICAgaXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuemlwID0gbmV3IEpTWmlwKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5pbyh0aGlzLnVybCwgNjAwMDAsICdhcnJheWJ1ZmZlcicpXG4gICAgICAgICAgICAgICAgLnRoZW4oYm9keSA9PiB0aGlzLnppcC5sb2FkQXN5bmMoYm9keSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wYXJzZVppcEZpbGVzKCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5sb2FkUm9vdCgpKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IFByb21pc2UucmVqZWN0KGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cmxGb3IodXJsKSB7XG4gICAgICAgIGlmIChpc0dsb2JhbCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cmxGb3JaaXBGaWxlKFVSTHMuZmxhdHRlblJlbGF0aXZlVVJMKHVybCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci51cmxGb3IodXJsKTtcbiAgICB9XG5cbiAgICB0eXBlRm9yKHVybCkge1xuICAgICAgICBpZiAoVVJMcy5pc1JlbGF0aXZlVVJMKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVGb3JaaXBGaWxlKHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnR5cGVGb3IodXJsKTtcbiAgICB9XG5cbiAgICBsb2FkUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJvb3QoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gbG9hZFJlc291cmNlKHRoaXMudXJsRm9yWmlwRmlsZSh0aGlzLnJvb3QpKSk7XG4gICAgfVxuXG4gICAgZmluZFJvb3QoKSB7XG4gICAgICAgIC8vIFRoZXJlIG11c3QgYmUgYSBzaW5nbGUgWUFNTCBmaWxlIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHppcFxuICAgICAgICBjb25zdCB5YW1scyA9IE9iamVjdC5rZXlzKHRoaXMuZmlsZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHBhdGggPT4gdGhpcy5maWxlc1twYXRoXS5kZXB0aCA9PT0gMClcbiAgICAgICAgICAgIC5maWx0ZXIocGF0aCA9PiBVUkxzLmV4dGVuc2lvbkZvclVSTChwYXRoKSA9PT0gJ3lhbWwnKTtcblxuICAgICAgICBpZiAoeWFtbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSB5YW1sc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIHJvb3QgZm91bmRcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcm9vdCBzY2VuZSBmb3IgYnVuZGxlICcke3RoaXMudXJsfSc6IGA7XG4gICAgICAgICAgICBtc2cgKz0gYFRoZSB6aXAgYXJjaGl2ZSdzIHJvb3QgbGV2ZWwgbXVzdCBjb250YWluIGEgc2luZ2xlIHNjZW5lIGZpbGUgd2l0aCB0aGUgJy55YW1sJyBleHRlbnNpb24uIGA7XG4gICAgICAgICAgICBpZiAoeWFtbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG1zZyArPSBgRm91bmQgbXVsdGlwbGUgWUFNTCBmaWxlcyBhdCB0aGUgcm9vdCBsZXZlbDogJHt5YW1scy5tYXAociA9PiAnXFwnJyArIHIgKyAnXFwnJyApLmpvaW4oJywgJyl9LmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYEZvdW5kIE5PIFlBTUwgZmlsZXMgYXQgdGhlIHJvb3QgbGV2ZWwuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcGFyc2VaaXBGaWxlcygpIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW107XG4gICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLnppcC5mb3JFYWNoKChwYXRoLCBmaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpbGUuZGlyKSB7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKGZpbGUuYXN5bmMoJ2FycmF5YnVmZmVyJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocXVldWUpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGggPSBwYXRoLnNwbGl0KCcvJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3BhdGhdID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBVUkxzLmV4dGVuc2lvbkZvclVSTChwYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGhcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cmxGb3JaaXBGaWxlKGZpbGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsZXNbZmlsZV0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlc1tmaWxlXS51cmwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW2ZpbGVdLnVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aGlzLmZpbGVzW2ZpbGVdLmRhdGFdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVzW2ZpbGVdLnVybDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHR5cGVGb3JaaXBGaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZXNbZmlsZV0gJiYgdGhpcy5maWxlc1tmaWxlXS50eXBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQsIHR5cGUgPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICd6aXAnIHx8ICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBVUkxzLmV4dGVuc2lvbkZvclVSTCh1cmwpID09PSAnemlwJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBaaXBTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQpO1xufVxuXG4vLyBSZWZlcmVuY2VzIGEgZ2xvYmFsIHByb3BlcnR5P1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYmFsICh2YWwpIHtcbiAgICBpZiAodmFsICYmIHZhbC5zbGljZSgwLCA3KSA9PT0gJ2dsb2JhbC4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVzb3VyY2UgKGJvZHkpIHtcbiAgICB2YXIgZGF0YTtcbiAgICB0cnkge1xuICAgICAgICAvLyBqc3lhbWwgJ2pzb24nIG9wdGlvbiBhbGxvd3MgZHVwbGljYXRlIGtleXNcbiAgICAgICAgLy8gS2VlcGluZyB0aGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IHNob3VsZCBjb25zaWRlciBtaWdyYXRpbmcgdG8gcmVxdWlyaW5nXG4gICAgICAgIC8vIHVuaXF1ZSBrZXlzLCBhcyB0aGlzIGlzIFlBTUwgc3BlYy4gQnV0IFRhbmdyYW0gRVMgY3VycmVudGx5IGFjY2VwdHMgZHVwZSBrZXlzIGFzIHdlbGwsXG4gICAgICAgIC8vIHNvIHNob3VsZCBjb25zaWRlciBob3cgYmVzdCB0byB1bmlmeS5cbiAgICAgICAgZGF0YSA9IHlhbWwuc2FmZUxvYWQoYm9keSwgeyBqc29uOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGxvYWRSZXNvdXJjZSAoc291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBVdGlscy5pbyhzb3VyY2UpLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHBhcnNlUmVzb3VyY2UoYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IHtjcmVhdGVTY2VuZUJ1bmRsZSwgaXNHbG9iYWx9IGZyb20gJy4vc2NlbmVfYnVuZGxlJztcblxudmFyIFNjZW5lTG9hZGVyO1xuXG5leHBvcnQgZGVmYXVsdCBTY2VuZUxvYWRlciA9IHtcblxuICAgIC8vIExvYWQgc2NlbmVzIGRlZmluaXRpb25zIGZyb20gVVJMICYgcHJvcHJvY2Vzc1xuICAgIGxvYWRTY2VuZSh1cmwsIHBhdGggPSBudWxsKSB7XG4gICAgICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFNjZW5lUmVjdXJzaXZlKHsgdXJsLCBwYXRoIH0sIG51bGwsIGVycm9ycykuXG4gICAgICAgICAgICB0aGVuKHJlc3VsdCA9PiB0aGlzLmZpbmFsaXplKHJlc3VsdCkpLlxuICAgICAgICAgICAgdGhlbigoeyBjb25maWcsIGJ1bmRsZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcm9vdCBzY2VuZSBmYWlsZWQgdG8gbG9hZCwgcmVqZWN0IHdpdGggZmlyc3QgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yc1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNjZW5lIGxvYWRlZCwgYnV0IHNvbWUgaW1wb3J0cyBoYWQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYEZhaWxlZCB0byBpbXBvcnQgc2NlbmU6ICR7ZXJyb3IudXJsfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHsgdHlwZTogJ3NjZW5lX2ltcG9ydCcsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IGVycm9yLnVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGNvbmZpZywgYnVuZGxlIH07XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZHMgc2NlbmUgZmlsZXMgZnJvbSBVUkwsIHJlY3Vyc2l2ZWx5IGxvYWRpbmcgJ2ltcG9ydCcgc2NlbmVzXG4gICAgLy8gT3B0aW9uYWwgKmluaXRpYWwqIHBhdGggb25seSAod29uJ3QgYmUgcGFzc2VkIHRvIHJlY3Vyc2l2ZSAnaW1wb3J0JyBjYWxscylcbiAgICAvLyBVc2VmdWwgZm9yIGxvYWRpbmcgcmVzb3VyY2VzIGluIGJhc2Ugc2NlbmUgZmlsZSBmcm9tIGEgc2VwYXJhdGUgbG9jYXRpb25cbiAgICAvLyAoZS5nLiBpbiBUYW5ncmFtIFBsYXksIHdoZW4gbW9kaWZpZWQgbG9jYWwgc2NlbmUgc2hvdWxkIHN0aWxsIHJlZmVyIHRvIG9yaWdpbmFsIHJlc291cmNlIFVSTHMpXG4gICAgbG9hZFNjZW5lUmVjdXJzaXZlKHsgdXJsLCBwYXRoLCB0eXBlIH0sIHBhcmVudCwgZXJyb3JzID0gW10pIHtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1bmRsZSA9IGNyZWF0ZVNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50LCB0eXBlKTtcblxuICAgICAgICByZXR1cm4gYnVuZGxlLmxvYWQoKS50aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmltcG9ydCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWNjZXB0IHNpbmdsZSBlbnRyeSBvciBhcnJheVxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5pbXBvcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmltcG9ydCA9IFtjb25maWcuaW1wb3J0XTsgLy8gY29udmVydCB0byBhcnJheVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb2xsZWN0IFVSTHMgb2Ygc2NlbmVzIHRvIGltcG9ydFxuICAgICAgICAgICAgbGV0IGltcG9ydHMgPSBbXTtcbiAgICAgICAgICAgIGNvbmZpZy5pbXBvcnQuZm9yRWFjaCh1cmwgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgc2NlbmUgb2JqZWN0cyB0byBVUkxzXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeSh1cmwpXSkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGltcG9ydHMucHVzaChidW5kbGUucmVzb3VyY2VGb3IodXJsKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuaW1wb3J0OyAvLyBkb24ndCB3YW50IHRvIG1lcmdlIHRoaXMgcHJvcGVydHlcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuXG4gICAgICAgICAgICAgICAgYWxsKGltcG9ydHMubWFwKHJlc291cmNlID0+IHRoaXMubG9hZFNjZW5lUmVjdXJzaXZlKHJlc291cmNlLCBidW5kbGUsIGVycm9ycykpKS5cbiAgICAgICAgICAgICAgICAgICAgdGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25maWdzID0gcmVzdWx0cy5tYXAociA9PiByLmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZU9iamVjdHMoe30sIC4uLmNvbmZpZ3MsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCBzY2VuZSBsb2FkIGVycm9ycyBhcyB3ZSBnb1xuICAgICAgICAgICAgZXJyb3IudXJsID0gdXJsO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTm9ybWFsaXplIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgYWRqdXN0IHdpdGhpbiBlYWNoIGxvY2FsIHNjZW5lIGZpbGUgKHVzdWFsbHkgYnkgcGF0aClcbiAgICBub3JtYWxpemUoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVEYXRhU291cmNlcyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRm9udHMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZVRleHR1cmVzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgcmV0dXJuIHsgY29uZmlnLCBidW5kbGUgfTtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGZvciBkYXRhIHNvdXJjZVxuICAgIG5vcm1hbGl6ZURhdGFTb3VyY2VzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy5zb3VyY2VzID0gY29uZmlnLnNvdXJjZXMgfHwge307XG5cbiAgICAgICAgZm9yIChsZXQgc24gaW4gY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplRGF0YVNvdXJjZShjb25maWcuc291cmNlc1tzbl0sIGJ1bmRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICBub3JtYWxpemVEYXRhU291cmNlKHNvdXJjZSwgYnVuZGxlKSB7XG4gICAgICAgIHNvdXJjZS51cmwgPSBidW5kbGUudXJsRm9yKHNvdXJjZS51cmwpO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZS5zY3JpcHRzKSkge1xuICAgICAgICAgICAgc291cmNlLnNjcmlwdHMgPSBzb3VyY2Uuc2NyaXB0cy5tYXAodXJsID0+IGJ1bmRsZS51cmxGb3IodXJsKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgZm9yIGZvbnRzXG4gICAgbm9ybWFsaXplRm9udHMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLmZvbnRzID0gY29uZmlnLmZvbnRzIHx8IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGZhbWlseSBpbiBjb25maWcuZm9udHMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5mb250c1tmYW1pbHldKSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5mb250c1tmYW1pbHldLmZvckVhY2goZmFjZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZhY2UudXJsID0gZmFjZS51cmwgJiYgYnVuZGxlLnVybEZvcihmYWNlLnVybCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZmFjZSA9IGNvbmZpZy5mb250c1tmYW1pbHldO1xuICAgICAgICAgICAgICAgIGZhY2UudXJsID0gZmFjZS51cmwgJiYgYnVuZGxlLnVybEZvcihmYWNlLnVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgYW5kIGNlbnRyYWxpemUgdGV4dHVyZSBkZWZpbml0aW9ucyBmb3IgYSBzY2VuZSBvYmplY3RcbiAgICBub3JtYWxpemVUZXh0dXJlcyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcudGV4dHVyZXMgPSBjb25maWcudGV4dHVyZXMgfHwge307XG5cbiAgICAgICAgLy8gQWRkIGN1cnJlbnQgc2NlbmUncyBiYXNlIHBhdGggdG8gZ2xvYmFsbHkgZGVmaW5lZCB0ZXh0dXJlc1xuICAgICAgICAvLyBPbmx5IGFkZHMgcGF0aCBmb3IgdGV4dHVyZXMgd2l0aCByZWxhdGl2ZSBVUkxzLCBzbyB0ZXh0dXJlcyBpbiBpbXBvcnRlZCBzY2VuZXMgZ2V0IHRoZSBiYXNlXG4gICAgICAgIC8vIHBhdGggb2YgdGhlaXIgaW1tZWRpYXRlIHNjZW5lIGZpbGVcbiAgICAgICAgaWYgKGNvbmZpZy50ZXh0dXJlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgdG4gaW4gY29uZmlnLnRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBjb25maWcudGV4dHVyZXNbdG5dO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlLnVybCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLnVybCA9IGJ1bmRsZS51cmxGb3IodGV4dHVyZS51cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgVVJMcyBmb3IgaW5saW5lIHRleHR1cmVzXG4gICAgICAgIGlmIChjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzbiBpbiBjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gY29uZmlnLnN0eWxlc1tzbl07XG5cbiAgICAgICAgICAgICAgICAvLyBTdHlsZSBgdGV4dHVyZWBcbiAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUudGV4dHVyZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdICYmICFpc0dsb2JhbCh0ZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleHR1cmUgPSBidW5kbGUudXJsRm9yKHRleCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInLCAnbm9ybWFsJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsIHByb3BlcnR5IGhhcyBhIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS5tYXRlcmlhbFtwcm9wXSAhPSBudWxsICYmIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdICYmICFpc0dsb2JhbCh0ZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZSA9IGJ1bmRsZS51cmxGb3IodGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2hhZGVyIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBHTFNMLnBhcnNlVW5pZm9ybXMoc3R5bGUuc2hhZGVycy51bmlmb3JtcykuZm9yRWFjaCgoe3R5cGUsIHZhbHVlLCBrZXksIHVuaWZvcm1zfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGV4dHVyZSBieSBVUkwgKHN0cmluZy1uYW1lZCB0ZXh0dXJlIG5vdCByZWZlcmVuY2luZyBleGlzdGluZyB0ZXh0dXJlIGRlZmluaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NhbXBsZXIyRCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3ZhbHVlXSAmJiAhaXNHbG9iYWwodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNba2V5XSA9IGJ1bmRsZS51cmxGb3IodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBTdWJzdGl0dXRlcyBnbG9iYWwgc2NlbmUgcHJvcGVydGllcyAodGhvc2UgZGVmaW5lZCBpbiB0aGUgYGNvbmZpZy5nbG9iYWxgIG9iamVjdCkgZm9yIGFueSBzdHlsZSB2YWx1ZXNcbiAgICAvLyBvZiB0aGUgZm9ybSBgZ2xvYmFsLmAsIGZvciBleGFtcGxlIGBjb2xvcjogZ2xvYmFsLnBhcmtfY29sb3JgIHdvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIChpZiBhbnkpXG4gICAgLy8gZGVmaW5lZCBmb3IgdGhlIGBwYXJrX2NvbG9yYCBwcm9wZXJ0eSBpbiBgY29uZmlnLmdsb2JhbC5wYXJrX2NvbG9yYC5cbiAgICBhcHBseUdsb2JhbFByb3BlcnRpZXMoY29uZmlnLCBhcHBsaWVkKSB7XG4gICAgICAgIGlmICghY29uZmlnLmdsb2JhbCB8fCBPYmplY3Qua2V5cyhjb25maWcuZ2xvYmFsKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWc7IC8vIG5vIGdsb2JhbCBwcm9wZXJ0aWVzIHRvIHRyYW5zZm9ybVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2UgcHJvcGVydGllcyBmcm9tIGdsb2JhbHNcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gJzonO1xuICAgICAgICBjb25zdCBwcm9wcyA9IGZsYXR0ZW5Qcm9wZXJ0aWVzKGNvbmZpZy5nbG9iYWwsIHNlcGFyYXRvcik7XG5cbiAgICAgICAgLy8gUmUtYXBwbHkgcHJldmlvdXNseSBhcHBsaWVkIHByb3BlcnRpZXNcbiAgICAgICAgLy8gTkI6IGEgY3VycmVudCBzaG9ydGNvbWluZyBoZXJlIGlzIHRoYXQgeW91IGNhbm5vdCBcInVuLWxpbmtcIiBhIHRhcmdldCBwcm9wZXJ0eSBmcm9tIGEgZ2xvYmFsXG4gICAgICAgIC8vIGF0IHJ1bi10aW1lLiBPbmNlIGEgZ2xvYmFsIHByb3BlcnR5IHN1YnN0aXR1dGlvbiBoYXMgYmVlbiByZWNvcmRlcmQsIGl0IHdpbGwgYWx3YXlzIGJlIHJlLWFwcGxpZWRcbiAgICAgICAgLy8gb24gc3Vic2VxdWVudCBzY2VuZSB1cGRhdGVzLCBldmVuIGlmIHRoZSB0YXJnZXQgcHJvcGVydHkgd2FzIHVwZGF0ZWQgdG8gYW5vdGhlciBsaXRlcmFsIHZhbHVlLlxuICAgICAgICAvLyBUaGlzIGlzIHVubGlrZWx5IHRvIGJlIGEgY29tbW9uIG9jY3VycmVuY2UgYW4gYWNjZXB0YWJsZSBsaW1pdGF0aW9uIGZvciBub3cuXG4gICAgICAgIGFwcGxpZWQuZm9yRWFjaCgoeyBwcm9wLCB0YXJnZXQsIGtleSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ2luZm8nLCBgUmUtYXBwbHlpbmcgJHtwcm9wfSB3aXRoIHZhbHVlICR7cHJvcHNbcHJvcF19IHRvIGtleSAke2tleX0gaW5gLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaW5kIGFuZCBhcHBseSBuZXcgcHJvcGVydGllc1xuICAgICAgICBmdW5jdGlvbiBhcHBseVByb3BzIChvYmosIHRhcmdldCwga2V5KSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZ1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IChvYmouc2xpY2UoMCwgNykgPT09ICdnbG9iYWwuJykgJiYgKG9iai5zbGljZSg3KS5yZXBsYWNlKC9cXC4vZywgc2VwYXJhdG9yKSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgJiYgcHJvcHNbcHJvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHJlY29yZCBvZiB3aGVyZSBwcm9wZXJ0eSBpcyBhcHBsaWVkXG4gICAgICAgICAgICAgICAgICAgIGFwcGxpZWQucHVzaCh7IHByb3AsIHRhcmdldCwga2V5IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IHByb3BzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICBvYmpbcF0gPSBhcHBseVByb3BzKG9ialtwXSwgb2JqLCBwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGx5UHJvcHMoY29uZmlnKTtcbiAgICB9LFxuXG4gICAgLy8gTW92ZSBpbmxpbmUgKFVSTCBzdHJpbmcpIHRleHR1cmVzIHRvIHRoZSBzY2VuZSdzIHRvcC1sZXZlbCBzZXQgb2YgdGV4dHVyZXMgKGNvbmZpZy50ZXh0dXJlcykuXG4gICAgLy8gVGhlcmUgYXJlIDMgc3VjaCBjYXNlcyBvZiB0ZXh0dXJlczpcbiAgICAvLyAtIGluIGEgc3R5bGUncyBgdGV4dHVyZWAgcHJvcGVydHlcbiAgICAvLyAtIGluIGEgc3R5bGUncyBgbWF0ZXJpYWxgIHByb3BlcnRpZXNcbiAgICAvLyAtIGluIGEgc3R5bGUncyBjdXN0b20gdW5pZm9ybXMgKGBzaGFkZXJzLnVuaWZvcm1zYClcbiAgICBob2lzdFRleHR1cmVzIChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNuIGluIGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBjb25maWcuc3R5bGVzW3NuXTtcblxuICAgICAgICAgICAgICAgIC8vIFN0eWxlIGB0ZXh0dXJlYFxuICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRleDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpc0dsb2JhbCh1cmwpID8gYHRleHR1cmUtJHt1cmx9YCA6IHVybDtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRleHR1cmVzW25hbWVdID0geyB1cmwgfTtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4dHVyZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInLCAnbm9ybWFsJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsIHByb3BlcnR5IGhhcyBhIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS5tYXRlcmlhbFtwcm9wXSAhPSBudWxsICYmIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGlzR2xvYmFsKHVybCkgPyBgdGV4dHVyZS0ke3VybH1gIDogdXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1tuYW1lXSA9IHsgdXJsIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNoYWRlciB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgR0xTTC5wYXJzZVVuaWZvcm1zKHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpLmZvckVhY2goKHt0eXBlLCB2YWx1ZSwga2V5LCB1bmlmb3Jtc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgYnkgVVJMIChzdHJpbmctbmFtZWQgdGV4dHVyZSBub3QgcmVmZXJlbmNpbmcgZXhpc3RpbmcgdGV4dHVyZSBkZWZpbml0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzYW1wbGVyMkQnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpc0dsb2JhbCh1cmwpID8gYHRleHR1cmUtJHt1cmx9YCA6IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbbmFtZV0gPSB7IHVybCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW2tleV0gPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gTm9ybWFsaXplIHNvbWUgc2NlbmUtd2lkZSBzZXR0aW5ncyB0aGF0IGFwcGx5IHRvIHRoZSBmaW5hbCwgbWVyZ2VkIHNjZW5lXG4gICAgZmluYWxpemUoeyBjb25maWcsIGJ1bmRsZSB9KSB7XG4gICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdG9wLWxldmVsIHByb3BlcnRpZXNcbiAgICAgICAgY29uZmlnLnNjZW5lID0gY29uZmlnLnNjZW5lIHx8IHt9O1xuICAgICAgICBjb25maWcuY2FtZXJhcyA9IGNvbmZpZy5jYW1lcmFzIHx8IHt9O1xuICAgICAgICBjb25maWcubGlnaHRzID0gY29uZmlnLmxpZ2h0cyB8fCB7fTtcbiAgICAgICAgY29uZmlnLnN0eWxlcyA9IGNvbmZpZy5zdHlsZXMgfHwge307XG4gICAgICAgIGNvbmZpZy5sYXllcnMgPSBjb25maWcubGF5ZXJzIHx8IHt9O1xuXG4gICAgICAgIC8vIElmIG9ubHkgb25lIGNhbWVyYSBzcGVjaWZpZWQsIHNldCBpdCBhcyBkZWZhdWx0XG4gICAgICAgIGlmIChjb25maWcuY2FtZXJhKSB7XG4gICAgICAgICAgICBjb25maWcuY2FtZXJhcy5kZWZhdWx0ID0gY29uZmlnLmNhbWVyYTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGNhbWVyYXMgc3BlY2lmaWVkLCBjcmVhdGUgb25lXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcuY2FtZXJhcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25maWcuY2FtZXJhcy5kZWZhdWx0ID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBsaWdodHMgc3BlY2lmaWVkLCBjcmVhdGUgZGVmYXVsdFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLmxpZ2h0cykubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcubGlnaHRzKS5ldmVyeShpID0+IGNvbmZpZy5saWdodHNbaV0udmlzaWJsZSA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICBjb25maWcubGlnaHRzLmRlZmF1bHRfbGlnaHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2RpcmVjdGlvbmFsJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGNvbmZpZywgYnVuZGxlIH07XG4gICAgfVxuXG59O1xuXG4vLyBGbGF0dGVuIG5lc3RlZCBwcm9wZXJ0aWVzIGZvciBzaW1wbGVyIHN0cmluZyBsb29rLXVwc1xuLy8gZS5nLiBnbG9iYWwuYmFja2dyb3VuZC5jb2xvciAtPiAnZ2xvYmFsOmJhY2tncm91bmQ6Y29sb3InXG5mdW5jdGlvbiBmbGF0dGVuUHJvcGVydGllcyAob2JqLCBzZXBhcmF0b3IgPSAnOicsIHByZWZpeCA9IG51bGwsIHByb3BzID0ge30pIHtcbiAgICBwcmVmaXggPSBwcmVmaXggPyAocHJlZml4ICsgc2VwYXJhdG9yKSA6ICcnO1xuXG4gICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgbGV0IGtleSA9IHByZWZpeCArIHA7XG4gICAgICAgIGxldCB2YWwgPSBvYmpbcF07XG4gICAgICAgIHByb3BzW2tleV0gPSB2YWw7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5Qcm9wZXJ0aWVzKHZhbCwgc2VwYXJhdG9yLCBrZXksIHByb3BzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHM7XG59XG5cbnN1YnNjcmliZU1peGluKFNjZW5lTG9hZGVyKTtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge3BhcnNlTGF5ZXJzfSBmcm9tICcuL3N0eWxlcy9sYXllcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5leHBvcnQgdmFyIFNjZW5lV29ya2VyID0gc2VsZjtcblxuLy8gV29ya2VyIGZ1bmN0aW9uYWxpdHkgd2lsbCBvbmx5IGJlIGRlZmluZWQgaW4gd29ya2VyIHRocmVhZFxuaWYgKFRocmVhZC5pc193b3JrZXIpIHtcblxuT2JqZWN0LmFzc2lnbihzZWxmLCB7XG5cbiAgICBGZWF0dXJlU2VsZWN0aW9uLFxuXG4gICAgc291cmNlczoge30sXG4gICAgc3R5bGVzOiB7fSxcbiAgICBsYXllcnM6IHt9LFxuICAgIHRpbGVzOiB7fSxcbiAgICBvYmplY3RzOiB7fSxcbiAgICBjb25maWc6IHt9LCAgICAgLy8gcmF3IGNvbmZpZyAoZS5nLiBmdW5jdGlvbnMsIGV0Yy4gbm90IGV4cGFuZGVkKVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB3b3JrZXJcbiAgICBpbml0IChzY2VuZV9pZCwgd29ya2VyX2lkLCBudW1fd29ya2VycywgbG9nX2xldmVsLCBkZXZpY2VfcGl4ZWxfcmF0aW8pIHtcbiAgICAgICAgc2VsZi5zY2VuZV9pZCA9IHNjZW5lX2lkO1xuICAgICAgICBzZWxmLl93b3JrZXJfaWQgPSB3b3JrZXJfaWQ7XG4gICAgICAgIHNlbGYubnVtX3dvcmtlcnMgPSBudW1fd29ya2VycztcbiAgICAgICAgbG9nLnNldExldmVsKGxvZ19sZXZlbCk7XG4gICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5zZXRQcmVmaXgoc2VsZi5fd29ya2VyX2lkKTtcbiAgICAgICAgc2VsZi5zdHlsZV9tYW5hZ2VyID0gbmV3IFN0eWxlTWFuYWdlcigpO1xuICAgICAgICByZXR1cm4gd29ya2VyX2lkO1xuICAgIH0sXG5cbiAgICAvLyBTdGFydHMgYSBjb25maWcgcmVmcmVzaFxuICAgIHVwZGF0ZUNvbmZpZyAoeyBjb25maWcsIGdlbmVyYXRpb24sIGludHJvc3BlY3Rpb24gfSkge1xuICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZyk7XG5cbiAgICAgICAgc2VsZi5sYXN0X2NvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgc2VsZi5jb25maWcpO1xuICAgICAgICBzZWxmLmNvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgY29uZmlnKTtcbiAgICAgICAgc2VsZi5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjtcbiAgICAgICAgc2VsZi5pbnRyb3NwZWN0aW9uID0gaW50cm9zcGVjdGlvbjtcblxuICAgICAgICAvLyBEYXRhIGJsb2NrIGZ1bmN0aW9ucyBhcmUgbm90IGNvbnRleHQgd3JhcHBlZCBsaWtlIHRoZSByZXN0IG9mIHRoZSBzdHlsZSBmdW5jdGlvbnMgYXJlXG4gICAgICAgIC8vIFRPRE86IHByb2JhYmx5IHdhbnQgYSBjbGVhbmVyIHdheSB0byBleGNsdWRlIHRoZXNlXG4gICAgICAgIGZvciAobGV0IGxheWVyIGluIGNvbmZpZy5sYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcubGF5ZXJzW2xheWVyXSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5sYXllcnNbbGF5ZXJdLmRhdGEgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLmxheWVyc1tsYXllcl0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHBhbmQgZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgICAgc2VsZi5nbG9iYWwgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLmdsb2JhbCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGRhdGEgc291cmNlc1xuICAgICAgICBzZWxmLmNyZWF0ZURhdGFTb3VyY2VzKGNvbmZpZyk7XG5cbiAgICAgICAgLy8gRXhwYW5kIHN0eWxlc1xuICAgICAgICBjb25maWcuc3R5bGVzID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5zdHlsZXMsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG4gICAgICAgIHNlbGYuc3R5bGVzID0gc2VsZi5zdHlsZV9tYW5hZ2VyLmJ1aWxkKGNvbmZpZy5zdHlsZXMpO1xuICAgICAgICBzZWxmLnN0eWxlX21hbmFnZXIuaW5pdFN0eWxlcyh7XG4gICAgICAgICAgICBnZW5lcmF0aW9uOiBzZWxmLmdlbmVyYXRpb24sXG4gICAgICAgICAgICBzdHlsZXM6IHNlbGYuc3R5bGVzLFxuICAgICAgICAgICAgc291cmNlczogc2VsZi5zb3VyY2VzLFxuICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogc2VsZi5pbnRyb3NwZWN0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBhcnNlIGVhY2ggdG9wLWxldmVsIGxheWVyIGFzIGEgc2VwYXJhdGUgdHJlZVxuICAgICAgICBzZWxmLmxheWVycyA9IHBhcnNlTGF5ZXJzKGNvbmZpZy5sYXllcnMsIHNlbGYuc3R5bGVfbWFuYWdlci5zdHlsZXMpO1xuXG4gICAgICAgIC8vIFN5bmMgdGV0eHVyZSBpbmZvIGZyb20gbWFpbiB0aHJlYWRcbiAgICAgICAgc2VsZi5zeW5jaW5nX3RleHR1cmVzID0gc2VsZi5zeW5jVGV4dHVyZXMoY29uZmlnLnRleHR1cmVzKTtcblxuICAgICAgICAvLyBSZXR1cm4gcHJvbWlzZSBmb3Igd2hlbiBjb25maWcgcmVmcmVzaCBmaW5pc2hlc1xuICAgICAgICBzZWxmLmNvbmZpZ3VyaW5nID0gc2VsZi5zeW5jaW5nX3RleHR1cmVzLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGB1cGRhdGVkIGNvbmZpZ2ApO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gQ3JlYXRlIGRhdGEgc291cmNlcyBhbmQgY2xlYXIgdGlsZSBjYWNoZSBpZiBuZWNlc3NhcnlcbiAgICBjcmVhdGVEYXRhU291cmNlcyAoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5zb3VyY2VzID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5zb3VyY2VzKTsgLy8gcGFyc2UgbmV3IHNvdXJjZXNcbiAgICAgICAgc2VsZi5zb3VyY2VzID0ge307IC8vIGNsZWFyIHByZXZpb3VzIHNvdXJjZXNcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc291cmNlID0gRGF0YVNvdXJjZS5jcmVhdGUoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLnNvdXJjZXNbbmFtZV0sIHtuYW1lfSksIHNlbGYuc291cmNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLnNvdXJjZXNbbmFtZV0gPSBzb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aWxlIGNhY2hlIGlmIGRhdGEgc291cmNlIGNvbmZpZyBjaGFuZ2VkXG4gICAgICAgIGlmICghc2VsZi5jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgIXNlbGYubGFzdF9jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2VsZi5jb25maWcuc291cmNlcykuc29tZShzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VsZi5jb25maWcuc291cmNlc1tzXSkgIT09IEpTT04uc3RyaW5naWZ5KHNlbGYubGFzdF9jb25maWcuc291cmNlc1tzXSk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc2VsZi50aWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2hlbiBjb25maWcgcmVmcmVzaCBpcyBmaW5pc2hlZFxuICAgIGF3YWl0Q29uZmlndXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNvbmZpZ3VyaW5nO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBhIHRpbGU6IGxvYWQgZnJvbSB0aWxlIHNvdXJjZSBpZiBidWlsZGluZyBmb3IgZmlyc3QgdGltZSwgb3RoZXJ3aXNlIHJlYnVpbGQgd2l0aCBleGlzdGluZyBkYXRhXG4gICAgYnVpbGRUaWxlICh7IHRpbGUgfSkge1xuICAgICAgICAvLyBUaWxlIGNhY2hlZD9cbiAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBsb2FkaW5nP1xuICAgICAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkubG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aWxlIGNhY2hlXG4gICAgICAgIHRpbGUgPSBzZWxmLnRpbGVzW3RpbGUua2V5XSA9IE9iamVjdC5hc3NpZ24oc2VsZi5nZXRUaWxlKHRpbGUua2V5KSB8fCB7fSwgdGlsZSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbmZpZyAoc3R5bGVzLCBldGMuKSwgdGhlbiBidWlsZCB0aWxlXG4gICAgICAgIHJldHVybiBzZWxmLmF3YWl0Q29uZmlndXJhdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBidWlsZGluZyB0aGUgdGlsZVxuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGVkICE9PSB0cnVlKSB7XG5cbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBzZWxmLmxvYWRUaWxlU291cmNlRGF0YSh0aWxlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmdldFRpbGUodGlsZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBhZnRlciBkYXRhIHNvdXJjZSBsb2FkIGJlY2F1c2UgdGlsZSB3YXMgcmVtb3ZlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIGNvbnRpbnVlIG9uIGRhdGEgc291cmNlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgdGlsZSBsb2FkIGVycm9yKHMpIGZvciAke3RpbGUua2V5fTogJHt0aWxlLnNvdXJjZV9kYXRhLmVycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgVGlsZS5idWlsZEdlb21ldHJ5KHRpbGUsIHNlbGYpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgYHRpbGUgbG9hZCBlcnJvciBmb3IgJHt0aWxlLmtleX06ICR7dGlsZS5lcnJvcn1gKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShgVGlsZU1hbmFnZXJfJHtzZWxmLnNjZW5lX2lkfS5idWlsZFRpbGVFcnJvcmAsIFRpbGUuc2xpY2UodGlsZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGlsZSBhbHJlYWR5IGxvYWRlZCwganVzdCByZWJ1aWxkXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHVzZWQgd29ya2VyIGNhY2hlIGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBCdWlsZCBnZW9tZXRyeVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFRpbGUuYnVpbGRHZW9tZXRyeSh0aWxlLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBlcnJvciB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGBUaWxlTWFuYWdlcl8ke3NlbGYuc2NlbmVfaWR9LmJ1aWxkVGlsZUVycm9yYCwgVGlsZS5zbGljZSh0aWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCB0aGlzIHRpbGUncyBkYXRhIHNvdXJjZVxuICAgIGxvYWRUaWxlU291cmNlRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAoc2VsZi5zb3VyY2VzW3RpbGUuc291cmNlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlc1t0aWxlLnNvdXJjZV0ubG9hZCh0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0VGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYudGlsZXNba2V5XTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHRpbGVcbiAgICByZW1vdmVUaWxlIChrZXkpIHtcbiAgICAgICAgdmFyIHRpbGUgPSBzZWxmLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FuY2VsIGlmIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYGNhbmNlbCB0aWxlIGxvYWQgZm9yICR7a2V5fWApO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFRpbGUuY2FuY2VsKHRpbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5jbGVhclRpbGUoa2V5KTtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmLnRpbGVzW2tleV07XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYHJlbW92ZSB0aWxlIGZyb20gY2FjaGUgZm9yICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEdldCBhIGZlYXR1cmUgZnJvbSB0aGUgc2VsZWN0aW9uIG1hcFxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb24gKHsgaWQsIGtleSB9ID0ge30pIHtcbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IEZlYXR1cmVTZWxlY3Rpb24ubWFwW2tleV07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIGZlYXR1cmU6IChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmZlYXR1cmUpXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIFJlc2V0cyB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gc3RhdGVcbiAgICByZXNldEZlYXR1cmVTZWxlY3Rpb24gKCkge1xuICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgc2l6ZSBmb3IgdGhpcyB3b3JrZXJcbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSAoKSB7XG4gICAgICAgIHJldHVybiBGZWF0dXJlU2VsZWN0aW9uLmdldE1hcFNpemUoKTtcbiAgICB9LFxuXG4gICAgLy8gVGV4dHVyZSBpbmZvIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIG1haW4gdGhyZWFkLCBlLmcuIHdpZHRoL2hlaWdodCwgd2hpY2ggd2Ugb25seSBrbm93IGFmdGVyIHRoZSB0ZXh0dXJlIGxvYWRzXG4gICAgc3luY1RleHR1cmVzICh0ZXhfY29uZmlnKSB7XG4gICAgICAgIGxldCB0ZXh0dXJlcyA9IFtdO1xuICAgICAgICBpZiAodGV4X2NvbmZpZykge1xuICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5PYmplY3Qua2V5cyh0ZXhfY29uZmlnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2coJ3RyYWNlJywgJ3N5bmMgdGV4dHVyZXMgdG8gd29ya2VyOicsIHRleHR1cmVzKTtcbiAgICAgICAgaWYgKHRleHR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyKHRleHR1cmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSxcblxuICAgIC8vIFN5bmMgZGV2aWNlIHBpeGVsIHJhdGlvIGZyb20gbWFpbiB0aHJlYWRcbiAgICB1cGRhdGVEZXZpY2VQaXhlbFJhdGlvIChkZXZpY2VfcGl4ZWxfcmF0aW8pIHtcbiAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgIH0sXG5cbiAgICAvLyBQcm9maWxpbmcgaGVscGVyc1xuICAgIHByb2ZpbGUgKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGB3b3JrZXIgJHtzZWxmLl93b3JrZXJfaWR9OiAke25hbWV9YCk7XG4gICAgfSxcblxuICAgIHByb2ZpbGVFbmQgKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlRW5kKGB3b3JrZXIgJHtzZWxmLl93b3JrZXJfaWR9OiAke25hbWV9YCk7XG4gICAgfVxuXG59KTtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnc2VsZicsIHNlbGYpO1xuXG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZlYXR1cmVTZWxlY3Rpb24ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHdvcmtlcnMpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLndvcmtlcnMgPSB3b3JrZXJzOyAvLyBwb29sIG9mIHdvcmtlcnMgdG8gcmVxdWVzdCBmZWF0dXJlIGxvb2stdXBzIGZyb20sIGtleWVkIGJ5IGlkXG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFNlbGVjdGlvbiBzdGF0ZSB0cmFja2luZ1xuICAgICAgICB0aGlzLnJlcXVlc3RzID0ge307IC8vIHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgICAgIHRoaXMuZmVhdHVyZSA9IG51bGw7IC8vIGN1cnJlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG4gICAgICAgIHRoaXMucmVhZF9kZWxheSA9IDA7IC8vIGRlbGF5IHRpbWUgZnJvbSBzZWxlY3Rpb24gcmVuZGVyIHRvIGZyYW1lYnVmZmVyIHNhbXBsZSwgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2tcbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gbnVsbDsgLy8gY3VycmVudCB0aW1lciAoc2V0VGltZW91dCkgZm9yIGRlbGF5ZWQgc2VsZWN0aW9uIHJlYWRzXG5cbiAgICAgICAgdGhpcy5waXhlbCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICB0aGlzLnBpeGVsMzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMucGl4ZWwuYnVmZmVyKTtcblxuICAgICAgICAvLyBGcmFtZSBidWZmZXIgZm9yIHNlbGVjdGlvblxuICAgICAgICAvLyBUT0RPOiBpbml0aWF0ZSBsYXppbHkgaW4gY2FzZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5mYm8gPSB0aGlzLmdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcbiAgICAgICAgdGhpcy5mYm9fc2l6ZSA9IHsgd2lkdGg6IDI1NiwgaGVpZ2h0OiAyNTYgfTsgLy8gVE9ETzogbWFrZSBjb25maWd1cmFibGUgLyBhZGFwdGl2ZSBiYXNlZCBvbiBjYW52YXMgc2l6ZVxuICAgICAgICB0aGlzLmZib19zaXplLmFzcGVjdCA9IHRoaXMuZmJvX3NpemUud2lkdGggLyB0aGlzLmZib19zaXplLmhlaWdodDtcblxuICAgICAgICAvLyBUZXh0dXJlIGZvciB0aGUgRkJPIGNvbG9yIGF0dGFjaG1lbnRcbiAgICAgICAgdmFyIGZib190ZXh0dXJlID0gVGV4dHVyZS5jcmVhdGUoIHRoaXMuZ2wsICdzZWxlY3Rpb25fZmJvJywgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcbiAgICAgICAgZmJvX3RleHR1cmUuc2V0RGF0YSh0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCwgbnVsbCwgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcbiAgICAgICAgdGhpcy5nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCh0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmdsLkNPTE9SX0FUVEFDSE1FTlQwLCB0aGlzLmdsLlRFWFRVUkVfMkQsIGZib190ZXh0dXJlLnRleHR1cmUsIDApO1xuXG4gICAgICAgIC8vIFJlbmRlcmJ1ZmZlciBmb3IgdGhlIEZCTyBkZXB0aCBhdHRhY2htZW50XG4gICAgICAgIHZhciBmYm9fZGVwdGhfcmIgPSB0aGlzLmdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRSZW5kZXJidWZmZXIodGhpcy5nbC5SRU5ERVJCVUZGRVIsIGZib19kZXB0aF9yYik7XG4gICAgICAgIHRoaXMuZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSh0aGlzLmdsLlJFTkRFUkJVRkZFUiwgdGhpcy5nbC5ERVBUSF9DT01QT05FTlQxNiwgdGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQpO1xuICAgICAgICB0aGlzLmdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZ2wuREVQVEhfQVRUQUNITUVOVCwgdGhpcy5nbC5SRU5ERVJCVUZGRVIsIGZib19kZXB0aF9yYik7XG5cbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2wgJiYgdGhpcy5mYm8pIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mYm8pO1xuICAgICAgICAgICAgdGhpcy5mYm8gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBmcmVlIHRleHR1cmU/XG4gICAgfVxuXG4gICAgYmluZCgpIHtcbiAgICAgICAgLy8gU3dpdGNoIHRvIEZCT1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQoMCwgMCwgdGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAvLyBSdW5zIGFzeW5jaHJvbm91c2x5LCBzY2hlZHVsZXMgc2VsZWN0aW9uIGJ1ZmZlciB0byBiZSB1cGRhdGVkXG4gICAgZ2V0RmVhdHVyZUF0KHBvaW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBRdWV1ZSByZXF1ZXN0cyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGFuZCB0aGV5IHdpbGwgYmUgcGlja2VkIHVwIGJ5IHRoZSByZW5kZXIgbG9vcFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCA9ICh0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkICsgMSkgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdHNbdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZF0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCxcbiAgICAgICAgICAgICAgICBwb2ludCxcbiAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQW55IHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgcGVuZGluZ1JlcXVlc3RzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZXF1ZXN0cykubGVuZ3RoICYmIHRoaXMucmVxdWVzdHM7XG4gICAgfVxuXG4gICAgY2xlYXJQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5yZXF1ZXN0cykge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc2VudCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWplY3QgcmVxdWVzdCBzaW5jZSBpdCB3aWxsIG5ldmVyIGJlIGZ1bGZpbGxlZFxuICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBhIHJlYXNvbiBmb3IgcmVqZWN0aW9uP1xuICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QoeyByZXF1ZXN0IH0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWFkIHBlbmRpbmcgcmVzdWx0cyBmcm9tIHRoZSBzZWxlY3Rpb24gYnVmZmVyLiBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nIHRvIHNlbGVjdGlvbiBidWZmZXIuXG4gICAgcmVhZCgpIHtcbiAgICAgICAgLy8gRGVsYXkgcmVhZGluZyB0aGUgcGl4ZWwgcmVzdWx0IGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2suXG4gICAgICAgIC8vIENhbGxpbmcgcmVhZFBpeGVscyBzeW5jaHJvbm91c2x5IGNhdXNlZCBhIG1hc3NpdmUgcGVyZm9ybWFuY2UgaGl0LCBwcmVzdW1hYmx5IHNpbmNlIGl0XG4gICAgICAgIC8vIGZvcmNlZCB0aGlzIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHRoZSBHUFUgdG8gZmluaXNoIHJlbmRlcmluZyBhbmQgcmV0cmlldmUgdGhlIHRleHR1cmUgY29udGVudHMuXG4gICAgICAgIGlmICh0aGlzLnJlYWRfZGVsYXlfdGltZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZF9kZWxheV90aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IHdhcyBhbHJlYWR5IHNlbnQgdG8gdGhlIHdvcmtlciwgd2UncmUganVzdCBhd2FpdGluZyBpdHMgcmVwbHlcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2VsZWN0aW9uIHR5cGVzLCBzdWNoIGFzIGZlYXR1cmVzIHdpdGhpbiBhIGJveFxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnR5cGUgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgc2VsZWN0aW9uIG1hcCBhZ2FpbnN0IEZCT1xuICAgICAgICAgICAgICAgIGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVxdWVzdC5wb2ludC54ICogdGhpcy5mYm9fc2l6ZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKDEgLSByZXF1ZXN0LnBvaW50LnkpICogdGhpcy5mYm9fc2l6ZS5oZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICAxLCAxLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnBpeGVsKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9rZXkgPSAodGhpcy5waXhlbFswXSArICh0aGlzLnBpeGVsWzFdIDw8IDgpICsgKHRoaXMucGl4ZWxbMl0gPDwgMTYpICsgKHRoaXMucGl4ZWxbM10gPDwgMjQpKSA+Pj4gMDtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZlYXR1cmUgZm91bmQsIGFzayBhcHByb3ByaWF0ZSB3ZWIgd29ya2VyIHRvIGxvb2t1cCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlcl9pZCA9IHRoaXMucGl4ZWxbM107XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlcl9pZCAhPT0gMjU1KSB7IC8vIDI1NSBpbmRpY2F0ZXMgYW4gZW1wdHkgc2VsZWN0aW9uIGJ1ZmZlciBwaXhlbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXJzW3dvcmtlcl9pZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2Vyc1t3b3JrZXJfaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWxmLmdldEZlYXR1cmVTZWxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IHJlcXVlc3QuaWQsIGtleTogZmVhdHVyZV9rZXkgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIGZlYXR1cmUgZm91bmQsIGJ1dCBzdGlsbCBuZWVkIHRvIHJlc29sdmUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlYWQoeyBpZDogcmVxdWVzdC5pZCwgZmVhdHVyZTogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuXG4gICAgICAgIH0sIHRoaXMucmVhZF9kZWxheSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGZpbmRzIGEgZmVhdHVyZSBpbiB0aGUgc2VsZWN0aW9uIGJ1ZmZlclxuICAgIGZpbmlzaFJlYWQgKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW21lc3NhZ2UuaWRdO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIkZlYXR1cmVTZWxlY3Rpb24uZmluaXNoUmVhZCgpOiBjb3VsZCBub3QgZmluZCBtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyByZXF1ZXN0IHdhcyBjbGVhcmVkIGJlZm9yZSBpdCByZXR1cm5lZFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBtZXNzYWdlLmZlYXR1cmU7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICgoZmVhdHVyZSAhPSBudWxsICYmIHRoaXMuZmVhdHVyZSA9PSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgPT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCkgfHxcbiAgICAgICAgICAgIChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5mZWF0dXJlKSkpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsgLy8gc3RvcmUgdGhlIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdC5yZXNvbHZlKHsgZmVhdHVyZSwgY2hhbmdlZCwgcmVxdWVzdCB9KTtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07IC8vIGRvbmUgcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3RcbiAgICB9XG5cblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgZ2VuZXJhdGlvblxuICAgIC8vIEVhY2ggd29ya2VyIHdpbGwgY3JlYXRlIGl0cyBvd24gaW5kZXBlbmRlbnQsICdsb2NhbCcgc2VsZWN0aW9uIG1hcFxuXG4gICAgLy8gQ3JlYXRlIGEgdW5pcXVlIDMyLWJpdCBjb2xvciB0byBpZGVudGlmeSBhIGZlYXR1cmVcbiAgICAvLyBXb3JrZXJzIGluZGVwZW5kZW50bHkgY3JlYXRlL21vZGlmeSBzZWxlY3Rpb24gY29sb3JzIGluIHRoZWlyIG93biB0aHJlYWRzLCBidXQgd2UgYWxzb1xuICAgIC8vIG5lZWQgdGhlIG1haW4gdGhyZWFkIHRvIGtub3cgd2hlcmUgZWFjaCBmZWF0dXJlIGNvbG9yIG9yaWdpbmF0ZWQuIFRvIGFjY29tcGxpc2ggdGhpcyxcbiAgICAvLyB3ZSBwYXJ0aXRpb24gdGhlIG1hcCBieSBzZXR0aW5nIHRoZSA0dGggY29tcG9uZW50IChhbHBoYSBjaGFubmVsKSB0byB0aGUgd29ya2VyJ3MgaWQuXG4gICAgc3RhdGljIG1ha2VFbnRyeSh0aWxlKSB7XG4gICAgICAgIC8vIDMyLWJpdCBjb2xvciBrZXlcbiAgICAgICAgdGhpcy5tYXBfZW50cnkrKztcbiAgICAgICAgdmFyIGlyID0gdGhpcy5tYXBfZW50cnkgJiAyNTU7XG4gICAgICAgIHZhciBpZyA9ICh0aGlzLm1hcF9lbnRyeSA+PiA4KSAmIDI1NTtcbiAgICAgICAgdmFyIGliID0gKHRoaXMubWFwX2VudHJ5ID4+IDE2KSAmIDI1NTtcbiAgICAgICAgdmFyIGlhID0gdGhpcy5tYXBfcHJlZml4O1xuICAgICAgICB2YXIgciA9IGlyIC8gMjU1O1xuICAgICAgICB2YXIgZyA9IGlnIC8gMjU1O1xuICAgICAgICB2YXIgYiA9IGliIC8gMjU1O1xuICAgICAgICB2YXIgYSA9IGlhIC8gMjU1O1xuICAgICAgICB2YXIga2V5ID0gKGlyICsgKGlnIDw8IDgpICsgKGliIDw8IDE2KSArIChpYSA8PCAyNCkpID4+PiAwOyAvLyBuZWVkIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHRvIGNvbnZlcnQgdG8gcG9zaXRpdmUgI1xuXG4gICAgICAgIHRoaXMubWFwW2tleV0gPSB7XG4gICAgICAgICAgICBjb2xvcjogW3IsIGcsIGIsIGFdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1hcF9zaXplKys7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aWxlLXNwZWNpZmljIHRyYWNraW5nIGluZm9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICAgICAgZW50cmllczogW10sICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9mIGZlYXR1cmUgZW50cmllcyBpbiB0aGlzIHRocmVhZFxuICAgICAgICAgICAgICAgIHRpbGU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnNldCBvZiB0aWxlIHByb3BlcnRpZXMgdG8gcGFzcyBiYWNrIHdpdGggZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBrZXk6IHRpbGUua2V5LFxuICAgICAgICAgICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aWxlLnN0eWxlX3pvb20sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGlsZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb246IHRpbGUuZ2VuZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XS5lbnRyaWVzLnB1c2goa2V5KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWFrZUNvbG9yKGZlYXR1cmUsIHRpbGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5tYWtlRW50cnkodGlsZSk7XG4gICAgICAgIHNlbGVjdG9yLmZlYXR1cmUgPSB7XG4gICAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgIHNvdXJjZV9uYW1lOiBjb250ZXh0LnNvdXJjZSxcbiAgICAgICAgICAgIHNvdXJjZV9sYXllcjogY29udGV4dC5sYXllcixcbiAgICAgICAgICAgIGxheWVyczogY29udGV4dC5sYXllcnMsXG4gICAgICAgICAgICB0aWxlOiB0aGlzLnRpbGVzW3RpbGUua2V5XS50aWxlXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmNvbG9yO1xuICAgIH1cblxuICAgIHN0YXRpYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuICAgICAgICB0aGlzLm1hcF9zaXplID0gMDtcbiAgICAgICAgdGhpcy5tYXBfZW50cnkgPSAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhclRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmZvckVhY2goayA9PiBkZWxldGUgdGhpcy5tYXBba10pO1xuICAgICAgICAgICAgdGhpcy5tYXBfc2l6ZSAtPSB0aGlzLnRpbGVzW2tleV0uZW50cmllcy5sZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50aWxlc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE1hcFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcF9zaXplO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRQcmVmaXgocHJlZml4KSB7XG4gICAgICAgIHRoaXMubWFwX3ByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbn1cblxuLy8gU3RhdGljIHByb3BlcnRpZXNcbkZlYXR1cmVTZWxlY3Rpb24ubWFwID0ge307ICAgLy8gdGhpcyB3aWxsIGJlIHVuaXF1ZSBwZXIgbW9kdWxlIGluc3RhbmNlIChzbyB1bmlxdWUgcGVyIHdvcmtlcilcbkZlYXR1cmVTZWxlY3Rpb24udGlsZXMgPSB7fTsgLy8gc2VsZWN0aW9uIGtleXMsIGJ5IHRpbGVcbkZlYXR1cmVTZWxlY3Rpb24ubWFwX3NpemUgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfZW50cnkgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfcHJlZml4ID0gMDsgLy8gc2V0IGJ5IHdvcmtlciB0byB3b3JrZXIgaWQgI1xuRmVhdHVyZVNlbGVjdGlvbi5kZWZhdWx0Q29sb3IgPSBbMCwgMCwgMCwgMV07XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUgKi9cbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCB7TWV0aG9kTm90SW1wbGVtZW50ZWR9IGZyb20gJy4uL3V0aWxzL2Vycm9ycyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuLi91dGlscy91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnLCBzb3VyY2VzKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOyAvLyBzYXZlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAvLyBmdWxsIHNldCBvZiBkYXRhIHNvdXJjZXMgVE9ETzogY2VudHJhbGl6ZSB0aGVzZSBsaWtlIHRleHR1cmVzP1xuICAgICAgICB0aGlzLmlkID0gY29uZmlnLmlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy5wYWRfc2NhbGUgPSBjb25maWcucGFkX3NjYWxlIHx8IDAuMDAwMTsgLy8gc2NhbGUgdGlsZSB1cCBieSBzbWFsbCBmYWN0b3IgdG8gY292ZXIgc2VhbXNcbiAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBudWxsOyAvLyB3aW5kaW5nIG9yZGVyIHdpbGwgYWRhcHQgdG8gZGF0YSBzb3VyY2VcbiAgICAgICAgdGhpcy5yYXN0ZXJzID0gW107IC8vIGF0dGFjaGVkIHJhc3RlciB0aWxlIHNvdXJjZXNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJhc3RlcnMpKSB7IC8vIGNvcHkgdW5pcXVlIHNldCBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAgICAgY29uZmlnLnJhc3RlcnMuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yYXN0ZXJzLmluZGV4T2YocikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmFzdGVycy5wdXNoKHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHNvdXJjZSBkYXRhXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gY29uZmlnLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgdGhpcy5leHRyYV9kYXRhID0gY29uZmlnLmV4dHJhX2RhdGE7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBzY3JpcHRzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGxvYWRlZCBhbG9uZ3NpZGUgdGhlIGxpYnJhcnkgd2hlbiB0aGUgd29ya2VycyBhcmUgaW5zdGFudGlhdGVkXG4gICAgICAgIHRoaXMuc2NyaXB0cyA9IGNvbmZpZy5zY3JpcHRzO1xuXG4gICAgICAgIC8vIG92ZXJ6b29tIHdpbGwgYXBwbHkgZm9yIHpvb21zIGhpZ2hlciB0aGFuIHRoaXNcbiAgICAgICAgdGhpcy5tYXhfem9vbSA9IChjb25maWcubWF4X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X3pvb20gOiBHZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb207XG5cbiAgICAgICAgLy8gbm8gdGlsZXMgd2lsbCBiZSByZXF1ZXN0ZWQgb3IgZGlzcGxheWVkIG91dHNpZGUgb2YgdGhlc2UgbWluL21heCB2YWx1ZXNcbiAgICAgICAgdGhpcy5taW5fZGlzcGxheV96b29tID0gKGNvbmZpZy5taW5fZGlzcGxheV96b29tICE9IG51bGwpID8gY29uZmlnLm1pbl9kaXNwbGF5X3pvb20gOiAwO1xuICAgICAgICB0aGlzLm1heF9kaXNwbGF5X3pvb20gPSAoY29uZmlnLm1heF9kaXNwbGF5X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X2Rpc3BsYXlfem9vbSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGlsZSBzb3VyY2UgYnkgdHlwZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBpZiAoRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0oc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvbiBjaGFuZ2VkXG4gICAgc3RhdGljIGNoYW5nZWQgKHNvdXJjZSwgcHJldl9zb3VyY2UpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXByZXZfc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXIgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UuY29uZmlnLCB7IGlkOiBudWxsIH0pOyAvLyBudWxsIG91dCBpZHMgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21wYXJlIHRoZW1cbiAgICAgICAgbGV0IHByZXYgPSBPYmplY3QuYXNzaWduKHt9LCBwcmV2X3NvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGN1cikgIT09IEpTT04uc3RyaW5naWZ5KHByZXYpO1xuICAgIH1cblxuICAgIC8vIE1lcmNhdG9yIHByb2plY3Rpb25cbiAgICBzdGF0aWMgcHJvamVjdERhdGEgKHNvdXJjZSkge1xuICAgICAgICB2YXIgdGltZXIgPSArbmV3IERhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKGNvb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSB4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlLmRlYnVnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZS5kZWJ1Zy5wcm9qZWN0aW9uID0gK25ldyBEYXRlKCkgLSB0aW1lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICBSZS1zY2FsZSBnZW9tZXRyaWVzIHdpdGhpbiBlYWNoIHNvdXJjZSB0byBpbnRlcm5hbCB0aWxlIHVuaXRzXG4gICAgKi9cbiAgICBzdGF0aWMgc2NhbGVEYXRhIChzb3VyY2UsIHtjb29yZHM6IHt6fSwgbWluLCBtYXh9KSB7XG4gICAgICAgIGxldCB1bml0c19wZXJfbWV0ZXIgPSBHZW8udW5pdHNQZXJNZXRlcih6KTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IChjb29yZFswXSAtIG1pbi54KSAqIHVuaXRzX3Blcl9tZXRlcjtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAoY29vcmRbMV0gLSBtaW4ueSkgKiB1bml0c19wZXJfbWV0ZXIgKiAtMTsgLy8gZmxpcCBjb29yZHMgcG9zaXRpdmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoZGVzdCkge1xuICAgICAgICBkZXN0LnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIGRlc3QucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIGRlc3QucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQoZGVzdCkudGhlbigoZGVzdCkgPT4ge1xuICAgICAgICAgICAgLy8gUG9zdC1wcm9jZXNzaW5nXG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciBpbiBkZXN0LnNvdXJjZV9kYXRhLmxheWVycykge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgR2VvLnRyYW5zZm9ybUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGNvb3JkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGlwIFkgY29vcmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAtY29vcmRbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbGlnaHRseSBzY2FsZSB1cCB0aWxlIHRvIGNvdmVyIHNlYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFkX3NjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gTWF0aC5yb3VuZChjb29yZFswXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IE1hdGgucm91bmQoY29vcmRbMV0gKiAoMSArIHRoaXMucGFkX3NjYWxlKSAtIChHZW8udGlsZV9zY2FsZSAqIHRoaXMucGFkX3NjYWxlLzIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGZpcnN0IGVuY291bnRlcmVkIHBvbHlnb24gd2luZGluZyBvcmRlciBhcyBkZWZhdWx0IGZvciBkYXRhIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0V2luZGluZyhmZWF0dXJlLmdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXN0LmRlZmF1bHRfd2luZGluZyA9IHRoaXMuZGVmYXVsdF93aW5kaW5nIHx8ICdDQ1cnO1xuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gICAgX2xvYWQoZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ19sb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgd2luZGluZyBmb3IgZGF0YSBzb3VyY2UgZnJvbSBmaXJzdCByaW5nIG9mIHByb3ZpZGVkIGdlb21ldHJ5XG4gICAgdXBkYXRlRGVmYXVsdFdpbmRpbmcgKGdlb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdF93aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChnZW9tLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZ2VvbS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRfd2luZGluZztcbiAgICB9XG5cbiAgICAvLyBBbGwgZGF0YSBzb3VyY2VzIHN1cHBvcnQgYSBtaW4gem9vbSwgdGlsZWQgc291cmNlcyBjYW4gc3ViY2xhc3MgZm9yIG1vcmUgc3BlY2lmaWMgbGltaXRzIChlLmcuIGJvdW5kaW5nIGJveClcbiAgICBpbmNsdWRlc1RpbGUgKGNvb3Jkcywgc3R5bGVfem9vbSkge1xuICAgICAgICAvLyBMaW1pdCBieSB0aGlzIGRhdGEgc291cmNlXG4gICAgICAgIGlmIChjb29yZHMueiA8IHRoaXMubWluX2Rpc3BsYXlfem9vbSB8fCAodGhpcy5tYXhfZGlzcGxheV96b29tICE9IG51bGwgJiYgc3R5bGVfem9vbSA+IHRoaXMubWF4X2Rpc3BsYXlfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGJ5IGFueSBkZXBlbmRlbnQgcmFzdGVyIHNvdXJjZXNcbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5yYXN0ZXJzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VfbmFtZSA9IHRoaXMucmFzdGVyc1tyXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW3NvdXJjZV9uYW1lXSAhPT0gdGhpcyAmJlxuICAgICAgICAgICAgICAgICF0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdLmluY2x1ZGVzVGlsZShjb29yZHMsIGNvb3Jkcy56KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGEgbmV3IGRhdGEgc291cmNlIHR5cGUsIHVuZGVyIGEgdHlwZSBuYW1lXG4gICAgc3RhdGljIHJlZ2lzdGVyKHR5cGVfY2xhc3MsIHR5cGVfbmFtZSkge1xuICAgICAgICBpZiAoIXR5cGVfY2xhc3MgfHwgIXR5cGVfbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRGF0YVNvdXJjZS50eXBlc1t0eXBlX25hbWVdID0gdHlwZV9jbGFzcztcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS50eXBlcyA9IHt9OyAvLyBzZXQgb2Ygc3VwcG9ydGVkIGRhdGEgc291cmNlIGNsYXNzZXMsIHJlZmVyZW5jZWQgYnkgdHlwZSBuYW1lXG5cblxuLyoqKiBHZW5lcmljIG5ldHdvcmsgbG9hZGluZyBzb3VyY2UgLSBhYnN0cmFjdCBjbGFzcyAqKiovXG5cbmxldCBuZXR3b3JrX3JlcXVlc3RfaWQgPSAwOyAvLyB1c2VkIHRvIG5hbWVzcGFjZSBVUkwgcmVxdWVzdHNcblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy51cmwgPSBVUkxzLmFkZFBhcmFtc1RvVVJMKHNvdXJjZS51cmwsIHNvdXJjZS51cmxfcGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJcIjsgLy8gdXNlIHRvIHNldCBleHBsaWNpdCBYSFIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLnVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTmV0d29yayBkYXRhIHNvdXJjZSBtdXN0IHByb3ZpZGUgYSBgdXJsYCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWQgKGRlc3QpIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCBkZXN0KTtcblxuICAgICAgICBsZXQgc291cmNlX2RhdGEgPSBkZXN0LnNvdXJjZV9kYXRhO1xuICAgICAgICBzb3VyY2VfZGF0YS51cmwgPSB1cmw7XG4gICAgICAgIGRlc3QuZGVidWcgPSBkZXN0LmRlYnVnIHx8IHt9O1xuICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcgbmV0d29yayBlcnJvcnNcbiAgICAgICAgICAgIC8vIHZhciBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMCwgdGhpcy5yZXNwb25zZV90eXBlKTtcbiAgICAgICAgICAgIC8vIGlmIChNYXRoLnJhbmRvbSgpIDwgLjcpIHtcbiAgICAgICAgICAgIC8vICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ2Zha2UgZGF0YSBzb3VyY2UgZXJyb3InKSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcblxuICAgICAgICAgICAgbGV0IHJlcXVlc3RfaWQgPSAobmV0d29ya19yZXF1ZXN0X2lkKyspICsgJy0nICsgdXJsO1xuICAgICAgICAgICAgbGV0IHByb21pc2UgPSBVdGlscy5pbyh1cmwsIDYwICogMTAwMCwgdGhpcy5yZXNwb25zZV90eXBlLCAnR0VUJywge30sIHJlcXVlc3RfaWQpO1xuICAgICAgICAgICAgc291cmNlX2RhdGEucmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7XG5cbiAgICAgICAgICAgIHByb21pc2UudGhlbigoYm9keSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucmVzcG9uc2Vfc2l6ZSA9IGJvZHkubGVuZ3RoIHx8IGJvZHkuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKSAtIGRlc3QuZGVidWcubmV0d29yaztcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnBhcnNpbmcgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlU291cmNlRGF0YShkZXN0LCBzb3VyY2VfZGF0YSwgYm9keSk7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLnBhcnNpbmc7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHNvdXJjZV9kYXRhLmVycm9yID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTsgLy8gcmVzb2x2ZSByZXF1ZXN0IGJ1dCBwYXNzIGFsb25nIGVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3ViLWNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6XG5cbiAgICBmb3JtYXRVcmwgKHVybF90ZW1wbGF0ZSwgZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ2Zvcm1hdFVybCcpO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAoZGVzdCwgc291cmNlLCByZXBvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgncGFyc2VTb3VyY2VEYXRhJyk7XG4gICAgfVxufVxuXG5cbi8qKiogR2VuZXJpYyBuZXR3b3JrIHRpbGUgbG9hZGluZyAtIGFic3RyYWN0IGNsYXNzICoqKi9cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtUaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFyc2VCb3VuZHMoc291cmNlKTtcblxuICAgICAgICAvLyBpbmRpY2F0ZXMgaWYgc291cmNlIHNob3VsZCBidWlsZCBnZW9tZXRyeSB0aWxlcywgZW5hYmxlZCBmb3Igc291cmNlcyByZWZlcmVuY2VkIGluIHRoZSBzY2VuZSdzIGxheWVycyxcbiAgICAgICAgLy8gYW5kIGxlZnQgZGlzYWJsZWQgZm9yIHNvdXJjZXMgdGhhdCBhcmUgbmV2ZXIgcmVmZXJlbmNlZCwgb3Igb25seSB1c2VkIGFzIHJhc3RlciB0ZXh0dXJlc1xuICAgICAgICB0aGlzLmJ1aWxkc19nZW9tZXRyeV90aWxlcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudG1zID0gKHNvdXJjZS50bXMgPT09IHRydWUpOyAvLyBvcHRpb25hbGx5IGZsaXAgdGlsZSBjb29yZHMgZm9yIFRNU1xuICAgICAgICB0aGlzLnVybF9ob3N0cyA9IG51bGw7XG4gICAgICAgIHZhciBob3N0X21hdGNoID0gdGhpcy51cmwubWF0Y2goL3tzOlxcWyhbXn0rXSspXFxdfS8pO1xuICAgICAgICBpZiAoaG9zdF9tYXRjaCAhPSBudWxsICYmIGhvc3RfbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy51cmxfaG9zdHMgPSBob3N0X21hdGNoWzFdLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB0aGlzLm5leHRfaG9zdCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYm91bmRzIGZyb20gc291cmNlIGNvbmZpZyBwYXJhbWV0ZXJzXG4gICAgcGFyc2VCb3VuZHMgKHNvdXJjZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UuYm91bmRzKSAmJiBzb3VyY2UuYm91bmRzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBzb3VyY2UuYm91bmRzO1xuICAgICAgICAgICAgbGV0IFt3LCBzLCBlLCBuXSA9IHRoaXMuYm91bmRzO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNfbWV0ZXJzID0ge1xuICAgICAgICAgICAgICAgIG1pbjogR2VvLmxhdExuZ1RvTWV0ZXJzKFt3LCBuXSksXG4gICAgICAgICAgICAgICAgbWF4OiBHZW8ubGF0TG5nVG9NZXRlcnMoW2UsIHNdKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmJvdW5kc190aWxlcyA9IHsgbWluOiB7fSwgbWF4OiB7fSB9OyAvLyBtYXggdGlsZSBib3VuZHMgcGVyIHpvb20gKGxhemlseSBldmFsdWF0ZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRpbGUgaXMgb3V0c2lkZSBkYXRhIHNvdXJjZSdzIGJvdW5kcywgdHJ1ZSBpZiB3aXRoaW5cbiAgICBjaGVja0JvdW5kcyAoY29vcmRzKSB7XG4gICAgICAgIC8vIENoZWNrIHRpbGUgYm91bmRzXG4gICAgICAgIGlmICh0aGlzLmJvdW5kcykge1xuICAgICAgICAgICAgY29vcmRzID0gR2VvLndyYXBUaWxlKGNvb3JkcywgeyB4OiB0cnVlIH0pO1xuXG4gICAgICAgICAgICBsZXQgbWluID0gdGhpcy5ib3VuZHNfdGlsZXMubWluW2Nvb3Jkcy56XTtcbiAgICAgICAgICAgIGlmICghbWluKSB7XG4gICAgICAgICAgICAgICAgbWluID0gdGhpcy5ib3VuZHNfdGlsZXMubWluW2Nvb3Jkcy56XSA9IEdlby50aWxlRm9yTWV0ZXJzKHRoaXMuYm91bmRzX21ldGVycy5taW4sIGNvb3Jkcy56KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG1heCA9IHRoaXMuYm91bmRzX3RpbGVzLm1heFtjb29yZHMuel07XG4gICAgICAgICAgICBpZiAoIW1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IHRoaXMuYm91bmRzX3RpbGVzLm1heFtjb29yZHMuel0gPSBHZW8udGlsZUZvck1ldGVycyh0aGlzLmJvdW5kc19tZXRlcnMubWF4LCBjb29yZHMueik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb29yZHMueCA8IG1pbi54IHx8IGNvb3Jkcy54ID4gbWF4LnggfHxcbiAgICAgICAgICAgICAgICBjb29yZHMueSA8IG1pbi55IHx8IGNvb3Jkcy55ID4gbWF4LnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaW5jbHVkZXNUaWxlIChjb29yZHMsIHN0eWxlX3pvb20pIHtcbiAgICAgICAgaWYgKCFzdXBlci5pbmNsdWRlc1RpbGUoY29vcmRzLCBzdHlsZV96b29tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZSBib3VuZHNcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQm91bmRzKGNvb3JkcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtYXRVcmwodXJsX3RlbXBsYXRlLCB0aWxlKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSBHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICBpZiAodGhpcy50bXMpIHtcbiAgICAgICAgICAgIGNvb3Jkcy55ID0gTWF0aC5wb3coMiwgY29vcmRzLnopIC0gMSAtIGNvb3Jkcy55OyAvLyBvcHRpb25hbGx5IGZsaXAgdGlsZSBjb29yZHMgZm9yIFRNU1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVybCA9IHVybF90ZW1wbGF0ZS5yZXBsYWNlKCd7eH0nLCBjb29yZHMueCkucmVwbGFjZSgne3l9JywgY29vcmRzLnkpLnJlcGxhY2UoJ3t6fScsIGNvb3Jkcy56KTtcblxuICAgICAgICBpZiAodGhpcy51cmxfaG9zdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL3tzOlxcWyhbXn0rXSspXFxdfS8sIHRoaXMudXJsX2hvc3RzW3RoaXMubmV4dF9ob3N0XSk7XG4gICAgICAgICAgICB0aGlzLm5leHRfaG9zdCA9ICh0aGlzLm5leHRfaG9zdCArIDEpICUgdGhpcy51cmxfaG9zdHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tzIGZvciB0aGUgeC95L3ogdGlsZSBwYXR0ZXJuIGluIFVSTCB0ZW1wbGF0ZVxuICAgIHVybEhhc1RpbGVQYXR0ZXJuKHVybCkge1xuICAgICAgICByZXR1cm4gdXJsICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7eH0nKSA+IC0xICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7eX0nKSA+IC0xICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7en0nKSA+IC0xO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrU291cmNlLCBOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQge2RlY29kZU11bHRpUG9seWdvbn0gZnJvbSAnLi9tdnQnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG4vLyBGb3IgdGlsaW5nIEdlb0pTT04gY2xpZW50LXNpZGVcbmltcG9ydCBnZW9qc29udnQgZnJvbSAnZ2VvanNvbi12dCc7XG5cbi8qKlxuIEdlb0pTT04gc3RhbmRhbG9uZSAobm9uLXRpbGVkKSBzb3VyY2VcbiBVc2VzIGdlb2pzb24tdnQgc3BsaXQgaW50byB0aWxlcyBjbGllbnQtc2lkZVxuKi9cblxuZXhwb3J0IGNsYXNzIEdlb0pTT05Tb3VyY2UgZXh0ZW5kcyBOZXR3b3JrU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB0aGlzLmxvYWRfZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMudGlsZV9pbmRleGVzID0ge307IC8vIGdlb2pzb24tdnQgdGlsZSBpbmRpY2VzLCBieSBsYXllciBuYW1lXG4gICAgICAgIHRoaXMubWF4X3pvb20gPSBNYXRoLm1heCh0aGlzLm1heF96b29tIHx8IDAsIDE1KTsgLy8gVE9ETzogbWF4IHpvb20gPCAxNSBjYXVzZXMgYXJ0aWZhY3RzL25vLWRyYXcgYXQgMjAsIGludmVzdGlnYXRlXG4gICAgICAgIHRoaXMucGFkX3NjYWxlID0gMDsgLy8gd2UgZG9uJ3Qgd2FudCBwYWRkaW5nIG9uIGF1dG8tdGlsZWQgc291cmNlc1xuICAgIH1cblxuICAgIF9sb2FkKGRlc3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkX2RhdGEgPSBzdXBlci5fbG9hZCh7IHNvdXJjZV9kYXRhOiB7IGxheWVyczoge30gfSB9KS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIGNvbnRpbnVlIG9uIGRhdGEgc291cmNlIGVycm9yXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc291cmNlX2RhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYGRhdGEgc291cmNlIGxvYWQgZXJyb3IocykgZm9yIHNvdXJjZSAnJHt0aGlzLm5hbWV9JywgVVJMICcke3RoaXMudXJsfSc6ICR7ZGF0YS5zb3VyY2VfZGF0YS5lcnJvcn1gKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbGF5ZXJzID0gZGF0YS5zb3VyY2VfZGF0YS5sYXllcnM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWxlX2luZGV4ZXNbbGF5ZXJfbmFtZV0gPSBnZW9qc29udnQobGF5ZXJzW2xheWVyX25hbWVdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heF96b29tLCAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2xlcmFuY2U6IDMsIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnQ6IEdlby50aWxlX3NjYWxlLCAvLyB0aWxlIGV4dGVudCAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiAwLjAwMDEgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRfZGF0YS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyX25hbWUgaW4gdGhpcy50aWxlX2luZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBkZXN0LnNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl9uYW1lXSA9IHRoaXMuZ2V0VGlsZUZlYXR1cmVzKGRlc3QsIGxheWVyX25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFRpbGVGZWF0dXJlcyh0aWxlLCBsYXllcl9uYW1lKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSBHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyByZXF1ZXN0IGEgcGFydGljdWxhciB0aWxlXG4gICAgICAgIGxldCB0ID0gdGhpcy50aWxlX2luZGV4ZXNbbGF5ZXJfbmFtZV0uZ2V0VGlsZShjb29yZHMueiwgY29vcmRzLngsIGNvb3Jkcy55KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGZyb20gTVZULXN0eWxlIEpTT04gc3RydWN0IHRvIEdlb0pTT05cbiAgICAgICAgbGV0IGNvbGxlY3Rpb247XG4gICAgICAgIGlmICh0ICYmIHQuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHQuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gdC5mZWF0dXJlc1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIEdlb0pTT04gZmVhdHVyZVxuICAgICAgICAgICAgICAgIGxldCBmID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS50YWdzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS5jb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkubWFwKGNvb3JkID0+IFtjb29yZFswXSwgY29vcmRbMV1dKTtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS50eXBlID0gJ011bHRpUG9pbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09IDIgfHwgZmVhdHVyZS50eXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5Lm1hcChyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nLm1hcChjb29yZCA9PiBbY29vcmRbMF0sIGNvb3JkWzFdXSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS50eXBlID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5ID0gZGVjb2RlTXVsdGlQb2x5Z29uKGYuZ2VvbWV0cnkpOyAvLyB1bi1mbGF0dGVuIHJpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5nZW9tZXRyeSA9PSBudWxsKSB7IC8vIHNraXAgcG9seXMgdGhhdCBjb3VsZG4ndCBiZSBkZWNvZGVkIChlLmcuIGRlZ2VuZXJhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cblxuICAgIGZvcm1hdFVybCAoZGVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy51cmw7XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBwYXJzZWRfcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgbGV0IGxheWVycyA9IHRoaXMuZ2V0TGF5ZXJzKHBhcnNlZF9yZXNwb25zZSk7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSB0aGlzLnByZXByb2Nlc3NMYXllcnMobGF5ZXJzKTtcbiAgICB9XG5cbiAgICBwcmVwcm9jZXNzTGF5ZXJzIChsYXllcnMpe1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbGF5ZXJzKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSBsYXllcnNba2V5XTtcbiAgICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc0ZlYXR1cmVzKGxheWVyLmZlYXR1cmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIGRhdGEgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhsYXllcnMpLmxlbmd0aCA9PT0gMSAmJiBsYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMuX2RlZmF1bHQgPSB0aGlzLnRyYW5zZm9ybShsYXllcnMuX2RlZmF1bHQsIHRoaXMuZXh0cmFfZGF0YSk7IC8vIHNpbmdsZS1sYXllclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzID0gdGhpcy50cmFuc2Zvcm0obGF5ZXJzLCB0aGlzLmV4dHJhX2RhdGEpOyAvLyBtdWx0aXBsZSBsYXllcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLy8gUHJlcHJvY2VzcyBmZWF0dXJlcy4gQ3VycmVudGx5IHVzZWQgdG8gYWRkIGEgbmV3IFwiY2VudHJvaWRcIiBmZWF0dXJlIGZvciBwb2x5Z29uIGxhYmVsaW5nXG4gICAgcHJlcHJvY2Vzc0ZlYXR1cmVzIChmZWF0dXJlcykge1xuICAgICAgICAvLyBEZWZpbmUgY2VudHJvaWRzIGZvciBwb2x5Z29ucyBmb3IgY2VudHJvaWQgbGFiZWwgcGxhY2VtZW50XG4gICAgICAgIC8vIEF2b2lkcyByZWR1bmRhbnQgbGFiZWwgcGxhY2VtZW50IGZvciBlYWNoIGdlbmVyYXRlZCB0aWxlIGF0IGhpZ2hlciB6b29tIGxldmVsc1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZ2VuZXJhdGVfbGFiZWxfY2VudHJvaWRzKXtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlc19jZW50cm9pZCA9IFtdO1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkX3Byb3BlcnRpZXMgPSB7XCJsYWJlbF9wbGFjZW1lbnRcIiA6IHRydWV9O1xuXG4gICAgICAgICAgICBmZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlcywgY2VudHJvaWRfZmVhdHVyZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkX2ZlYXR1cmUgPSBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uKGNvb3JkaW5hdGVzLCBmZWF0dXJlLnByb3BlcnRpZXMsIGNlbnRyb2lkX3Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNfY2VudHJvaWQucHVzaChjZW50cm9pZF9mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNlbnRyb2lkIGZlYXR1cmUgZm9yIGxhcmdlc3QgcG9seWdvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9hcmVhID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9hcmVhX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb29yZGluYXRlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJlYSA9IEdlby5wb2x5Z29uQXJlYShjb29yZGluYXRlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmVhID4gbWF4X2FyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYXJlYV9pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkX2ZlYXR1cmUgPSBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uKGNvb3JkaW5hdGVzW21heF9hcmVhX2luZGV4XSwgZmVhdHVyZS5wcm9wZXJ0aWVzLCBjZW50cm9pZF9wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzX2NlbnRyb2lkLnB1c2goY2VudHJvaWRfZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gYXBwZW5kIGNlbnRyb2lkIGZlYXR1cmVzIHRvIGZlYXR1cmVzIGFycmF5XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShmZWF0dXJlcywgZmVhdHVyZXNfY2VudHJvaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBzaW5nbGUgb3IgbXVsdGlwbGUgbGF5ZXJzIGluIHJldHVybmVkIGRhdGFcbiAgICBnZXRMYXllcnMgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9kZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbZGF0YV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfZGVmYXVsdDogZGF0YVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbi8qKlxuIEdlb0pTT04gdmVjdG9yIHRpbGVzXG4gQGNsYXNzIEdlb0pTT05UaWxlU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05UaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIFVSTCB0aWxlIHBhdHRlcm4sIGlmIG5vdCBmb3VuZCwgdHJlYXQgYXMgc3RhbmRhbG9uZSBHZW9KU09OL1RvcG9KU09OIG9iamVjdFxuICAgICAgICBpZiAoIXRoaXMudXJsSGFzVGlsZVBhdHRlcm4odGhpcy51cmwpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpbnN0YW5jZSB0eXBlIGZyb20gcGFyZW50IGNsYXNzXG4gICAgICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09ICdHZW9KU09OJykge1xuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgaW5zdGFuY2UgdHlwZVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2VvSlNPTlNvdXJjZShzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyBiYWNrIHRvIHBhcmVudCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnByZXBhcmVHZW9KU09OKGRhdGEsIHRpbGUsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHJlcGFyZUdlb0pTT04gKGRhdGEsIHRpbGUsIHNvdXJjZSkge1xuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy50cmFuc2Zvcm0oZGF0YSwgdGhpcy5leHRyYV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBHZW9KU09OU291cmNlLnByb3RvdHlwZS5nZXRMYXllcnMoZGF0YSk7XG5cbiAgICAgICAgLy8gQSBcInN5bnRoZXRpY1wiIHRpbGUgdGhhdCBhZGp1c3RzIHRoZSB0aWxlIG1pbiBhbmNob3IgdG8gYWNjb3VudCBmb3IgdGlsZSBsb25naXR1ZGUgd3JhcHBpbmdcbiAgICAgICAgbGV0IGFuY2hvciA9IHtcbiAgICAgICAgICAgIGNvb3JkczogdGlsZS5jb29yZHMsXG4gICAgICAgICAgICBtaW46IEdlby5tZXRlcnNGb3JUaWxlKEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pKVxuICAgICAgICB9O1xuXG4gICAgICAgIERhdGFTb3VyY2UucHJvamVjdERhdGEoc291cmNlKTsgLy8gbWVyY2F0b3IgcHJvamVjdGlvblxuICAgICAgICBEYXRhU291cmNlLnNjYWxlRGF0YShzb3VyY2UsIGFuY2hvcik7IC8vIHJlLXNjYWxlIGZyb20gbWV0ZXJzIHRvIGxvY2FsIHRpbGUgY29vcmRzXG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoR2VvSlNPTlRpbGVTb3VyY2UsICdHZW9KU09OJyk7ICAgICAgLy8gcHJlZmVyZWQgc2hvcnRlciBuYW1lXG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgY2VudHJvaWQgcG9pbnQgZmVhdHVyZSBmcm9tIHBvbHlnb24gY29vcmRpbmF0ZXMgYW5kIHByb3ZpZGVkIGZlYXR1cmUgbWV0YS1kYXRhXG5mdW5jdGlvbiBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uIChjb29yZGluYXRlcywgcHJvcGVydGllcywgbmV3UHJvcGVydGllcykge1xuICAgIGxldCBjZW50cm9pZCA9IEdlby5jZW50cm9pZChjb29yZGluYXRlcyk7XG5cbiAgICAvLyBjbG9uZSBwcm9wZXJ0aWVzIGFuZCBtaXhpeCBuZXdQcm9wZXJ0aWVzXG4gICAgbGV0IGNlbnRyb2lkX3Byb3BlcnRpZXMgPSB7fTtcbiAgICBPYmplY3QuYXNzaWduKGNlbnRyb2lkX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIHByb3BlcnRpZXM6IGNlbnRyb2lkX3Byb3BlcnRpZXMsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiBcIlBvaW50XCIsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY2VudHJvaWRcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuaW1wb3J0IFBiZiBmcm9tICdwYmYnO1xuaW1wb3J0IHtWZWN0b3JUaWxlLCBWZWN0b3JUaWxlRmVhdHVyZX0gZnJvbSAndmVjdG9yLXRpbGUnO1xuXG4vKipcbiBNYXBib3ggVmVjdG9yIFRpbGUgZm9ybWF0XG4gQGNsYXNzIE1WVFNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBNVlRTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VfdHlwZSA9IFwiYXJyYXlidWZmZXJcIjsgLy8gYmluYXJ5IGRhdGFcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgLy8gQ29udmVydCBNYXBib3ggdmVjdG9yIHRpbGUgdG8gR2VvSlNPTlxuICAgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBQYmYoZGF0YSk7XG4gICAgICAgIHNvdXJjZS5kYXRhID0gbmV3IFZlY3RvclRpbGUoYnVmZmVyKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMudG9HZW9KU09OKHNvdXJjZS5kYXRhKTtcblxuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy50cmFuc2Zvcm0oc291cmNlLmxheWVycywgdGhpcy5leHRyYV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBzb3VyY2UuZGF0YTsgLy8gY29tbWVudCBvdXQgdG8gc2F2ZSByYXcgZGF0YSBmb3IgZGVidWdnaW5nXG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGxheWVycy9mZWF0dXJlcyB1c2luZyBNYXBib3ggbGliIEFQSSwgY29udmVydCB0byBHZW9KU09OIGZlYXR1cmVzXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBrZXlzIGZvciBlYWNoIGxheWVyLCBlLmcuIHsgbGF5ZXI6IGdlb2pzb24gfVxuICAgIHRvR2VvSlNPTiAodGlsZSkge1xuICAgICAgICB2YXIgbGF5ZXJzID0ge307XG4gICAgICAgIGZvciAodmFyIGwgaW4gdGlsZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBsYXllciA9IHRpbGUubGF5ZXJzW2xdO1xuICAgICAgICAgICAgdmFyIHNjYWxlID0gR2VvLnRpbGVfc2NhbGUgLyBsYXllci5leHRlbnQ7XG4gICAgICAgICAgICB2YXIgbGF5ZXJfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgZj0wOyBmIDwgbGF5ZXIubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoZik7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlX2dlb2pzb24uZ2VvbWV0cnk7XG4gICAgICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5sb2FkR2VvbWV0cnkoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByPTA7IHIgPCBjb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGNvb3JkaW5hdGVzW3JdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCByaW5nLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueCAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueSAqIHNjYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG5cbiAgICAgICAgICAgICAgICBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ1BvaW50JztcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlc1swXVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IGRlY29kZU11bHRpUG9seWdvbihnZW9tZXRyeSk7IC8vIHVuLWZsYXR0ZW4gcmluZ3NcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXllcl9nZW9qc29uLmZlYXR1cmVzLnB1c2goZmVhdHVyZV9nZW9qc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxheWVyc1tsXSA9IGxheWVyX2dlb2pzb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbn1cblxuLy8gRGVjb2RlIG11bHRpcG9seWdvbnMsIHdoaWNoIGFyZSBlbmNvZGVkIGFzIGEgc2luZ2xlIHNldCBvZiByaW5nc1xuLy8gV2luZGluZyBvcmRlciBvZiBmaXJzdCByaW5nIGlzIGFzc3VtZWQgdG8gaW5kaWNhdGUgZXh0ZXJpb3IgcmluZyxcbi8vIHRoZSBvcHBvc2l0ZSB3aW5kaW5nIG9yZGVyIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYSBuZXcgcG9seWdvbi5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVNdWx0aVBvbHlnb24gKGdlb20pIHtcbiAgICBsZXQgcG9seXMgPSBbXTtcbiAgICBsZXQgcG9seSA9IFtdO1xuICAgIGxldCBvdXRlcl93aW5kaW5nO1xuICAgIGZvciAobGV0IHI9MDsgciA8IGdlb20uY29vcmRpbmF0ZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgbGV0IHJpbmcgPSBnZW9tLmNvb3JkaW5hdGVzW3JdO1xuICAgICAgICBsZXQgd2luZGluZyA9IEdlby5yaW5nV2luZGluZyhyaW5nKTtcbiAgICAgICAgaWYgKHdpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgemVyby1hcmVhIHJpbmdzXG4gICAgICAgIH1cblxuICAgICAgICBvdXRlcl93aW5kaW5nID0gb3V0ZXJfd2luZGluZyB8fCB3aW5kaW5nOyAvLyBhc3N1bWUgZmlyc3QgcmluZyBpbmRpY2F0ZXMgb3V0ZXIgcmluZyB3aW5kaW5nXG5cbiAgICAgICAgaWYgKHdpbmRpbmcgPT09IG91dGVyX3dpbmRpbmcgJiYgcG9seS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwb2x5cy5wdXNoKHBvbHkpO1xuICAgICAgICAgICAgcG9seSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHBvbHkucHVzaChyaW5nKTtcbiAgICB9XG4gICAgaWYgKHBvbHkubGVuZ3RoID4gMCkge1xuICAgICAgICBwb2x5cy5wdXNoKHBvbHkpO1xuICAgIH1cblxuICAgIC8vIFNpbmdsZSBvciBtdWx0aT9cbiAgICBpZiAocG9seXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGdlb20udHlwZSA9ICdQb2x5Z29uJztcbiAgICAgICAgZ2VvbS5jb29yZGluYXRlcyA9IHBvbHlzWzBdO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb2x5cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGdlb20udHlwZSA9ICdNdWx0aVBvbHlnb24nO1xuICAgICAgICBnZW9tLmNvb3JkaW5hdGVzID0gcG9seXM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnZW9tID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2VvbTtcbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihNVlRTb3VyY2UsICdNVlQnKTtcbiIsImltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vdGlsZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBjbGFzcyBSYXN0ZXJUaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMucmFzdGVycy5pbmRleE9mKHRoaXMubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJhc3RlcnMudW5zaGlmdCh0aGlzLm5hbWUpOyAvLyBhZGQgdGhpcyByYXN0ZXIgYXMgdGhlIGZpcnN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSBzb3VyY2UuZmlsdGVyaW5nOyAvLyBvcHRpb25hbCB0ZXh0dXJlIGZpbHRlcmluZyAobmVhcmVzdCwgbGluZWFyLCBtaXBtYXApXG5cbiAgICAgICAgLy8gc2F2ZSB0ZXh0dXJlIG9iamVjdHMgYnkgdGlsZSBrZXksIHNvIFVSTCByZW1haW5zIHN0YWJsZSBpZiB0aWxlIGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzLFxuICAgICAgICAvLyBlLmcuIGF2b2lkIHJlLWxvYWRpbmcgdGhlIHNhbWUgdGlsZSB0ZXh0dXJlIHVuZGVyIGEgZGlmZmVyZW50IHN1YmRvbWFpbiB3aGVuIHVzaW5nIHRpbGUgaG9zdHNcbiAgICAgICAgdGhpcy50ZXh0dXJlcyA9IHt9O1xuICAgIH1cblxuICAgIGxvYWQodGlsZSkge1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIHRpbGUucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIHRpbGUucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYSBzaW5nbGUgcXVhZCB0aGF0IGZpbGxzIHRoZSBlbnRpcmUgdGlsZVxuICAgICAgICBsZXQgc2NhbGUgPSBHZW8udGlsZV9zY2FsZTtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5sYXllcnMgPSB7XG4gICAgICAgICAgICBfZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlczogW1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMF0sIFtzY2FsZSwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NjYWxlLCAtc2NhbGVdLCBbMCwgLXNjYWxlXSwgWzAsIDBdXG4gICAgICAgICAgICAgICAgICAgICAgICBdXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7fVxuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGlsZS5kZWZhdWx0X3dpbmRpbmcgPSAnQ1cnO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0ZXh0dXJlIGluZm8gZm9yIGEgcmFzdGVyIHRpbGVcbiAgICB0aWxlVGV4dHVyZSAodGlsZSkge1xuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZXNba2V5XSkge1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKHRpbGUuY29vcmRzLCB0aGlzLm1heF96b29tKTtcbiAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmZvcm1hdFVybCh0aGlzLnVybCwgeyBjb29yZHMgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzW2tleV0gPSB7IHVybCwgZmlsdGVyaW5nOiB0aGlzLmZpbHRlcmluZywgY29vcmRzIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZXNba2V5XTtcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihSYXN0ZXJUaWxlU291cmNlLCAnUmFzdGVyJyk7XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCB7R2VvSlNPTlNvdXJjZSwgR2VvSlNPTlRpbGVTb3VyY2V9IGZyb20gJy4vZ2VvanNvbic7XG5cbmltcG9ydCAqIGFzIHRvcG9qc29uIGZyb20gJ3RvcG9qc29uLWNsaWVudCc7XG5cbi8qKlxuIFRvcG9KU09OIHN0YW5kYWxvbmUgKG5vbi10aWxlZCkgc291cmNlXG4gVXNlcyBnZW9qc29uLXZ0IHNwbGl0IGludG8gdGlsZXMgY2xpZW50LXNpZGVcbiovXG5cbmV4cG9ydCBjbGFzcyBUb3BvSlNPTlNvdXJjZSBleHRlbmRzIEdlb0pTT05Tb3VyY2Uge1xuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGRhdGEgPSB0aGlzLnRvR2VvSlNPTihkYXRhKTtcblxuICAgICAgICBsZXQgbGF5ZXJzID0gdGhpcy5nZXRMYXllcnMoZGF0YSk7XG4gICAgICAgIHN1cGVyLnByZXByb2Nlc3NMYXllcnMobGF5ZXJzKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IGxheWVycztcbiAgICB9XG5cbiAgICB0b0dlb0pTT04gKGRhdGEpIHtcbiAgICAgICAgLy8gU2luZ2xlIGxheWVyXG4gICAgICAgIGlmIChkYXRhLm9iamVjdHMgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGEub2JqZWN0cykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSBPYmplY3Qua2V5cyhkYXRhLm9iamVjdHMpWzBdO1xuICAgICAgICAgICAgZGF0YSA9IGdldFRvcG9KU09ORmVhdHVyZShkYXRhLCBkYXRhLm9iamVjdHNbbGF5ZXJdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNdWx0aXBsZSBsYXllcnNcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXJzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YS5vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzW2tleV0gPSBnZXRUb3BvSlNPTkZlYXR1cmUoZGF0YSwgZGF0YS5vYmplY3RzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YSA9IGxheWVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbn1cblxuZnVuY3Rpb24gZ2V0VG9wb0pTT05GZWF0dXJlICh0b3BvbG9neSwgb2JqZWN0KSB7XG4gICAgbGV0IGZlYXR1cmUgPSB0b3BvanNvbi5mZWF0dXJlKHRvcG9sb2d5LCBvYmplY3QpO1xuXG4gICAgLy8gQ29udmVydCBzaW5nbGUgZmVhdHVyZSB0byBhIGZlYXR1cmUgY29sbGVjdGlvblxuICAgIGlmIChmZWF0dXJlLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICBmZWF0dXJlID0ge1xuICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbZmVhdHVyZV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cblxuLyoqXG4gVG9wb0pTT04gdmVjdG9yIHRpbGVzXG4gQGNsYXNzIFRvcG9KU09OVGlsZVNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBUb3BvSlNPTlRpbGVTb3VyY2UgZXh0ZW5kcyBHZW9KU09OVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICAvLyBSZXBsYWNlIHdpdGggbm9uLXRpbGVkIHNvdXJjZSBpZiB0aWxlZCBzb3VyY2UgZmFpbGVkIHRvIGluc3RhbnRpYXRlXG4gICAgICAgIGlmICghdGhpcy51cmxIYXNUaWxlUGF0dGVybih0aGlzLnVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVG9wb0pTT05Tb3VyY2Uoc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBkYXRhID0gVG9wb0pTT05Tb3VyY2UucHJvdG90eXBlLnRvR2VvSlNPTihkYXRhKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlR2VvSlNPTihkYXRhLCB0aWxlLCBzb3VyY2UpO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKFRvcG9KU09OVGlsZVNvdXJjZSwgJ1RvcG9KU09OJyk7ICAgICAgICAvLyBwcmVmZXJlZCBzaG9ydGVyIG5hbWVcbiIsImZ1bmN0aW9uIG5vdE51bGwoeCkgIHsgcmV0dXJuIHggIT0gbnVsbDsgfVxuZnVuY3Rpb24gd3JhcCh4KSAgICAgeyByZXR1cm4gJygnICsgeCArICcpJzt9XG5cbmZ1bmN0aW9uIG1heWJlUXVvdGUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBsb29rVXAoa2V5KSB7XG4gICAgaWYgKGtleVswXSA9PT0gJyQnKSB7XG4gICAgICAgIHJldHVybiAnY29udGV4dFtcXCcnICsga2V5LnN1YnN0cmluZygxKSArICdcXCddJztcbiAgICB9XG4gICAgcmV0dXJuICdjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tcXCcnICsga2V5ICsgJ1xcJ10nO1xufVxuXG5mdW5jdGlvbiBudWxsVmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiAnIHRydWUgJztcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlFcXVhbChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobWF5YmVRdW90ZSh2YWx1ZSkgKyAnID09PSAnICsgbG9va1VwKGtleSkpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU9yKGtleSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWVzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gcHJvcGVydHlFcXVhbChrZXksIHgpOyB9KS5qb2luKCcgfHwgJykpO1xufVxuXG5mdW5jdGlvbiBwcmludE5lc3RlZCh2YWx1ZXMsIGpvaW5lcikge1xuICAgIHJldHVybiB3cmFwKHZhbHVlcy5maWx0ZXIobm90TnVsbCkubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB3cmFwKHguam9pbignICYmICcpKTtcbiAgICB9KS5qb2luKCcgJyArIGpvaW5lciArICcgJykpO1xufVxuXG5mdW5jdGlvbiBhbnkoXywgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApID8gcHJpbnROZXN0ZWQodmFsdWVzLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBwYXJzZUZpbHRlcih2LCBvcHRpb25zKTsgfSksICd8fCcpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBhbGwoXywgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApID8gcHJpbnROZXN0ZWQodmFsdWVzLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBwYXJzZUZpbHRlcih2LCBvcHRpb25zKTsgfSksICcmJicpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBub3Qoa2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKHBhcnNlRmlsdGVyKHZhbHVlLCBvcHRpb25zKS5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBub25lKGtleSwgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICchJyArIHdyYXAoYW55KG51bGwsIHZhbHVlcywgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU1hdGNoZXNCb29sZWFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChsb29rVXAoa2V5KSArICh2YWx1ZSA/ICcgIT0gJyA6ICcgPT0gJykgICsgJ251bGwnKTtcbn1cblxuZnVuY3Rpb24gcmFuZ2VNYXRjaChrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuICAgIHZhciB0cmFuc2Zvcm0gPSBvcHRpb25zICYmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZVRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgJiYgb3B0aW9ucy5yYW5nZVRyYW5zZm9ybTtcblxuICAgIGlmICh2YWx1ZXMubWF4KSB7XG4gICAgICAgIHZhciBtYXggPSB0cmFuc2Zvcm0gPyB0cmFuc2Zvcm0odmFsdWVzLm1heCkgOiB2YWx1ZXMubWF4O1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnIDwgJyArIG1heCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5taW4pIHtcbiAgICAgICAgdmFyIG1pbiA9IHRyYW5zZm9ybSA/IG1pbiA9IHRyYW5zZm9ybSh2YWx1ZXMubWluKSA6IHZhbHVlcy5taW47XG4gICAgICAgIGV4cHJlc3Npb25zLnB1c2goJycgKyBsb29rVXAoa2V5KSArICcgPj0gJyArIG1pbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXAoZXhwcmVzc2lvbnMuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgdmFyIGZpbHRlckFTVCA9IFtdO1xuXG4gICAgLy8gRnVuY3Rpb24gZmlsdGVyXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFt3cmFwKGZpbHRlci50b1N0cmluZygpICsgJyhjb250ZXh0KScpXTtcbiAgICB9XG4gICAgLy8gQXJyYXkgZmlsdGVyLCBpbXBsaWNpdCAnYW55J1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICByZXR1cm4gW2FueShudWxsLCBmaWx0ZXIsIG9wdGlvbnMpXTtcbiAgICB9XG4gICAgLy8gTnVsbCBmaWx0ZXIgb2JqZWN0XG4gICAgZWxzZSBpZiAoZmlsdGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFsndHJ1ZSddO1xuICAgIH1cblxuICAgIC8vIE9iamVjdCBmaWx0ZXIsIGUuZy4gaW1wbGljaXQgJ2FsbCdcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZpbHRlcik7XG4gICAgZm9yICh2YXIgaz0wOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1trXTtcblxuICAgICAgICB2YXIgdmFsdWUgPSBmaWx0ZXJba2V5XSxcbiAgICAgICAgICAgIHR5cGUgID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5RXF1YWwoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm90Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gobm90KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbnknKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbnkoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKGFsbChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vbmUoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eU9yKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUubWF4IHx8IHZhbHVlLm1pbikge1xuICAgICAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHJhbmdlTWF0Y2goa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG51bGxWYWx1ZShrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gUXVlcnkgc3l0bmF4OiAnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID09PSAwID8gWyd0cnVlJ10gOiBmaWx0ZXJBU1Q7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclRvU3RyaW5nKGZpbHRlckFTVCkge1xuICAgIHJldHVybiB3cmFwKGZpbHRlckFTVC5qb2luKCcgJiYgJykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKGZpbHRlciA9PSBudWxsKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9OyB9XG4gICAgLy8ganNoaW50IGV2aWw6IHRydWVcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ3JldHVybiAnICsgZmlsdGVyVG9TdHJpbmcocGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSkgKyAnOycpO1xufVxuIiwiaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHtidWlsZEZpbHRlcn0gZnJvbSAnLi9maWx0ZXInO1xuXG5leHBvcnQgY29uc3Qgd2hpdGVMaXN0ID0gWydmaWx0ZXInLCAnZHJhdycsICd2aXNpYmxlJywgJ2RhdGEnXTtcblxuZXhwb3J0IGNvbnN0IGxheWVyX2NhY2hlID0ge307XG5cbmZ1bmN0aW9uIGNhY2hlS2V5IChsYXllcnMpIHtcbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGsgPSBsYXllcnNbMF07XG4gICAgICAgIGZvciAodmFyIGk9MTsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgayArPSAnLycgKyBsYXllcnNbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaztcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyc1swXTtcbn1cblxuLy8gTWVyZ2UgbWF0Y2hpbmcgbGF5ZXIgdHJlZXMgaW50byBhIGZpbmFsIGRyYXcgZ3JvdXBcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRyZWVzKG1hdGNoaW5nVHJlZXMsIGdyb3VwKSB7XG4gICAgbGV0IGRyYXdzLCB0cmVlRGVwdGggPSAwO1xuXG4gICAgbGV0IGRyYXcgPSB7XG4gICAgICAgIHZpc2libGU6IHRydWUgLy8gdmlzaWJsZSBieSBkZWZhdWx0XG4gICAgfTtcblxuICAgIC8vIEZpbmQgZGVlcGVzdCB0cmVlXG4gICAgZm9yIChsZXQgdD0wOyB0IDwgbWF0Y2hpbmdUcmVlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICBpZiAobWF0Y2hpbmdUcmVlc1t0XS5sZW5ndGggPiB0cmVlRGVwdGgpIHtcbiAgICAgICAgICAgIHRyZWVEZXB0aCA9IG1hdGNoaW5nVHJlZXNbdF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gbGF5ZXJzIHRvIHBhcnNlXG4gICAgaWYgKHRyZWVEZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRyZWVzIGluIHBhcmFsbGVsXG4gICAgZm9yIChsZXQgeD0wOyB4IDwgdHJlZURlcHRoOyB4KyspIHtcbiAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHJlcXVlc3RlZCBkcmF3IGdyb3VwLCBmb3IgZWFjaCB0cmVlLCBhdCB0aGlzIGRlcHRoXG4gICAgICAgIGRyYXdzID0gbWF0Y2hpbmdUcmVlcy5tYXAodHJlZSA9PiB0cmVlW3hdICYmIHRyZWVbeF1bZ3JvdXBdKTtcbiAgICAgICAgaWYgKGRyYXdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IGJ5IGxheWVyIG5hbWUgYmVmb3JlIG1lcmdpbmcsIHNvIGxheWVycyBhcmUgYXBwbGllZCBkZXRlcm1pbmlzdGljYWxseVxuICAgICAgICAvLyB3aGVuIG11bHRpcGxlIGxheWVycyBtb2RpZnkgdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgICBkcmF3cy5zb3J0KChhLCBiKSA9PiAoYSAmJiBhLmxheWVyX25hbWUpID4gKGIgJiYgYi5sYXllcl9uYW1lKSA/IDEgOiAtMSk7XG5cbiAgICAgICAgLy8gTWVyZ2UgZHJhdyBvYmplY3RzXG4gICAgICAgIG1lcmdlT2JqZWN0cyhkcmF3LCAuLi5kcmF3cyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGxheWVyIG5hbWVzLCB0aGV5IHdlcmUgb25seSB1c2VkIHRyYW5zaWVudGx5IHRvIHNvcnQgYW5kIGNhbGN1bGF0ZSBmaW5hbCBsYXllclxuICAgICAgICAvLyAoZmluYWwgbWVyZ2VkIG5hbWVzIHdpbGwgbm90IGJlIGFjY3VyYXRlIHNpbmNlIG9ubHkgb25lIHRyZWUgY2FuIHdpbilcbiAgICAgICAgZGVsZXRlIGRyYXcubGF5ZXJfbmFtZTtcbiAgICB9XG5cbiAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIG5vdCB2aXNpYmxlXG4gICAgaWYgKGRyYXcudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYXc7XG59XG5cbmNvbnN0IGJsYWNrbGlzdCA9IFsnYW55JywgJ2FsbCcsICdub3QnLCAnbm9uZSddO1xuXG5jbGFzcyBMYXllciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IGxheWVyLCBuYW1lLCBwYXJlbnQsIGRyYXcsIHZpc2libGUsIGZpbHRlciB9KSB7XG4gICAgICAgIHRoaXMuaWQgPSBMYXllci5pZCsrO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGxheWVyO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5mdWxsX25hbWUgPSB0aGlzLnBhcmVudCA/ICh0aGlzLnBhcmVudC5mdWxsX25hbWUgKyAnOicgKyB0aGlzLm5hbWUpIDogdGhpcy5uYW1lO1xuICAgICAgICB0aGlzLmRyYXcgPSBkcmF3O1xuICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgdGhpcy5pc19idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlICE9PSB1bmRlZmluZWQgPyB2aXNpYmxlIDogKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnZpc2libGUpO1xuXG4gICAgICAgIC8vIERlbm9ybWFsaXplIGxheWVyIG5hbWUgdG8gZHJhdyBncm91cHNcbiAgICAgICAgaWYgKHRoaXMuZHJhdykge1xuICAgICAgICAgICAgZm9yIChsZXQgZ3JvdXAgaW4gdGhpcy5kcmF3KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhd1tncm91cF0gPT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5kcmF3W2dyb3VwXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgRHJhdyBncm91cCAnJHtncm91cH0nIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBtdXN0IGJlIGFuIG9iamVjdCwgYDtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGBidXQgd2FzIHNldCB0byBcXGAke2dyb3VwfTogJHt0aGlzLmRyYXdbZ3JvdXBdfVxcYCBpbnN0ZWFkYDtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG5cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZHJhd1tncm91cF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdbZ3JvdXBdLmxheWVyX25hbWUgPSB0aGlzLmZ1bGxfbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZCAoKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCBgQnVpbGRpbmcgbGF5ZXIgJyR7dGhpcy5mdWxsX25hbWV9J2ApO1xuICAgICAgICB0aGlzLmJ1aWxkRmlsdGVyKCk7XG4gICAgICAgIHRoaXMuYnVpbGREcmF3KCk7XG4gICAgICAgIHRoaXMuaXNfYnVpbHQgPSB0cnVlO1xuICAgIH1cblxuICAgIGJ1aWxkRHJhdygpIHtcbiAgICAgICAgdGhpcy5kcmF3ID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKHRoaXMuZHJhdywgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkRHJhdyA9IGNhbGN1bGF0ZURyYXcodGhpcyk7XG4gICAgfVxuXG4gICAgYnVpbGRGaWx0ZXIoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyX29yaWdpbmFsID0gdGhpcy5maWx0ZXI7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKHRoaXMuZmlsdGVyLCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuXG4gICAgICAgIGxldCB0eXBlID0gdHlwZW9mIHRoaXMuZmlsdGVyO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCAmJiB0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbHRlclxuICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIGZpbHRlciB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdCBvciBmdW5jdGlvbiwgYDtcbiAgICAgICAgICAgIG1zZyArPSBgYnV0IHdhcyBzZXQgdG8gXFxgZmlsdGVyOiAke3RoaXMuZmlsdGVyfVxcYCBpbnN0ZWFkYDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRab29tcygpO1xuICAgICAgICAgICAgdGhpcy5idWlsZFByb3BNYXRjaGVzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCAmJiAodHlwZW9mIHRoaXMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gYnVpbGRGaWx0ZXIodGhpcy5maWx0ZXIsIEZpbHRlck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgZmlsdGVyXG4gICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgXFxgZmlsdGVyOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyKX1cXGAgYDtcbiAgICAgICAgICAgIG1zZyArPSBgZmFpbGVkIHdpdGggZXJyb3IgJyR7ZS5tZXNzYWdlfScsIHN0YWNrIHRyYWNlOiAke2Uuc3RhY2t9YDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gWm9vbXMgb2Z0ZW4gY3VsbCBsYXJnZSBzd2F0aHMgb2YgdGhlIGxheWVyIHRyZWUsIHNvIHRoZXkgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGFuZCBhcmUgY2hlY2tlZCBmaXJzdFxuICAgIGJ1aWxkWm9vbXMoKSB7XG4gICAgICAgIGxldCB6b29tID0gdGhpcy5maWx0ZXIgJiYgdGhpcy5maWx0ZXIuJHpvb207XG4gICAgICAgIGxldCB6dHlwZSA9IHR5cGVvZiB6b29tO1xuICAgICAgICBpZiAoem9vbSAhPSBudWxsICYmIHp0eXBlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IGFjY2VsZXJhdGUgZnVuY3Rpb24tYmFzZWQgZmlsdGVyc1xuICAgICAgICAgICAgdGhpcy56b29tcyA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoenR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy56b29tc1t6b29tXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHpvb20pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgej0wOyB6IDwgem9vbS5sZW5ndGg7IHorKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pvb21bel1dID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh6dHlwZSA9PT0gJ29iamVjdCcgJiYgKHpvb20ubWluICE9IG51bGwgfHwgem9vbS5tYXggIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgem1pbiA9IHpvb20ubWluIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IHptYXggPSB6b29tLm1heCB8fCAyNTsgLy8gVE9ETzogcmVwbGFjZSBjb25zdGFudCBmb3IgbWF4IHBvc3NpYmxlIHpvb21cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6PXptaW47IHogPCB6bWF4OyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tc1t6XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXIuJHpvb207IC8vIGRvbid0IHByb2Nlc3Mgem9vbSB0aHJvdWdoIHVzdWFsIGdlbmVyaWMgZmlsdGVyIGxvZ2ljXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZFByb3BNYXRjaGVzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyIHx8IEFycmF5LmlzQXJyYXkodGhpcy5maWx0ZXIpIHx8IHR5cGVvZiB0aGlzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChibGFja2xpc3QuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLmZpbHRlcltrZXldO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIShhcnJheSB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChrZXlbMF0gPT09ICckJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb250ZXh0IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMgPSB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzLnB1c2goW2tleS5zdWJzdHJpbmcoMSksIGFycmF5ID8gdmFsIDogW3ZhbF1dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcyA9IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMucHVzaChba2V5LCBhcnJheSA/IHZhbCA6IFt2YWxdXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRvUHJvcE1hdGNoZXMgKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzW3JdO1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1ttYXRjaFswXV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IG1hdGNoWzFdLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlc1tyXTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gY29udGV4dFttYXRjaFswXV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IG1hdGNoWzFdLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGRvZXNNYXRjaCAoY29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNfYnVpbHQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHpvb20gcHJlLWZpbHRlcjogc2tpcCByZXN0IG9mIGZpbHRlciBpZiBvdXQgb2YgbGF5ZXIgem9vbSByYW5nZVxuICAgICAgICBpZiAodGhpcy56b29tcyAhPSBudWxsICYmICF0aGlzLnpvb21zW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRpcmVjdCBmZWF0dXJlIHByb3BlcnR5IG1hdGNoZXNcbiAgICAgICAgaWYgKCF0aGlzLmRvUHJvcE1hdGNoZXMoY29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFueSByZW1haW5pbmcgZmlsdGVyIChtb3JlIGNvbXBsZXggbWF0Y2hlcyBvciBkeW5hbWljIGZ1bmN0aW9uKVxuICAgICAgICBpZiAodGhpcy5maWx0ZXIgaW5zdGFuY2VvZiBGdW5jdGlvbil7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEZpbHRlciBmdW5jdGlvbiBlcnJvclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciB0aGlzICR7dGhpcy5mdWxsX25hbWV9OiBcXGBmaWx0ZXI6ICR7dGhpcy5maWx0ZXJfb3JpZ2luYWx9XFxgIGA7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBmYWlsZWQgd2l0aCBlcnJvciAnJHtlcnJvci5tZXNzYWdlfScsIHN0YWNrIHRyYWNlOiAke2Vycm9yLnN0YWNrfWA7XG4gICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1zZywgY29udGV4dC5mZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlciA9PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbkxheWVyLmlkID0gMDtcblxuXG5leHBvcnQgY2xhc3MgTGF5ZXJMZWFmIGV4dGVuZHMgTGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgdGhpcy5pc19sZWFmID0gdHJ1ZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIExheWVyVHJlZSBleHRlbmRzIExheWVyIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXNfdHJlZSA9IHRydWU7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gY29uZmlnLmxheWVycyB8fCBbXTtcbiAgICB9XG5cbiAgICBhZGRMYXllciAobGF5ZXIpIHtcbiAgICAgICAgdGhpcy5sYXllcnMucHVzaChsYXllcik7XG4gICAgfVxuXG4gICAgYnVpbGREcmF3R3JvdXBzIChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXllcnMgPSBbXSwgbGF5ZXJfaWRzID0gW107XG4gICAgICAgIG1hdGNoRmVhdHVyZShjb250ZXh0LCBbdGhpc10sIGxheWVycywgbGF5ZXJfaWRzKTtcblxuICAgICAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjYWNoZV9rZXkgPSBjYWNoZUtleShsYXllcl9pZHMpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGV2YWx1YXRlIGVhY2ggbGF5ZXIgY29tYmluYXRpb24gb25jZSAodW5kZWZpbmVkIG1lYW5zIG5vdCB5ZXQgZXZhbHVhdGVkLFxuICAgICAgICAgICAgLy8gbnVsbCBtZWFucyBldmFsdWF0ZWQgd2l0aCBubyBkcmF3IG9iamVjdClcbiAgICAgICAgICAgIGlmIChsYXllcl9jYWNoZVtjYWNoZV9rZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCB0aGUgdW5pcXVlIHZpc2libGUgZHJhdyBibG9ja3MgZm9yIHRoaXMgbGF5ZXIgdHJlZVxuICAgICAgICAgICAgICAgIGxldCBkcmF3X2dyb3VwcyA9IGxheWVycy5tYXAoeCA9PiB4ICYmIHgudmlzaWJsZSAhPT0gZmFsc2UgJiYgeC5jYWxjdWxhdGVkRHJhdyk7XG4gICAgICAgICAgICAgICAgbGV0IGRyYXdfa2V5cyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgZHJhd19ncm91cHMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxheWVyID0gZHJhd19ncm91cHNbcl07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGc9MDsgZyA8IGxheWVyLmxlbmd0aDsgZysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBsYXllcltnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfa2V5c1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGRyYXcgZ3JvdXBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkcmF3X2tleSBpbiBkcmF3X2tleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9IGxheWVyX2NhY2hlW2NhY2hlX2tleV0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldID0gbWVyZ2VUcmVlcyhkcmF3X2dyb3VwcywgZHJhd19rZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2F2ZSB0aGUgb25lcyB0aGF0IHdlcmVuJ3QgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XS5rZXkgPSBjYWNoZV9rZXkgKyAnLycgKyBkcmF3X2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldLmxheWVycyA9IGxheWVycy5tYXAoeCA9PiB4ICYmIHguZnVsbF9uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vIGxheWVycyBldmFsdWF0ZWRcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSAmJiBPYmplY3Qua2V5cyhsYXllcl9jYWNoZVtjYWNoZV9rZXldKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxheWVyX2NhY2hlW2NhY2hlX2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuY29uc3QgRmlsdGVyT3B0aW9ucyA9IHtcbiAgICAvLyBIYW5kbGUgdW5pdCBjb252ZXJzaW9ucyBvbiBmaWx0ZXIgcmFuZ2VzXG4gICAgcmFuZ2VUcmFuc2Zvcm0odmFsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpLnNsaWNlKC0zKSA9PT0gJ3B4MicpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtwYXJzZUZsb2F0KHZhbCl9ICogY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsX3NxYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGlzV2hpdGVMaXN0ZWQoa2V5KSB7XG4gICAgcmV0dXJuIHdoaXRlTGlzdC5pbmRleE9mKGtleSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFByb3BzKG9iaikge1xuICAgIGxldCB3aGl0ZUxpc3RlZCA9IHt9LCBub25XaGl0ZUxpc3RlZCA9IHt9O1xuXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoaXNXaGl0ZUxpc3RlZChrZXkpKSB7XG4gICAgICAgICAgICB3aGl0ZUxpc3RlZFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub25XaGl0ZUxpc3RlZFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt3aGl0ZUxpc3RlZCwgbm9uV2hpdGVMaXN0ZWRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRHJhdyhsYXllcikge1xuXG4gICAgbGV0IGRyYXcgID0gW107XG5cbiAgICBpZiAobGF5ZXIucGFyZW50KSB7XG4gICAgICAgIGxldCBjcyA9IGxheWVyLnBhcmVudC5jYWxjdWxhdGVkRHJhdyB8fCBbXTtcbiAgICAgICAgZHJhdy5wdXNoKC4uLmNzKTtcbiAgICB9XG5cbiAgICBkcmF3LnB1c2gobGF5ZXIuZHJhdyk7XG4gICAgcmV0dXJuIGRyYXc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVyVHJlZShuYW1lLCBsYXllciwgcGFyZW50LCBzdHlsZXMpIHtcblxuICAgIGxldCBwcm9wZXJ0aWVzID0geyBuYW1lLCBsYXllciwgcGFyZW50IH07XG4gICAgbGV0IFt3aGl0ZUxpc3RlZCwgbm9uV2hpdGVMaXN0ZWRdID0gZ3JvdXBQcm9wcyhsYXllcik7XG4gICAgbGV0IGVtcHR5ID0gaXNFbXB0eShub25XaGl0ZUxpc3RlZCk7XG4gICAgbGV0IENyZWF0ZTtcblxuICAgIGlmIChlbXB0eSAmJiBwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICBDcmVhdGUgPSBMYXllckxlYWY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgQ3JlYXRlID0gTGF5ZXJUcmVlO1xuICAgIH1cblxuICAgIGxldCByID0gbmV3IENyZWF0ZShPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIHdoaXRlTGlzdGVkKSk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5hZGRMYXllcihyKTtcbiAgICB9XG5cbiAgICBpZiAoIWVtcHR5KSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBub25XaGl0ZUxpc3RlZCkge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5ID0gbm9uV2hpdGVMaXN0ZWRba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHBhcnNlTGF5ZXJUcmVlKGtleSwgcHJvcGVydHksIHIsIHN0eWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEludmFsaWQgbGF5ZXJcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYExheWVyIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0OiBjYW5ub3QgY3JlYXRlIGxheWVyICcke2tleX06ICR7SlNPTi5zdHJpbmdpZnkocHJvcGVydHkpfSdgO1xuICAgICAgICAgICAgICAgIG1zZyArPSBgLCB1bmRlciBwYXJlbnQgbGF5ZXIgJyR7ci5mdWxsX25hbWV9Jy5gO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBhcmVudCBpcyBhIHN0eWxlIG5hbWUsIHRoaXMgbWF5IGJlIGFuIGluY29ycmVjdGx5IG5lc3RlZCBsYXllclxuICAgICAgICAgICAgICAgIGlmIChzdHlsZXNbci5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCBUaGUgcGFyZW50IG5hbWUgJyR7ci5uYW1lfScgaXMgYWxzbyB0aGUgbmFtZSBvZiBhIHN0eWxlLCBkaWQgeW91IG1lYW4gdG8gY3JlYXRlIGEgJ2RyYXcnIGdyb3VwYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgdW5kZXIgJyR7cGFyZW50Lm5hbWV9J2A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgaW5zdGVhZD9gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJzIChsYXllcnMsIHN0eWxlcykge1xuICAgIGxldCBsYXllcl90cmVlcyA9IHt9O1xuXG4gICAgZm9yIChsZXQga2V5IGluIGxheWVycykge1xuICAgICAgICBsZXQgbGF5ZXIgPSBsYXllcnNba2V5XTtcbiAgICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgICAgICBsYXllcl90cmVlc1trZXldID0gcGFyc2VMYXllclRyZWUoa2V5LCBsYXllciwgbnVsbCwgc3R5bGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcl90cmVlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmVhdHVyZShjb250ZXh0LCBsYXllcnMsIGNvbGxlY3RlZF9sYXllcnMsIGNvbGxlY3RlZF9sYXllcnNfaWRzKSB7XG4gICAgbGV0IG1hdGNoZWQgPSBmYWxzZTtcbiAgICBsZXQgY2hpbGRNYXRjaGVkID0gZmFsc2U7XG5cbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIGZvciAobGV0IHI9MDsgciA8IGxheWVycy5sZW5ndGg7IHIrKykge1xuICAgICAgICBsZXQgY3VycmVudCA9IGxheWVyc1tyXTtcblxuICAgICAgICBpZiAoY3VycmVudC5pc19sZWFmKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5kb2VzTWF0Y2goY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHMucHVzaChjdXJyZW50LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQuaXNfdHJlZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9lc01hdGNoKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBjaGlsZE1hdGNoZWQgPSBtYXRjaEZlYXR1cmUoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkc1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkTWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzLnB1c2goY3VycmVudC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWQ7XG59XG4iLCIvLyBSZW5kZXJzIGFuIGFycmF5IHNwZWNpZnlpbmcgYSBsaW5lIHBhdHRlcm4gb2YgYWx0ZXJuYXRpbmcgZGFzaGVzIGFuZCBzcGFjZXMsXG4vLyBzaW1pbGFyIHRvIGFuIFNWRyBgZGFzaGFycmF5YCBvciBDYW52YXMgc2V0TGluZURhc2goKSwgaW50byBhIGJ5dGUgYXJyYXkgb2YgUkdCQSBwaXhlbHNcbi8vIFJldHVybnM6XG4vLyB7XG4vLyAgICBwaXhlbDogcmVuZGVyZWQgaW1hZ2UgaW4gVWludDhBcnJheSBidWZmZXJcbi8vICAgIGxlbmd0aDogcGl4ZWwgbGVuZ3RoIG9mIHJlbmRlcmVkIGRhc2ggcGF0dGVybiAoc3VtIG9mIGFsbCBkYXNoZXMgYW5kIHNwYWNlcylcbi8vIH1cbi8vXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvU1ZHL3BhaW50aW5nLmh0bWwjU3Ryb2tlRGFzaGFycmF5UHJvcGVydHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NWRy9BdHRyaWJ1dGUvc3Ryb2tlLWRhc2hhcnJheVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC9zZXRMaW5lRGFzaFxuXG5jb25zdCBkZWZhdWx0X2Rhc2hfY29sb3IgPSBbMjU1LCAyNTUsIDI1NSwgMjU1XTtcbmNvbnN0IGRlZmF1bHRfYmFja2dyb3VuZF9jb2xvciA9IFswLCAwLCAwLCAwXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVuZGVyRGFzaEFycmF5IChwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBkYXNoX3BpeGVsID0gb3B0aW9ucy5kYXNoX2NvbG9yIHx8IGRlZmF1bHRfZGFzaF9jb2xvcjtcbiAgICBjb25zdCBiYWNrZ3JvdW5kX2NvbG9yID0gb3B0aW9ucy5iYWNrZ3JvdW5kX2NvbG9yIHx8IGRlZmF1bHRfYmFja2dyb3VuZF9jb2xvcjtcbiAgICBjb25zdCBkYXNoZXMgPSBwYXR0ZXJuO1xuICAgIGNvbnN0IHNjYWxlID0gb3B0aW9ucy5zY2FsZSB8fCAxO1xuXG4gICAgLy8gSWYgcGF0dGVybiBpcyBvZGQsIHJlcGVhdCBpdCB0byBtYWtlIGl0IGV2ZW4gKHNlZSBTVkcgc3BlYylcbiAgICBpZiAoZGFzaGVzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZGFzaGVzLCBkYXNoZXMpO1xuICAgIH1cblxuICAgIGxldCBkYXNoID0gdHJ1ZTtcbiAgICBsZXQgcGl4ZWxzID0gW107XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgZGFzaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gTWF0aC5mbG9vcihkYXNoZXNbaV0gKiBzY2FsZSk7XG4gICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNlZ21lbnQ7IHMrKykge1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocGl4ZWxzLCBkYXNoID8gZGFzaF9waXhlbCA6IGJhY2tncm91bmRfY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGRhc2ggPSAhZGFzaDsgLy8gYWx0ZXJuYXRlIGJldHdlZW4gZGFzaGVzIGFuZCBzcGFjZXNcbiAgICB9XG5cbiAgICBwaXhlbHMgPSBuZXcgVWludDhBcnJheShwaXhlbHMpOyAvLyBjb252ZXJ0IHRvIHR5cGVkIGFycmF5XG4gICAgY29uc3QgbGVuZ3RoID0gcGl4ZWxzLmxlbmd0aCAvIDQ7IC8vIG9uZSBSR0JBIGJ5dGUgc2VxdWVuY2VzIHRvIG9uZSBwaXhlbFxuXG4gICAgcmV0dXJuIHsgcGl4ZWxzLCBsZW5ndGggfTtcbn1cbiIsIi8vIExpbmUgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRQb2x5bGluZXN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvbHlsaW5lcyc7XG5pbXBvcnQgcmVuZGVyRGFzaEFycmF5IGZyb20gJy4vZGFzaGFycmF5JztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7c2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LCBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudH0gZnJvbSAnLi4vcG9seWdvbnMvcG9seWdvbnMnO1xuXG5leHBvcnQgdmFyIExpbmVzID0gT2JqZWN0LmNyZWF0ZShTdHlsZSk7XG5cbk9iamVjdC5hc3NpZ24oTGluZXMsIHtcbiAgICBuYW1lOiAnbGluZXMnLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHZlcnRleF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgZnJhZ21lbnRfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQsXG4gICAgc2VsZWN0aW9uOiB0cnVlLCAvLyB0dXJuIGZlYXR1cmUgc2VsZWN0aW9uIG9uXG5cbiAgICBpbml0KCkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzaWMgYXR0cmlidXRlcywgb3RoZXJzIGNhbiBiZSBhZGRlZCAoc2VlIHRleHR1cmUgVVZzIGJlbG93KVxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfZXh0cnVkZScsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFRlbGwgdGhlIHNoYWRlciB3ZSB3YW50IGEgb3JkZXIgaW4gdmVydGV4IGF0dHJpYnV0ZXMsIGFuZCB0byBleHRydWRlIGxpbmVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRVhUUlVERV9MSU5FUyA9IHRydWU7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgbGluZSB0ZXh0dXJlIG9yIGRhc2ggYXJyYXlcbiAgICAgICAgLy8gKGxhdHRlciB3aWxsIGJlIHJlbmRlcmVkIGF0IGNvbXBpbGUtdGltZSwgd2hlbiBHTCBjb250ZXh0IGF2YWlsYWJsZSlcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSB8fCB0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIHRoaXMudGV4Y29vcmRzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIHRleHR1cmUgVVZzXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVEVYVFVSRV9DT09SRFMgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBTY2FsaW5nIGZhY3RvciB0byBhZGQgcHJlY2lzaW9uIHRvIGxpbmUgdGV4dHVyZSBWIGNvb3JkaW5hdGUgcGFja2VkIGFzIG5vcm1hbGl6ZWQgc2hvcnRcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgPSAxO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZSAqIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggYXR0cmlidXRlIGZvciBVVnMgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBzaW5nbGUtYWxsb2NhdGVkIG9iamVjdCB1c2VkIGZvciBob2xkaW5nIG91dGxpbmUgc3R5bGUgYXMgaXQgaXMgcHJvY2Vzc2VkXG4gICAgICAgIC8vIFNlcGFyYXRlIGZyb20gdGhpcy5mZWF0dXJlX3N0eWxlIHNvIHRoYXQgb3V0bGluZSBwcm9wZXJ0aWVzIGRvIG5vdCBvdmVyd3JpdGUgY2FsY3VsYXRlZFxuICAgICAgICAvLyBpbmxpbmUgcHJvcGVydGllcyAob3V0bGluZSBjYWxsIGlzIG1hZGUgKndpdGhpbiogdGhlIGlubGluZSBjYWxsKVxuICAgICAgICB0aGlzLm91dGxpbmVfZmVhdHVyZV9zdHlsZSA9IHt9O1xuICAgICAgICB0aGlzLmlubGluZV9mZWF0dXJlX3N0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlOyAvLyBzYXZlIHJlZmVyZW5jZSB0byBtYWluIGNvbXB1dGVkIHN0eWxlIG9iamVjdFxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlX3NldHVwKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlTGluZVRleHR1cmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3R5bGUuY29tcGlsZVNldHVwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIC8vIE9wdGlvbmFsbHkgYXBwbHkgYSBkYXNoIGFycmF5IHBhdHRlcm4gdG8gdGhpcyBsaW5lXG4gICAgcGFyc2VMaW5lVGV4dHVyZSAoKSB7XG4gICAgICAgIC8vIFNwZWNpZnkgYSBsaW5lIHBhdHRlcm5cbiAgICAgICAgaWYgKHRoaXMuZGFzaCkge1xuICAgICAgICAgICAgLy8gT3B0aW9uYWwgYmFja2dyb3VuZCBjb2xvciBmb3IgZGFzaCBwYXR0ZXJuIChkZWZhdWx0cyB0cmFuc3BhcmVudClcbiAgICAgICAgICAgIGlmICh0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcih0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTElORV9CQUNLR1JPVU5EX0NPTE9SID1cbiAgICAgICAgICAgICAgICAgICAgYHZlYzMoJHt0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvci5zbGljZSgwLCAzKS5qb2luKCcsICcpfSlgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGp1c3QgdGV4Y29vcmQgc2NhbGUgdG8gYWxsb3cgZm9yIGRhc2ggcGF0dGVybnMgdGhhdCBhcmUgYSBmcmFjdGlvbiBvZiBsaW5lIHdpZHRoXG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFID0gMjA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9WX1NDQUxFX0FESlVTVCA9IEdlby50aWxlX3NjYWxlICogdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGxpbmUgcGF0dGVyblxuICAgICAgICAgICAgY29uc3QgZGFzaCA9IHJlbmRlckRhc2hBcnJheSh0aGlzLmRhc2gsIHsgc2NhbGU6IHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSAnXycgKyB0aGlzLm5hbWUgKyAnX2Rhc2hhcnJheSc7XG4gICAgICAgICAgICBUZXh0dXJlLmNyZWF0ZSh0aGlzLmdsLCB0aGlzLnRleHR1cmUsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXNoLnBpeGVscyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGRhc2gubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgICAgICAgIGZpbHRlcmluZzogJ25lYXJlc3QnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpZnkgYSBsaW5lIHRleHR1cmUgKGVpdGhlciBkaXJlY3RseSwgb3IgcmVuZGVyZWQgZGFzaCBwYXR0ZXJuIGZyb20gYWJvdmUpXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xJTkVfVEVYVFVSRSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9BTFBIQV9URVNUID0gMC41OyAvLyBwaXhlbHMgYmVsb3cgdGhpcyB0aHJlc2hvbGQgYXJlIHRyYW5zcGFyZW50XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMgPSB0aGlzLnNoYWRlcnMudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZV9yYXRpbyA9IDE7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsaW5lIHBhdHRlcm4gYXNwZWN0IHJhdGlvIGFmdGVyIHRleHR1cmUgbG9hZHNcbiAgICAgICAgICAgIFRleHR1cmUuZ2V0SW5mbyh0aGlzLnRleHR1cmUpLnRoZW4odGV4dHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZV9yYXRpbyA9IHRleHR1cmUuaGVpZ2h0IC8gdGV4dHVyZS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYXQgem9vbSBnaXZlbiBpbiBgY29udGV4dGBcbiAgICBjYWxjV2lkdGggKHdpZHRoLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAod2lkdGggJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkod2lkdGgsIGNvbnRleHQpKSB8fCAwO1xuICAgIH0sXG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYXQgbmV4dCB6b29tICh1c2VkIGZvciBsaW5lIHdpZHRoIGludGVycG9sYXRpb24pXG4gICAgY2FsY1dpZHRoTmV4dFpvb20gKHdpZHRoLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuem9vbSsrO1xuICAgICAgICBsZXQgdmFsID0gdGhpcy5jYWxjV2lkdGgod2lkdGgsIGNvbnRleHQpO1xuICAgICAgICBjb250ZXh0Lnpvb20tLTtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgX3BhcnNlRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG5cbiAgICAgICAgLy8gbGluZSB3aWR0aCBpbiBtZXRlcnNcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5jYWxjV2lkdGgoZHJhdy53aWR0aCwgY29udGV4dCk7XG4gICAgICAgIGlmICh3aWR0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBsaW5lcyB3aXRoIG5lZ2F0aXZlIHdpZHRoXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRfd2lkdGggPSB0aGlzLmNhbGNXaWR0aE5leHRab29tKGRyYXcubmV4dF93aWR0aCwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCh3aWR0aCA9PT0gMCAmJiBuZXh0X3dpZHRoID09PSAwKSB8fCBuZXh0X3dpZHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIGxpbmVzIHRoYXQgZG9uJ3QgaW50ZXJwb2xhdGUgdG8gYSBwb3NpdGl2ZSB2YWx1ZSBhdCBuZXh0IHpvb21cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gdW5pdHMgYW5kIHJlbGF0aXZlIGNoYW5nZSBmcm9tIHByZXZpb3VzIHpvb21cbiAgICAgICAgLy8gTkI6IG11bHRpcGx5IGJ5IDIgYmVjYXVzZSBhIGdpdmVuIHdpZHRoIGlzIHR3aWNlIGFzIGJpZyBpbiBzY3JlZW4gc3BhY2UgYXQgdGhlIG5leHQgem9vbVxuICAgICAgICBzdHlsZS53aWR0aCA9IHdpZHRoICogY29udGV4dC51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb207XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggPSAobmV4dF93aWR0aCAqIDIpIC0gd2lkdGg7XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggKj0gY29udGV4dC51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb207XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggLz0gMjsgLy8gTkI6IGRpdmlkZSBieSAyIGJlY2F1c2UgZXh0cnVzaW9uIHdpZHRoIGlzIGhhbHZlZCBpbiBidWlsZGVyIC0gcmVtb3ZlP1xuXG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoZWlnaHQgZGVmYXVsdHMgdG8gZmVhdHVyZSBoZWlnaHQsIGJ1dCBleHRydWRlIHN0eWxlIGNhbiBkeW5hbWljYWxseSBhZGp1c3QgaGVpZ2h0IGJ5IHJldHVybmluZyBhIG51bWJlciBvciBhcnJheSAoaW5zdGVhZCBvZiBhIGJvb2xlYW4pXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiB8fCAwLCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcbiAgICAgICAgc3R5bGUuaGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5oZWlnaHQ7XG4gICAgICAgIHN0eWxlLmV4dHJ1ZGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5leHRydWRlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3R5bGUuZXh0cnVkZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5leHRydWRlKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSYWlzZSBsaW5lIGhlaWdodCBpZiBleHRydWRlZFxuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSAmJiBzdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIHN0eWxlLnogKz0gc3R5bGUuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUueiAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAgICAgICAgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgc3R5bGUuaGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7XG5cbiAgICAgICAgc3R5bGUuY2FwID0gZHJhdy5jYXA7XG4gICAgICAgIHN0eWxlLmpvaW4gPSBkcmF3LmpvaW47XG4gICAgICAgIHN0eWxlLm1pdGVyX2xpbWl0ID0gZHJhdy5taXRlcl9saW1pdDtcbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGFuIG91dGxpbmUgc3R5bGVcbiAgICAgICAgLy8gUmV1c2FibGUgb3V0bGluZSBzdHlsZSBvYmplY3QsIG1hcmtlZCBhcyBhbHJlYWR5IHdyYXBwZWQgaW4gY2FjaGUgb2JqZWN0cyAocHJlcHJvY2Vzc2VkID0gdHJ1ZSlcbiAgICAgICAgc3R5bGUub3V0bGluZSA9IHN0eWxlLm91dGxpbmUgfHwgeyB3aWR0aDoge30sIG5leHRfd2lkdGg6IHt9LCBwcmVwcm9jZXNzZWQ6IHRydWUgfTtcblxuICAgICAgICBpZiAoZHJhdy5vdXRsaW5lICYmIGRyYXcub3V0bGluZS52aXNpYmxlICE9PSBmYWxzZSAmJiBkcmF3Lm91dGxpbmUuY29sb3IgJiYgZHJhdy5vdXRsaW5lLndpZHRoKSB7XG4gICAgICAgICAgICAvLyBvdXRsaW5lIHdpZHRoIGluIG1ldGVyc1xuICAgICAgICAgICAgLy8gTkI6IG11bHRpcGx5IGJ5IDIgYmVjYXVzZSBvdXRsaW5lIGlzIGFwcGxpZWQgb24gYm90aCBzaWRlcyBvZiBsaW5lXG4gICAgICAgICAgICBsZXQgb3V0bGluZV93aWR0aCA9IHRoaXMuY2FsY1dpZHRoKGRyYXcub3V0bGluZS53aWR0aCwgY29udGV4dCkgKiAyO1xuICAgICAgICAgICAgbGV0IG91dGxpbmVfbmV4dF93aWR0aCA9IHRoaXMuY2FsY1dpZHRoTmV4dFpvb20oZHJhdy5vdXRsaW5lLm5leHRfd2lkdGgsIGNvbnRleHQpICogMjtcblxuICAgICAgICAgICAgaWYgKChvdXRsaW5lX3dpZHRoID09PSAwICYmIG91dGxpbmVfbmV4dF93aWR0aCA9PT0gMCkgfHwgb3V0bGluZV93aWR0aCA8IDAgfHwgb3V0bGluZV9uZXh0X3dpZHRoIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgbGluZXMgdGhhdCBkb24ndCBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHplcm8gb3IgZ3JlYXRlciB3aWR0aFxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNYWludGFpbiBjb25zaXN0ZW50IG91dGxpbmUgd2lkdGggYXJvdW5kIHRoZSBsaW5lIGZpbGxcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gb3V0bGluZV93aWR0aCArIHdpZHRoO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG91dGxpbmVfbmV4dF93aWR0aCArIG5leHRfd2lkdGg7XG5cbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gZHJhdy5vdXRsaW5lLmNvbG9yO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY2FwID0gZHJhdy5vdXRsaW5lLmNhcCB8fCBkcmF3LmNhcDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmpvaW4gPSBkcmF3Lm91dGxpbmUuam9pbiB8fCBkcmF3LmpvaW47XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5taXRlcl9saW1pdCA9IGRyYXcub3V0bGluZS5taXRlcl9saW1pdCB8fCBkcmF3Lm1pdGVyX2xpbWl0O1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuc3R5bGUgPSBkcmF3Lm91dGxpbmUuc3R5bGUgfHwgdGhpcy5uYW1lO1xuXG4gICAgICAgICAgICAgICAgLy8gRXhwbGljaXRseSBkZWZpbmVkIG91dGxpbmUgb3JkZXIsIG9yIGluaGVyaXRlZCBmcm9tIGlubmVyIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoZHJhdy5vdXRsaW5lLm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSB0aGlzLnBhcnNlT3JkZXIoZHJhdy5vdXRsaW5lLm9yZGVyLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSBzdHlsZS5vcmRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBEb24ndCBsZXQgb3V0bGluZSBiZSBhYm92ZSBpbm5lciBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm91dGxpbmUub3JkZXIgPiBzdHlsZS5vcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gc3R5bGUub3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT3V0bGluZXMgYXJlIGFsd2F5cyBhdCBoYWxmLWxheWVyIGludGVydmFscyB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoIGlubmVyIGxpbmVzXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciAtPSAwLjU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgZHJhdy5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3LmNvbG9yKTtcbiAgICAgICAgZHJhdy53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgIGRyYXcubmV4dF93aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7IC8vIHdpZHRoIHdpbGwgYmUgY29tcHV0ZWQgZm9yIG5leHQgem9vbVxuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG5cbiAgICAgICAgaWYgKGRyYXcub3V0bGluZSkge1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS5jb2xvcik7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUubmV4dF93aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTsgLy8gd2lkdGggcmUtY29tcHV0ZWQgZm9yIG5leHQgem9vbVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS56IHx8IDA7XG5cbiAgICAgICAgLy8gbGF5ZXIgb3JkZXIgLSB3IGNvb3JkIG9mICdwb3NpdGlvbicgYXR0cmlidXRlIChmb3IgcGFja2luZyBlZmZpY2llbmN5KVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKTtcblxuICAgICAgICAvLyBleHRydXNpb24gdmVjdG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG5cbiAgICAgICAgLy8gc2NhbGluZyB0byBwcmV2aW91cyBhbmQgbmV4dCB6b29tXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5uZXh0X3dpZHRoO1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclswXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzFdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMl0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclszXSAqIDI1NTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzBdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMl0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzNdICogMjU1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRleHR1cmUgVVZzIHRvIHRlbXBsYXRlIG9ubHkgaWYgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRMaW5lcyhsaW5lcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIC8vIE91dGxpbmUgKGJ1aWxkIGZpcnN0IHNvIHRoYXQgYmxlbmRlZCBnZW9tZXRyeSB3aXRob3V0IGEgZGVwdGggdGVzdCBpcyBkcmF3biBmaXJzdC91bmRlciB0aGUgaW5uZXIgbGluZSlcbiAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0gdGhpcy5vdXRsaW5lX2ZlYXR1cmVfc3R5bGU7IC8vIHN3YXAgaW4gb3V0bGluZS1zcGVjaWZpYyBzdHlsZSBob2xkZXJcbiAgICAgICAgaWYgKHN0eWxlLm91dGxpbmUgJiYgc3R5bGUub3V0bGluZS5jb2xvciAhPSBudWxsICYmIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG91dGxpbmVfc3R5bGUgPSB0aGlzLnN0eWxlc1tzdHlsZS5vdXRsaW5lLnN0eWxlXTtcbiAgICAgICAgICAgIGlmIChvdXRsaW5lX3N0eWxlKSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZV9zdHlsZS5hZGRGZWF0dXJlKGNvbnRleHQuZmVhdHVyZSwgc3R5bGUub3V0bGluZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWluIGxpbmVcbiAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0gdGhpcy5pbmxpbmVfZmVhdHVyZV9zdHlsZTsgLy8gcmVzdG9yZSBjYWxjdWxhdGVkIHN0eWxlIGZvciBpbmxpbmVcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgYnVpbGRQb2x5bGluZXMoXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHN0eWxlLndpZHRoLFxuICAgICAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FwOiBzdHlsZS5jYXAsXG4gICAgICAgICAgICAgICAgam9pbjogc3R5bGUuam9pbixcbiAgICAgICAgICAgICAgICBtaXRlcl9saW1pdDogc3R5bGUubWl0ZXJfbGltaXQsXG4gICAgICAgICAgICAgICAgc2NhbGluZ19pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfZXh0cnVkZSxcbiAgICAgICAgICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZTogMjU2LCAvLyB2YWx1ZXMgaGF2ZSBhbiA4LWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF93aWR0aDogKHN0eWxlLndpZHRoIHx8IHN0eWxlLm5leHRfd2lkdGgpIC8gY29udGV4dC50aWxlLm92ZXJ6b29tMiwgLy8gVVZzIGNhbid0IGNhbGMgZm9yIHplcm8td2lkdGgsIHVzZSBuZXh0IHpvb20gd2lkdGggaW4gdGhhdCBjYXNlXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNSwgLy8gc2NhbGUgVVZzIHRvIHVuc2lnbmVkIHNob3J0c1xuICAgICAgICAgICAgICAgIGNsb3NlZF9wb2x5Z29uOiBvcHRpb25zICYmIG9wdGlvbnMuY2xvc2VkX3BvbHlnb24sXG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXM6ICFzdHlsZS50aWxlX2VkZ2VzICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5yZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlOiBHZW8udGlsZV9zY2FsZSAqIGNvbnRleHQudGlsZS5wYWRfc2NhbGUgKiA0XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICAvLyBSZW5kZXIgcG9seWdvbnMgYXMgaW5kaXZpZHVhbCBsaW5lc1xuICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgdGhpcy5idWlsZExpbmVzKHBvbHlnb25zW3BdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQsIHsgY2xvc2VkX3BvbHlnb246IHRydWUsIHJlbW92ZV90aWxlX2VkZ2VzOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcbiIsIi8vIFBvaW50ICsgdGV4dCBsYWJlbCByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBnbCBmcm9tICcuLi8uLi9nbC9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRRdWFkc0ZvclBvaW50c30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9pbnRzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi8uLi92ZWN0b3InO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9wb2ludCc7XG5pbXBvcnQgcGxhY2VQb2ludHNPbkxpbmUgZnJvbSAnLi4vLi4vbGFiZWxzL3BvaW50X3BsYWNlbWVudCc7XG5pbXBvcnQge1RleHRMYWJlbHN9IGZyb20gJy4uL3RleHQvdGV4dF9sYWJlbHMnO1xuaW1wb3J0IHtWSUVXX1BBTl9TTkFQX1RJTUV9IGZyb20gJy4uLy4uL3ZpZXcnO1xuaW1wb3J0IGRlYnVnU2V0dGluZ3MgZnJvbSAnLi4vLi4vdXRpbHMvZGVidWdfc2V0dGluZ3MnO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50c1ZlcnRleCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvaW50c192ZXJ0ZXguZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcG9pbnRzRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2ludHNfZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5cbmNvbnN0IFBMQUNFTUVOVCA9IExhYmVsUG9pbnQuUExBQ0VNRU5UO1xuXG5leHBvcnQgdmFyIFBvaW50cyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG4vLyBNaXhpbiB0ZXh0IGxhYmVsIG1ldGhvZHNcbk9iamVjdC5hc3NpZ24oUG9pbnRzLCBUZXh0TGFiZWxzKTtcblxuT2JqZWN0LmFzc2lnbihQb2ludHMsIHtcbiAgICBuYW1lOiAncG9pbnRzJyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICBjb2xsaXNpb246IHRydWUsICAvLyBzdHlsZSBpbmNsdWRlcyBhIGNvbGxpc2lvbiBwYXNzXG4gICAgYmxlbmQ6ICdvdmVybGF5JywgLy8gb3ZlcmxheXMgZHJhd24gb24gdG9wIG9mIGFsbCBvdGhlciBzdHlsZXMsIHdpdGggYmxlbmRpbmdcblxuICAgIGluaXQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNlIHNoYWRlcnNcbiAgICAgICAgdGhpcy52ZXJ0ZXhfc2hhZGVyX3NyYyA9IHNoYWRlclNyY19wb2ludHNWZXJ0ZXg7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRfc2hhZGVyX3NyYyA9IHNoYWRlclNyY19wb2ludHNGcmFnbWVudDtcblxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffc2hhcGUnLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9vZmZzZXQnLCBzaXplOiAyLCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcblxuICAgICAgICAvLyBJZiB3ZSdyZSBub3QgcmVuZGVyaW5nIGFzIG92ZXJsYXksIHdlIG5lZWQgYSBsYXllciBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKHRoaXMuYmxlbmQgIT09ICdvdmVybGF5Jykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5zdXJlIGEgbGFiZWwgdGV4dHVyZSBpcyBhbHdheXMgYm91bmQgKGF2b2lkIENocm9tZSAnbm8gdGV4dHVyZSBib3VuZCB0byB1bml0JyB3YXJuaW5ncylcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zID0gdGhpcy5zaGFkZXJzLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV9sYWJlbF90ZXh0dXJlID0gVGV4dHVyZS5kZWZhdWx0O1xuXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1BPSU5UX1RFWFRVUkUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsZSBkdWFsIHBvaW50L3RleHQgbW9kZVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9NVUxUSV9TQU1QTEVSID0gdHJ1ZTtcblxuICAgICAgICAvLyBGYWRlIG91dCB3aGVuIHRpbGUgaXMgem9vbWluZyBvdXQsIGUuZy4gYWN0aW5nIGFzIHByb3h5IHRpbGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUX1JBVEUgPSAyOyAvLyBmYWRlIGF0IDJ4LCBlLmcuIGZ1bGx5IHRyYW5zcGFyZW50IGF0IDAuNSB6b29tIGxldmVsIGF3YXlcblxuICAgICAgICAvLyBGYWRlIGluIChkZXBlbmRpbmcgb24gdGlsZSBwcm94eSBzdGF0dXMpXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLnN1cHByZXNzX2xhYmVsX2ZhZGVfaW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmFkZV9pbl90aW1lID0gMDtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDAuMTU7IC8vIHRpbWUgaW4gc2Vjb25kc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9JTl9SQVRFID0gMSAvIHRoaXMuZmFkZV9pbl90aW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU25hcCBwb2ludHMgdG8gcGl4ZWwgZ3JpZCBhZnRlciBwYW5uaW5nIHN0b3BcbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3Muc3VwcHJlc3NfbGFiZWxfc25hcF9hbmltYXRpb24gIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1ZJRVdfUEFOX1NOQVBfUkFURSA9IDEgLyBWSUVXX1BBTl9TTkFQX1RJTUU7IC8vIGludmVyc2UgdGltZSBpbiBzZWNvbmRzXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMgPSB0aGlzLm5hbWUrJy1wb2ludHMnO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0ID0gdGhpcy5uYW1lKyctdGV4dCc7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sXG5cbiAgICByZXNldCAoKSB7XG4gICAgICAgIHRoaXMucXVldWVzID0ge307XG4gICAgICAgIHRoaXMucmVzZXRUZXh0KCk7XG4gICAgICAgIHRoaXMudGV4dHVyZV9taXNzaW5nX3Nwcml0ZXMgPSB7fTsgLy8gdHJhY2sgd2hpY2ggbWlzc2luZyBzcHJpdGVzIHdlJ3ZlIGZvdW5kIChyZWR1Y2UgZHVwZSBsb2cgbWVzc2FnZXMpXG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHF1ZXVlIGZlYXR1cmVzIGluc3RlYWQgb2YgcHJvY2Vzc2luZyBpbW1lZGlhdGVseVxuICAgIGFkZEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRpbGUgPSBjb250ZXh0LnRpbGU7XG4gICAgICAgIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbGVkIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZSBmZWF0dXJlIHF1ZXVlIGlzIHBhcnNlZCxcbiAgICAgICAgLy8gYW5kIHdlIHdhbnQgdGhlIHByZXByb2Nlc3NpbmcgZG9uZSBiZWZvcmUgd2UgZXZhbHVhdGUgdGV4dCBzdHlsZSBiZWxvd1xuICAgICAgICBkcmF3ID0gdGhpcy5wcmVwcm9jZXNzKGRyYXcpO1xuICAgICAgICBpZiAoIWRyYXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHt9O1xuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBQb2ludCBzdHlsaW5nXG5cbiAgICAgICAgLy8gcmVxdWlyZSBjb2xvciBvciB0ZXh0dXJlXG4gICAgICAgIGlmICghc3R5bGUuY29sb3IgJiYgIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0aW9uYWwgc3ByaXRlXG4gICAgICAgIGxldCBzcHJpdGVfaW5mbztcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ByaXRlcygpKSB7XG4gICAgICAgICAgICBzcHJpdGVfaW5mbyA9IHRoaXMucGFyc2VTcHJpdGUoZHJhdywgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzcHJpdGVfaW5mby50ZXhjb29yZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwb2ludCBzaXplIGRlZmluZWQgZXhwbGljaXRseSwgb3IgZGVmYXVsdHMgdG8gc3ByaXRlIHNpemUsIG9yIGdlbmVyaWMgZmFsbGJhY2tcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuc2l6ZTtcbiAgICAgICAgaWYgKCFzdHlsZS5zaXplKSB7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gc3ByaXRlX2luZm8uc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSBbMTYsIDE2XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLnNpemUgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoc3R5bGUuc2l6ZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplIHdpbGwgYmUgc2NhbGVkIHRvIDE2LWJpdCBzaWduZWQgaW50LCBzbyBtYXggYWxsb3dlZCB3aWR0aCArIGhlaWdodCBvZiAyNTYgcGl4ZWxzXG4gICAgICAgIHN0eWxlLnNpemUgPSBbXG4gICAgICAgICAgICBNYXRoLm1pbihzdHlsZS5zaXplWzBdICE9IG51bGwgPyBzdHlsZS5zaXplWzBdIDogc3R5bGUuc2l6ZSwgMjU2KSxcbiAgICAgICAgICAgIE1hdGgubWluKHN0eWxlLnNpemVbMV0gIT0gbnVsbCA/IHN0eWxlLnNpemVbMV0gOiBzdHlsZS5zaXplLCAyNTYpXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWd5XG4gICAgICAgIHN0eWxlLnBsYWNlbWVudCA9IGRyYXcucGxhY2VtZW50O1xuICAgICAgICBzdHlsZS5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBTcGFjaW5nIHBhcmFtZXRlciAoaW4gcGl4ZWxzKSB0byBlcXVhbGx5IHNwYWNlIHBvaW50cyBhbG9uZyBhIGxpbmVcbiAgICAgICAgaWYgKHN0eWxlLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULlNQQUNFRCAmJiBkcmF3LnBsYWNlbWVudF9zcGFjaW5nKSB7XG4gICAgICAgICAgICBzdHlsZS5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuZ2xlIHBhcmFtZXRlciAoY2FuIGJlIGEgbnVtYmVyIG9yIHRoZSBzdHJpbmcgXCJhdXRvXCIpXG4gICAgICAgIHN0eWxlLmFuZ2xlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuYW5nbGUsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIHBvaW50cyBjYW4gYmUgcGxhY2VkIG9mZiB0aGUgZ3JvdW5kXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG5cbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgc3R5bGUuc2FtcGxlciA9IDA7IC8vIDAgPSBzcHJpdGVzXG5cbiAgICAgICAgdGhpcy5jb21wdXRlTGF5b3V0KHN0eWxlLCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyBUZXh0IHN0eWxpbmdcbiAgICAgICAgbGV0IHRmID1cbiAgICAgICAgICAgIGRyYXcudGV4dCAmJlxuICAgICAgICAgICAgZHJhdy50ZXh0LnZpc2libGUgIT09IGZhbHNlICYmIC8vIGV4cGxpY2l0bHkgaGFuZGxlIGB2aXNpYmxlYCBwcm9wZXJ0eSBmb3IgbmVzdGVkIHRleHRcbiAgICAgICAgICAgIHRoaXMucGFyc2VUZXh0RmVhdHVyZShmZWF0dXJlLCBkcmF3LnRleHQsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIGlmICh0Zikge1xuICAgICAgICAgICAgdGYubGF5b3V0LnBhcmVudCA9IHN0eWxlOyAvLyBwYXJlbnQgcG9pbnQgd2lsbCBhcHBseSBhZGRpdGlvbmFsIGFuY2hvci9vZmZzZXQgdG8gdGV4dFxuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBoYXZlIGEgZGVmYXVsdCBwcmlvcml0eSBvZiAwLjUgYmVsb3cgdGhlaXIgcGFyZW50IHBvaW50ICgrMC41LCBwcmlvcml0eSBpcyBsb3dlci1pcy1iZXR0ZXIpXG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBiZSBvdmVycmlkZW4sIGFzIGxvbmcgYXMgaXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICB0Zi5sYXlvdXQucHJpb3JpdHkgPSBkcmF3LnRleHQucHJpb3JpdHkgPyBNYXRoLm1heCh0Zi5sYXlvdXQucHJpb3JpdHksIHN0eWxlLnByaW9yaXR5ICsgMC41KSA6IChzdHlsZS5wcmlvcml0eSArIDAuNSk7XG5cbiAgICAgICAgICAgIC8vIFRleHQgbGFiZWxzIGF0dGFjaGVkIHRvIHBvaW50cyBzaG91bGQgbm90IGJlIG1vdmVkIGludG8gdGlsZVxuICAgICAgICAgICAgLy8gKHRoZXkgc2hvdWxkIHN0YXkgZml4ZWQgcmVsYXRpdmUgdG8gdGhlIHBvaW50KVxuICAgICAgICAgICAgdGYubGF5b3V0Lm1vdmVfaW50b190aWxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIENvbGxpc2lvbi5hZGRTdHlsZSh0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0aWxlLmtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWV1ZSB0aGUgZmVhdHVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0ucHVzaCh7XG4gICAgICAgICAgICBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCBzdHlsZSxcbiAgICAgICAgICAgIHRleHRfZmVhdHVyZTogdGZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCBjb2xsaXNpb24gbWFuYWdlclxuICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfcG9pbnRzLCB0aWxlLmtleSk7XG4gICAgfSxcblxuICAgIGhhc1Nwcml0ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmUgJiYgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdICYmIFRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzO1xuICAgIH0sXG5cbiAgICBnZXRTcHJpdGVJbmZvIChzcHJpdGUpIHtcbiAgICAgICAgbGV0IGluZm8gPSBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlc1tzcHJpdGVdICYmIFRleHR1cmUuZ2V0U3ByaXRlSW5mbyh0aGlzLnRleHR1cmUsIHNwcml0ZSk7XG4gICAgICAgIGlmIChzcHJpdGUgJiYgIWluZm8pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdKSB7IC8vIG9ubHkgbG9nIGVhY2ggbWlzc2luZyBzcHJpdGUgb25jZVxuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBjb3VsZCBub3QgZmluZCBzcHJpdGUgJyR7c3ByaXRlfScgZm9yIHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfSdgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH0sXG5cbiAgICBwYXJzZVNwcml0ZSAoZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgc3ByaXRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuc3ByaXRlLCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHNwcml0ZV9pbmZvID0gdGhpcy5nZXRTcHJpdGVJbmZvKHNwcml0ZSkgfHwgdGhpcy5nZXRTcHJpdGVJbmZvKGRyYXcuc3ByaXRlX2RlZmF1bHQpO1xuICAgICAgICByZXR1cm4gc3ByaXRlX2luZm87XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuICAgICAgICByZXR1cm4gU3R5bGUuc3RhcnREYXRhLmNhbGwodGhpcywgdGlsZSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZSAke3RoaXMubmFtZX06IHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXVlID0gdGhpcy5xdWV1ZXNbdGlsZS5rZXldO1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcblxuICAgICAgICAvLyBGb3IgZWFjaCBwb2ludCBmZWF0dXJlLCBjcmVhdGUgb25lIG9yIG1vcmUgbGFiZWxzXG4gICAgICAgIGxldCB0ZXh0X29ianMgPSBbXTtcbiAgICAgICAgbGV0IHBvaW50X29ianMgPSBbXTtcblxuICAgICAgICBxdWV1ZS5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gcS5zdHlsZTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlID0gcS5mZWF0dXJlO1xuICAgICAgICAgICAgbGV0IGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeTtcblxuICAgICAgICAgICAgbGV0IGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyhzdHlsZS5zaXplLCBnZW9tZXRyeSwgc3R5bGUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlX2xhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGZlYXR1cmVfbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBwb2ludF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIGRyYXc6IHEuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogcS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBvaW50X29ianMucHVzaChwb2ludF9vYmopO1xuXG4gICAgICAgICAgICAgICAgaWYgKHEudGV4dF9mZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X29iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLnRleHRfZmVhdHVyZS5kcmF3LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogcS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcS50ZXh0X2ZlYXR1cmUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfc2V0dGluZ3Nfa2V5OiBxLnRleHRfZmVhdHVyZS50ZXh0X3NldHRpbmdzX2tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dDogcS50ZXh0X2ZlYXR1cmUubGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VkOiBwb2ludF9vYmogICAvLyBsaW5rIHNvIHRleHQgb25seSByZW5kZXJzIHdoZW4gcGFyZW50IHBvaW50IGlzIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X29ianMucHVzaCh0ZXh0X29iaik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVW5sZXNzIHRleHQgZmVhdHVyZSBpcyBvcHRpb25hbCwgY3JlYXRlIGEgdHdvLXdheSBsaW5rIHNvIHRoYXQgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHdpbGwgb25seSByZW5kZXIgd2hlbiB0ZXh0IGlzIGFsc28gcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgIGlmICghcS5kcmF3LnRleHQub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X29iai5saW5rZWQgPSB0ZXh0X29iajsgLy8gdHdvLXdheSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENvbGxpZGUgYm90aCBwb2ludHMgYW5kIHRleHQsIHRoZW4gYnVpbGQgZmVhdHVyZXNcbiAgICAgICAgcmV0dXJuIFByb21pc2UuXG4gICAgICAgICAgICBhbGwoW1xuICAgICAgICAgICAgICAgIC8vIFBvaW50c1xuICAgICAgICAgICAgICAgIENvbGxpc2lvbi5jb2xsaWRlKHBvaW50X29ianMsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpLnRoZW4ocG9pbnRfb2JqcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50X29ianMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUubGFiZWwgPSBxLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyBMYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmVUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIHRleHRfb2JqcykuXG4gICAgICAgICAgICAgICAgICAgIHRoZW4obGFiZWxzID0+IHRoaXMuY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHModGlsZSwgdGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgbGFiZWxzKSlcbiAgICAgICAgICAgIF0pLnRoZW4oKFssIHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgbGFiZWxzXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVscyAmJiB0ZXh0cykge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBxdWV1ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XSAmJiB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgc3R5bGluZyBvYmplY3QgZXhwZWN0ZWQgYnkgU3R5bGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5sb2dpY2FsX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYW5nbGUgPSBxLmxhYmVsLmFuZ2xlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyID0gMTsgLy8gbm9uLTAgPSBsYWJlbHNcblxuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mcmVlVGV4dCh0aWxlKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB0aWxlIG1lc2hcbiAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUuZW5kRGF0YS5jYWxsKHRoaXMsIHRpbGUpLnRoZW4odGlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRpbGUtc3BlY2lmaWMgbGFiZWwgYXRsYXMgdG8gbWVzaCBhcyBhIHRleHR1cmUgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSAmJiB0aWxlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcyA9IHRpbGVfZGF0YS50ZXh0dXJlcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0ZXh0dXJlKTsgLy8gYXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcblxuICAgICAgICAvLyBTaXplICgxZCB2YWx1ZSBvciAyZCBhcnJheSlcbiAgICAgICAgZHJhdy5zaXplID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnNpemUsIHYgPT4gQXJyYXkuaXNBcnJheSh2KSA/IHYubWFwKHBhcnNlRmxvYXQpIDogcGFyc2VGbG9hdCh2KSk7XG5cbiAgICAgICAgLy8gT2Zmc2V0ICgyZCBhcnJheSlcbiAgICAgICAgZHJhdy5vZmZzZXQgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub2Zmc2V0LCB2ID0+IChBcnJheS5pc0FycmF5KHYpICYmIHYubWFwKHBhcnNlRmxvYXQpKSB8fCAwKTtcblxuICAgICAgICAvLyBCdWZmZXIgKDFkIHZhbHVlIG9yIDJkIGFycmF5LCBleHBhbmQgMWQgdG8gMmQpXG4gICAgICAgIGRyYXcuYnVmZmVyID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmJ1ZmZlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdiwgdl0pLm1hcChwYXJzZUZsb2F0KSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBlYXQgcnVsZXMgLSBubyByZXBlYXQgbGltaXRhdGlvbiBmb3IgcG9pbnRzIGJ5IGRlZmF1bHRcbiAgICAgICAgZHJhdy5yZXBlYXRfZGlzdGFuY2UgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucmVwZWF0X2Rpc3RhbmNlLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICAvLyBQbGFjZW1lbnQgc3RyYXRlZ2llc1xuICAgICAgICBkcmF3LnBsYWNlbWVudCA9IFBMQUNFTUVOVFtkcmF3LnBsYWNlbWVudCAmJiBkcmF3LnBsYWNlbWVudC50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgaWYgKGRyYXcucGxhY2VtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIGRyYXcucGxhY2VtZW50ID0gUExBQ0VNRU5ULlZFUlRFWDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRyYXcucGxhY2VtZW50X3NwYWNpbmcgPSBkcmF3LnBsYWNlbWVudF9zcGFjaW5nICE9IG51bGwgPyBkcmF3LnBsYWNlbWVudF9zcGFjaW5nIDogODA7IC8vIGRlZmF1bHQgc3BhY2luZ1xuICAgICAgICBkcmF3LnBsYWNlbWVudF9zcGFjaW5nID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvID0gZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyAhPSBudWxsID8gZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA6IDE7XG4gICAgICAgIGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8sIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZHJhdy5hbmdsZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGRyYXcuYW5nbGUgPSBkcmF3LmFuZ2xlICogTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRyYXcuYW5nbGUgPSBkcmF3LmFuZ2xlIHx8IDA7IC8vIGFuZ2xlIGNhbiBiZSBhIHN0cmluZyBsaWtlIFwiYXV0b1wiICh1c2UgYW5nbGUgb2YgZ2VvbWV0cnkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0IHN0eWxpbmdcbiAgICAgICAgZHJhdy50ZXh0ID0gdGhpcy5wcmVwcm9jZXNzVGV4dChkcmF3LnRleHQpOyAvLyB3aWxsIHJldHVybiBudWxsIGlmIHZhbGlkIHRleHQgc3R5bGluZyB3YXNuJ3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKGRyYXcudGV4dCkge1xuICAgICAgICAgICAgZHJhdy50ZXh0LmtleSA9IGRyYXcua2V5OyAvLyBjb3B5IGxheWVyIGtleSBmb3IgdXNlIGFzIGxhYmVsIHJlcGVhdCBncm91cFxuICAgICAgICAgICAgZHJhdy50ZXh0LnJlcGVhdF9ncm91cCA9IGRyYXcudGV4dC5yZXBlYXRfZ3JvdXAgfHwgZHJhdy5yZXBlYXRfZ3JvdXA7IC8vIGluaGVyaXQgcmVwZWF0IGdyb3VwIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGRyYXcudGV4dC5hbmNob3IgPSBkcmF3LnRleHQuYW5jaG9yIHx8IHRoaXMuZGVmYXVsdF9hbmNob3I7XG4gICAgICAgICAgICBkcmF3LnRleHQub3B0aW9uYWwgPSAodHlwZW9mIGRyYXcudGV4dC5vcHRpb25hbCA9PT0gJ2Jvb2xlYW4nKSA/IGRyYXcudGV4dC5vcHRpb25hbCA6IGZhbHNlOyAvLyBkZWZhdWx0IHRleHQgdG8gcmVxdWlyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBEZWZhdWx0IHRvIHRyeWluZyBhbGwgYW5jaG9yIHBsYWNlbWVudHNcbiAgICBkZWZhdWx0X2FuY2hvcjogWydib3R0b20nLCAndG9wJywgJ3JpZ2h0JywgJ2xlZnQnXSxcblxuICAgIC8vIENvbXB1dGUgbGFiZWwgbGF5b3V0LXJlbGF0ZWQgcHJvcGVydGllc1xuICAgIGNvbXB1dGVMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuICAgICAgICBsYXlvdXQuaWQgPSBmZWF0dXJlO1xuICAgICAgICBsYXlvdXQudW5pdHNfcGVyX3BpeGVsID0gdGlsZS51bml0c19wZXJfcGl4ZWwgfHwgMTtcblxuICAgICAgICAvLyBjb2xsaXNpb24gZmxhZ1xuICAgICAgICBsYXlvdXQuY29sbGlkZSA9IChkcmF3LmNvbGxpZGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IGZhbHNlO1xuXG4gICAgICAgIC8vIHBvaW50cyBzaG91bGQgbm90IG1vdmUgaW50byB0aWxlIGlmIG92ZXIgdGlsZSBib3VuZGFyeVxuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBsYWJlbCBhbmNob3JzIChwb2ludCBsYWJlbHMgb25seSlcbiAgICAgICAgLy8gbGFiZWwgcG9zaXRpb24gd2lsbCBiZSBhZGp1c3RlZCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLCByZWxhdGl2ZSB0byBpdHMgb3JpZ2luYWwgcG9pbnRcbiAgICAgICAgLy8gb25lIG9mOiBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRvcC1sZWZ0LCB0b3AtcmlnaHQsIGJvdHRvbS1sZWZ0LCBib3R0b20tcmlnaHRcbiAgICAgICAgbGF5b3V0LmFuY2hvciA9IGRyYXcuYW5jaG9yO1xuXG4gICAgICAgIC8vIGxhYmVsIG9mZnNldCBhbmQgYnVmZmVyIGluIHBpeGVsIChhcHBsaWVkIGluIHNjcmVlbiBzcGFjZSlcbiAgICAgICAgbGF5b3V0Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3Lm9mZnNldCwgY29udGV4dCkgfHwgU3R5bGVQYXJzZXIuemVyb1BhaXI7XG4gICAgICAgIGxheW91dC5idWZmZXIgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5idWZmZXIsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuXG4gICAgICAgIC8vIHJlcGVhdCBydWxlc1xuICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcucmVwZWF0X2Rpc3RhbmNlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgKj0gbGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkcmF3LnJlcGVhdF9ncm91cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnJlcGVhdF9ncm91cChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkcmF3LnJlcGVhdF9ncm91cCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5rZXk7IC8vIGRlZmF1bHQgdG8gdW5pcXVlIHNldCBvZiBtYXRjaGluZyBsYXllcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxhYmVsIHByaW9yaXR5IChsb3dlciBpcyBoaWdoZXIpXG4gICAgICAgIGxldCBwcmlvcml0eSA9IGRyYXcucHJpb3JpdHk7XG4gICAgICAgIGlmIChwcmlvcml0eSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByaW9yaXR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBwcmlvcml0eShjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByaW9yaXR5ID0gLTEgPj4+IDA7IC8vIGRlZmF1bHQgdG8gbWF4IHByaW9yaXR5IHZhbHVlIGlmIG5vbmUgc2V0XG4gICAgICAgIH1cbiAgICAgICAgbGF5b3V0LnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9LFxuXG4gICAgLy8gSW1wbGVtZW50cyBsYWJlbCBidWlsZGluZyBmb3IgVGV4dExhYmVscyBtaXhpblxuICAgIGJ1aWxkVGV4dExhYmVscyAodGlsZV9rZXksIGZlYXR1cmVfcXVldWUpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmPTA7IGYgPCBmZWF0dXJlX3F1ZXVlLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICBsZXQgZnEgPSBmZWF0dXJlX3F1ZXVlW2ZdO1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRoaXMudGV4dHNbdGlsZV9rZXldW2ZxLnRleHRfc2V0dGluZ3Nfa2V5XVtmcS50ZXh0XTtcbiAgICAgICAgICAgIGxldCBzaXplID0gdGV4dF9pbmZvLnNpemUuY29sbGlzaW9uX3NpemU7XG4gICAgICAgICAgICBmcS5sYWJlbCA9IG5ldyBMYWJlbFBvaW50KGZxLnBvaW50X2xhYmVsLnBvc2l0aW9uLCBzaXplLCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2goZnEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkcyBvbmUgb3IgbW9yZSBwb2ludCBsYWJlbHMgZm9yIGEgZ2VvbWV0cnlcbiAgICBidWlsZExhYmVscyAoc2l6ZSwgZ2VvbWV0cnksIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuXG4gICAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHtcbiAgICAgICAgICAgIGxldCBwb2ludHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50LCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUobGluZSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgbGluZXMubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tsbl07XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKGxpbmUsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBwb2x5Z29uIGNlbnRyb2lkIChvZiBvdXRlciByaW5nKVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhY2VtZW50ID09PSBQTEFDRU1FTlQuQ0VOVFJPSUQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBlYWNoIHBvbHlnb24gdmVydGV4IChhbGwgcmluZ3MpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgcmluZ3MubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShyaW5nc1tsbl0sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gocG9pbnRfbGFiZWxzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wbGFjZW1lbnQgPT09IFBMQUNFTUVOVC5DRU5UUk9JRCkge1xuICAgICAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5tdWx0aUNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvbHlzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBwb2x5cy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBwb2x5c1twXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IHJpbmdzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKHJpbmdzW2xuXSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgY29sb3IgPSBzdHlsZS5jb2xvciB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5jb2xvcjtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgMCwgeyBzaXplOiAyIH0pO1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIHN0eWxlLnogfHwgMCwgeyBzaXplOiAxLCBvZmZzZXQ6IDIgfSk7XG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpLCB7IHNpemU6IDEsIG9mZnNldDogMyB9KTtcblxuICAgICAgICAvLyBzY2FsaW5nIHZlY3RvciAtICh4LCB5KSBjb21wb25lbnRzIHBlciBwaXhlbCwgeiA9IGFuZ2xlLCB3ID0gc2NhbGluZyBmYWN0b3JcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffc2hhcGUnLCAwLCB7IHNpemU6IDQgfSk7XG5cbiAgICAgICAgLy8gdGV4dHVyZSBjb29yZHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfdGV4Y29vcmQnLCAwLCB7IHNpemU6IDIgfSk7XG5cbiAgICAgICAgLy8gb2Zmc2V0c1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9vZmZzZXQnLCAwLCB7IHNpemU6IDIgfSk7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfY29sb3InLCBWZWN0b3IubXVsdChjb2xvciwgMjU1KSwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NlbGVjdGlvbl9jb2xvcicsIFZlY3Rvci5tdWx0KHN0eWxlLnNlbGVjdGlvbl9jb2xvciwgMjU1KSwgeyBzaXplOiA0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZFF1YWQocG9pbnRzLCBzaXplLCBhbmdsZSwgc2FtcGxlciwgb2Zmc2V0LCB0ZXhjb29yZF9zY2FsZSwgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSkge1xuICAgICAgICBidWlsZFF1YWRzRm9yUG9pbnRzKFxuICAgICAgICAgICAgcG9pbnRzLFxuICAgICAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9wb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzaGFwZV9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfc2hhcGUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0X2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9vZmZzZXRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcXVhZDogc2l6ZSxcbiAgICAgICAgICAgICAgICBxdWFkX25vcm1hbGl6ZTogMjU2LCAgICAvLyB2YWx1ZXMgaGF2ZSBhbiA4LWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgICAgICBhbmdsZTogYW5nbGUgKiA0MDk2LCAgICAvLyB2YWx1ZXMgaGF2ZSBhIDEyLWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIHNoYXBlX3c6IHNhbXBsZXIsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBxdWFkIGZvciBwb2ludCBzcHJpdGVcbiAgICBidWlsZCAoc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IHN0eWxlLmxhYmVsO1xuICAgICAgICBpZiAobGFiZWwubnVtX3NlZ21lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMYWJlbChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBidWlsZExhYmVsIChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGxldCBhbmdsZSA9IGxhYmVsLmFuZ2xlIHx8IHN0eWxlLmFuZ2xlO1xuXG4gICAgICAgIHRoaXMuYnVpbGRRdWFkKFxuICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgc3R5bGUuc2l6ZSwgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGluIHBpeGVsc1xuICAgICAgICAgICAgYW5nbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZSBpbiByYWRpYW5zXG4gICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgIGxhYmVsLm9mZnNldCwgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGZyb20gY2VudGVyIGluIHBpeGVsc1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzLCAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWwubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgbGV0IGFuZ2xlID0gbGFiZWwuYW5nbGVbaV07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHN0eWxlLnNpemVbaV07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gbGFiZWwub2Zmc2V0c1tpXTtcbiAgICAgICAgICAgIGxldCB0ZXhjb29yZCA9IHN0eWxlLnRleGNvb3Jkc1tpXTtcblxuICAgICAgICAgICAgdGhpcy5idWlsZFF1YWQoXG4gICAgICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICBhbmdsZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZ2xlIGluIGRlZ3JlZXNcbiAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgICAgICBvZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBmcm9tIGNlbnRlciBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICB0ZXhjb29yZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgVVZzXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHBhc3MtdGhyb3VnaCB0byBnZW5lcmljIHBvaW50IGJ1aWxkZXJcbiAgICBidWlsZExpbmVzIChsaW5lcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2ludHMgKHBvaW50cywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyAocG9pbnRzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBtYWtlTWVzaCAodmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIEFkZCBsYWJlbCBmYWRlIHRpbWVcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHsgZmFkZV9pbl90aW1lOiB0aGlzLmZhZGVfaW5fdGltZSB9KTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLm1ha2VNZXNoLmNhbGwodGhpcywgdmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFBvbHlnb24gcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUG9seWdvbnMsIGJ1aWxkRXh0cnVkZWRQb2x5Z29uc30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9seWdvbnMnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9seWdvbnNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2x5Z29uc19mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IHZhciBQb2x5Z29ucyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG4vLyBleHBvcnQgc2hhZGVycyBmb3IgdXNlIGluIGxpbmVzLmpzXG5leHBvcnQge1xuICAgIHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudFxufTtcblxuT2JqZWN0LmFzc2lnbihQb2x5Z29ucywge1xuICAgIG5hbWU6ICdwb2x5Z29ucycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgdmVydGV4X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBmcmFnbWVudF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNpYyBhdHRyaWJ1dGVzLCBvdGhlcnMgY2FuIGJlIGFkZGVkIChzZWUgdGV4dHVyZSBVVnMgYmVsb3cpXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9ub3JtYWwnLCBzaXplOiAzLCB0eXBlOiBnbC5CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0sIC8vIGdldHMgcGFkZGVkIHRvIDQtYnl0ZXNcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBUZWxsIHRoZSBzaGFkZXIgd2UgaGF2ZSBhIG5vcm1hbCBhbmQgb3JkZXIgYXR0cmlidXRlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9OT1JNQUxfQVRUUklCVVRFID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0dXJlIFVWc1xuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1RFWFRVUkVfQ09PUkRTID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQWRkIHZlcnRleCBhdHRyaWJ1dGUgZm9yIFVWcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcbiAgICB9LFxuXG4gICAgX3BhcnNlRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG5cbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG4gICAgICAgIGlmICghc3R5bGUuY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56LCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcbiAgICAgICAgc3R5bGUueiAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuXG4gICAgICAgIHN0eWxlLmV4dHJ1ZGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5leHRydWRlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUpIHtcbiAgICAgICAgICAgIC8vIHVzZSBmZWF0dXJlJ3MgaGVpZ2h0IGFuZCBtaW5faGVpZ2h0IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmIChzdHlsZS5leHRydWRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5taW5faGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLm1pbl9oZWlnaHQ7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGV4cGxpY2l0IGhlaWdodCwgbm8gbWluX2hlaWdodFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHN0eWxlLmV4dHJ1ZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGV4cGxpY2l0IGhlaWdodCBhbmQgbWluX2hlaWdodFxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5leHRydWRlKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSBzdHlsZS5leHRydWRlWzBdO1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAgICAgICAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS56IHx8IDA7XG5cbiAgICAgICAgLy8gbGF5ZXIgb3JkZXIgLSB3IGNvb3JkIG9mICdwb3NpdGlvbicgYXR0cmlidXRlIChmb3IgcGFja2luZyBlZmZpY2llbmN5KVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKTtcblxuICAgICAgICAvLyBub3JtYWxcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMSAqIDEyNztcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMF0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzJdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbM10gKiAyNTU7XG5cbiAgICAgICAgLy8gc2VsZWN0aW9uIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclswXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMV0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzJdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclszXSAqIDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0ZXh0dXJlIFVWcyB0byB0ZW1wbGF0ZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzUsIC8vIHNjYWxlIFVWcyB0byB1bnNpZ25lZCBzaG9ydHNcbiAgICAgICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzOiAhc3R5bGUudGlsZV9lZGdlcyxcbiAgICAgICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2U6IEdlby50aWxlX3NjYWxlICogY29udGV4dC50aWxlLnBhZF9zY2FsZSAqIDQsXG4gICAgICAgICAgICB3aW5kaW5nOiBjb250ZXh0LndpbmRpbmdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFeHRydWRlZCBwb2x5Z29ucyAoZS5nLiAzRCBidWlsZGluZ3MpXG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlICYmIHN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgYnVpbGRFeHRydWRlZFBvbHlnb25zKFxuICAgICAgICAgICAgICAgIHBvbHlnb25zLFxuICAgICAgICAgICAgICAgIHN0eWxlLnosIHN0eWxlLmhlaWdodCwgc3R5bGUubWluX2hlaWdodCxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX25vcm1hbCxcbiAgICAgICAgICAgICAgICAxMjcsIC8vIHNjYWxlIG5vcm1hbHMgdG8gc2lnbmVkIGJ5dGVzXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWd1bGFyIHBvbHlnb25zXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVpbGRQb2x5Z29ucyhcbiAgICAgICAgICAgICAgICBwb2x5Z29ucyxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuIiwiLy8gUmFzdGVyIHRpbGUgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1BvbHlnb25zfSBmcm9tICcuLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5cbmV4cG9ydCBsZXQgUmFzdGVyU3R5bGUgPSBPYmplY3QuY3JlYXRlKFBvbHlnb25zKTtcblxuT2JqZWN0LmFzc2lnbihSYXN0ZXJTdHlsZSwge1xuICAgIG5hbWU6ICdyYXN0ZXInLFxuICAgIHN1cGVyOiBQb2x5Z29ucyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFJlcXVpcmVkIGZvciByYXN0ZXIgdGlsZXNcbiAgICAgICAgdGhpcy5yYXN0ZXIgPSB0aGlzLnJhc3RlciB8fCAnY29sb3InO1xuXG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gZmFsc2U7IC8vIHJhc3RlciBzdHlsZXMgY2FuJ3Qgc3VwcG9ydCBmZWF0dXJlIHNlbGVjdGlvblxuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICAvLyBSYXN0ZXIgdGlsZXMgZGVmYXVsdCB0byB3aGl0ZSB2ZXJ0ZXggY29sb3IsIGFzIHRoaXMgY29sb3Igd2lsbCB0aW50IHRoZSB1bmRlcmx5aW5nIHRleHR1cmVcbiAgICAgICAgZHJhdy5jb2xvciA9IGRyYXcuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgICAgIHJldHVybiB0aGlzLnN1cGVyLl9wcmVwcm9jZXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFJlbmRlcmluZyBzdHlsZXNcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4uL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWQk9NZXNoIGZyb20gJy4uL2dsL3Zib19tZXNoJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuLi9saWdodCc7XG5pbXBvcnQge1Jhc3RlclRpbGVTb3VyY2V9IGZyb20gJy4uL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3NlbGVjdGlvbl9mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19yYXN0ZXJzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9yYXN0ZXJzLmdsc2wnLCAndXRmOCcpO1xuXG4vLyBCYXNlIGNsYXNzXG5cbmV4cG9ydCB2YXIgU3R5bGUgPSB7XG4gICAgaW5pdCAoeyBnZW5lcmF0aW9uLCBzdHlsZXMsIHNvdXJjZXMgPSB7fSwgaW50cm9zcGVjdGlvbiB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsgICAgICAgICAgICAgICAvLyBzY2VuZSBnZW5lcmF0aW9uIGlkIHRoaXMgc3R5bGUgd2FzIGNyZWF0ZWQgZm9yXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGVzIGZvciBzY2VuZVxuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgc291cmNlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5kZWZpbmVzID0gKHRoaXMuaGFzT3duUHJvcGVydHkoJ2RlZmluZXMnKSAmJiB0aGlzLmRlZmluZXMpIHx8IHt9OyAvLyAjZGVmaW5lcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBzaGFkZXJzXG4gICAgICAgIHRoaXMuc2hhZGVycyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdzaGFkZXJzJykgJiYgdGhpcy5zaGFkZXJzKSB8fCB7fTsgLy8gc2hhZGVyIGN1c3RvbWl6YXRpb24gKHVuaWZvcm1zLCBkZWZpbmVzLCBibG9ja3MsIGV0Yy4pXG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGludHJvc3BlY3Rpb24gfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5pbnRyb3NwZWN0aW9uIHx8IGZhbHNlOyAgIC8vIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN0eWxlIHN1cHBvcnRzIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuY29tcGlsZV9zZXR1cCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0dXAgc3RlcHMgZm9yIHByb2dyYW0gY29tcGlsYXRpb25cbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTCBwcm9ncmFtIHJlZmVyZW5jZSAoZm9yIG1haW4gcmVuZGVyIHBhc3MpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsOyAgICAgICAgICAgICAgLy8gR0wgcHJvZ3JhbSByZWZlcmVuY2UgZm9yIGZlYXR1cmUgc2VsZWN0aW9uIHJlbmRlciBwYXNzXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHt9OyAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGUgZm9yIGZlYXR1cmUgY3VycmVudGx5IGJlaW5nIHBhcnNlZCwgc2hhcmVkIHRvIGxlc3NlbiBHQy9tZW1vcnkgdGhyYXNoXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlID0gW107ICAgICAgICAgICAgICAgICAgLy8gc2hhcmVkIHNpbmdsZS12ZXJ0ZXggdGVtcGxhdGUsIGZpbGxlZCBvdXQgYnkgZWFjaCBzdHlsZVxuICAgICAgICB0aGlzLnRpbGVfZGF0YSA9IHt9O1xuXG4gICAgICAgIC8vIFByb3ZpZGUgYSBob29rIGZvciB0aGlzIG9iamVjdCB0byBiZSBjYWxsZWQgZnJvbSB3b3JrZXIgdGhyZWFkc1xuICAgICAgICB0aGlzLm1haW5fdGhyZWFkX3RhcmdldCA9IFsnU3R5bGUnLCB0aGlzLm5hbWUsIHRoaXMuZ2VuZXJhdGlvbl0uam9pbignLycpO1xuICAgICAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5hZGRUYXJnZXQodGhpcy5tYWluX3RocmVhZF90YXJnZXQsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB3b3JsZCBjb29yZHMgdG8gd3JhcCBldmVyeSAxMDAsMDAwIG1ldGVycywgY2FuIHR1cm4gb2ZmIGJ5IHNldHRpbmcgdGhpcyB0byAnZmFsc2UnXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1dPUkxEX1BPU0lUSU9OX1dSQVAgPSAxMDAwMDA7XG5cbiAgICAgICAgLy8gQmxlbmRpbmdcbiAgICAgICAgdGhpcy5ibGVuZCA9IHRoaXMuYmxlbmQgfHwgJ29wYXF1ZSc7ICAgICAgICAvLyBkZWZhdWx0OiBvcGFxdWUgc3R5bGVzIGFyZSBkcmF3biBmaXJzdCwgd2l0aG91dCBibGVuZGluZ1xuICAgICAgICB0aGlzLmRlZmluZXNbYFRBTkdSQU1fQkxFTkRfJHt0aGlzLmJsZW5kLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5ibGVuZF9vcmRlciA9PSBudWxsKSB7IC8vIGNvbnRyb2xzIG9yZGVyIG9mIHJlbmRlcmluZyBmb3Igc3R5bGVzIHcvbm9uLW9wYXF1ZSBibGVuZGluZ1xuICAgICAgICAgICAgdGhpcy5ibGVuZF9vcmRlciA9IC0xOyAvLyBkZWZhdWx0cyB0byBmaXJzdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVTaGFkZXJCbG9jaygnc2V0dXAnKTsgLy8gY2xlYXIgYmVmb3JlIG1hdGVyaWFsIGluamVjdGlvblxuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBkZWZpbmVzIGl0cyBvd24gbWF0ZXJpYWwsIHJlcGxhY2UgdGhlIGluaGVyaXRlZCBtYXRlcmlhbCBpbnN0YW5jZVxuICAgICAgICBpZiAoISh0aGlzLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICBpZiAoIU1hdGVyaWFsLmlzVmFsaWQodGhpcy5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMubWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHRoaXMubWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuaW5qZWN0KHRoaXMpO1xuXG4gICAgICAgIC8vIFNldCBsaWdodGluZyBtb2RlOiBmcmFnbWVudCwgdmVydGV4LCBvciBub25lIChzcGVjaWZpZWQgYXMgJ2ZhbHNlJylcbiAgICAgICAgTGlnaHQuc2V0TW9kZSh0aGlzLmxpZ2h0aW5nLCB0aGlzKTtcblxuICAgICAgICAvLyBTZXR1cCByYXN0ZXIgc2FtcGxlcnMgaWYgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0dXBSYXN0ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbl9wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgIH0sXG5cbiAgICBiYXNlU3R5bGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlIHx8IHRoaXMubmFtZTtcbiAgICB9LFxuXG4gICAgZmlsbFZlcnRleFRlbXBsYXRlKGF0dHJpYnV0ZSwgdmFsdWUsIHsgc2l6ZSwgb2Zmc2V0IH0pIHtcbiAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PT0gdW5kZWZpbmVkKSA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBubyBpbmRleCBmb3VuZCBpbiB2ZXJ0ZXggbGF5b3V0IGZvciBhdHRyaWJ1dGUgJyR7YXR0cmlidXRlfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbHVlLmxlbmd0aCA+IGkgPyB2YWx1ZVtpXSA6IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaW5kZXggKyBpICsgb2Zmc2V0XSA9IHY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqKiBTdHlsZSBwYXJzaW5nIGFuZCBnZW9tZXRyeSBjb25zdHJ1Y3Rpb24gKioqL1xuXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gaG9sZCBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogbnVsbCxcbiAgICAgICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgICAgIHRleHR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IGhvbGRpbmcgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHZhciB0aWxlX2RhdGEgPSB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9jb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIE9ubHkga2VlcCBmaW5hbCBieXRlIGJ1ZmZlclxuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVuZCgpO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbGVtZW50X2J1ZmZlcjtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfYnVmZmVyOyAvLyBjb252ZXJ0IGZyb20gaW5zdGFuY2UgdG8gcmF3IHR5cGVkIGFycmF5XG5cbiAgICAgICAgICAgIC8vIExvYWQgcmFzdGVyIHRpbGVzIHBhc3NlZCBmcm9tIGRhdGEgc291cmNlXG4gICAgICAgICAgICAvLyBCbG9ja3MgbWVzaCBjb21wbGV0aW9uIHRvIGF2b2lkIGZsaWNrZXJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFzdGVyVGV4dHVyZXModGlsZSwgdGlsZV9kYXRhKS50aGVuKCgpID0+IHRpbGVfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBkb24ndCBzZW5kIHRpbGUgZGF0YSBiYWNrIGlmIGRvZXNuJ3QgaGF2ZSBnZW9tZXRyeVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhhcyBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZT9cbiAgICBoYXNEYXRhRm9yVGlsZSAodGlsZV9rZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGVfa2V5XSAhPSBudWxsO1xuICAgIH0sXG5cbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNraXAgZmVhdHVyZT9cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgZmVhdHVyZSBpbiB0aGlzIHJlbmRlciBzdHlsZT9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSA9IHRoaXMudmVydGV4X2xheW91dC5jcmVhdGVWZXJ0ZXhEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgc3R5bGUsIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGJ1aWxkR2VvbWV0cnkgKGdlb21ldHJ5LCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgICAgICBzdHlsZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm9yZGVyLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gKG9ubHkgaWYgc3R5bGUgc3VwcG9ydHMgaXQpXG4gICAgICAgICAgICB2YXIgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3R5bGUuaW50ZXJhY3RpdmUgPSB0aGlzLmludHJvc3BlY3Rpb24gfHwgZHJhdy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoc3R5bGUuaW50ZXJhY3RpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGlzIG1hcmtlZCBhcyBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24ubWFrZUNvbG9yKGZlYXR1cmUsIGNvbnRleHQudGlsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5fcGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU3R5bGUucGFyc2VGZWF0dXJlOiBzdHlsZSBwYXJzaW5nIGVycm9yJywgZmVhdHVyZSwgc3R5bGUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUHJlcHJvY2VzcyBmaXJzdCB0aW1lXG4gICAgICAgIGlmICghZHJhdy5wcmVwcm9jZXNzZWQpIHtcbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLl9wcmVwcm9jZXNzKGRyYXcpOyAvLyBvcHRpb25hbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJhdy5wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFuIG9yZGVyIHZhbHVlXG4gICAgcGFyc2VPcmRlciAob3JkZXIsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuY2FsY3VsYXRlT3JkZXIob3JkZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIGZpbmFsIHByZWNpc2lvbiBmb3IgaGFsZi1sYXllcnMgKGZvciBvdXRsaW5lcylcbiAgICBzY2FsZU9yZGVyIChvcmRlcikge1xuICAgICAgICByZXR1cm4gb3JkZXIgKiAyO1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhIGNvbG9yIG9mIGNob29zZSBhIGRlZmF1bHQgaWYgYWNjZXB0YWJsZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBjb2xvciBtaXNzaW5nXG4gICAgcGFyc2VDb2xvcihjb2xvciwgY29udGV4dCkge1xuICAgICAgICAvLyBOZWVkIGVpdGhlciBhIGNvbG9yLCBvciBhIHNoYWRlciBibG9jayBmb3IgJ2NvbG9yJyBvciAnZmlsdGVyJ1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShjb2xvciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcy5jb2xvciB8fCB0aGlzLnNoYWRlcnMuYmxvY2tzLmZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIHVudGlsIG92ZXJyaWRlblxuICAgIGJ1aWxkUG9seWdvbnMgKCkge30sXG4gICAgYnVpbGRMaW5lcyAoKSB7fSxcbiAgICBidWlsZFBvaW50cyAoKSB7fSxcblxuXG4gICAgLyoqKiBHTCBzdGF0ZSBhbmQgcmVuZGVyaW5nICoqKi9cblxuICAgIHNldEdMIChnbCkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMubWF4X3RleHR1cmVfc2l6ZSA9IFRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUodGhpcy5nbCk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWQk9NZXNoKHRoaXMuZ2wsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIHRoaXMudmVydGV4X2xheW91dCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIHJlbmRlciAobWVzaCkge1xuICAgICAgICByZXR1cm4gbWVzaC5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgcHJvZ3JhbSwgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeVxuICAgIGdldFByb2dyYW0gKGtleSA9ICdwcm9ncmFtJykge1xuICAgICAgICB0aGlzLmNvbXBpbGVTZXR1cCgpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzW2tleV07XG4gICAgICAgIGlmICghcHJvZ3JhbSB8fCBwcm9ncmFtLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb2dyYW0uY29tcGlsZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ29tcGlsaW5nIHN0eWxlICcke3RoaXMubmFtZX0nLCBwcm9ncmFtIGtleSAnJHtrZXl9J2ApO1xuICAgICAgICAgICAgcHJvZ3JhbS5jb21waWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfSxcblxuICAgIC8vIE9uZS10aW1lIHNldHVwIGZvciBjb21waWxpbmcgc3R5bGUncyBwcm9ncmFtc1xuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVfc2V0dXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMubmFtZX0gYmVjYXVzZSBubyBHTCBjb250ZXh0YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgZGVmaW5lcyAmIGZvciBzZWxlY3Rpb24gKG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzaW5jZSB0aGUgZmlyc3QgaXMgc3RvcmVkIGFzIGEgcmVmZXJlbmNlIGJ5IHRoZSBwcm9ncmFtKVxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbl9kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmaW5lcyk7XG4gICAgICAgICAgICBzZWxlY3Rpb25fZGVmaW5lcy5UQU5HUkFNX0ZFQVRVUkVfU0VMRUNUSU9OID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhbnkgY3VzdG9tIGNvZGUgYmxvY2tzLCB1bmlmb3JtIGRlcGVuZGVuY2llcywgZXRjLlxuICAgICAgICB2YXIgYmxvY2tzID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuYmxvY2tzKTtcbiAgICAgICAgdmFyIGJsb2NrX3Njb3BlcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blcyk7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMudW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEFjY2VwdCBhIHNpbmdsZSBleHRlbnNpb24sIG9yIGFuIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5leHRlbnNpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IFtleHRlbnNpb25zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBzaGFkZXJzXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGRlZmluZXMsXG4gICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlcyxcbiAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbmV3IFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHNoYWRlclNyY19zZWxlY3Rpb25GcmFnbWVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICh0aGlzLm5hbWUgKyAnIChzZWxlY3Rpb24pJyksXG4gICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IHNlbGVjdGlvbl9kZWZpbmVzLFxuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgICAgICBibG9ja19zY29wZXMsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaGFkZXIgYmxvY2tcbiAgICBhZGRTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3MgPSB0aGlzLnNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XS5wdXNoKGJsb2NrKTtcblxuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0ucHVzaChzY29wZSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhbGwgc2hhZGVyIGJsb2NrcyBmb3Iga2V5XG4gICAgcmVtb3ZlU2hhZGVyQmxvY2sgKGtleSkge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNoYWRlckJsb2NrKGtleSk7XG4gICAgICAgIHRoaXMuYWRkU2hhZGVyQmxvY2soa2V5LCBibG9jaywgc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvKiogVE9ETzogY291bGQgcHJvYmFibHkgY29tYmluZSBhbmQgZ2VuZXJhbGl6ZSB0aGlzIHdpdGggc2ltaWxhciBtZXRob2QgaW4gU2hhZGVyUHJvZ3JhbVxuICAgICAqIChsaXN0IG9mIGRlZmluZSBvYmplY3RzIHRoYXQgaW5oZXJpdCBmcm9tIGVhY2ggb3RoZXIpXG4gICAgICovXG4gICAgYnVpbGREZWZpbmVMaXN0ICgpIHtcbiAgICAgICAgLy8gQWRkIGFueSBjdXN0b20gZGVmaW5lcyB0byBidWlsdC1pbiBzdHlsZSBkZWZpbmVzXG4gICAgICAgIHZhciBkZWZpbmVzID0ge307IC8vIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYSBwcm90b3R5cGUgdmFsdWUgdGhhdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgc3R5bGVzXG4gICAgICAgIGlmICh0aGlzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMgIT0gbnVsbCAmJiB0aGlzLnNoYWRlcnMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGQgaW4gdGhpcy5zaGFkZXJzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5zaGFkZXJzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG5cbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lcyBpZiAncmFzdGVyJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgdmFsaWQgdmFsdWVcbiAgICBoYXNSYXN0ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIChbJ2NvbG9yJywgJ25vcm1hbCcsICdjdXN0b20nXS5pbmRleE9mKHRoaXMucmFzdGVyKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gU2V0dXAgcmFzdGVyIGFjY2VzcyBpbiBzaGFkZXJzXG4gICAgc2V0dXBSYXN0ZXJzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIHJhc3RlciB0ZXh0dXJlcyBhbmQgY29uZmlndXJlIGhvdyBmaXJzdCByYXN0ZXIgaXMgYXBwbGllZFxuICAgICAgICBpZiAodGhpcy5yYXN0ZXIgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX0NPTE9SID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhc3RlciA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX05PUk1BTCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBjdXN0b20gcmFzdGVyIChzYW1wbGVycyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGJ1dCBub3QgYXV0b21hdGljYWxseSBhcHBsaWVkKVxuXG4gICAgICAgIC8vIEEgZ2l2ZW4gc3R5bGUgbWF5IGJlIGJ1aWx0IHdpdGggbXVsdGlwbGUgZGF0YSBzb3VyY2VzLCBlYWNoIG9mIHdoaWNoIG1heSBhdHRhY2hcbiAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXMgKDAgdG8gTiwgd2hlcmUgTiBpcyB0aGUgbWF4IG51bWJlciBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgc2NlbmUpLiBUaGlzIG1lYW5zIHdlIGRvbid0IGtub3cgKndoaWNoKiBvciAqaG93IG1hbnkqIHJhc3RlcnMgd2lsbCBiZVxuICAgICAgICAvLyBib3VuZCBub3csIGF0IGluaXRpYWwgY29tcGlsZS10aW1lOyB3ZSBvbmx5IGtub3cgdGhpcyBhdCBnZW9tZXRyeSBidWlsZC10aW1lLiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gYmluZCBhcyBtYW55IHJhc3RlciBzb3VyY2VzIGFzIG5lZWRlZCwgd2UgZGVjbGFyZSBvdXIgdW5pZm9ybSBhcnJheXMgdG8gaG9sZFxuICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc291cmNlcy4gQXQgcmVuZGVyIHRpbWUsIG9ubHkgdGhlIG5lY2Vzc2FyeSBudW1iZXIgb2YgcmFzdGVyc1xuICAgICAgICAvLyBhcmUgYm91bmQgKHRoZSByZW1haW5pbmcgc2xvdHMgYXJlbid0IGludGVuZGVkIHRvIGJlIGFjY2Vzc2VkKS5cbiAgICAgICAgbGV0IG51bV9yYXN0ZXJfc291cmNlcyA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5zb3VyY2VzW3NdIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSlcbiAgICAgICAgICAgIC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTlVNX1JBU1RFUl9TT1VSQ0VTID0gYGludCgke251bV9yYXN0ZXJfc291cmNlc30pYDtcbiAgICAgICAgaWYgKG51bV9yYXN0ZXJfc291cmNlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBtb2RlbCBwb3NpdGlvbiBvZiB0aWxlJ3MgY29vcmRpbmF0ZSB6b29tIGZvciByYXN0ZXIgdGlsZSB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTU9ERUxfUE9TSVRJT05fQkFTRV9aT09NX1ZBUllJTkcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBVbmlmb3JtcyBhbmQgbWFjcm9zIGZvciByYXN0ZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVNoYWRlckJsb2NrKCdyYXN0ZXInLCBzaGFkZXJTcmNfcmFzdGVycywgJ1Jhc3RlcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIExvYWQgcmFzdGVyIHRpbGUgdGV4dHVyZXMgYW5kIHNldCB1bmlmb3Jtc1xuICAgIGJ1aWxkUmFzdGVyVGV4dHVyZXMgKHRpbGUsIHRpbGVfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlncyA9IHt9OyAvLyB0ZXh0dXJlIGNvbmZpZ3MgdG8gcGFzcyB0byB0ZXh0dXJlIGJ1aWxkZXIsIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuICAgICAgICBsZXQgaW5kZXggPSB7fTsgICAvLyBpbmRleCBpbnRvIHJhc3RlciBzYW1wbGVyIGFycmF5LCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcblxuICAgICAgICAvLyBUT0RPOiBkYXRhIHNvdXJjZSBjb3VsZCByZXRyaWV2ZSByYXN0ZXIgdGV4dHVyZSBVUkxzXG4gICAgICAgIHRpbGUucmFzdGVycy5tYXAociA9PiB0aGlzLnNvdXJjZXNbcl0pLmZpbHRlcih4ID0+IHgpLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gc291cmNlLnRpbGVUZXh0dXJlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NbY29uZmlnLnVybF0gPSBjb25maWc7XG4gICAgICAgICAgICAgICAgaW5kZXhbY29uZmlnLnVybF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHRleHR1cmVzIG9uIG1haW4gdGhyZWFkIGFuZCByZXR1cm4gd2hlbiBkb25lXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYmxvY2sgdGhlIGJ1aWxkaW5nIG9mIGEgcmFzdGVyIHRpbGUgbWVzaCB1bnRpbCBpdHMgdGV4dHVyZSBpcyBsb2FkZWQsXG4gICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcgd2hpbGUgbG9hZGluZyAodGV4dHVyZSB3aWxsIHJlbmRlciBhcyBibGFjaylcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmxvYWRUZXh0dXJlcycsIGNvbmZpZ3MpXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0dXJlcyB8fCB0ZXh0dXJlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dHVyZSB1bmlmb3JtcyAocmV0dXJuZWQgYWZ0ZXIgbG9hZGluZyBmcm9tIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBsZXQgdV9zYW1wbGVycyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9zaXplcyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfc2l6ZXMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X29mZnNldHMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX29mZnNldHMnXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCgoW3RuYW1lLCB0d2lkdGgsIHRoZWlnaHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhbdG5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFzdGVyX2Nvb3JkcyA9IGNvbmZpZ3NbdG5hbWVdLmNvb3JkczsgLy8gdGlsZSBjb29yZHMgb2YgcmFzdGVyIHRpbGVcblxuICAgICAgICAgICAgICAgICAgICB1X3NhbXBsZXJzW2ldID0gdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICB1X3NpemVzW2ldID0gW3R3aWR0aCwgdGhlaWdodF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGlsZSBnZW9tZXRyeSBtYXkgYmUgYXQgYSBoaWdoZXIgem9vbSB0aGFuIHRoZSByYXN0ZXIgdGlsZSB0ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhbiBvdmVyem9vbWVkIHJhc3RlciB0aWxlKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFzdGVyIHRleHR1cmUgVVZzIHRvIG9mZnNldCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgdGlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuY29vcmRzLnogPiByYXN0ZXJfY29vcmRzLnopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeiA9IHRpbGUuY29vcmRzLnogLSByYXN0ZXJfY29vcmRzLno7IC8vICMgb2YgbGV2ZWxzIHJhc3RlciBzb3VyY2UgaXMgb3Zlcnpvb21lZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6MiA9IE1hdGgucG93KDIsIGR6KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGlsZS5jb29yZHMueCAlIGR6MikgLyBkejIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR6MiAtIDEgLSAodGlsZS5jb29yZHMueSAlIGR6MikpIC8gZHoyLCAvLyBHTCB0ZXh0dXJlIGNvb3JkcyBhcmUgK1kgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8gZHoyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gWzAsIDAsIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWRcbiAgICBsb2FkVGV4dHVyZXMgKHRleHR1cmVzKSB7XG4gICAgICAgIC8vIE5COiBvbmx5IHJldHVybiBuYW1lIGFuZCBzaXplIG9mIHRleHR1cmVzIGxvYWRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGFjdHVhbCB0ZXh0dXJlIG9iamVjdHMgdG8gd29ya2VyXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGV4dHVyZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHRleHR1cmVzKS5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzW3RdICYmIFRleHR1cmUudGV4dHVyZXNbdF0ubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQucmV0YWluKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlcy5tYXAodCA9PiBbdC5uYW1lLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIGFueSBHTCBzdGF0ZSBmb3IgcmVuZGVyaW5nXG4gICAgc2V0dXAgKCkge1xuICAgICAgICB0aGlzLnNldFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuc2V0dXBQcm9ncmFtKFNoYWRlclByb2dyYW0uY3VycmVudCk7XG4gICAgfSxcblxuICAgIC8vIFNldCBzdHlsZSB1bmlmb3JtcyBvbiBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuICAgIHNldFVuaWZvcm1zICgpIHtcbiAgICAgICAgdmFyIHByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLCB0cnVlKTsgLy8gcmVzZXQgdGV4dHVyZSB1bml0IHRvIDBcbiAgICB9LFxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIHNldHRpbmdzIGJ5IGJsZW5kIG1vZGVcbiAgICByZW5kZXJfc3RhdGVzOiB7XG4gICAgICAgIG9wYXF1ZTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogdHJ1ZSB9LFxuICAgICAgICBhZGQ6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG11bHRpcGx5OiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBpbmxheTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgb3ZlcmxheTogeyBkZXB0aF90ZXN0OiBmYWxzZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH1cbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCBzb3J0IG9yZGVyIGZvciBibGVuZCBtb2Rlc1xuICAgIGRlZmF1bHRfYmxlbmRfb3JkZXJzOiB7XG4gICAgICAgIG9wYXF1ZTogMCxcbiAgICAgICAgYWRkOiAxLFxuICAgICAgICBtdWx0aXBseTogMixcbiAgICAgICAgaW5sYXk6IDMsXG4gICAgICAgIG92ZXJsYXk6IDRcbiAgICB9LFxuXG4gICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyBzdHlsZXMgYnkgYmxlbmRcbiAgICBibGVuZE9yZGVyU29ydCAoYSwgYikge1xuICAgICAgICAvLyBvcGFxdWUgYWx3YXlzIGNvbWVzIGZpcnN0XG4gICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyB8fCBiLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgaWYgKGEuYmxlbmQgPT09ICdvcGFxdWUnICYmIGIuYmxlbmQgPT09ICdvcGFxdWUnKSB7IC8vIGlmIGJvdGggYXJlIG9wYXF1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDE7IC8vIHVzZSBuYW1lIGFzIHRpZSBicmVha2VyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gb25seSBgYWAgd2FzIG9wYXF1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgYGJgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBleHBsaWNpdCBibGVuZCBvcmRlciBpZiBwb3NzaWJsZVxuICAgICAgICBpZiAoYS5ibGVuZF9vcmRlciA8IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmJsZW5kX29yZGVyID4gYi5ibGVuZF9vcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBibGVuZCBvcmRlcnMgYXJlIGVxdWFsLCB1c2UgZGVmYXVsdCBvcmRlciBieSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1thLmJsZW5kXSA8IFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2IuYmxlbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPiBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgc3R5bGVzXG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5pbXBvcnQge0xpbmVzfSBmcm9tICcuL2xpbmVzL2xpbmVzJztcbmltcG9ydCB7UG9pbnRzfSBmcm9tICcuL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IHtUZXh0U3R5bGV9IGZyb20gJy4vdGV4dC90ZXh0JztcbmltcG9ydCB7UmFzdGVyU3R5bGV9IGZyb20gJy4vcmFzdGVyL3Jhc3Rlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfYWNjZXNzb3JzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9hY2Nlc3NvcnMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfbGF5ZXJPcmRlciA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvbGF5ZXJfb3JkZXIuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2dsb2JhbHMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlcyA9IHt9O1xuXG4gICAgICAgIC8vIEFkZCBidWlsdC1pbiByZW5kZXJpbmcgc3R5bGVzXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2x5Z29ucykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoTGluZXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFBvaW50cykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoVGV4dFN0eWxlKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShSYXN0ZXJTdHlsZSkpO1xuICAgIH1cblxuICAgIC8vIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciBhbGwgc3R5bGVzXG4gICAgaW5pdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soJ2dsb2JhbCcpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdzZXR1cCcpO1xuXG4gICAgICAgIC8vIE1vZGVsIGFuZCB3b3JsZCBwb3NpdGlvbiBhY2Nlc3NvcnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2FjY2Vzc29ycyk7XG5cbiAgICAgICAgLy8gTGF5ZXIgcmUtb3JkZXJpbmcgZnVuY3Rpb25cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2xheWVyT3JkZXIpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIGdsb2JhbFxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyk7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gdmVydGV4IHNoYWRlciBzdXBwb3J0XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdzZXR1cCcsIHNoYWRlclNyY19zZWxlY3Rpb25WZXJ0ZXgpO1xuXG4gICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIGZsb2F0IGNvbXBhcmlzb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0VQU0lMT04gPSAwLjAwMDAxO1xuXG4gICAgICAgIC8vIE1pbmltdW0gZGVwdGggYnVmZmVyIHZhbHVlIHNlcGFyYXRpbmcgZWFjaCBgb3JkZXJgIHVuaXRcbiAgICAgICAgLy8gQXNzdW1lIG1pbiAxNi1iaXQgZGVwdGggYnVmZmVyLCBpbiBwcmFjdGljZSB1c2VzIDE0LWJpdHMsIDEgZXh0cmEgYml0IHRvIGhhbmRsZSB2aXJ0dWFsIGhhbGYtbGF5ZXJzXG4gICAgICAgIC8vIGZvciBvdXRsaW5lcyAoaW5zZXJ0ZWQgaW4gYmV0d2VlbiBsYXllcnMpLCBhbm90aGVyIGV4dHJhIGJpdCB0byBwcmV2ZW50IHByZWNpc2lvbiBsb3NzXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0xBWUVSX0RFTFRBID0gMSAvICgxIDw8IDE0KTtcblxuICAgICAgICAvLyBJbnRlcm5hbCB0aWxlIHNjYWxlXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX1RJTEVfU0NBTEUgPVxuICAgICAgICAgICAgYHZlYzMoJHtHZW8udGlsZV9zY2FsZX0uLCAke0dlby50aWxlX3NjYWxlfS4sIHVfbWV0ZXJzX3Blcl9waXhlbCAqICR7R2VvLnRpbGVfc2l6ZX0uKWA7XG5cbiAgICAgICAgLy8gSW5jcmVhc2VzIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9IRUlHSFRfU0NBTEUgPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYWxsIHN0eWxlcyBmb3IgYSBnaXZlbiBHTCBjb250ZXh0XG4gICAgZGVzdHJveSAoZ2wpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLmZvckVhY2goKF9uYW1lKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZU1hbmFnZXIuZGVzdHJveTogZGVzdHJveWluZyByZW5kZXIgc3R5bGUgJHtzdHlsZS5uYW1lfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBzdHlsZVxuICAgIHJlZ2lzdGVyIChzdHlsZSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLm5hbWVdID0gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc3R5bGVcbiAgICByZW1vdmUgKG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW25hbWVdO1xuICAgIH1cblxuICAgIG1peCAoc3R5bGUsIHN0eWxlcykge1xuICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkeSBhcHBsaWVkIG1peGlucyB0byB0aGlzIHN0eWxlXG4gICAgICAgIGlmIChzdHlsZS5taXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLm1peGVkID0ge307XG5cbiAgICAgICAgLy8gTWl4aW4gc291cmNlcywgaW4gb3JkZXJcbiAgICAgICAgbGV0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgaWYgKHN0eWxlLm1peCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCguLi5zdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlLm1peCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5tYXAoeCA9PiBzdHlsZXNbeF0pLmZpbHRlcih4ID0+IHggJiYgeCAhPT0gc3R5bGUpOyAvLyBUT0RPOiB3YXJuaW5nIG9uIHRyeWluZyB0byBtaXggaW50byBzZWxmXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0eWxlcyB3ZXJlIG1peGVkIGludG8gdGhpcyBvbmVcbiAgICAgICAgICAgIHNvdXJjZXMuZm9yRWFjaChzID0+IHN0eWxlLm1peGVkW3MubmFtZV0gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzLnB1c2goc3R5bGUpO1xuXG4gICAgICAgIC8vIEZsYWdzIC0gT1InZCwgdHJ1ZSBpZiBhbnkgc3R5bGUgaGFzIGl0IHNldFxuICAgICAgICBzdHlsZS5hbmltYXRlZCA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC5hbmltYXRlZCk7XG4gICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC50ZXhjb29yZHMpO1xuXG4gICAgICAgIC8vIE92ZXJ3cml0ZXMgLSBsYXN0IGRlZmluaXRpb24gd2luc1xuICAgICAgICBzdHlsZS5iYXNlID0gc291cmNlcy5tYXAoeCA9PiB4LmJhc2UpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5saWdodGluZyA9IHNvdXJjZXMubWFwKHggPT4geC5saWdodGluZykuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUudGV4dHVyZSA9IHNvdXJjZXMubWFwKHggPT4geC50ZXh0dXJlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUucmFzdGVyID0gc291cmNlcy5tYXAoeCA9PiB4LnJhc3RlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaCA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBpZiAoc291cmNlcy5zb21lKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKSkge1xuICAgICAgICAgICAgLy8gb25seSBtaXggYmxlbmQgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBsZXQgYmFzZSBzdHlsZSBjaG9vc2UgYmxlbmRpbmcgbW9kZVxuICAgICAgICAgICAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2sgZ2l2ZXMgcHJlZmVyZW5jZSB0byBiYXNlIHN0eWxlIHByb3RvdHlwZVxuICAgICAgICAgICAgc3R5bGUuYmxlbmQgPSBzb3VyY2VzLm1hcCh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuYmxlbmRfb3JkZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmxlbmRfb3JkZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG5cbiAgICAgICAgLy8gTWVyZ2VzIC0gcHJvcGVydHktc3BlY2lmaWMgcnVsZXMgZm9yIG1lcmdpbmcgdmFsdWVzXG4gICAgICAgIHN0eWxlLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpOyAvLyBpbnRlcm5hbCBkZWZpbmVzIChub3QgdXNlci1kZWZpbmVkKVxuICAgICAgICBzdHlsZS5tYXRlcmlhbCA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5tYXRlcmlhbCkuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIE1peCBzaGFkZXIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLm1peFNoYWRlcnMoc3R5bGUsIHN0eWxlcywgc291cmNlcyk7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBNaXggdGhlIHByb3BlcnRlcyBpbiB0aGUgXCJzaGFkZXJzXCIgYmxvY2tcbiAgICBtaXhTaGFkZXJzIChzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKSB7XG4gICAgICAgIGxldCBzaGFkZXJzID0ge307IC8vIG5ld2x5IG1peGVkIHNoYWRlcnMgcHJvcGVydGllc1xuICAgICAgICBsZXQgc2hhZGVyX21lcmdlcyA9IHNvdXJjZXMubWFwKHggPT4geC5zaGFkZXJzKS5maWx0ZXIoeCA9PiB4KTsgLy8ganVzdCB0aGUgc291cmNlIHN0eWxlcyB3aXRoIHNoYWRlciBwcm9wZXJ0aWVzXG5cbiAgICAgICAgLy8gRGVmaW5lc1xuICAgICAgICBzaGFkZXJzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zaGFkZXJfbWVyZ2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIFVuaWZvcm1zXG4gICAgICAgIHNoYWRlcnMudW5pZm9ybXMgPSB7fTsgIC8vIHVuaWZvcm1zIGZvciB0aGlzIHN0eWxlLCBib3RoIGV4cGxpY2l0bHkgZGVmaW5lZCwgYW5kIG1peGVkIGZyb20gb3RoZXIgc3R5bGVzXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zID0gKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3JtcykgfHwge307IC8vIHVuaWZvcm1zIGV4cGxpY2l0bHkgZGVmaW5lZCBieSAqdGhpcyogc3R5bGVcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIHN0eWxlIGVhY2ggdW5pZm9ybSBvcmlnaW5hdGVkIGZyb20gKHRoaXMgb25lLCBvciBhbmNlc3RvcilcblxuICAgICAgICAvLyBNaXggaW4gdW5pZm9ybXMgZnJvbSBhbmNlc3RvcnMsIHByb3ZpZGluZyBtZWFucyB0byBhY2Nlc3NcbiAgICAgICAgc291cmNlc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHguc2hhZGVycyAmJiB4LnNoYWRlcnMudW5pZm9ybXMpXG4gICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IGluIHguc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XSA9IHgubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoaXMgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXR0ZXIgcmV0dXJucyB2YWx1ZSBmb3IgdGhpcyBzdHlsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgYXNrcyBhcHByb3ByaWF0ZSBhbmNlc3RvciBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGVyIHNldHMgdGhlIHZhbHVlIGZvciB0aGlzIHN0eWxlICh3aGV0aGVyIHByZXZpb3VzbHkgcHJlc2VudCBpbiB0aGlzIHN0eWxlIG9yIG5vdClcbiAgICAgICAgICAgICAgICAgICAgLy8gTWltaWNzIEpTIHByb3RvdHlwZS9oYXNPd25Qcm9wZXJ0eSBiZWhhdmlvciwgYnV0IHdpdGggbXVsdGlwbGUgYW5jZXN0b3JzICh2aWEgbWl4aW5zKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hhZGVycy51bmlmb3JtcywgdSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gaXMgZXhwbGljaXRseSBkZWZpbmVkIG9uIHRoaXMgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGVycy5fdW5pZm9ybXNbdV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhZGVycy5fdW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gd2FzIG1peGVkIGZyb20gYW5vdGhlciBzdHlsZSwgZm9yd2FyZCByZXF1ZXN0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgY2hlY2sgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgcHJldmlvdXNseSBkZWZpbmVkIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zICE9PSBzaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3Jtc1t1XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dGVuc2lvbnM6IGJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZXh0ZW5zaW9uc1xuICAgICAgICBzaGFkZXJzLmV4dGVuc2lvbnMgPSBPYmplY3Qua2V5cyhzaGFkZXJfbWVyZ2VzXG4gICAgICAgICAgICAubWFwKHggPT4geC5leHRlbnNpb25zKVxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbY3VyXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmZvckVhY2goeCA9PiBwcmV2W3hdID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSwge30pIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2hhZGVyIGJsb2Nrc1xuICAgICAgICAvLyBNYXJrIGFsbCBzaGFkZXIgYmxvY2tzIGZvciB0aGUgdGFyZ2V0IHN0eWxlIGFzIG9yaWdpbmF0aW5nIHdpdGggaXRzIG93biBuYW1lXG4gICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzdHlsZS5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHN0eWxlLnNoYWRlcnMuYmxvY2tzW2tdO1xuICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goLi4uYmxvY2subWFwKCgpID0+IHN0eWxlLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2Ugc2hhZGVyIGJsb2Nrcywga2VlcGluZyB0cmFjayBvZiB3aGljaCBzdHlsZSBlYWNoIGJsb2NrIG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgICBsZXQgbWl4ZWQgPSB7fTsgLy8gYWxsIHNjb3BlcyBtaXhlZCBzbyBmYXJcbiAgICAgICAgc2hhZGVyX21lcmdlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzID0gc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgbGV0IG1peGVkX3NvdXJjZSA9IHt9OyAvLyBzY29wZXMgbWl4ZWQgZm9yIHRoaXMgc291cmNlIHN0eWxlXG5cbiAgICAgICAgICAgIGZvciAobGV0IHQgaW4gc291cmNlLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHNvdXJjZS5ibG9ja3NbdF07XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrX3Njb3BlID0gc291cmNlLmJsb2NrX3Njb3Blc1t0XTtcblxuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdID0gc2hhZGVycy5ibG9ja3NbdF0gfHwgW107XG4gICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0gPSBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplIG9uIGFycmF5cyAoYmxvY2sgY2FuIGJlIHNpbmdsZSBvciBtdWx0aS12YWx1ZSlcbiAgICAgICAgICAgICAgICBibG9jayA9IEFycmF5LmlzQXJyYXkoYmxvY2spID8gYmxvY2sgOiBbYmxvY2tdO1xuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlID0gQXJyYXkuaXNBcnJheShibG9ja19zY29wZSkgPyBibG9ja19zY29wZSA6IFtibG9ja19zY29wZV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCBibG9jay5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGJsb2NrcyB3ZSd2ZSBhbHJlYWR5IG1peGVkIGluIGZyb20gdGhlIHNhbWUgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwZWF0aW5nIHNjb3BlIGluZGljYXRlcyBhIGRpYW1vbmQgcGF0dGVybiB3aGVyZSBhIHN0eWxlIGlzIGJlaW5nIG1peGVkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlZFtibG9ja19zY29wZVtiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1peGVkX3NvdXJjZVtibG9ja19zY29wZVtiXV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdLnB1c2goYmxvY2tbYl0pO1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XS5wdXNoKGJsb2NrX3Njb3BlW2JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBzdHlsZXMgbWl4ZWQgaW4gZnJvbSB0aGlzIHNvdXJjZSAtIHRoZXkgY291bGQgYmUgbXVsdGktbGV2ZWwgYW5jZXN0b3JzLFxuICAgICAgICAgICAgLy8gYmV5b25kIHRoZSBmaXJzdC1sZXZlbCBcInBhcmVudHNcIiBkZWZpbmVkIGluIHRoaXMgc3R5bGUncyBgbWl4YCBsaXN0XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1peGVkLCBtaXhlZF9zb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLm1peGVkLCBtaXhlZCk7IC8vIGFkZCBhbGwgbmV3bHkgbWl4ZWQgc3R5bGVzXG5cbiAgICAgICAgc3R5bGUuc2hhZGVycyA9IHNoYWRlcnM7IC8vIGFzc2lnbiBiYWNrIHRvIHN0eWxlXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGVcbiAgICAvLyBuYW1lOiBuYW1lIG9mIG5ldyBzdHlsZVxuICAgIC8vIGNvbmZpZzogcHJvcGVydGllcyBvZiBuZXcgc3R5bGVcbiAgICAvLyBzdHlsZXM6IHdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdCAodXNlZCBmb3IgbWl4aW5nIGluIGV4aXN0aW5nIHN0eWxlcylcbiAgICBjcmVhdGUgKG5hbWUsIGNvbmZpZywgc3R5bGVzID0ge30pIHtcbiAgICAgICAgbGV0IHN0eWxlID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpOyAvLyBkZWVwIGNvcHlcbiAgICAgICAgc3R5bGUubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gU3R5bGUgbWl4aW5zXG4gICAgICAgIHN0eWxlID0gdGhpcy5taXgoc3R5bGUsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gSGFzIGJhc2Ugc3R5bGU/XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyYWJsZSAoaW5zdGFudGlhdGVkKSBzdHlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBydW4tdGltZSB1c2VcbiAgICAgICAgLy8gT3RoZXJzIGFyZSBpbnRlcm1lZGlhcnkvYWJzdHJhY3QsIHVzZWQgZHVyaW5nIHN0eWxlIGNvbXBvc2l0aW9uIGJ1dCBub3QgZXhlY3V0aW9uXG4gICAgICAgIGlmIChzdHlsZS5iYXNlICYmIHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSksIHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmJhc2UgPSBudWxsOyAvLyBudWxsIG91dCBpbnZhbGlkIGJhc2Ugc3R5bGVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHN0eWxlc1xuICAgIGJ1aWxkIChzdHlsZXMpIHtcbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgZGVwZW5kZW5jeSwgdGhlbiBidWlsZCB0aGVtXG4gICAgICAgIGxldCBzdHlsZV9kZXBzID0gT2JqZWN0LmtleXMoc3R5bGVzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IHRoaXMuaW5oZXJpdGFuY2VEZXB0aChhLCBzdHlsZXMpIC0gdGhpcy5pbmhlcml0YW5jZURlcHRoKGIsIHN0eWxlcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBPbmx5IGtlZXAgYnVpbHQtaW4gYmFzZSBzdHlsZXNcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlX3N0eWxlc1tzbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNbc25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHRcbiAgICAgICAgbGV0IHdzID0ge307XG4gICAgICAgIHN0eWxlX2RlcHMuZm9yRWFjaChzbmFtZSA9PiB7XG4gICAgICAgICAgICB3c1tzbmFtZV0gPSB0aGlzLmNyZWF0ZShzbmFtZSwgc3R5bGVzW3NuYW1lXSwgd3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgc3R5bGVzXG4gICAgaW5pdFN0eWxlcyAoc2NlbmUgPSB7fSkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGFsbFxuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLmluaXQoc2NlbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzdHlsZSBrZXkgaW4gYSBzZXQgb2Ygc3R5bGVzIHRvIGFkZCwgY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAgICBpbmhlcml0YW5jZURlcHRoIChrZXksIHN0eWxlcykge1xuICAgICAgICBsZXQgcGFyZW50cyA9IDA7XG5cbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNjZW5lIGRlZiBlcnJvciwgdHJ5aW5nIHRvIGV4dGVuZCBhIHN0eWxlIHRoYXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGVuZHMgd2hlbiB0aGlzIHN0eWxlIGlzbid0IG1peGluZyBpbiBhbnkgb3RoZXJzXG4gICAgICAgICAgICBpZiAoIXN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSBuZXh0IHBhcmVudCBzdHlsZVxuICAgICAgICAgICAgcGFyZW50cysrO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5taXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgbWl4aW5zLCBmaW5kIHRoZSBkZWVwZXN0IG9uZVxuICAgICAgICAgICAgICAgIHBhcmVudHMgKz0gTWF0aC5tYXgoLi4uc3R5bGUubWl4Lm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChzLCBzdHlsZXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHNpbmdsZSBtaXhpbiwgY29udGludWUgbG9vcCB1cCB0aGUgdHJlZVxuICAgICAgICAgICAgICAgIGtleSA9IHN0eWxlLm1peDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBwYXJzZUNTU0NvbG9yIGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuZXhwb3J0IHZhciBTdHlsZVBhcnNlciA9IHt9O1xuXG4vLyBXcmFwcyBzdHlsZSBmdW5jdGlvbnMgYW5kIHByb3ZpZGVzIGEgc2NvcGUgb2YgY29tbW9ubHkgYWNjZXNzaWJsZSBkYXRhOlxuLy8gLSBmZWF0dXJlOiB0aGUgJ3Byb3BlcnRpZXMnIG9mIHRoZSBmZWF0dXJlLCBlLmcuIGFjY2Vzc2VkIGFzICdmZWF0dXJlLm5hbWUnXG4vLyAtIGdsb2JhbDogdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgb24gdGhlIGBnbG9iYWxgIG9iamVjdCBpbiB0aGUgc2NlbmUgZmlsZVxuLy8gLSAkem9vbTogdGhlIGN1cnJlbnQgbWFwIHpvb20gbGV2ZWxcbi8vIC0gJGdlb21ldHJ5OiB0aGUgdHlwZSBvZiBnZW9tZXRyeSwgJ3BvaW50JywgJ2xpbmUnLCBvciAncG9seWdvbidcbi8vIC0gJG1ldGVyc19wZXJfcGl4ZWw6IGNvbnZlcnNpb24gZm9yIG1ldGVycy9waXhlbHMgYXQgY3VycmVudCBtYXAgem9vbVxuU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgZiA9IGBcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdmFyIGdsb2JhbCA9IGNvbnRleHQuZ2xvYmFsO1xuICAgICAgICB2YXIgJHpvb20gPSBjb250ZXh0Lnpvb207XG4gICAgICAgIHZhciAkbGF5ZXIgPSBjb250ZXh0LmxheWVyO1xuICAgICAgICB2YXIgJGdlb21ldHJ5ID0gY29udGV4dC5nZW9tZXRyeTtcbiAgICAgICAgdmFyICRtZXRlcnNfcGVyX3BpeGVsID0gY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIHZhciB2YWwgPSAoZnVuY3Rpb24oKXsgJHtmdW5jfSB9KCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSBudWxsOyAvLyBjb252ZXJ0IE5hTnMgdG8gbnVsbHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgYDtcbiAgICByZXR1cm4gZjtcbn07XG5cblxuLy8gU3R5bGUgcGFyc2luZ1xuXG5TdHlsZVBhcnNlci56ZXJvUGFpciA9IE9iamVjdC5mcmVlemUoWzAsIDBdKTsgLy8gc2luZ2xlIGFsbG9jYXRpb24gZm9yIHplcm8gdmFsdWVzIHRoYXQgd29uJ3QgYmUgbW9kaWZpZWRcblxuLy8gU3R5bGUgZGVmYXVsdHNcblN0eWxlUGFyc2VyLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yOiBbMSwgMSwgMSwgMV0sXG4gICAgd2lkdGg6IDEsXG4gICAgc2l6ZTogMSxcbiAgICBleHRydWRlOiBmYWxzZSxcbiAgICBoZWlnaHQ6IDIwLFxuICAgIG1pbl9oZWlnaHQ6IDAsXG4gICAgb3JkZXI6IDAsXG4gICAgejogMCxcbiAgICBtYXRlcmlhbDoge1xuICAgICAgICBhbWJpZW50OiAxLFxuICAgICAgICBkaWZmdXNlOiAxXG4gICAgfVxufTtcblxuLy8gU3R5bGUgbWFjcm9zXG5TdHlsZVBhcnNlci5tYWNyb3MgPSB7XG4gICAgLy8gcHNldWRvLXJhbmRvbSBjb2xvciBieSBnZW9tZXRyeSBpZFxuICAgICdTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMCAlIDEpLCAgICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAgJSAxKSwgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMDAwICUgMSksIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMVxuICAgICAgICBdO1xuICAgIH0sXG5cbiAgICAvLyByYW5kb20gY29sb3JcbiAgICAnU3R5bGUuY29sb3IucmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFswLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAxXTtcbiAgICB9XG59O1xuXG4vLyBBIGNvbnRleHQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHN0eWxlIHBhcnNpbmcgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYSBzY29wZSBvZiBjb21tb25seSB1c2VkIHZhbHVlc1xuU3R5bGVQYXJzZXIuZ2V0RmVhdHVyZVBhcnNlQ29udGV4dCA9IGZ1bmN0aW9uIChmZWF0dXJlLCB0aWxlLCBnbG9iYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB0aWxlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHpvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgZ2VvbWV0cnk6IEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGlsZS5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciA9IDg7IC8vIHZlcnRpY2FsIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyID0gNDsgLy8gdGV4dCBzdHlsaW5nIHN1Y2ggYXMgaXRhbGljIGVtcGhhc2lzIGlzIG5vdCBtZWFzdXJlZCBieSB0aGUgQ2FudmFzIEFQSSwgc28gcGFkZGluZyBpcyBuZWNlc3NhcnlcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICB0aGlzLnB4X3NpemUgPSBweF9zaXplO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoICogZHByO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIGxldCBkcHI7XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwge307XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAqIHRleHRfc2V0dGluZ3Muc3VwZXJzYW1wbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV93aWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dCgnICcpLndpZHRoIC8gZHByO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zcGFjZV93aWR0aCA9IHNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50cyA9IHNwbGl0TGFiZWxUZXh0KHRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2VnbWVudHMgPSBzZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50ID0gc2VnbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0gPSB0aGlzLnRleHRTaXplKHNlZ21lbnQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLm1pc3NlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5oaXRzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnB1c2goQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XS5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0gPSB0aGlzLnRleHRTaXplKHRleHQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCB0ZXh0IHNpemVzIGJhY2sgdG8gd29ya2VyIChrZWVwIGNvbXB1dGVkIHRleHQgbGluZSBpbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBtYWluIHRocmVhZCwgZm9yIGZ1dHVyZSByZW5kZXJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2l6ZSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0uc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRleHRzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlcyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRleHQgYmFzZWQgb24gY3VycmVudCBmb250IHN0eWxlXG4gICAgLy8gSW5jbHVkZXMgd29yZCB3cmFwcGluZywgcmV0dXJucyBzaXplIGluZm8gZm9yIHdob2xlIHRleHQgYmxvY2sgYW5kIGluZGl2aWR1YWwgbGluZXNcbiAgICB0ZXh0U2l6ZSAodGV4dCwge3RyYW5zZm9ybSwgdGV4dF93cmFwLCBtYXhfbGluZXMsIHN0cm9rZV93aWR0aCA9IDAsIHN1cGVyc2FtcGxlfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybSh0ZXh0LCB0cmFuc2Zvcm0pO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciAqIGRwcjtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG4gICAgICAgIGxldCBsZWFkaW5nID0gMiAqIGRwcjsgLy8gbWFrZSBjb25maWd1cmFibGUgYW5kL29yIHVzZSBDYW52YXMgVGV4dE1ldHJpY3Mgd2hlbiBhdmFpbGFibGVcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gdGhpcy5weF9zaXplICsgbGVhZGluZzsgLy8gcHhfc2l6ZSBhbHJlYWR5IGluIGRldmljZSBwaXhlbHNcblxuICAgICAgICAvLyBQYXJzZSBzdHJpbmcgaW50byBzZXJpZXMgb2YgbGluZXMgaWYgaXQgZXhjZWVkcyB0aGUgdGV4dCB3cmFwcGluZyB2YWx1ZSBvciBjb250YWlucyBsaW5lIGJyZWFrc1xuICAgICAgICBsZXQgbXVsdGlsaW5lID0gTXVsdGlMaW5lLnBhcnNlKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpO1xuXG4gICAgICAgIC8vIEZpbmFsIGRpbWVuc2lvbnMgb2YgdGV4dFxuICAgICAgICBsZXQgaGVpZ2h0ID0gbXVsdGlsaW5lLmhlaWdodDtcbiAgICAgICAgbGV0IHdpZHRoID0gbXVsdGlsaW5lLndpZHRoO1xuICAgICAgICBsZXQgbGluZXMgPSBtdWx0aWxpbmUubGluZXM7XG5cbiAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggLyBkcHIsXG4gICAgICAgICAgICBoZWlnaHQgLyBkcHJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggKyAyICogaG9yaXpvbnRhbF9idWZmZXIsXG4gICAgICAgICAgICBoZWlnaHQgKyAyICogdmVydGljYWxfYnVmZmVyXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGxvZ2ljYWxfc2l6ZSA9IFtcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVswXSAvIGRwcixcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVsxXSAvIGRwcixcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBSZXR1cm5zIGxpbmVzICh3L3Blci1saW5lIGluZm8gZm9yIGRyYXdpbmcpIGFuZCB0ZXh0J3Mgb3ZlcmFsbCBib3VuZGluZyBib3ggKyBjYW52YXMgc2l6ZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzaXplOiB7IGNvbGxpc2lvbl9zaXplLCB0ZXh0dXJlX3NpemUsIGxvZ2ljYWxfc2l6ZSwgbGluZV9oZWlnaHQgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIERyYXcgbXVsdGlwbGUgbGluZXMgb2YgdGV4dFxuICAgIGRyYXdUZXh0TXVsdGlMaW5lIChsaW5lcywgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSBzaXplLmxpbmVfaGVpZ2h0O1xuICAgICAgICBsZXQgaGVpZ2h0ID0geTtcbiAgICAgICAgZm9yIChsZXQgbGluZV9udW09MDsgbGluZV9udW0gPCBsaW5lcy5sZW5ndGg7IGxpbmVfbnVtKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbbGluZV9udW1dO1xuICAgICAgICAgICAgdGhpcy5kcmF3VGV4dExpbmUobGluZSwgW3gsIGhlaWdodF0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGgsIHRyYW5zZm9ybSwgYWxpZ24sIHN1cGVyc2FtcGxlIH0pO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAodGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyICsgc3Ryb2tlX3dpZHRoKTtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSBkcHIgKiB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyO1xuICAgICAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gc2l6ZS5jb2xsaXNpb25fc2l6ZTtcbiAgICAgICAgICAgIGxldCBsaW5lV2lkdGggPSAyO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnYmx1ZSc7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVJlY3QoeCArIGhvcml6b250YWxfYnVmZmVyLCB5ICsgdmVydGljYWxfYnVmZmVyLCBkcHIgKiBjb2xsaXNpb25fc2l6ZVswXSwgZHByICogY29sbGlzaW9uX3NpemVbMV0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3MuZHJhd19sYWJlbF90ZXh0dXJlX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICAvLyBzdHJva2UgaXMgYXBwbGllZCBpbnRlcm5hbGx5LCBzbyB0aGUgb3V0ZXIgYm9yZGVyIGlzIHRoZSBlZGdlIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlUmVjdCh4ICsgbGluZVdpZHRoLCB5ICsgbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMF0gLSAyICogbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMV0gLSAyICogbGluZVdpZHRoKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYXcgc2luZ2xlIGxpbmUgb2YgdGV4dCBhdCBzcGVjaWZpZWQgbG9jYXRpb24sIGFkanVzdGluZyBmb3IgYnVmZmVyIGFuZCBiYXNlbGluZVxuICAgIGRyYXdUZXh0TGluZSAobGluZSwgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgIGFsaWduID0gYWxpZ24gfHwgJ2NlbnRlcic7XG5cbiAgICAgICAgbGV0IHZlcnRpY2FsX2J1ZmZlciA9IHRoaXMudmVydGljYWxfdGV4dF9idWZmZXIgKiBkcHI7XG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBzaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gc2l6ZS5saW5lX2hlaWdodDtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG5cbiAgICAgICAgbGV0IHN0ciA9IHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtKGxpbmUudGV4dCwgdHJhbnNmb3JtKTtcblxuICAgICAgICAvLyBUZXh0IGFsaWdubWVudFxuICAgICAgICBsZXQgdHg7XG4gICAgICAgIGlmIChhbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICB0eCA9IHggKyBob3Jpem9udGFsX2J1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIHR4ID0geCArIHRleHR1cmVfc2l6ZVswXS8yIC0gbGluZS53aWR0aC8yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0gLSBsaW5lLndpZHRoIC0gaG9yaXpvbnRhbF9idWZmZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbiB0aGUgYWJzZW5jZSBvZiBiZXR0ZXIgQ2FudmFzIFRleHRNZXRyaWNzIChub3Qgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzIHlldCksXG4gICAgICAgIC8vIDAuNzUgYnVmZmVyIHByb2R1Y2VzIGEgYmV0dGVyIGFwcHJveGltYXRlIHZlcnRpY2FsIGNlbnRlcmluZyBvZiB0ZXh0XG4gICAgICAgIGxldCB0eSA9IHkgKyB2ZXJ0aWNhbF9idWZmZXIgKiAwLjc1ICsgbGluZV9oZWlnaHQ7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KHN0ciwgdHgsIHR5KTtcbiAgICB9XG5cbiAgICByYXN0ZXJpemUgKHRleHRzLCB0ZXh0dXJlX3NpemUsIHRpbGVfa2V5KSB7XG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0X2luZm9zW3RleHRdO1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gdGV4dF9pbmZvLnRleHRfc2V0dGluZ3M7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXQgZm9udCBvbiBmaXJzdCBvY2N1cmVuY2Ugb2YgbmV3IGZvbnQgc3R5bGVcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmRzID0gdGV4dF9pbmZvLnNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8udGV4Y29vcmRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZCA9IHdvcmRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleGNvb3JkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZCA9IENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlX3Bvc2l0aW9uID0gQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleHR1cmVfcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3dvcmRdLnNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3dvcmRdLmxpbmVzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE11bHRpTGluZShsaW5lLCB0ZXh0dXJlX3Bvc2l0aW9uLCBzaXplLCB0ZXh0X3NldHRpbmdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGNvb3JkID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkID0gdGV4Y29vcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby50ZXhjb29yZHMucHVzaCh0ZXhjb29yZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lcyA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0ubGluZXM7IC8vIGdldCBwcmV2aW91c2x5IGNvbXB1dGVkIGxpbmVzIG9mIHRleHRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdUZXh0TXVsdGlMaW5lKGxpbmVzLCB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sIHRleHRfaW5mby5zaXplLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiB0ZXh0X3NldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Vfd2lkdGg6IHRleHRfc2V0dGluZ3Muc3Ryb2tlX3dpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdGV4dF9zZXR0aW5ncy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJzYW1wbGU6IHRleHRfc2V0dGluZ3Muc3VwZXJzYW1wbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246IGFsaWduXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXhjb29yZHMgPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBsYWNlIHRleHQgbGFiZWxzIHdpdGhpbiBhbiBhdGxhcyBvZiB0aGUgZ2l2ZW4gbWF4IHNpemVcbiAgICBzZXRUZXh0dXJlVGV4dFBvc2l0aW9ucyAodGV4dHMsIG1heF90ZXh0dXJlX3NpemUsIHRpbGVfa2V5KSB7XG4gICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0pIHtcbiAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGNvbHVtbiB3aWR0aFxuICAgICAgICBsZXQgY29sdW1uX3dpZHRoID0gMDtcblxuICAgICAgICAvLyBMYXlvdXQgbGFiZWxzLCBzdGFja2VkIGluIGNvbHVtbnNcbiAgICAgICAgbGV0IGN4ID0gMCwgY3kgPSAwOyAvLyBjdXJyZW50IHgveSBwb3NpdGlvbiBpbiBhdGxhc1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDsgICAgIC8vIG92ZXJhbGwgYXRsYXMgaGVpZ2h0XG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXSkge1xuICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm9zID0gdGV4dHNbc3R5bGVdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRfaW5mby5zaXplLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZCA9IHRleHRfaW5mby5zZWdtZW50c1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplW2ldLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZVswXSA+IGNvbHVtbl93aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSBzaXplWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgKyBzaXplWzFdIDwgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgKz0gc2l6ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBjeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RhcnQgbmV3IGNvbHVtbiBpZiB0YWxsZXIgdGhhbiB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4ICs9IGNvbHVtbl93aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uOiB0ZXh0dXJlX3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyZWQgc2l6ZSBpcyBzYW1lIGZvciBhbGwgYWxpZ25tZW50c1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVbMF0gPiBjb2x1bW5fd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IHNpemVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgZWFjaCBhbGlnbm1lbnQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgc2VwYXJhdGVseVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhbGlnbiBpbiB0ZXh0X2luZm8uYWxpZ24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSArIHNpemVbMV0gPCBtYXhfdGV4dHVyZV9zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07IC8vIGFkZCBsYWJlbCB0byBjdXJyZW50IGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ICs9IHNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBzdGFydCBuZXcgY29sdW1uIGlmIHRhbGxlciB0aGFuIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeCArPSBjb2x1bW5fd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2N4ICsgY29sdW1uX3dpZHRoLCBoZWlnaHRdOyAvLyBvdmVyYWxsIGF0bGFzIHNpemVcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYmVmb3JlIHJhc3Rlcml6YXRpb25cbiAgICBhcHBseVRleHRUcmFuc2Zvcm0gKHRleHQsIHRyYW5zZm9ybSkge1xuICAgICAgICBpZiAodHJhbnNmb3JtID09PSAnY2FwaXRhbGl6ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcd1xcUyovZywgZnVuY3Rpb24gKHR4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAndXBwZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgZm9udCBDU1Mtc3R5bGUgc2l6ZSAoJzEycHgnLCAnMTRwdCcsICcxLjVlbScsIGV0Yy4pIHRvIHBpeGVsIHNpemUgKGFkanVzdGVkIGZvciBkZXZpY2UgcGl4ZWwgcmF0aW8pXG4gICAgLy8gRGVmYXVsdHMgdW5pdHMgdG8gcGl4ZWxzIGlmIG5vdCBzcGVjaWZpZWRcbiAgICBzdGF0aWMgZm9udFBpeGVsU2l6ZSAoc2l6ZSkge1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2l6ZSA9ICh0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycpID8gc2l6ZSA6IFN0cmluZyhzaXplKTsgLy8gbmVlZCBhIHN0cmluZyBmb3IgcmVnZXhcblxuICAgICAgICBsZXQgWywgcHhfc2l6ZSwgdW5pdHNdID0gc2l6ZS5tYXRjaChDYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSkgfHwgW107XG4gICAgICAgIHVuaXRzID0gdW5pdHMgfHwgJ3B4JztcblxuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAqPSAxNjtcbiAgICAgICAgfSBlbHNlIGlmICh1bml0cyA9PT0gXCJwdFwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDAuNzU7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwiJVwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDYuMjU7XG4gICAgICAgIH1cblxuICAgICAgICBweF9zaXplID0gcGFyc2VGbG9hdChweF9zaXplKTtcbiAgICAgICAgcHhfc2l6ZSAqPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBweF9zaXplO1xuICAgIH1cblxuICAgIGNsZWFyVGV4Y29vcmRDYWNoZSAodGlsZV9rZXkpIHtcbiAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0gPSB7fTtcbiAgICB9XG5cbn1cblxuLy8gRXh0cmFjdCBmb250IHNpemUgYW5kIHVuaXRzXG5DYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSA9IC8oKD86WzAtOV0qXFwuKT9bMC05XSspXFxzKihweHxwdHxlbXwlKT8vO1xuXG4vLyBDYWNoZSBzaXplcyBvZiByZW5kZXJlZCB0ZXh0XG5DYW52YXNUZXh0LnRleHRfY2FjaGUgPSB7fTsgLy8gYnkgdGV4dCBzdHlsZSwgdGhlbiB0ZXh0IHN0cmluZ1xuQ2FudmFzVGV4dC5jYWNoZV9zdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG5DYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlID0ge307XG5cbi8vIFJpZ2h0LXRvLWxlZnQgLyBiaS1kaXJlY3Rpb25hbCB0ZXh0IGhhbmRsaW5nXG4vLyBUYWtlbiBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTIwMDYwOTUvamF2YXNjcmlwdC1ob3ctdG8tY2hlY2staWYtY2hhcmFjdGVyLWlzLXJ0bCNhbnN3ZXItMTkxNDMyNTRcbmxldCBydGxSZWdFeCA9IC9eW15cXHUwNTkxLVxcdTA3RkZcXHUyMDBGXFx1MjAyQlxcdTIwMkVcXHVGQjFELVxcdUZERkRcXHVGRTcwLVxcdUZFRkNdKj9bXFx1MDU5MS1cXHUwN0ZGXFx1MjAwRlxcdTIwMkJcXHUyMDJFXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXS87XG5mdW5jdGlvbiBpc1JUTChzKXtcbiAgICByZXR1cm4gcnRsUmVnRXgudGVzdChzKTtcbn1cblxuZnVuY3Rpb24gcmVvcmRlcldvcmRzTFRSKHdvcmRzKSB7XG4gICAgbGV0IHdvcmRzX0xUUiA9IFtdO1xuICAgIGxldCB3b3Jkc19SVEwgPSBbXTtcblxuICAgIC8vIGxvb3AgdGhyb3VnaCB3b3JkcyBhbmQgcmUtb3JkZXIgUlRMIGdyb3VwcyBpbiByZXZlcnNlIG9yZGVyIChidXQgaW4gTFRSIHZpc3VhbCBvcmRlcilcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHN0ciA9IHdvcmRzW2ldO1xuICAgICAgICB2YXIgcnRsID0gaXNSVEwoc3RyKTtcbiAgICAgICAgaWYgKHJ0bCl7XG4gICAgICAgICAgICB3b3Jkc19SVEwucHVzaChzdHIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKHdvcmRzX1JUTC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICB3b3Jkc19MVFIucHVzaCh3b3Jkc19SVEwucG9wKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd29yZHNfTFRSLnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdoaWxlICh3b3Jkc19SVEwubGVuZ3RoID4gMCl7XG4gICAgICAgIHdvcmRzX0xUUi5wdXNoKHdvcmRzX1JUTC5wb3AoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmRzX0xUUjtcbn1cblxuLy8gU3BsaXR0aW5nIHN0cmF0ZWd5IGZvciBjaG9wcGluZyBhIGxhYmVsIGludG8gc2VnbWVudHNcbmZ1bmN0aW9uIHNwbGl0TGFiZWxUZXh0KHRleHQpe1xuICAgIGxldCB3b3JkcyA9IHRleHQuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4gcmVvcmRlcldvcmRzTFRSKHdvcmRzKTtcbn1cblxuLy8gUHJpdmF0ZSBjbGFzcyB0byBhcnJhbmdlIHRleHQgbGFiZWxzIGludG8gbXVsdGlwbGUgbGluZXMgYmFzZWQgb25cbi8vIFwidGV4dCB3cmFwXCIgYW5kIFwibWF4IGxpbmVcIiB2YWx1ZXNcbmNsYXNzIE11bHRpTGluZSB7XG4gICAgY29uc3RydWN0b3IgKGNvbnRleHQsIG1heF9saW5lcyA9IEluZmluaXR5LCB0ZXh0X3dyYXAgPSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG5cbiAgICAgICAgdGhpcy5lbGxpcHNpcyA9ICcuLi4nO1xuICAgICAgICB0aGlzLmVsbGlwc2lzX3dpZHRoID0gTWF0aC5jZWlsKGNvbnRleHQubWVhc3VyZVRleHQodGhpcy5lbGxpcHNpcykud2lkdGgpO1xuXG4gICAgICAgIHRoaXMubWF4X2xpbmVzID0gbWF4X2xpbmVzO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG5cbiAgICBjcmVhdGVMaW5lIChsaW5lX2hlaWdodCl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShsaW5lX2hlaWdodCwgdGhpcy50ZXh0X3dyYXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCAobGluZSl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIC8vIG1lYXN1cmUgbGluZSB3aWR0aFxuICAgICAgICAgICAgbGV0IGxpbmVfd2lkdGggPSB0aGlzLmNvbnRleHQubWVhc3VyZVRleHQobGluZS50ZXh0KS53aWR0aDtcbiAgICAgICAgICAgIGxpbmUud2lkdGggPSBsaW5lX3dpZHRoO1xuXG4gICAgICAgICAgICBpZiAobGluZV93aWR0aCA+IHRoaXMud2lkdGgpe1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBNYXRoLmNlaWwobGluZV93aWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCB0byBsaW5lcyBhbmQgaW5jcmVtZW50IGhlaWdodFxuICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgKz0gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxsaXBzaXMoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHB1c2hlcyB0byB0aGUgbGluZXMgYXJyYXkgYW5kIHJldHVybnMgYSBuZXcgbGluZSBpZiBwb3NzaWJsZSAoZmFsc2Ugb3RoZXJ3aXNlKVxuICAgIGFkdmFuY2UgKGxpbmUsIGxpbmVfaGVpZ2h0KSB7XG4gICAgICAgIGxldCBjYW5fcHVzaCA9IHRoaXMucHVzaChsaW5lKTtcbiAgICAgICAgaWYgKGNhbl9wdXNoKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRWxsaXBzaXMgKCl7XG4gICAgICAgIGxldCBsYXN0X2xpbmUgPSB0aGlzLmxpbmVzW3RoaXMubGluZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFzdF9saW5lLmFwcGVuZCh0aGlzLmVsbGlwc2lzKTtcbiAgICAgICAgbGFzdF9saW5lLndpZHRoICs9IHRoaXMuZWxsaXBzaXNfd2lkdGg7XG5cbiAgICAgICAgaWYgKGxhc3RfbGluZS53aWR0aCA+IHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBsYXN0X2xpbmUud2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5pc2ggKGxpbmUpe1xuICAgICAgICBpZiAobGluZSl7XG4gICAgICAgICAgICB0aGlzLnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVsbGlwc2lzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UgKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpIHtcbiAgICAgICAgLy8gV29yZCB3cmFwcGluZ1xuICAgICAgICAvLyBMaW5lIGJyZWFrcyBjYW4gYmUgY2F1c2VkIGJ5OlxuICAgICAgICAvLyAgLSBpbXBsaWNpdCBsaW5lIGJyZWFrIHdoZW4gYSBtYXhpbXVtIGNoYXJhY3RlciB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgcGVyIGxpbmUgKHRleHRfd3JhcClcbiAgICAgICAgLy8gIC0gZXhwbGljaXQgbGluZSBicmVhayBpbiB0aGUgbGFiZWwgdGV4dCAoXFxuKVxuICAgICAgICBsZXQgd29yZHM7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dF93cmFwID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgd29yZHMgPSBzdHIuc3BsaXQoJyAnKTsgLy8gc3BsaXQgd29yZHMgb24gc3BhY2VzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3b3JkcyA9IFtzdHJdOyAvLyBubyBtYXggbGluZSB3b3JkIHdyYXBwaW5nIChidXQgbmV3IGxpbmVzIHdpbGwgc3RpbGwgYmUgaW4gZWZmZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG11bHRpbGluZSA9IG5ldyBNdWx0aUxpbmUoY3R4LCBtYXhfbGluZXMsIHRleHRfd3JhcCk7XG4gICAgICAgIGxldCBsaW5lID0gbXVsdGlsaW5lLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuXG4gICAgICAgIC8vIEZpcnN0IGl0ZXJhdGUgb24gc3BhY2UtYnJlYWsgZ3JvdXBzICh3aWxsIGJlIG9uZSBpZiBtYXggbGluZSBsZW5ndGggb2ZmKSwgdGhlbiBpdGVyYXRlIG9uIGxpbmUtYnJlYWsgZ3JvdXBzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSB3b3Jkc1tpXS5zcGxpdCgnXFxuJyk7IC8vIHNwbGl0IG9uIGxpbmUgYnJlYWtzXG4gICAgICAgICAgICBsZXQgbmV3X2xpbmUgPSAoaSA9PT0gMCkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG49MDsgbiA8IGJyZWFrcy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgICAgIGlmICghbGluZSl7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB3b3JkID0gYnJlYWtzW25dLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmICghd29yZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc3BhY2VkX3dvcmQgPSAobmV3X2xpbmUpID8gd29yZCA6ICcgJyArIHdvcmQ7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBhZGRpbmcgY3VycmVudCB3b3JkIHdvdWxkIG92ZXJmbG93LCBhZGQgYSBuZXcgbGluZSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgLy8gZmlyc3Qgd29yZCAoaSA9PT0gMCkgYWx3YXlzIGFwcGVuZHNcbiAgICAgICAgICAgICAgICBpZiAodGV4dF93cmFwICYmIGkgPiAwICYmIGxpbmUuZXhjZWVkc1RleHR3cmFwKHNwYWNlZF93b3JkKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod29yZCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld19saW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHNwYWNlZF93b3JkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBsaW5lIGJyZWFrcyBwcmVzZW50LCBhZGQgbmV3IGxpbmUgKHVubGVzcyBvbiBsYXN0IGxpbmUpXG4gICAgICAgICAgICAgICAgaWYgKG4gPCBicmVha3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdfbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gd29yZHMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgICAgbXVsdGlsaW5lLmZpbmlzaChsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXVsdGlsaW5lO1xuICAgIH1cbn1cblxuLy8gQSBQcml2YXRlIGNsYXNzIHVzZWQgYnkgTXVsdGlMaW5lIHRvIGNvbnRhaW4gdGhlIGxvZ2ljIGZvciBhIHNpbmdsZSBsaW5lXG4vLyBpbmNsdWRpbmcgY2hhcmFjdGVyIGNvdW50LCB3aWR0aCwgaGVpZ2h0IGFuZCB0ZXh0XG5jbGFzcyBMaW5lIHtcbiAgICBjb25zdHJ1Y3RvciAoaGVpZ2h0ID0gMCwgdGV4dF93cmFwID0gMCl7XG4gICAgICAgIHRoaXMuY2hhcnMgPSAwO1xuICAgICAgICB0aGlzLnRleHQgPSAnJztcblxuICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQpO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICB9XG5cbiAgICBhcHBlbmQgKHRleHQpe1xuICAgICAgICB0aGlzLmNoYXJzICs9IHRleHQubGVuZ3RoO1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG5cbiAgICBleGNlZWRzVGV4dHdyYXAgKHRleHQpe1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggKyB0aGlzLmNoYXJzID4gdGhpcy50ZXh0X3dyYXA7XG4gICAgfVxufVxuIiwiLyogZ2xvYmFsIEZvbnRGYWNlICovXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEZvbnRGYWNlT2JzZXJ2ZXIgZnJvbSAnZm9udGZhY2VvYnNlcnZlcic7XG5cbmNvbnN0IEZvbnRNYW5hZ2VyID0ge1xuXG4gICAgLy8gRm9udCBkZXRlY3Rpb25cbiAgICBmb250c19sb2FkZWQ6IFByb21pc2UucmVzb2x2ZSgpLCAvLyByZXNvbHZlcyB3aGVuIGFsbCByZXF1ZXN0ZWQgZm9udHMgaGF2ZSBiZWVuIGRldGVjdGVkXG5cbiAgICAvLyBMb2FkIHNldCBvZiBjdXN0b20gZm9udCBmYWNlc1xuICAgIC8vIGBmb250c2AgaXMgYW4gb2JqZWN0IHdoZXJlIHRoZSBrZXkgaXMgYSBmb250IGZhbWlseSBuYW1lLCBhbmQgdGhlIHZhbHVlIGlzIG9uZSBvciBtb3JlIGZvbnQgZmFjZVxuICAgIC8vIGRlZmluaXRpb25zLiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHN1Y2ggb2JqZWN0cy5cbiAgICAvLyBJZiB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWUgJ2V4dGVybmFsJyBpcyB1c2VkLCBpdCBpbmRpY2F0ZXMgdGhlIHRoZSBmb250IHdpbGwgYmUgbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuXG4gICAgbG9hZEZvbnRzIChmb250cykge1xuICAgICAgICBpZiAoZm9udHMpIHtcbiAgICAgICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZmFtaWx5IGluIGZvbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZm9udHNbZmFtaWx5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9udHNbZmFtaWx5XS5mb3JFYWNoKGZhY2UgPT4gcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZhY2UpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHRoaXMubG9hZEZvbnRGYWNlKGZhbWlseSwgZm9udHNbZmFtaWx5XSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb250c19sb2FkZWQgPSBQcm9taXNlLmFsbChxdWV1ZS5maWx0ZXIoeCA9PiB4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udHNfbG9hZGVkO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkIGEgc2luZ2xlIGZvbnQgZmFjZVxuICAgIC8vIGBmYWNlYCBjb250YWlucyB0aGUgZm9udCBmYWNlIGRlZmluaXRpb24sIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYHdlaWdodGAsIGBzdHlsZWAsIGFuZCBgdXJsYC5cbiAgICAvLyBJZiB0aGUgYHVybGAgaXMgZGVmaW5lZCwgdGhlIGZvbnQgaXMgaW5qZWN0ZWQgaW50byB0aGUgZG9jdW1lbnQgYXMgYSBDU1MgZm9udC1mYWNlLlxuICAgIC8vIElmIHRoZSBvYmplY3QncyB2YWx1ZSBpcyB0aGUgc3BlY2lhbCBzdHJpbmcgJ2V4dGVybmFsJywgb3IgaWYgbm8gYHVybGAgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZm9udCBmYWNlXG4gICAgLy8gaXMgYXNzdW1lZCBpcyBhc3N1bWVkIHRvIGJlZW4gbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuIEluIGVpdGhlciBjYXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2VcbiAgICAvLyB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbnQgZmFjZSBoYXMgbG9hZGVkLCBvciB0aW1lcyBvdXQuXG4gICAgbG9hZEZvbnRGYWNlIChmYW1pbHksIGZhY2UpIHtcbiAgICAgICAgaWYgKGZhY2UgPT0gbnVsbCB8fCAodHlwZW9mIGZhY2UgIT09ICdvYmplY3QnICYmIGZhY2UgIT09ICdleHRlcm5hbCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IHsgZmFtaWx5IH07XG4gICAgICAgIGxldCBpbmplY3QgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGZhY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIGZhY2UpO1xuXG4gICAgICAgICAgICAvLyBJZiBVUkwgaXMgZGVmaW5lZCwgaW5qZWN0IGZvbnQgaW50byBkb2N1bWVudFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmYWNlLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbmplY3QgPSB0aGlzLmluamVjdEZvbnRGYWNlKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgZm9udCB0byBsb2FkXG4gICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBGb250RmFjZU9ic2VydmVyKGZhbWlseSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBpbmplY3QudGhlbigoKSA9PiBvYnNlcnZlci5sb2FkKCkpLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlcywgZm9udCBpcyBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBhdmFpbGFibGVgLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RzLCBmb250IGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBOT1QgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8vIExvYWRzIGEgZm9udCBmYWNlIHZpYSBlaXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEksIG9yIENTUyBpbmplY3Rpb25cbiAgICAvLyBUT0RPOiBjb25zaWRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBmb3JtYXQgVVJMcyBwZXIgZmFjZSwgdW5pY29kZSByYW5nZXNcbiAgICBpbmplY3RGb250RmFjZSAoeyBmYW1pbHksIHVybCwgd2VpZ2h0LCBzdHlsZSB9KSB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzX25hdGl2ZV9mb250X2xvYWRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID0gKHdpbmRvdy5Gb250RmFjZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgYmxvYiBVUkxzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmF0aXZlIEZvbnRGYWNlIEFQSSB3aWxsIGJlIHVzZWQgb3Igbm90LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgKmlzKiBzdXBwb3J0ZWQsIHRoZSBibG9iIFVSTCBpcyByZWFkIGludG8gYSByYXcgZGF0YSBhcnJheS5cbiAgICAgICAgLy8gTkI6IGl0J3MgaW5lZmZpY2llbnQgdG8gYmUgY29udmVydGluZyBibG9iIFVSTHMgaW50byB0eXBlZCBhcnJheXMgaGVyZSwgc2luY2UgdGhleSBvcmlnaW5hdGVkXG4gICAgICAgIC8vIGFzIHJhdyBkYXRhICpiZWZvcmUqIHRoZXkgd2VyZSBjb252ZXJ0ZWQgaW50byBibG9iIFVSTHMuIEhvd2V2ZXIsIHRoaXMgcHJvY2VzcyBzaG91bGQgYmUgZmFzdCBzaW5jZVxuICAgICAgICAvLyB0aGVzZSBhcmUgbmF0aXZlIGJyb3dzZXIgZnVuY3Rpb25zIGFuZCBhbGwgZGF0YSBpcyBsb2NhbCAobm8gbmV0d29yayByZXF1ZXN0KSwgYW5kIGl0IGtlZXBzIHRoZVxuICAgICAgICAvLyBsb2dpYyBzdHJlYW1saW5lZCBieSBhbGxvd2luZyB1cyB0byBjb250aW51ZSB0byB1c2UgYSBVUkwtYmFzZWQgaW50ZXJmYWNlIGZvciBhbGwgc2NlbmUgcmVzb3VyY2VzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgaXMgKm5vdCogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSBiYXNlNjQgZGF0YSBVUkwuXG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIHNlY3VyaXR5IHJlc3RyaWNpb25zIGluIHNvbWUgYnJvd3NlcnMuXG4gICAgICAgIC8vIEFsc28gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9icmFtc3RlaW4vZm9udGxvYWRlci9ibG9iLzU5OGU5Mzk5MTE3YmRjOTQ2ZmY3ODZmYTJjNTAwN2E2YmQ3ZDNiOWUvc3JjL2ZvbnRmYWNlLmpzI0wxNDUtTDE1M1xuICAgICAgICBsZXQgcHJlcHJvY2VzcyA9IFByb21pc2UucmVzb2x2ZSh1cmwpO1xuICAgICAgICBpZiAodXJsLnNsaWNlKDAsIDUpID09PSAnYmxvYjonKSB7XG4gICAgICAgICAgICBwcmVwcm9jZXNzID0gVXRpbHMuaW8odXJsLCA2MDAwMCwgJ2FycmF5YnVmZmVyJykudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBieXRlczsgLy8gdXNlIHJhdyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCcgKyBidG9hKHN0cik7IC8vIGJhc2U2NCBlbmNvZGUgYXMgZGF0YSBVUkxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmVwcm9jZXNzLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBGb250RmFjZSBBUElcbiAgICAgICAgICAgICAgICBsZXQgZmFjZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGFkZCBhcyBVUkxcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG5ldyBGb250RmFjZShmYW1pbHksIGB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KWAsIHsgd2VpZ2h0LCBzdHlsZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsgLy8gYWRkIGFzIGJpbmFyeSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBkYXRhLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChmYWNlKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0FkZGluZyBGb250RmFjZSB0byBkb2N1bWVudC5mb250czonLCBmYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBDU1MgaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgbGV0IGNzcyA9IGBcbiAgICAgICAgICAgICAgICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJyR7ZmFtaWx5fSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogJHt3ZWlnaHQgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zdHlsZTogJHtzdHlsZSB8fCAnbm9ybWFsJ307XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHVybCgke2VuY29kZVVSSShkYXRhKX0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgc3R5bGVfZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVfZWwpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLnNoZWV0Lmluc2VydFJ1bGUoY3NzLCAwKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0luamVjdGluZyBDU1MgZm9udCBmYWNlOicsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9udE1hbmFnZXI7XG4iLCIvLyBUZXh0IHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1BvaW50c30gZnJvbSAnLi4vcG9pbnRzL3BvaW50cyc7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX3BvaW50JztcbmltcG9ydCBMYWJlbExpbmUgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX2xpbmUnO1xuXG5leHBvcnQgbGV0IFRleHRTdHlsZSA9IE9iamVjdC5jcmVhdGUoUG9pbnRzKTtcblxuT2JqZWN0LmFzc2lnbihUZXh0U3R5bGUsIHtcbiAgICBuYW1lOiAndGV4dCcsXG4gICAgc3VwZXI6IFBvaW50cyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIFBvaW50IHN0eWxlIChwYXJlbnQgY2xhc3MpIHJlcXVpcmVzIHRleHR1cmluZyB0byBiZSB0dXJuZWQgb25cbiAgICAgICAgLy8gKGxhYmVscyBhcmUgYWx3YXlzIGRyYXduIHdpdGggdGV4dHVyZXMpXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1BPSU5UX1RFWFRVUkUgPSB0cnVlO1xuXG4gICAgICAgIC8vIERpc2FibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IGZhbHNlO1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IHVuLW11bHRpcGx5IGFscGhhLCBiZWNhdXNlIENhbnZhcyB0ZXh0IHJhc3Rlcml6YXRpb24gaXMgcHJlLW11bHRpcGxpZWRcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVU5NVUxUSVBMWV9BTFBIQSA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgdGV4dCB3aGVuIHRpbGUgaXMgem9vbWluZyBvdXQsIGUuZy4gYWN0aW5nIGFzIHByb3h5IHRpbGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUX1JBVEUgPSAyOyAvLyBmYWRlIGF0IDJ4LCBlLmcuIGZ1bGx5IHRyYW5zcGFyZW50IGF0IDAuNSB6b29tIGxldmVsIGF3YXlcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnF1ZXVlcyA9IHt9O1xuICAgICAgICB0aGlzLnJlc2V0VGV4dCgpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBxdWV1ZSBmZWF0dXJlcyBpbnN0ZWFkIG9mIHByb2Nlc3NpbmcgaW1tZWRpYXRlbHlcbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGxlZCBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZmVhdHVyZSBxdWV1ZSBpcyBwYXJzZWQsXG4gICAgICAgIC8vIGFuZCB3ZSB3YW50IHRoZSBwcmVwcm9jZXNzaW5nIGRvbmUgYmVmb3JlIHdlIGV2YWx1YXRlIHRleHQgc3R5bGUgYmVsb3dcbiAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHlwZSA9IGZlYXR1cmUuZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgZHJhdy5jYW5fYXJ0aWN1bGF0ZSA9ICh0eXBlID09PSBcIkxpbmVTdHJpbmdcIiB8fCB0eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKTtcblxuICAgICAgICAvLyBzdXBlcnNhbXBsZSB0ZXh0IHJlbmRlcmluZyBmb3IgYW5nbGVkIGxhYmVscywgdG8gaW1wcm92ZSBjbGFyaXR5XG4gICAgICAgIGRyYXcuc3VwZXJzYW1wbGVfdGV4dCA9ICh0eXBlID09PSBcIkxpbmVTdHJpbmdcIiB8fCB0eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKTtcblxuICAgICAgICBsZXQgcSA9IHRoaXMucGFyc2VUZXh0RmVhdHVyZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcbiAgICAgICAgaWYgKCFxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBxLmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgICBxLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBxLmxheW91dC52ZXJ0ZXggPSBmYWxzZTsgLy8gdmVydGV4IHBsYWNlbWVudCBvcHRpb24gbm90IGFwcGxpY2FibGUgdG8gc3RhbmRhbG9uZSBsYWJlbHNcblxuICAgICAgICAvLyBRdWV1ZSB0aGUgZmVhdHVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2gocSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCBjb2xsaXNpb24gbWFuYWdlclxuICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5uYW1lLCB0aWxlLmtleSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuICAgICAgICByZXR1cm4gU3R5bGUuc3RhcnREYXRhLmNhbGwodGhpcywgdGlsZSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLm5hbWUsIHRoaXMucXVldWVzW3RpbGUua2V5XSkuXG4gICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMubmFtZSwgbGFiZWxzKSkuXG4gICAgICAgICAgICB0aGVuKCh7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRleHRzO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHF1ZXVlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgc3R5bGluZyBvYmplY3QgZXhwZWN0ZWQgYnkgU3R5bGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxhYmVsID0gcS5sYWJlbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG9naWNhbCBzaXplcyBvZiBlYWNoIHNlZ21lbnQgaW50byBhbiBhcnJheSBmb3IgdGhlIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLm1hcChmdW5jdGlvbihzaXplKXsgcmV0dXJuIHNpemUubG9naWNhbF9zaXplOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLmxvZ2ljYWxfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hbmdsZSA9IHEubGFiZWwuYW5nbGUgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBTdHlsZS5hZGRGZWF0dXJlLmNhbGwodGhpcywgcS5mZWF0dXJlLCBxLmRyYXcsIHEuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZyZWVUZXh0KHRpbGUpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluaXNoIHRpbGUgbWVzaFxuICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZS5lbmREYXRhLmNhbGwodGhpcywgdGlsZSkudGhlbih0aWxlX2RhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggdGlsZS1zcGVjaWZpYyBsYWJlbCBhdGxhcyB0byBtZXNoIGFzIGEgdGV4dHVyZSB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlICYmIHRpbGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0ZXh0dXJlKTsgLy8gYXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aWxlX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBTZXRzIHVwIGNhY2hpbmcgZm9yIGRyYXcgcHJvcGVydGllc1xuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXByb2Nlc3NUZXh0KGRyYXcpO1xuICAgIH0sXG5cbiAgICAvLyBJbXBsZW1lbnRzIGxhYmVsIGJ1aWxkaW5nIGZvciBUZXh0TGFiZWxzIG1peGluXG4gICAgYnVpbGRUZXh0TGFiZWxzICh0aWxlX2tleSwgZmVhdHVyZV9xdWV1ZSkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG4gICAgICAgIGZvciAobGV0IGY9MDsgZiA8IGZlYXR1cmVfcXVldWUubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgIGxldCBmcSA9IGZlYXR1cmVfcXVldWVbZl07XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGhpcy50ZXh0c1t0aWxlX2tleV1bZnEudGV4dF9zZXR0aW5nc19rZXldW2ZxLnRleHRdO1xuICAgICAgICAgICAgbGV0IGZlYXR1cmVfbGFiZWxzO1xuICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZXMgPSB0ZXh0X2luZm8uc2l6ZS5tYXAoZnVuY3Rpb24oc2l6ZSl7IHJldHVybiBzaXplLmNvbGxpc2lvbl9zaXplOyB9KTtcbiAgICAgICAgICAgICAgICBmcS5sYXlvdXQuc3BhY2Vfd2lkdGggPSB0ZXh0X2luZm8uc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHNpemVzLCBmcS5mZWF0dXJlLmdlb21ldHJ5LCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHRleHRfaW5mby5zaXplLmNvbGxpc2lvbl9zaXplLCBmcS5mZWF0dXJlLmdlb21ldHJ5LCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlX2xhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmcWwgPSBPYmplY3QuY3JlYXRlKGZxKTtcbiAgICAgICAgICAgICAgICBmcWwubGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChmcWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkcyBvbmUgb3IgbW9yZSBsYWJlbHMgZm9yIGEgZ2VvbWV0cnlcbiAgICBidWlsZExhYmVscyAoc2l6ZSwgZ2VvbWV0cnksIGxheW91dCkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG5cbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZUxhYmVscyhnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lTGFiZWxzKGxpbmVzW2ldLCBzaXplLCBsYXlvdXQsIGxhYmVscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHtcbiAgICAgICAgICAgIGxldCBwb2ludHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQocG9pbnRzW2ldLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvbHlnb25cIikge1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBvbmUgb3IgbW9yZSBsYWJlbHMgZm9yIGEgbGluZSBnZW9tZXRyeVxuICAgIGJ1aWxkTGluZUxhYmVscyAobGluZSwgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpIHtcbiAgICAgICAgbGV0IHN1YmRpdiA9IE1hdGgubWluKGxheW91dC5zdWJkaXYsIGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgIGlmIChzdWJkaXYgPiAxKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgbXVsdGlwbGUgbGFiZWxzIGZvciBsaW5lLCB3aXRoIGVhY2ggYWxsb3R0ZWQgYSByYW5nZSBvZiBzZWdtZW50c1xuICAgICAgICAgICAgLy8gaW4gd2hpY2ggaXQgd2lsbCBhdHRlbXB0IHRvIHBsYWNlXG4gICAgICAgICAgICBsZXQgc2VnX3Blcl9kaXYgPSAobGluZS5sZW5ndGggLSAxKSAvIHN1YmRpdjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViZGl2OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9zdGFydCA9IE1hdGguZmxvb3IoaSAqIHNlZ19wZXJfZGl2KTtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9lbmQgPSBNYXRoLmZsb29yKChpICsgMSkgKiBzZWdfcGVyX2Rpdik7XG5cbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxMaW5lKHNpemUsIGxpbmUsIGxheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfZW5kID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbExpbmUoc2l6ZSwgbGluZSwgbGF5b3V0KTtcbiAgICAgICAgICAgIGlmICghbGFiZWwudGhyb3dfYXdheSl7XG4gICAgICAgICAgICAgICAgbGV0IGNob3Nlbl9sYWJlbCA9IHBsYWNlbWVudFN0cmF0ZWd5KGxhYmVsKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hvc2VuX2xhYmVsKXtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2goY2hvc2VuX2xhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuXG5jb25zdCBUQVJHRVRfU1RSQUlHSFQgPSAwLjQ7IC8vIE9wdGltaXN0aWMgdGFyZ2V0IHJhdGlvIGZvciBzdHJhaWdodCBsYWJlbHMgKGxhYmVsIGxlbmd0aCAvIGxpbmUgbGVuZ3RoKVxuY29uc3QgVEFSR0VUX0tJTktFRCA9IDAuNTsgLy8gT3B0aW1pc3RpYyB0YXJnZXQgcmF0aW8gZm9yIGtpbmtlZCBsYWJlbHMgKGxhYmVsIGxlbmd0aCAvIGxpbmUgbGVuZ3RoKVxuXG4vLyBQbGFjZSBsYWJlbHMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6XG4vLyAtIGNob29zZSB0aGUgYmVzdCBzdHJhaWdodCBsYWJlbCB0aGF0IHNhdGlzZmllcyB0aGUgb3B0aW1pc3RpYyBzdHJhaWdodCBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qga2lua2VkIGxhYmVsIHRoYXQgc2F0aXNmaWVzIHRoZSBvcHRpbWlzdGljIGtpbmtlZCBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qgc3RyYWlnaHQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgaXRzIGludGVybmFsIChsZXNzIG9wdGltaXN0aWMpIGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGNob29zZSB0aGUgYmVzdCBraW5rZWQgbGFiZWxzIHRoYXQgc2F0aXNmaWVzIGl0cyBpbnRlcm5hbCAobGVzcyBvcHRpbWlzdGljKSBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBkb24ndCBwbGFjZSBhIGxhYmVsXG5mdW5jdGlvbiBwbGFjZW1lbnRTdHJhdGVneShsYWJlbCl7XG4gICAgbGV0IGxhYmVsc19zdHJhaWdodCA9IFtdO1xuICAgIGxldCBsYWJlbHNfa2lua2VkID0gW107XG4gICAgbGV0IGJlc3Rfc3RyYWlnaHRfZml0bmVzcyA9IEluZmluaXR5O1xuICAgIGxldCBiZXN0X2tpbmtlZF9maXRuZXNzID0gSW5maW5pdHk7XG5cbiAgICAvLyBsb29wIHRocm91Z2ggYWxsIGxhYmVsc1xuICAgIHdoaWxlIChsYWJlbCAmJiAhbGFiZWwudGhyb3dfYXdheSkge1xuICAgICAgICBpZiAobGFiZWwua2lua19pbmRleCA+IDApe1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgYXJ0aWN1bGF0ZWQgbGFiZWwgaXMgYWJvdmUgbG93ZXN0IGN1dG9mZlxuICAgICAgICAgICAgaWYgKGxhYmVsLmZpdG5lc3MgPCBiZXN0X2tpbmtlZF9maXRuZXNzKXtcbiAgICAgICAgICAgICAgICBiZXN0X2tpbmtlZF9maXRuZXNzID0gbGFiZWwuZml0bmVzcztcbiAgICAgICAgICAgICAgICBsYWJlbHNfa2lua2VkLnVuc2hpZnQobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgc3RyYWlnaHQgbGFiZWwgaXMgYWJvdmUgbG93ZXN0IHN0cmFpZ2h0IGN1dG9mZlxuICAgICAgICAgICAgaWYgKGxhYmVsLmZpdG5lc3MgPCBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3Mpe1xuICAgICAgICAgICAgICAgIGJlc3Rfc3RyYWlnaHRfZml0bmVzcyA9IGxhYmVsLmZpdG5lc3M7XG4gICAgICAgICAgICAgICAgbGFiZWxzX3N0cmFpZ2h0LnVuc2hpZnQobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFiZWwgPSBMYWJlbExpbmUubmV4dExhYmVsKGxhYmVsKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdF9zdHJhaWdodCA9IGxhYmVsc19zdHJhaWdodFswXTtcbiAgICBsZXQgYmVzdF9raW5rZWQgPSBsYWJlbHNfa2lua2VkWzBdO1xuXG4gICAgaWYgKGxhYmVsc19zdHJhaWdodC5sZW5ndGggJiYgYmVzdF9zdHJhaWdodC5maXRuZXNzIDwgVEFSR0VUX1NUUkFJR0hUKXtcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBiZXN0IHN0cmFpZ2h0IHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgdGhlIHN0cmljdGVyIHN0cmFpZ2h0IGN1dG9mZlxuICAgICAgICByZXR1cm4gYmVzdF9zdHJhaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAobGFiZWxzX2tpbmtlZC5sZW5ndGggJiYgYmVzdF9raW5rZWQuZml0bmVzcyA8IFRBUkdFVF9LSU5LRUQpe1xuICAgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qga2lua2VkIHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgdGhlIHN0cmljdGVyIGtpbmtlZCBjdXRvZmZcbiAgICAgICAgcmV0dXJuIGJlc3Rfa2lua2VkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHJldHVybiBiZXN0IG9mIHdoYXQncyBsZWZ0IChpZiBhbnkpXG4gICAgICAgIHJldHVybiBiZXN0X3N0cmFpZ2h0IHx8IGJlc3Rfa2lua2VkO1xuICAgIH1cbn1cblxuVGV4dFN0eWxlLnRleHR1cmVfaWQgPSAwOyAvLyBuYW1lc3BhY2VzIHBlci10aWxlIGxhYmVsIHRleHR1cmVzXG4iLCIvLyBUZXh0IGxhYmVsIHJlbmRlcmluZyBtZXRob2RzLCBjYW4gYmUgbWl4ZWQgaW50byBhIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4uLy4uL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uLy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBUZXh0U2V0dGluZ3MgZnJvbSAnLi4vdGV4dC90ZXh0X3NldHRpbmdzJztcbmltcG9ydCBDYW52YXNUZXh0IGZyb20gJy4uL3RleHQvY2FudmFzX3RleHQnO1xuXG4vLyBuYW1lc3BhY2VzIGxhYmVsIHRleHR1cmVzIChlbnN1cmVzIG5ldyB0ZXh0dXJlIG5hbWUgd2hlbiBhIHRpbGUgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMpXG5sZXQgdGV4dF90ZXh0dXJlX2lkID0gMDtcblxuZXhwb3J0IGNvbnN0IFRleHRMYWJlbHMgPSB7XG5cbiAgICByZXNldFRleHQgKCkge1xuICAgICAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbmV3IENhbnZhc1RleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRzID0ge307IC8vIHVuaXF1ZSB0ZXh0cywgZ3JvdXBlZCBieSB0aWxlLCBieSBzdHlsZVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZyZWVUZXh0ICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRleHRzW3RpbGUua2V5XTtcbiAgICB9LFxuXG4gICAgcGFyc2VUZXh0RmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICAvLyBDb21wdXRlIGxhYmVsIHRleHRcbiAgICAgICAgbGV0IHRleHQgPSB0aGlzLnBhcnNlVGV4dFNvdXJjZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBubyB0ZXh0IGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgdGV4dCBzdHlsZSBhbmQgbGF5b3V0IHNldHRpbmdzIGZvciB0aGlzIGZlYXR1cmUgbGFiZWxcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSBUZXh0U2V0dGluZ3MuY29tcHV0ZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gVGV4dFNldHRpbmdzLmtleSh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgbGV0IGxheW91dCA9IHRoaXMuY29tcHV0ZVRleHRMYXlvdXQoe30sIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUsIHRleHQsIHRleHRfc2V0dGluZ3MpO1xuXG4gICAgICAgIC8vIGZpcnN0IGxhYmVsIGluIHRpbGUsIG9yIHdpdGggdGhpcyBzdHlsZT9cbiAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0aGlzLnRleHRzW3RpbGUua2V5XSB8fCB7fTtcbiAgICAgICAgbGV0IHNpemVzID0gdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldID0gdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldIHx8IHt9O1xuXG4gICAgICAgIC8vIHVuaXF1ZSB0ZXh0IHN0cmluZ3MsIGdyb3VwZWQgYnkgdGV4dCBkcmF3aW5nIHN0eWxlXG4gICAgICAgIGlmICghc2l6ZXNbdGV4dF0pIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGxhYmVsIHdpdGggdGhpcyB0ZXh0L3N0eWxlL3RpbGUgY29tYmluYXRpb24sIG1ha2UgYSBuZXcgbGFiZWwgZW50cnlcbiAgICAgICAgICAgIHNpemVzW3RleHRdID0ge1xuICAgICAgICAgICAgICAgIHRleHRfc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgcmVmOiAwIC8vICMgb2YgdGltZXMgdGhpcyB0ZXh0L3N0eWxlIGNvbWJvIGFwcGVhcnMgaW4gdGlsZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkcmF3LCB0ZXh0LCB0ZXh0X3NldHRpbmdzX2tleSwgbGF5b3V0XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIENvbXB1dGUgdGhlIGxhYmVsIHRleHQsIGRlZmF1bHQgaXMgdmFsdWUgb2YgZmVhdHVyZS5wcm9wZXJ0aWVzLm5hbWVcbiAgICAvLyAtIFN0cmluZyB2YWx1ZSBpbmRpY2F0ZXMgYSBmZWF0dXJlIHByb3BlcnR5IGxvb2stdXAsIGUuZy4gYHNob3J0X25hbWVgIG1lYW5zIHVzZSBmZWF0dXJlLnByb3BlcnRpZXMuc2hvcnRfbmFtZVxuICAgIC8vIC0gRnVuY3Rpb24gd2lsbCB1c2UgdGhlIHJldHVybiB2YWx1ZSBhcyB0aGUgbGFiZWwgdGV4dCAoZm9yIGN1c3RvbSBsYWJlbHMpXG4gICAgLy8gLSBBcnJheSAob2Ygc3RyaW5ncyBhbmQvb3IgZnVuY3Rpb25zKSBkZWZpbmVzIGEgbGlzdCBvZiBmYWxsYmFja3MsIGV2YWx1YXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHJ1bGVzLFxuICAgIC8vICAgd2l0aCB0aGUgZmlyc3Qgbm9uLW51bGwgdmFsdWUgdXNlZCBhcyB0aGUgbGFiZWwgdGV4dFxuICAgIC8vICAgZS5nLiBgW25hbWU6ZXMsIG5hbWU6ZW4sIG5hbWVdYCBwcmVmZXJzIFNwYW5pc2ggbmFtZXMsIGZvbGxvd2VkIGJ5IEVuZ2xpc2gsIGFuZCBsYXN0IHRoZSBkZWZhdWx0IGxvY2FsIG5hbWVcbiAgICBwYXJzZVRleHRTb3VyY2UgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgIGxldCBzb3VyY2UgPSBkcmF3LnRleHRfc291cmNlIHx8ICduYW1lJztcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2UubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtzXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGZlYXR1cmUucHJvcGVydGllc1tzb3VyY2Vbc11dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZVtzXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gc291cmNlW3NdKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGlmIHdlIGZvdW5kIGEgdGV4dCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGV4dCA9IGZlYXR1cmUucHJvcGVydGllc1tzb3VyY2VdO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRleHQgPSBzb3VyY2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcblxuICAgIHByZXBhcmVUZXh0TGFiZWxzICh0aWxlLCBjb2xsaXNpb25fZ3JvdXAsIHF1ZXVlKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRleHRzW3RpbGUua2V5XXx8e30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCBjYWxsIHRvIG1haW4gdGhyZWFkLCBhc2sgZm9yIHRleHQgcGl4ZWwgc2l6ZXNcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmNhbGNUZXh0U2l6ZXMnLCB0aGlzLnRleHRzW3RpbGUua2V5XSkudGhlbih0ZXh0cyA9PiB7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZSAke3RoaXMubmFtZX06IHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1jYWxjVGV4dFNpemVzKClgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGV4dHM7XG4gICAgICAgICAgICBpZiAoIXRleHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRleHRMYWJlbHModGlsZS5rZXksIHF1ZXVlKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzICh0aWxlLCBjb2xsaXNpb25fZ3JvdXAsIGxhYmVscykge1xuICAgICAgICBpZiAoIWxhYmVscykge1xuICAgICAgICAgICAgQ29sbGlzaW9uLmNvbGxpZGUoe30sIGNvbGxpc2lvbl9ncm91cCwgdGlsZS5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQ29sbGlzaW9uLmNvbGxpZGUobGFiZWxzLCBjb2xsaXNpb25fZ3JvdXAsIHRpbGUua2V5KS50aGVuKGxhYmVscyA9PiB7XG4gICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LWNvbGxpZGUoKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0cyA9IHRoaXMudGV4dHNbdGlsZS5rZXldO1xuICAgICAgICAgICAgdGhpcy5jdWxsVGV4dFN0eWxlcyh0ZXh0cywgbGFiZWxzKTtcblxuICAgICAgICAgICAgLy8gc2V0IGFsaWdubWVudHNcbiAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XSAmJiB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcbiAgICAgICAgICAgICAgICBpZiAoIXRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduID0gdGV4dF9pbmZvLmFsaWduIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gc2Vjb25kIGNhbGwgdG8gbWFpbiB0aHJlYWQsIGZvciByYXN0ZXJpemluZyB0aGUgc2V0IG9mIHRleHRzXG4gICAgICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0KycucmFzdGVyaXplVGV4dHMnLCB0aWxlLmtleSwgdGV4dHMpLnRoZW4oKHsgdGV4dHMsIHRleHR1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LXJhc3Rlcml6ZVRleHRzKClgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHVudXNlZCB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9ucyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByYXN0ZXJpemF0aW9uXG4gICAgY3VsbFRleHRTdHlsZXModGV4dHMsIGxhYmVscykge1xuICAgICAgICAvLyBDb3VudCBob3cgbWFueSB0aW1lcyBlYWNoIHRleHQvc3R5bGUgY29tYmluYXRpb24gaXMgdXNlZFxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICAgICAgICAgIHRleHRzW2xhYmVsLnRleHRfc2V0dGluZ3Nfa2V5XVtsYWJlbC50ZXh0XS5yZWYrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9ucyB0aGF0IGhhdmUgbm8gdmlzaWJsZSBsYWJlbHNcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dHNbc3R5bGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gbGFiZWxzIGZvciB0aGlzIHRleHRcbiAgICAgICAgICAgICAgICBpZiAodGV4dHNbc3R5bGVdW3RleHRdLnJlZiA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRleHRzW3N0eWxlXVt0ZXh0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgLy8gbm8gbGFiZWxzIGZvciB0aGlzIHN0eWxlXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGV4dHNbc3R5bGVdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGV4dHNbc3R5bGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIHRleHQgc3RyaW5nLFxuICAgIC8vIHdlcmUgaXQgdG8gYmUgcmVuZGVyZWQuIFRoaXMgaW5mbyBpcyB0aGVuIHVzZWQgdG8gcGVyZm9ybSBpbml0aWFsIGxhYmVsIGN1bGxpbmcsICpiZWZvcmUqXG4gICAgLy8gbGFiZWxzIGFyZSBhY3R1YWxseSByZW5kZXJlZC5cbiAgICBjYWxjVGV4dFNpemVzICh0ZXh0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMudGV4dFNpemVzKHRleHRzKTtcbiAgICB9LFxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBjcmVhdGUgYXRsYXMgb2YgbGFiZWxzIGZvciBhIHRpbGVcbiAgICByYXN0ZXJpemVUZXh0cyAodGlsZV9rZXksIHRleHRzKSB7XG4gICAgICAgIGxldCBjYW52YXMgPSBuZXcgQ2FudmFzVGV4dCgpO1xuICAgICAgICBjYW52YXMuY2xlYXJUZXhjb29yZENhY2hlKHRpbGVfa2V5KTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gY2FudmFzLnNldFRleHR1cmVUZXh0UG9zaXRpb25zKHRleHRzLCB0aGlzLm1heF90ZXh0dXJlX3NpemUsIHRpbGVfa2V5KTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0ZXh0IHN1bW1hcnkgZm9yIHRpbGUgJHt0aWxlX2tleX06IGZpdHMgaW4gJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4YCk7XG5cbiAgICAgICAgLy8gZml0cyBpbiBtYXggdGV4dHVyZSBzaXplP1xuICAgICAgICBpZiAodGV4dHVyZV9zaXplWzBdIDwgdGhpcy5tYXhfdGV4dHVyZV9zaXplICYmIHRleHR1cmVfc2l6ZVsxXSA8IHRoaXMubWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIGNhbnZhcyBzaXplICYgcmFzdGVyaXplIGFsbCB0aGUgdGV4dCBzdHJpbmdzIHdlIG5lZWRcbiAgICAgICAgICAgIGNhbnZhcy5yZXNpemUoLi4udGV4dHVyZV9zaXplKTtcbiAgICAgICAgICAgIGNhbnZhcy5yYXN0ZXJpemUodGV4dHMsIHRleHR1cmVfc2l6ZSwgdGlsZV9rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFtcbiAgICAgICAgICAgICAgICBgTGFiZWwgYXRsYXMgZm9yIHRpbGUgJHt0aWxlX2tleX0gaXMgJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4LCBgLFxuICAgICAgICAgICAgICAgIGBidXQgbWF4IEdMIHRleHR1cmUgc2l6ZSBpcyAke3RoaXMubWF4X3RleHR1cmVfc2l6ZX14JHt0aGlzLm1heF90ZXh0dXJlX3NpemV9cHhgXS5qb2luKCcnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGUgYSB0ZXh0dXJlXG4gICAgICAgIGxldCB0ID0gJ2xhYmVscy0nICsgdGlsZV9rZXkgKyAnLScgKyAodGV4dF90ZXh0dXJlX2lkKyspO1xuICAgICAgICBUZXh0dXJlLmNyZWF0ZSh0aGlzLmdsLCB0LCB7XG4gICAgICAgICAgICBlbGVtZW50OiBjYW52YXMuY2FudmFzLFxuICAgICAgICAgICAgZmlsdGVyaW5nOiAnbGluZWFyJyxcbiAgICAgICAgICAgIFVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgVGV4dHVyZS5yZXRhaW4odCk7XG5cbiAgICAgICAgcmV0dXJuIHsgdGV4dHMsIHRleHR1cmU6IHQgfTsgLy8gdGV4dHVyZSBpcyByZXR1cm5lZCBieSBuYW1lIChub3QgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIHByZXByb2Nlc3NUZXh0IChkcmF3KSB7XG4gICAgICAgIC8vIEZvbnQgc2V0dGluZ3MgYXJlIHJlcXVpcmVkXG4gICAgICAgIGlmICghZHJhdyB8fCAhZHJhdy5mb250IHx8IHR5cGVvZiBkcmF3LmZvbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb2xvcnNcbiAgICAgICAgZHJhdy5mb250LmZpbGwgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5maWxsKTtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UpIHtcbiAgICAgICAgICAgIGRyYXcuZm9udC5zdHJva2UuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zdHJva2UuY29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBmb250IGFuZCB0ZXh0IHN0cm9rZSBzaXplc1xuICAgICAgICBkcmF3LmZvbnQucHhfc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnNpemUgfHwgVGV4dFNldHRpbmdzLmRlZmF1bHRzLnNpemUsIENhbnZhc1RleHQuZm9udFBpeGVsU2l6ZSk7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2Uud2lkdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgZHJhdy5mb250LnN0cm9rZS53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgcGFyc2VGbG9hdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPZmZzZXQgKDJkIGFycmF5KVxuICAgICAgICBkcmF3Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vZmZzZXQsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgJiYgdi5tYXAocGFyc2VGbG9hdCkpIHx8IDApO1xuXG4gICAgICAgIC8vIEJ1ZmZlciAoMWQgdmFsdWUgb3Igb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuYnVmZmVyID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmJ1ZmZlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdiwgdl0pLm1hcChwYXJzZUZsb2F0KSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBlYXQgcnVsZXMgLSBmb3IgdGV4dCBsYWJlbHMsIGRlZmF1bHRzIHRvIHRpbGUgc2l6ZVxuICAgICAgICBkcmF3LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5yZXBlYXRfZGlzdGFuY2UgfHwgR2VvLnRpbGVfc2l6ZSwgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIEFkZGl0aW9uYWwgdGV4dC1zcGVjaWZpYyBsYXlvdXQgc2V0dGluZ3NcbiAgICBjb21wdXRlVGV4dExheW91dCAodGFyZ2V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlLCB0ZXh0LCB0ZXh0X3NldHRpbmdzKSB7XG4gICAgICAgIGxldCBsYXlvdXQgPSB0YXJnZXQgfHwge307XG5cbiAgICAgICAgLy8gY29tbW9uIHNldHRpbmdzIHcvcG9pbnRzXG4gICAgICAgIGxheW91dCA9IHRoaXMuY29tcHV0ZUxheW91dChsYXlvdXQsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIC8vIHRpbGUgYm91bmRhcnkgaGFuZGxpbmdcbiAgICAgICAgbGF5b3V0LmN1bGxfZnJvbV90aWxlID0gKGRyYXcuY3VsbF9mcm9tX3RpbGUgIT0gbnVsbCkgPyBkcmF3LmN1bGxfZnJvbV90aWxlIDogdHJ1ZTtcblxuICAgICAgICAvLyBzdGFuZGFsb25lIHRleHQgY2FuIG1vdmUgaW50byB0aWxlIGlmIHNwZWNpZmllZFxuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSAoZHJhdy5tb3ZlX2ludG9fdGlsZSAhPSBudWxsKSA/IGRyYXcubW92ZV9pbnRvX3RpbGUgOiB0cnVlO1xuXG4gICAgICAgIC8vIHJlcGVhdCBydWxlcyBpbmNsdWRlIHRoZSB0ZXh0XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwICs9ICcvJyArIHRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXggbnVtYmVyIG9mIHN1YmRpdmlzaW9ucyB0byB0cnlcbiAgICAgICAgbGF5b3V0LnN1YmRpdiA9IHRpbGUub3Zlcnpvb20yO1xuXG4gICAgICAgIGxheW91dC5hbGlnbiA9IGRyYXcuYWxpZ247XG5cbiAgICAgICAgLy8gdXNlZCB0byBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGxheW91dC5pdGFsaWMgPSAodGV4dF9zZXR0aW5ncy5zdHlsZSAhPT0gJ25vcm1hbCcpO1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5cbnZhciBUZXh0U2V0dGluZ3M7XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRTZXR0aW5ncyA9IHtcblxuICAgIC8vIEEga2V5IGZvciBncm91cGluZyBhbGwgbGFiZWxzIG9mIHRoZSBzYW1lIHRleHQgc3R5bGUgKGUuZy4gc2FtZSBDYW52YXMgc3RhdGUsIHRvIG1pbmltaXplIHN0YXRlIGNoYW5nZXMpXG4gICAga2V5IChzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc2V0dGluZ3Muc3R5bGUsXG4gICAgICAgICAgICBzZXR0aW5ncy53ZWlnaHQsXG4gICAgICAgICAgICBzZXR0aW5ncy5mYW1pbHksXG4gICAgICAgICAgICBzZXR0aW5ncy5weF9zaXplLFxuICAgICAgICAgICAgc2V0dGluZ3MuZmlsbCxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRleHRfd3JhcCxcbiAgICAgICAgICAgIHNldHRpbmdzLm1heF9saW5lcyxcbiAgICAgICAgICAgIHNldHRpbmdzLnN1cGVyc2FtcGxlLFxuICAgICAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvXG4gICAgICAgIF0uam9pbignLycpO1xuICAgIH0sXG5cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBzdHlsZTogJ25vcm1hbCcsXG4gICAgICAgIHdlaWdodDogbnVsbCxcbiAgICAgICAgc2l6ZTogJzEycHgnLFxuICAgICAgICBweF9zaXplOiAxMixcbiAgICAgICAgZmFtaWx5OiAnSGVsdmV0aWNhJyxcbiAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgdGV4dF93cmFwOiAxNSxcbiAgICAgICAgbWF4X2xpbmVzOiA1LFxuICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHN0cm9rZTogbnVsbCxcbiAgICAgICAgc3Ryb2tlX3dpZHRoOiAwXG4gICAgfSxcblxuICAgIGNvbXB1dGUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHN0eWxlID0ge307XG5cbiAgICAgICAgZHJhdy5mb250ID0gZHJhdy5mb250IHx8IHRoaXMuZGVmYXVsdHM7XG5cbiAgICAgICAgLy8gTGluZVN0cmluZyBsYWJlbHMgY2FuIGFydGljdWxhdGUgd2hpbGUgcG9pbnQgbGFiZWxzIGNhbm5vdC4gTmVlZGVkIGZvciBmdXR1cmUgdGV4dHVyZSBjb29yZGluYXRlIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgc3R5bGUuY2FuX2FydGljdWxhdGUgPSBkcmF3LmNhbl9hcnRpY3VsYXRlO1xuXG4gICAgICAgIC8vIFVzZSBmaWxsIGlmIHNwZWNpZmllZCwgb3IgZGVmYXVsdFxuICAgICAgICBzdHlsZS5maWxsID0gKGRyYXcuZm9udC5maWxsICYmIFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LmZpbGwsIGNvbnRleHQpKSkgfHwgdGhpcy5kZWZhdWx0cy5maWxsO1xuXG4gICAgICAgIC8vIEZvbnQgcHJvcGVydGllcyBhcmUgbW9kZWxlZCBhZnRlciBDU1MgbmFtZXM6XG4gICAgICAgIC8vIC0gZmFtaWx5OiBIZWx2ZXRpY2EsIEZ1dHVyYSwgZXRjLlxuICAgICAgICAvLyAtIHNpemU6IGluIHB0LCBweCwgb3IgZW1cbiAgICAgICAgLy8gLSBzdHlsZTogbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcbiAgICAgICAgLy8gLSB3ZWlnaHQ6IG5vcm1hbCwgYm9sZCwgZXRjLlxuICAgICAgICAvLyAtIHRyYW5zZm9ybTogY2FwaXRhbGl6ZSwgdXBwZXJjYXNlLCBsb3dlcmNhc2VcbiAgICAgICAgc3R5bGUuc3R5bGUgPSBkcmF3LmZvbnQuc3R5bGUgfHwgdGhpcy5kZWZhdWx0cy5zdHlsZTtcbiAgICAgICAgc3R5bGUud2VpZ2h0ID0gZHJhdy5mb250LndlaWdodCB8fCB0aGlzLmRlZmF1bHRzLndlaWdodDtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5mYW1pbHkpIHtcbiAgICAgICAgICAgIHN0eWxlLmZhbWlseSA9IGRyYXcuZm9udC5mYW1pbHk7XG4gICAgICAgICAgICBpZiAoc3R5bGUuZmFtaWx5ICE9PSB0aGlzLmRlZmF1bHRzLmZhbWlseSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmZhbWlseSArPSAnLCAnICsgdGhpcy5kZWZhdWx0cy5mYW1pbHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5mYW1pbHkgPSB0aGlzLmRlZmF1bHRzLmZhbWlseTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IGRyYXcuZm9udC50cmFuc2Zvcm07XG5cbiAgICAgICAgLy8gb3JpZ2luYWwgc2l6ZSAobm90IGN1cnJlbnRseSB1c2VkLCBidXQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcpXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LmZvbnQuc2l6ZSB8fCB0aGlzLmRlZmF1bHRzLnNpemU7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlZCBwaXhlbCBzaXplXG4gICAgICAgIHN0eWxlLnN1cGVyc2FtcGxlID0gZHJhdy5zdXBlcnNhbXBsZV90ZXh0ID8gMS41IDogMTsgLy8gb3B0aW9uYWxseSByZW5kZXIgdGV4dCBhdCAxNTAlIHRvIGltcHJvdmUgY2xhcml0eVxuICAgICAgICBzdHlsZS5weF9zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5weF9zaXplLCBjb250ZXh0KSAqIHN0eWxlLnN1cGVyc2FtcGxlO1xuXG4gICAgICAgIC8vIFVzZSBzdHJva2UgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2UuY29sb3IpIHtcbiAgICAgICAgICAgIHN0eWxlLnN0cm9rZSA9IFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS5jb2xvciwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2UpO1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlX3dpZHRoID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5zdHJva2Uud2lkdGgsIGNvbnRleHQpIHx8IHRoaXMuZGVmYXVsdHMuc3Ryb2tlX3dpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUuZm9udF9jc3MgPSB0aGlzLmZvbnRDU1Moc3R5bGUpO1xuXG4gICAgICAgIC8vIFdvcmQgd3JhcCBhbmQgdGV4dCBhbGlnbm1lbnRcbiAgICAgICAgLy8gTm90IGEgZm9udCBwcm9wZXJ0aWVzLCBidXQgYWZmZWN0IGF0bGFzIG9mIHVuaXF1ZSB0ZXh0IHRleHR1cmVzXG4gICAgICAgIGxldCB0ZXh0X3dyYXAgPSBkcmF3LnRleHRfd3JhcDsgLy8gdXNlIGV4cGxpY2l0bHkgc2V0IHZhbHVlXG5cbiAgICAgICAgaWYgKHRleHRfd3JhcCA9PSBudWxsICYmIEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSAhPT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvLyBwb2ludCBsYWJlbHMgKGZvciBwb2ludCBhbmQgcG9seWdvbiBmZWF0dXJlcykgaGF2ZSB3b3JkIHdyYXAgb24gdy9kZWZhdWx0IG1heCBsZW5ndGgsXG4gICAgICAgICAgICAvLyBsaW5lIGxhYmVscyBkZWZhdWx0IG9mZlxuICAgICAgICAgICAgdGV4dF93cmFwID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldHRpbmcgdG8gJ3RydWUnIGNhdXNlcyBkZWZhdWx0IHdyYXAgdmFsdWUgdG8gYmUgdXNlZFxuICAgICAgICBpZiAodGV4dF93cmFwID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0aGlzLmRlZmF1bHRzLnRleHRfd3JhcDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG5cbiAgICAgICAgLy8gbWF4X2xpbmVzIHNldHRpbmcgdG8gdHJ1bmNhdGUgdmVyeSBsb25nIGxhYmVscyB3aXRoIGFuIGVsbGlwc2lzXG4gICAgICAgIHN0eWxlLm1heF9saW5lcyA9IGRyYXcubWF4X2xpbmVzIHx8IHRoaXMuZGVmYXVsdHMubWF4X2xpbmVzO1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgQ1NTLXN0eWxlIGZvbnQgc3RyaW5nICh0byBzZXQgQ2FudmFzIGRyYXcgc3RhdGUpXG4gICAgZm9udENTUyAoeyBzdHlsZSwgd2VpZ2h0LCBweF9zaXplLCBmYW1pbHkgfSkge1xuICAgICAgICByZXR1cm4gW3N0eWxlLCB3ZWlnaHQsIHB4X3NpemUgKyAncHgnLCBmYW1pbHldXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geCkgLy8gcmVtb3ZlIG51bGwgcHJvcHNcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5pbXBvcnQge21hdDQsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZSB7XG5cbiAgICAvKipcbiAgICAgICAgVGlsZVxuICAgICAgICBAY29uc3RydWN0b3JcbiAgICAgICAgUmVxdWlyZWQgcHJvcGVydGllczpcbiAgICAgICAgY29vcmRzOiBvYmplY3Qgd2l0aCB7eCwgeSwgen0gcHJvcGVydGllcyBpZGVudGlmeWluZyB0aWxlIGNvb3JkaW5hdGUgbG9jYXRpb25cbiAgICAgICAgd29ya2VyOiB3ZWIgd29ya2VyIHRvIGhhbmRsZSB0aWxlIGNvbnN0cnVjdGlvblxuICAgICovXG4gICAgY29uc3RydWN0b3IoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSwgd29ya2VyLCB2aWV3IH0pIHtcbiAgICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnByb3hpZWRfYXMgPSBudWxsO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IHt9O1xuXG4gICAgICAgIHRoaXMuY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCB0aGlzLnNvdXJjZS5tYXhfem9vbSk7XG4gICAgICAgIHRoaXMuc3R5bGVfem9vbSA9IHN0eWxlX3pvb207IC8vIHpvb20gbGV2ZWwgdG8gYmUgdXNlZCBmb3Igc3R5bGluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tID0gTWF0aC5tYXgodGhpcy5zdHlsZV96b29tIC0gdGhpcy5jb29yZHMueiwgMCk7IC8vIG51bWJlciBvZiBsZXZlbHMgb2Ygb3Zlcnpvb21pbmdcbiAgICAgICAgdGhpcy5vdmVyem9vbTIgPSBNYXRoLnBvdygyLCB0aGlzLm92ZXJ6b29tKTtcbiAgICAgICAgdGhpcy5rZXkgPSBUaWxlLmtleSh0aGlzLmNvb3JkcywgdGhpcy5zb3VyY2UsIHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWluID0gR2VvLm1ldGVyc0ZvclRpbGUodGhpcy5jb29yZHMpO1xuICAgICAgICB0aGlzLm1heCA9IEdlby5tZXRlcnNGb3JUaWxlKHt4OiB0aGlzLmNvb3Jkcy54ICsgMSwgeTogdGhpcy5jb29yZHMueSArIDEsIHo6IHRoaXMuY29vcmRzLnogfSksXG4gICAgICAgIHRoaXMuc3BhbiA9IHsgeDogKHRoaXMubWF4LnggLSB0aGlzLm1pbi54KSwgeTogKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KSB9O1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHsgc3c6IHsgeDogdGhpcy5taW4ueCwgeTogdGhpcy5tYXgueSB9LCBuZTogeyB4OiB0aGlzLm1heC54LCB5OiB0aGlzLm1pbi55IH0gfTtcbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IDA7XG5cbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbF9zcSA9IHRoaXMubWV0ZXJzX3Blcl9waXhlbCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdGhpcy51bml0c19wZXJfcGl4ZWwgPSBHZW8udW5pdHNfcGVyX3BpeGVsIC8gdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuICAgICAgICB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSA9IEdlby51bml0c1Blck1ldGVyKHRoaXMuY29vcmRzLnopICogdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuXG4gICAgICAgIHRoaXMubWVzaGVzID0ge307IC8vIHJlbmRlcmFibGUgVkJPIG1lc2hlcyBrZXllZCBieSBzdHlsZVxuICAgICAgICB0aGlzLnRleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHRoYXQgdGhlIHRpbGUgb3ducyAobGFiZWxzLCBldGMuKVxuICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHJldGFpbmVkIGJ5IHRoZSB0aWxlIGluIHRoZSBwcmV2aW91cyBidWlsZCBnZW5lcmF0aW9uXG4gICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107IC8vIG1lc2hlcyB0aGF0IGhhdmUgYmVlbiBidWlsdCBzbyBmYXIgaW4gY3VycmVudCBidWlsZCBnZW5lcmF0aW9uXG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZShzcGVjKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmQoYykge1xuICAgICAgICByZXR1cm4ge3g6IGMueCwgeTogYy55LCB6OiBjLnosIGtleTogVGlsZS5jb29yZEtleShjKX07XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkS2V5KHt4LCB5LCB6fSkge1xuICAgICAgICByZXR1cm4geCArICcvJyArIHkgKyAnLycgKyB6O1xuICAgIH1cblxuICAgIHN0YXRpYyBrZXkgKGNvb3Jkcywgc291cmNlLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKGNvb3Jkcywgc291cmNlLm1heF96b29tKTtcbiAgICAgICAgaWYgKGNvb3Jkcy55IDwgMCB8fCBjb29yZHMueSA+PSAoMSA8PCBjb29yZHMueikgfHwgY29vcmRzLnogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGN1bGwgdGlsZXMgb3V0IG9mIHJhbmdlICh4IHdpbGwgd3JhcClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3NvdXJjZS5uYW1lLCBzdHlsZV96b29tLCBjb29yZHMueCwgY29vcmRzLnksIGNvb3Jkcy56XS5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHosIGtleX0sIHpvb20pIHtcbiAgICAgICAgaWYgKHogIT09IHpvb20pIHtcbiAgICAgICAgICAgIGxldCB6c2NhbGUgPSBNYXRoLnBvdygyLCB6IC0gem9vbSk7XG4gICAgICAgICAgICB4ID0gTWF0aC5mbG9vcih4IC8genNjYWxlKTtcbiAgICAgICAgICAgIHkgPSBNYXRoLmZsb29yKHkgLyB6c2NhbGUpO1xuICAgICAgICAgICAgeiA9IHpvb207XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZVdpdGhNYXhab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pIHtcbiAgICAgICAgaWYgKG1heF96b29tICE9PSB1bmRlZmluZWQgJiYgeiA+IG1heF96b29tKSB7XG4gICAgICAgICAgICByZXR1cm4gVGlsZS5jb29yZGluYXRlQXRab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkKHt4LCB5LCB6fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoaWxkcmVuRm9yQ29vcmRpbmF0ZSh7eCwgeSwgeiwga2V5fSkge1xuICAgICAgICBpZiAoIVRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgeCAqPSAyO1xuICAgICAgICAgICAgeSAqPSAyO1xuICAgICAgICAgICAgVGlsZS5jb29yZF9jaGlsZHJlbltrZXldID0gW1xuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHksICAgICAgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHksICAgICAgen0pLFxuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHk6IHkrMSwgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHk6IHkrMSwgen0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV07XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGRlc2NlbmRhbnQpIHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQueiA+IHBhcmVudC56KSB7XG4gICAgICAgICAgICBsZXQge3gsIHl9ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGRlc2NlbmRhbnQsIHBhcmVudC56KTtcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50LnggPT09IHggJiYgcGFyZW50LnkgPT09IHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGEgc2V0IG9mIHRpbGUgaW5zdGFuY2VzICh3aGljaCBhbHJlYWR5IGhhdmUgYSBkaXN0YW5jZSBmcm9tIGNlbnRlciB0aWxlIGNvbXB1dGVkKVxuICAgIHN0YXRpYyBzb3J0KHRpbGVzKSB7XG4gICAgICAgIHJldHVybiB0aWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBhLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgbGV0IGJkID0gYi5jZW50ZXJfZGlzdDtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRpbGVcbiAgICBmcmVlUmVzb3VyY2VzICgpIHtcbiAgICAgICAgZm9yIChsZXQgbSBpbiB0aGlzLm1lc2hlcykge1xuICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzaGVzID0ge307XG5cbiAgICAgICAgdGhpcy50ZXh0dXJlcy5mb3JFYWNoKHQgPT4gVGV4dHVyZS5yZWxlYXNlKHQpKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMuZm9yRWFjaCh0ID0+IFRleHR1cmUucmVsZWFzZSh0KSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYucmVtb3ZlVGlsZScsIHRoaXMua2V5KTtcbiAgICAgICAgdGhpcy5mcmVlUmVzb3VyY2VzKCk7XG4gICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBidWlsZEFzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLm5hbWUsXG4gICAgICAgICAgICBjb29yZHM6IHRoaXMuY29vcmRzLFxuICAgICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICB1bml0c19wZXJfcGl4ZWw6IHRoaXMudW5pdHNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbF9zcTogdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxLFxuICAgICAgICAgICAgdW5pdHNfcGVyX21ldGVyX292ZXJ6b29tOiB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSxcbiAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMuc3R5bGVfem9vbSxcbiAgICAgICAgICAgIG92ZXJ6b29tOiB0aGlzLm92ZXJ6b29tLFxuICAgICAgICAgICAgb3Zlcnpvb20yOiB0aGlzLm92ZXJ6b29tMixcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd29ya2VyTWVzc2FnZSAoLi4ubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VyLCAuLi5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICBidWlsZChnZW5lcmF0aW9uLCB7IGZhZGVfaW4gPSB0cnVlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSBmYWRlX2luO1xuICAgICAgICBpZiAoIXRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYuYnVpbGRUaWxlJywgeyB0aWxlOiB0aGlzLmJ1aWxkQXNNZXNzYWdlKCkgfSkuY2F0Y2goZSA9PiB7IHRocm93IGU7IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBDYWxsZWQgb24gd29ya2VyIHRvIGNhbmNlbCBsb2FkaW5nXG4gICAgICAgIFN0YXRpYyBtZXRob2QgYmVjYXVzZSB0aGUgd29ya2VyIG9ubHkgaGFzIG9iamVjdCByZXByZXNlbnRhdGlvbnMgb2YgdGlsZSBkYXRhLCB0aGVyZSBpcyBub1xuICAgICAgICB0aWxlIGluc3RhbmNlIGNyZWF0ZWQgeWV0LlxuICAgICovXG4gICAgc3RhdGljIGNhbmNlbCh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aWxlLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhICYmIHRpbGUuc291cmNlX2RhdGEucmVxdWVzdF9pZCkge1xuICAgICAgICAgICAgICAgIFV0aWxzLmNhbmNlbFJlcXVlc3QodGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0X2lkKTsgLy8gY2FuY2VsIHBlbmRpbmcgdGlsZSBuZXR3b3JrIHJlcXVlc3RcbiAgICAgICAgICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLnJlcXVlc3RfaWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBnZW9tZXRyeSBmb3IgdGlsZSAtIGNhbGxlZCBieSB3ZWIgd29ya2VyXG4gICAgLy8gUmV0dXJucyBhIHNldCBvZiB0aWxlIGtleXMgdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgbWFpbiB0aHJlYWQgKHNvIHRoYXQgd2UgY2FuIG1pbmltaXplIGRhdGEgZXhjaGFuZ2UgYmV0d2VlbiB3b3JrZXIgYW5kIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBidWlsZEdlb21ldHJ5ICh0aWxlLCB7IHNjZW5lX2lkLCBsYXllcnMsIHN0eWxlcywgZ2xvYmFsIH0pIHtcbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKTtcbiAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcyA9IDA7XG5cbiAgICAgICAgbGV0IGRhdGEgPSB0aWxlLnNvdXJjZV9kYXRhO1xuXG4gICAgICAgIENvbGxpc2lvbi5zdGFydFRpbGUodGlsZS5rZXkpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgZWFjaCB0b3AtbGV2ZWwgbGF5ZXJcbiAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IGxheWVyc1tsYXllcl9uYW1lXTtcbiAgICAgICAgICAgIC8vIFNraXAgbGF5ZXJzIHdpdGggbm8gZGF0YSBzb3VyY2UgZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsYXllciB8fCAhbGF5ZXIuY29uZmlnLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgTGF5ZXIgJHtsYXllcl9uYW1lfSB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2VvbWV0cnkgZGF0YSBzb3VyY2UgYW5kIHdpbGwgbm90IGJlIHJlbmRlcmVkLmApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTb3VyY2UgbmFtZXMgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgIGlmIChsYXllci5jb25maWcuZGF0YS5zb3VyY2UgIT09IHRpbGUuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCBkYXRhIGZvciBvbmUgb3IgbW9yZSBsYXllcnMgZnJvbSBzb3VyY2VcbiAgICAgICAgICAgIGxldCBzb3VyY2VfbGF5ZXJzID0gVGlsZS5nZXREYXRhRm9yU291cmNlKGRhdGEsIGxheWVyLmNvbmZpZy5kYXRhLCBsYXllcl9uYW1lKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGZlYXR1cmVzIGluIGxheWVyXG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2VfbGF5ZXJzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllciA9IHNvdXJjZV9sYXllcnNbc107XG4gICAgICAgICAgICAgICAgbGV0IGdlb20gPSBzb3VyY2VfbGF5ZXIuZ2VvbTtcbiAgICAgICAgICAgICAgICBpZiAoIWdlb20pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZiA9IDA7IGYgPCBnZW9tLmZlYXR1cmVzLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmZWF0dXJlID0gZ2VvbS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZmVhdHVyZXMgdy9vIGdlb21ldHJ5ICh2YWxpZCBHZW9KU09OKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBTdHlsZVBhcnNlci5nZXRGZWF0dXJlUGFyc2VDb250ZXh0KGZlYXR1cmUsIHRpbGUsIGdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud2luZGluZyA9IHRpbGUuZGVmYXVsdF93aW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNvdXJjZSA9IHRpbGUuc291cmNlOyAgICAgICAgLy8gYWRkIGRhdGEgc291cmNlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sYXllciA9IHNvdXJjZV9sYXllci5sYXllcjsgIC8vIGFkZCBkYXRhIHNvdXJjZSBsYXllciBuYW1lXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGRyYXcgZ3JvdXBzIGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRyYXdfZ3JvdXBzID0gbGF5ZXIuYnVpbGREcmF3R3JvdXBzKGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciBkcmF3IGdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBkcmF3X2dyb3Vwc1tncm91cF9uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JvdXAudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZV9uYW1lID0gZ3JvdXAuc3R5bGUgfHwgZ3JvdXBfbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1tzdHlsZV9uYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZSAnJHtzdHlsZV9uYW1lfScgbm90IGZvdW5kLCBza2lwcGluZyBsYXllciAnJHtsYXllcl9uYW1lfSc6YCwgZ3JvdXAsIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVycyA9IGdyb3VwLmxheWVyczsgIC8vIGFkZCBtYXRjaGluZyBkcmF3IGxheWVyc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hZGRGZWF0dXJlKGZlYXR1cmUsIGdyb3VwLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZGVidWcuZmVhdHVyZXMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKSAtIHRpbGUuZGVidWcucmVuZGVyaW5nO1xuXG4gICAgICAgIC8vIFNlbmQgc3R5bGVzIGJhY2sgdG8gbWFpbiB0aHJlYWQgYXMgdGhleSBmaW5pc2ggYnVpbGRpbmcsIGluIHR3byBncm91cHM6IGNvbGxpc2lvbiB2cy4gbm9uLWNvbGxpc2lvblxuICAgICAgICBsZXQgdGlsZV9zdHlsZXMgPSB0aGlzLnN0eWxlc0ZvclRpbGUodGlsZS5rZXksIHN0eWxlcykubWFwKHMgPT4gc3R5bGVzW3NdKTtcbiAgICAgICAgVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gc3R5bGUuY29sbGlzaW9uID8gJ2NvbGxpc2lvbicgOiAnbm9uLWNvbGxpc2lvbicpO1xuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiBzdHlsZS5uYW1lKTsgLy8gY2FsbCBmb3IgZWFjaCBzdHlsZVxuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiAnc3R5bGVzJyk7IC8vIGFsbCBzdHlsZXMgaW4gc2luZ2xlIGNhbGwgKHByZXZpb3VzIGJlaGF2aW9yKVxuICAgIH1cblxuICAgIHN0YXRpYyBzdHlsZXNGb3JUaWxlICh0aWxlX2tleSwgc3R5bGVzKSB7XG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzIGluIHN0eWxlcykge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1tzXS5oYXNEYXRhRm9yVGlsZSh0aWxlX2tleSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlX3N0eWxlcy5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlX3N0eWxlcztcbiAgICB9XG5cbiAgICAvLyBTZW5kIGdyb3VwcyBvZiBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgKGFzIHRoZXkgZmluaXNoIGJ1aWxkaW5nKSxcbiAgICAvLyBncm91cGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgIHN0YXRpYyBzZW5kU3R5bGVHcm91cHModGlsZSwgc3R5bGVzLCB7IHNjZW5lX2lkIH0sIGdyb3VwX2J5KSB7XG4gICAgICAgIC8vIEdyb3VwIHN0eWxlc1xuICAgICAgICBsZXQgZ3JvdXBzID0ge307XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdyb3VwX25hbWUgPSBncm91cF9ieShzKTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3Vwc1tncm91cF9uYW1lXSB8fCBbXTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXS5wdXNoKHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7IHN0YXJ0OiB0cnVlIH07XG4gICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cF9uYW1lXTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGdyb3VwLm1hcChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZS5lbmREYXRhKHRpbGUpLnRoZW4oc3R5bGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhW3N0eWxlLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogc3R5bGVfZGF0YS52ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzOiBzdHlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHN0eWxlX2RhdGEudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzOiBzdHlsZV9kYXRhLnRleHR1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYEZpbmlzaGVkIHN0eWxlIGdyb3VwICcke2dyb3VwX25hbWV9JyBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGdyb3VwIGFuZCBjaGVjayBpZiBhbGwgZ3JvdXBzIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5ldmVyeShnID0+IGdyb3Vwc1tnXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgbWVzaGVzIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHsgdGlsZTogVGlsZS5zbGljZSh0aWxlLCBbJ21lc2hfZGF0YSddKSwgcHJvZ3Jlc3MgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9OyAvLyByZXNldCBzbyBlYWNoIGdyb3VwIHNlbmRzIHNlcGFyYXRlIHNldCBvZiBzdHlsZSBtZXNoZXNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBidWlsZCwgcmV0dXJuIGVtcHR5IHRpbGUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgVGlsZU1hbmFnZXJfJHtzY2VuZV9pZH0uYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUpLCBwcm9ncmVzczogeyBzdGFydDogdHJ1ZSwgZG9uZTogdHJ1ZSB9IH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBSZXRyaWV2ZXMgZ2VvbWV0cnkgZnJvbSBhIHRpbGUgYWNjb3JkaW5nIHRvIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvblxuICAgICAgICBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aDpcbiAgICAgICAgICAgIGxheWVyOiBzb3VyY2UgbGF5ZXIgbmFtZVxuICAgICAgICAgICAgZ2VvbTogR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvblxuICAgICovXG4gICAgc3RhdGljIGdldERhdGFGb3JTb3VyY2UgKHNvdXJjZV9kYXRhLCBzb3VyY2VfY29uZmlnLCBkZWZhdWx0X2xheWVyID0gbnVsbCkge1xuICAgICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgICAgaWYgKHNvdXJjZV9jb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHNvdXJjZSBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGlmICghc291cmNlX2NvbmZpZy5sYXllciAmJiBzb3VyY2VfZGF0YS5sYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHJlcXVlc3RlZCBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIGRlZmF1bHRfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBkZWZhdWx0X2xheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbZGVmYXVsdF9sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IG5hbWUsIHVzZSBpdFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZV9jb25maWcubGF5ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXllcjogc291cmNlX2NvbmZpZy5sYXllcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW3NvdXJjZV9jb25maWcubGF5ZXJdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBsYXllcnMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCBjb21iaW5lIHRoZW1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlX2NvbmZpZy5sYXllcikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfY29uZmlnLmxheWVyLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXSAmJiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nXG4gICAgICAgZm9yIGEgc2luZ2xlIHRpbGUuXG4gICAgKi9cbiAgICBidWlsZE1lc2hlcyhzdHlsZXMsIHByb2dyZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1Z1xuICAgICAgICB0aGlzLmRlYnVnLmdlb21ldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgVkJPc1xuICAgICAgICBsZXQgbWVzaGVzID0ge30sIHRleHR1cmVzID0gW107IC8vIG5ldyBkYXRhIHRvIGJlIGFkZGVkIHRvIHRpbGVcbiAgICAgICAgbGV0IG1lc2hfZGF0YSA9IHRoaXMubWVzaF9kYXRhO1xuICAgICAgICBpZiAobWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIG1lc2hfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2RhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgKz0gbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3R5bGVzW3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ291bGQgbm90IGNyZWF0ZSBtZXNoIGJlY2F1c2Ugc3R5bGUgJyR7c30nIG5vdCBmb3VuZCwgZm9yIHRpbGUgJHt0aGlzLmtleX0sIGFib3J0aW5nIHRpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc2hlc1tzXSA9IHN0eWxlc1tzXS5tYWtlTWVzaChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEsIG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMsIG1lc2hfZGF0YVtzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyArPSBtZXNoZXNbc10uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVzXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmFsaWQgZm9yIGEgc2luZ2xlIHRleHR1cmUgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIG11bHRpcGxlIHN0eWxlc1xuICAgICAgICAgICAgICAgIC8vIChlLmcuIHNhbWUgcmFzdGVyIHRleHR1cmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgc291cmNlcykuIFRoaXMgbWVhbnMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIG1heSBiZSBhZGRlZCB0byB0aGUgdGlsZSdzIHRleHR1cmUgbGlzdCBtb3JlIHRoYW4gb25jZSwgd2hpY2ggZW5zdXJlc1xuICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgcHJvcGVybHkgcmVsZWFzZWQgKHRvIG1hdGNoIGl0cyByZXRhaW4gY291bnQpLlxuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5tZXNoX2RhdGFbc10udGV4dHVyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5tZXNoX2RhdGE7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFja2luZyBmb3IgdGhpcyB0aWxlIGdlbmVyYXRpb25cbiAgICAgICAgaWYgKHByb2dyZXNzLnN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLm5ld19tZXNoX3N0eWxlcyA9IFtdOyAvLyBrZWVwIHRyYWNrIG9mIHdoaWNoIG1lc2hlcyB3ZXJlIGJ1aWx0IGFzIHBhcnQgb2YgY3VycmVudCBnZW5lcmF0aW9uXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gWy4uLnRoaXMudGV4dHVyZXNdOyAvLyBjb3B5IG9sZCBsaXN0IG9mIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgbWVzaGVzXG4gICAgICAgIGZvciAobGV0IG0gaW4gbWVzaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNoZXNbbV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7IC8vIGZyZWUgb2xkIG1lc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWVzaGVzW21dID0gbWVzaGVzW21dOyAvLyBzZXQgbmV3IG1lc2hcbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzLnB1c2gobSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgdGV4dHVyZXNcbiAgICAgICAgdGhpcy50ZXh0dXJlcy5wdXNoKC4uLnRleHR1cmVzKTtcblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgLy8gUmVsZWFzZSB1bi1yZXBsYWNlZCBtZXNoZXMgKGV4aXN0aW5nIGluIHByZXZpb3VzIGdlbmVyYXRpb24sIGJ1dCB3ZXJlbid0IGJ1aWx0IGZvciB0aGlzIG9uZSlcbiAgICAgICAgICAgIGZvciAobGV0IG0gaW4gdGhpcy5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXdfbWVzaF9zdHlsZXMuaW5kZXhPZihtKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107XG5cbiAgICAgICAgICAgIC8vIFJlbGVhc2Ugb2xkIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnLmdlb21fcmF0aW8gPSAodGhpcy5kZWJ1Zy5nZW9tZXRyaWVzIC8gdGhpcy5kZWJ1Zy5mZWF0dXJlcykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgIHRoaXMucHJpbnREZWJ1ZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcsIGJ1dCB0aWxlIGhhcyBzaW5jZSBiZWVuIGRpc2NhcmRlZFxuICAgICAgICBGcmVlcyByZXNvdXJjZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHRpbGUgb2JqZWN0LlxuICAgICAgICBTdGF0aWMgbWV0aG9kIGJlY2F1c2UgdGhlIHRpbGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMgKHRoZSB0aWxlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdvcmtlciBpcyBwYXNzZWQgaW5zdGVhZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgYWJvcnRCdWlsZCAodGlsZSkge1xuICAgICAgICAvLyBSZWxlYXNlcyBtZXNoZXNcbiAgICAgICAgaWYgKHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmVzID0gdGlsZS5tZXNoX2RhdGFbc10udGV4dHVyZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgcmVsZWFzaW5nIHRleHR1cmUgJHt0fSBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcmVsYXRpdmUgdG8gdmlld1xuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB0aGlzLmNvb3JkcztcbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgdGhpcy52aWV3LmNlbnRlci50aWxlLnopO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VudGVyX2Rpc3QgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGNvb3Jkcy54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gY29vcmRzLnkpO1xuICAgIH1cblxuICAgIC8vIFNldCBhcyBhIHByb3h5IHRpbGUgZm9yIGFub3RoZXIgdGlsZVxuICAgIHNldFByb3h5Rm9yICh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSB0aGlzLnByb3h5X2ZvciB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZm9yLnB1c2godGlsZSk7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMTsgLy8gZHJhdyBwcm94aWVzIGEgaGFsZi1sYXllciBiYWNrIChvcmRlciBpcyBzY2FsZWQgMnggdG8gYXZvaWQgaW50ZWdlciB0cnVuY2F0aW9uKVxuICAgICAgICAgICAgdGlsZS5wcm94aWVkX2FzID0gKHRpbGUuc3R5bGVfem9vbSA+IHRoaXMuc3R5bGVfem9vbSA/ICdjaGlsZCcgOiAncGFyZW50Jyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm94eSB0aWxlcyBvbmx5IG5lZWQgdG8gcmVuZGVyIGEgc3BlY2lmaWMgc3R5bGUgaWYgYW55IG9mIHRoZSB0aWxlcyB0aGV5IGFyZSBwcm94eWluZyAqZm9yKlxuICAgIC8vIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB0aGF0IHN0eWxlIHlldC4gSWYgYWxsIHByb3hpZWQgdGlsZXMgKmhhdmUqIGRhdGEgZm9yIHRoYXQgc3R5bGUsIHRoZW4gaXQnc1xuICAgIC8vIHNhZmUgdG8gaGlkZSB0aGUgcHJveHkgdGlsZSdzIHZlcnNpb24uXG4gICAgc2hvdWxkUHJveHlGb3JTdHlsZSAoc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByb3h5X2ZvciB8fCB0aGlzLnByb3h5X2Zvci5zb21lKHQgPT4gdC5tZXNoZXNbc3R5bGVdID09IG51bGwpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtb2RlbCBtYXRyaXggYW5kIHRpbGUgdW5pZm9ybXNcbiAgICBzZXR1cFByb2dyYW0gKHsgbW9kZWwsIG1vZGVsMzIgfSwgcHJvZ3JhbSkge1xuICAgICAgICAvLyBUaWxlIG9yaWdpblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzRmdicsICd1X3RpbGVfb3JpZ2luJywgW3RoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMuc3R5bGVfem9vbSwgdGhpcy5jb29yZHMuel0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGlsZV9wcm94eV9kZXB0aCcsIHRoaXMucHJveHlfZGVwdGgpO1xuXG4gICAgICAgIC8vIE1vZGVsIC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB3b3JsZCBzcGFjZSAobWV0ZXJzLCBhYnNvbHV0ZSBtZXJjYXRvciBwb3NpdGlvbilcbiAgICAgICAgbWF0NC5pZGVudGl0eShtb2RlbCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMubWluLngsIHRoaXMubWluLnksIDApKTtcbiAgICAgICAgbWF0NC5zY2FsZShtb2RlbCwgbW9kZWwsIHZlYzMuZnJvbVZhbHVlcyh0aGlzLnNwYW4ueCAvIEdlby50aWxlX3NjYWxlLCAtMSAqIHRoaXMuc3Bhbi55IC8gR2VvLnRpbGVfc2NhbGUsIDEpKTsgLy8gc2NhbGUgdGlsZSBsb2NhbCBjb29yZHMgdG8gbWV0ZXJzXG4gICAgICAgIG1hdDQuY29weShtb2RlbDMyLCBtb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWwnLCBtb2RlbDMyKTtcblxuICAgICAgICAvLyBGYWRlIGluIGxhYmVscyBhY2NvcmRpbmcgdG8gcHJveHkgc3RhdHVzLCBhdm9pZGluZyBcImZsaWNrZXJpbmdcIiB3aGVyZVxuICAgICAgICAvLyBsYWJlbHMgcXVpY2tseSBnbyBmcm9tIGludmlzaWJsZSBiYWNrIHRvIHZpc2libGVcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3RpbGVfZmFkZV9pbicsIHRoaXMuZmFkZV9pbiAmJiB0aGlzLnByb3hpZWRfYXMgIT09ICdjaGlsZCcpO1xuICAgIH1cblxuICAgIC8vIFNsaWNlIGEgc3Vic2V0IG9mIGtleXMgb3V0IG9mIGEgdGlsZVxuICAgIC8vIEluY2x1ZGVzIGEgbWluaW11bSBzZXQgb2YgcHJlLWRlZmluZWQga2V5cyBmb3IgbG9hZCBzdGF0ZSwgZGVidWcuIGV0Yy5cbiAgICAvLyBXZSB1c2UgdGhpcyB0byBzZW5kIGEgc3Vic2V0IG9mIHRoZSB0aWxlIGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkLCB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeSBkYXRhIHRyYW5zZmVyXG4gICAgLy8gKGUuZy4gdmVyeSBsYXJnZSBpdGVtcyBsaWtlIGZlYXR1cmUgZ2VvbWV0cnkgYXJlIG5vdCBuZWVkZWQgb24gdGhlIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBzbGljZSAodGlsZSwga2V5cykge1xuICAgICAgICBsZXQga2VlcCA9IFtcbiAgICAgICAgICAgICdrZXknLFxuICAgICAgICAgICAgJ2xvYWRpbmcnLFxuICAgICAgICAgICAgJ2xvYWRlZCcsXG4gICAgICAgICAgICAnZ2VuZXJhdGlvbicsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgJ2RlYnVnJ1xuICAgICAgICBdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAga2VlcC5wdXNoKC4uLmtleXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIHRpbGUgc3Vic2V0XG4gICAgICAgIHZhciB0aWxlX3N1YnNldCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBrPTA7IGsgPCBrZWVwLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZWVwW2tdO1xuICAgICAgICAgICAgdGlsZV9zdWJzZXRba2V5XSA9IHRpbGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aWxlX3N1YnNldDtcbiAgICB9XG5cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3RoZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdrZXknKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gb3RoZXJba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcmludERlYnVnICgpIHtcbiAgICAgICAgbG9nKCdkZWJ1ZycsIGBUaWxlOiBkZWJ1ZyBmb3IgJHt0aGlzLmtleX06IFsgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kZWJ1Zyl9IF1gKTtcbiAgICB9XG5cbn1cblxuVGlsZS5jb29yZF9jaGlsZHJlbiA9IHt9OyAvLyBvbmx5IGFsbG9jYXRlIGNoaWxkcmVuIGNvb3JkaW5hdGVzIG9uY2UgcGVyIGNvb3JkaW5hdGVcbiIsImltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgVGlsZVB5cmFtaWQgZnJvbSAnLi90aWxlX3B5cmFtaWQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yKHsgc2NlbmUsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5weXJhbWlkID0gbmV3IFRpbGVQeXJhbWlkKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gW107XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydUaWxlTWFuYWdlcicsIHRoaXMuc2NlbmUuaWRdLmpvaW4oJ18nKTtcbiAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHRpbGUuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICB9XG5cbiAgICBrZWVwVGlsZSh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldID0gdGlsZTtcbiAgICAgICAgdGhpcy5weXJhbWlkLmFkZFRpbGUodGlsZSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvcmdldFRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLnB5cmFtaWQucmVtb3ZlVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RvcChrZXkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHNpbmdsZSB0aWxlXG4gICAgcmVtb3ZlVGlsZShrZXkpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlIHVubG9hZCBmb3IgJHtrZXl9YCk7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvLyBSdW4gYSBmdW5jdGlvbiBvbiBlYWNoIHRpbGVcbiAgICBmb3JFYWNoVGlsZShmdW5jKSB7XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgZnVuYyh0aGlzLnRpbGVzW3RdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IHBhc3MgYSBmaWx0ZXIgY29uZGl0aW9uXG4gICAgcmVtb3ZlVGlsZXMoZmlsdGVyKSB7XG4gICAgICAgIGxldCByZW1vdmVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAoZmlsdGVyKHRpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgcmVtb3ZlX3RpbGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gcmVtb3ZlX3RpbGVzW3JdO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlc0ZvclZpZXcoKSB7XG4gICAgICAgIC8vIEZpbmQgdmlzaWJsZSB0aWxlcyBhbmQgbG9hZCBuZXcgb25lc1xuICAgICAgICBsZXQgcHJldl9jb29yZHMgPSBPYmplY3Qua2V5cyh0aGlzLnZpc2libGVfY29vcmRzKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICBsZXQgdGlsZV9jb29yZHMgPSB0aGlzLnZpZXcuZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGlsZV9jb29yZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHRpbGVfY29vcmRzW2NdO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZUNvb3JkaW5hdGUoY29vcmRzKTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHNbY29vcmRzLmtleV0gPSBjb29yZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB2aXNpYmxlIGNvb3JkcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRPRE86IG1vdmUgdG8gYSBuZXcgdmlldyBtYW5hZ2VyIG9iamVjdFxuICAgICAgICBsZXQgbmV3X2Nvb3JkcyA9IE9iamVjdC5rZXlzKHRoaXMudmlzaWJsZV9jb29yZHMpO1xuICAgICAgICBsZXQgY29vcmRzX2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHByZXZfY29vcmRzLmxlbmd0aCAhPT0gbmV3X2Nvb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByZXZfY29vcmRzLnNvcnQoKTtcbiAgICAgICAgICAgIG5ld19jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgaWYgKCFwcmV2X2Nvb3Jkcy5ldmVyeSgoYywgaSkgPT4gbmV3X2Nvb3Jkc1tpXSA9PT0gYykpIHtcbiAgICAgICAgICAgICAgICBjb29yZHNfY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlU3RhdGVzICgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgICAgIHRpbGUudXBkYXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9hZFF1ZXVlZENvb3JkaW5hdGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUHJveHlUaWxlcygpO1xuICAgICAgICB0aGlzLnZpZXcucHJ1bmVUaWxlc0ZvclZpZXcoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSZW5kZXJhYmxlVGlsZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdHlsZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQcm94eVRpbGVzICgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgcHJveGllc1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4gdGlsZS5zZXRQcm94eUZvcihudWxsKSk7XG5cbiAgICAgICAgbGV0IHByb3h5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSAmJiAhdGlsZS5idWlsdCAmJiB0aWxlLmNvb3Jkcy56ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnB5cmFtaWQuZ2V0QW5jZXN0b3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy5weXJhbWlkLmdldERlc2NlbmRhbnRzKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkZXNjZW5kYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHNbaV0uc2V0UHJveHlGb3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5KHRpbGUpIHtcbiAgICAgICAgdGlsZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aWxlLnN0eWxlX3pvb20gPT09IHRoaXMudmlldy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVfY29vcmRzW3RpbGUuY29vcmRzLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYnJ1dGUgZm9yY2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy52aXNpYmxlX2Nvb3Jkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGlsZS5pc0Rlc2NlbmRhbnQodGlsZS5jb29yZHMsIHRoaXMudmlzaWJsZV9jb29yZHNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZW4ndCB2aXNpYmxlLCBhbmQgZmxhZyByZW1haW5pbmcgdmlzaWJsZSBvbmVzIHRvIGJlIHVwZGF0ZWQgKGZvciBsb2FkaW5nLCBwcm94eSwgZXRjLilcbiAgICBwcnVuZVRvVmlzaWJsZVRpbGVzICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUaWxlcyh0aWxlID0+ICF0aWxlLnZpc2libGUpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVUaWxlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmFibGVfdGlsZXM7XG4gICAgfVxuXG4gICAgdXBkYXRlUmVuZGVyYWJsZVRpbGVzKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmIHRpbGUubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJhYmxlX3RpbGVzLnB1c2godGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICB9XG5cbiAgICBnZXRBY3RpdmVTdHlsZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfc3R5bGVzO1xuICAgIH1cblxuICAgIHVwZGF0ZUFjdGl2ZVN0eWxlcyAoKSB7XG4gICAgICAgIGxldCB0aWxlcyA9IHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICAgICAgbGV0IGFjdGl2ZSA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCB0aWxlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aWxlc1t0XTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRpbGUubWVzaGVzKS5mb3JFYWNoKHMgPT4gYWN0aXZlW3NdID0gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gT2JqZWN0LmtleXMoYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlX3N0eWxlcztcbiAgICB9XG5cbiAgICBpc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5zb21lKGsgPT4gdGhpcy50aWxlc1trXS52aXNpYmxlICYmICF0aGlzLnRpbGVzW2tdLmJ1aWx0KTtcbiAgICB9XG5cbiAgICAvLyBRdWV1ZSBhIHRpbGUgZm9yIGxvYWRcbiAgICBxdWV1ZUNvb3JkaW5hdGUoY29vcmRzKSB7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkc1t0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoXSA9IGNvb3JkcztcbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCBxdWV1ZWQgdGlsZXNcbiAgICBsb2FkUXVldWVkQ29vcmRpbmF0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IHF1ZXVlZCB0aWxlcyBmcm9tIGNlbnRlciB0aWxlXG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGEueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGEueSk7XG4gICAgICAgICAgICBsZXQgYmQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGIueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGIueSk7XG4gICAgICAgICAgICByZXR1cm4gKGJkID4gYWQgPyAtMSA6IChiZCA9PT0gYWQgPyAwIDogMSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLmZvckVhY2goY29vcmRzID0+IHRoaXMubG9hZENvb3JkaW5hdGUoY29vcmRzKSk7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHRpbGVzIHRvIGNvdmVyIGEgZ2l2ZW4gbG9naWNhbCB0aWxlIGNvb3JkaW5hdGVcbiAgICBsb2FkQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBub3QgYXQgY3VycmVudCBzY2VuZSB6b29tXG4gICAgICAgIGlmIChjb29yZHMueiAhPT0gdGhpcy52aWV3LmNlbnRlci50aWxlLnopIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBuZWNlc3NhcnkgdGlsZXMgZm9yIGVhY2ggc291cmNlXG4gICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zY2VuZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zY2VuZS5zb3VyY2VzW3NdO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBzb3VyY2Ugc2hvdWxkIGJ1aWxkIHRoaXMgdGlsZVxuICAgICAgICAgICAgaWYgKCFzb3VyY2UuYnVpbGRzX2dlb21ldHJ5X3RpbGVzIHx8ICFzb3VyY2UuaW5jbHVkZXNUaWxlKGNvb3JkcywgdGhpcy52aWV3LnRpbGVfem9vbSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGtleSA9IFRpbGUua2V5KGNvb3Jkcywgc291cmNlLCB0aGlzLnZpZXcudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmIChrZXkgJiYgIXRoaXMuaGFzVGlsZShrZXkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbGUgPSBUaWxlLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IHRoaXMuc2NlbmUuZ2V0V29ya2VyRm9yRGF0YVNvdXJjZShzb3VyY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aGlzLnZpZXcuc3R5bGVab29tKGNvb3Jkcy56KSxcbiAgICAgICAgICAgICAgICAgICAgdmlldzogdGhpcy52aWV3XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtlZXBUaWxlKHRpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRUaWxlKHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCBhbmQgYnVpbGQgYSBsaXN0IG9mIHRpbGVzXG4gICAgYnVpbGRUaWxlcyh0aWxlcykge1xuICAgICAgICBUaWxlLnNvcnQodGlsZXMpLmZvckVhY2godGlsZSA9PiB0aGlzLmJ1aWxkVGlsZSh0aWxlKSk7XG4gICAgICAgIHRoaXMuY2hlY2tCdWlsZFF1ZXVlKCk7XG4gICAgfVxuXG4gICAgYnVpbGRUaWxlKHRpbGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50aWxlQnVpbGRTdGFydCh0aWxlLmtleSk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgdGlsZS5idWlsZCh0aGlzLnNjZW5lLmdlbmVyYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIGEgd2ViIHdvcmtlciBjb21wbGV0ZXMgcHJvY2Vzc2luZyBmb3IgYSBzaW5nbGUgdGlsZSAoaW5pdGlhbCBsb2FkLCBvciByZWJ1aWxkKVxuICAgIGJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCh7IHRpbGUsIHByb2dyZXNzIH0pIHtcbiAgICAgICAgLy8gUmVtb3ZlZCB0aGlzIHRpbGUgZHVyaW5nIGxvYWQ/XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW3RpbGUua2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYGRpc2NhcmRlZCB0aWxlICR7dGlsZS5rZXl9IGluIFRpbGVNYW5hZ2VyLmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCBiZWNhdXNlIHByZXZpb3VzbHkgcmVtb3ZlZGApO1xuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbHQgd2l0aCBhbiBvdXRkYXRlZCBzY2VuZSBjb25maWd1cmF0aW9uP1xuICAgICAgICBlbHNlIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuc2NlbmUuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBkaXNjYXJkZWQgdGlsZSAke3RpbGUua2V5fSBpbiBUaWxlTWFuYWdlci5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQgYmVjYXVzZSBidWlsdCB3aXRoIGAgK1xuICAgICAgICAgICAgICAgIGBzY2VuZSBjb25maWcgZ2VuICR7dGlsZS5nZW5lcmF0aW9ufSwgY3VycmVudCAke3RoaXMuc2NlbmUuZ2VuZXJhdGlvbn1gKTtcbiAgICAgICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRpbGUgd2l0aCBwcm9wZXJ0aWVzIGZyb20gd29ya2VyXG4gICAgICAgICAgICBpZiAodGhpcy50aWxlc1t0aWxlLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1t0aWxlLmtleV0ubWVyZ2UodGlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5idWlsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpbGUuYnVpbGRNZXNoZXModGhpcy5zY2VuZS5zdHlsZXMsIHByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKHRpbGUua2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgZW5jb3VudGVycyBhbiBlcnJvciBidWlsZGluZyBhIHRpbGVcbiAgICBidWlsZFRpbGVFcnJvcih0aWxlKSB7XG4gICAgICAgIGxvZygnZXJyb3InLCBgRXJyb3IgYnVpbGRpbmcgdGlsZSAke3RpbGUua2V5fTpgLCB0aWxlLmVycm9yKTtcbiAgICAgICAgdGhpcy5mb3JnZXRUaWxlKHRpbGUua2V5KTtcbiAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICB0aWxlQnVpbGRTdGFydChrZXkpIHtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IHRoaXMuYnVpbGRpbmdfdGlsZXMgfHwge307XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XSA9IHRydWU7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RhcnQgZm9yICR7a2V5fTogJHtPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgdGlsZUJ1aWxkU3RvcChrZXkpIHtcbiAgICAgICAgLy8gRG9uZSBidWlsZGluZz9cbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmdfdGlsZXMpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RvcCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1aWxkaW5nX3RpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLmNoZWNrQnVpbGRRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3RhdHVzIG9mIHRpbGUgYnVpbGRpbmcgcXVldWUgYW5kIG5vdGlmeSBzY2VuZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICBjaGVja0J1aWxkUXVldWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWlsZGluZ190aWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS50aWxlTWFuYWdlckJ1aWxkRG9uZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VtIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSB7XG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdICE9IG51bGwgJiYgKHR5cGVvZiBmaWx0ZXIgIT09ICdmdW5jdGlvbicgfHwgZmlsdGVyKHRoaXMudGlsZXNbdF0pID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHN1bSArPSB0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgLy8gQXZlcmFnZSBvZiBhIGRlYnVnIHByb3BlcnR5IGFjcm9zcyB0aWxlc1xuICAgIGdldERlYnVnQXZlcmFnZShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSAvIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aDtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZVB5cmFtaWQge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29vcmRzID0ge307XG4gICAgICAgIHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGggPSAzOyAvLyAjIG9mIGxldmVscyB0byBzZWFyY2ggdXAvZG93biBmb3IgcHJveHkgdGlsZXNcbiAgICAgICAgdGhpcy5tYXhfcHJveHlfYW5jZXN0b3JfZGVwdGggPSA1O1xuICAgIH1cblxuICAgIHNvdXJjZVRpbGVzKGNvb3JkLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0gJiZcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0uc291cmNlcyAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzW3NvdXJjZS5uYW1lXSk7XG4gICAgfVxuXG4gICAgYWRkVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIEFkZCB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBsZXQgY29vcmQgPSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICBpZiAoIWNvb3JkKSB7XG4gICAgICAgICAgICBjb29yZCA9IHRoaXMuY29vcmRzW2tleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvb3JkLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvb3JkLnNvdXJjZXMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSkge1xuICAgICAgICAgICAgY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV1bdGlsZS5zdHlsZV96b29tXSA9IHRpbGU7XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCB1cCA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3Jkcywgeik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29vcmRzW3VwLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1t1cC5rZXldID0geyBkZXNjZW5kYW50czogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb29yZHNbdXAua2V5XS5kZXNjZW5kYW50cysrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyh0aWxlLmNvb3JkcywgdGlsZS5zb3VyY2UpO1xuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuXG4gICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2VfdGlsZXNbdGlsZS5zdHlsZV96b29tXTtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzb3VyY2VfdGlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzb3VyY2VcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1trZXldLmRlc2NlbmRhbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgd2hvbGUgY29vcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCBkb3duID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB6KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0gJiYgdGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cy0tO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMgPT09IDAgJiYgIXRoaXMuY29vcmRzW2Rvd24ua2V5XS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1tkb3duLmtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QW5jZXN0b3IgKHsgY29vcmRzLCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgPSAxKSB7XG4gICAgICAgIGlmIChsZXZlbCA+IHRoaXMubWF4X3Byb3h5X2FuY2VzdG9yX2RlcHRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID4gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjb29yZHMsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gLSAxOyB6ID49IHNvdXJjZS5tYXhfem9vbTsgei0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZV90aWxlc1t6XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgrK2xldmVsID4gdGhpcy5tYXhfcHJveHlfYW5jZXN0b3JfZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlX3pvb20gPSBzb3VyY2UubWF4X3pvb207XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlcyBhdCBuZXh0IHpvb20gdXBcbiAgICAgICAgc3R5bGVfem9vbS0tO1xuICAgICAgICBsZXQgcGFyZW50ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgY29vcmRzLnogLSAxKTtcbiAgICAgICAgbGV0IHBhcmVudF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMocGFyZW50LCBzb3VyY2UpO1xuICAgICAgICBpZiAocGFyZW50X3RpbGVzICYmIHBhcmVudF90aWxlc1tzdHlsZV96b29tXSAmJiBwYXJlbnRfdGlsZXNbc3R5bGVfem9vbV0ubG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50X3RpbGVzW3N0eWxlX3pvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpZG4ndCBmaW5kIGFuY2VzdG9yLCB0cnkgbmV4dCBsZXZlbFxuICAgICAgICBpZiAocGFyZW50LnogPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbmNlc3Rvcih7IGNvb3JkczogcGFyZW50LCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERlc2NlbmRhbnRzICh7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlIH0sIGxldmVsID0gMSkge1xuICAgICAgICBsZXQgZGVzY2VuZGFudHMgPSBbXTtcblxuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID49IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY29vcmRzLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzZWFyY2hfbWF4X3pvb20gPSBNYXRoLm1heChHZW8uZGVmYXVsdF92aWV3X21heF96b29tLCBzdHlsZV96b29tICsgdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gKyAxOyB6IDw9IHNlYXJjaF9tYXhfem9vbTsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChzb3VyY2VfdGlsZXNbel0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZXMgYXQgbmV4dCB6b29tIGRvd25cbiAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldICYmIHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgc3R5bGVfem9vbSsrO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBUaWxlLmNoaWxkcmVuRm9yQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2NdO1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY2hpbGQsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkX3RpbGVzICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgY2hpbGQsIHRyeSBuZXh0IGxldmVsXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPD0gdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCAmJiBjaGlsZC56IDw9IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKC4uLnRoaXMuZ2V0RGVzY2VuZGFudHMoeyBjb29yZHM6IGNoaWxkLCBzb3VyY2UsIHN0eWxlX3pvb20gfSwgbGV2ZWwgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGRyYXdzIGEgYmx1ZSByZWN0YW5nbGUgYm9yZGVyIGFyb3VuZCB0aGUgY29sbGlzaW9uIGJveCBvZiBhIGxhYmVsXG4gICAgZHJhd19sYWJlbF9jb2xsaXNpb25fYm94ZXM6IGZhbHNlLFxuICAgIC8vIGRyYXdzIGEgZ3JlZW4gcmVjdGFuZ2xlIGJvcmRlciB3aXRoaW4gdGhlIHRleHR1cmUgYm94IG9mIGEgbGFiZWxcbiAgICBkcmF3X2xhYmVsX3RleHR1cmVfYm94ZXM6IGZhbHNlLFxuICAgIC8vIHN1cHByZXNlcyBmYWRlLWluIG9mIGxhYmVsc1xuICAgIHN1cHByZXNzX2xhYmVsX2ZhZGVfaW46IGZhbHNlLFxuICAgIC8vIHN1cHByZXNzIGFuaW1hdG9uIG9mIGxhYmVsIHNuYXAgdG8gcGl4ZWwgZ3JpZFxuICAgIHN1cHByZXNzX2xhYmVsX3NuYXBfYW5pbWF0aW9uOiBmYWxzZVxufTtcbiIsIlxuXG5leHBvcnQgY2xhc3MgTWV0aG9kTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgICAgPSAnTWV0aG9kTm90SW1wbGVtZW50ZWQnO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnTWV0aG9kICcgKyBtZXRob2ROYW1lICsgJyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzJztcbiAgICB9XG59XG4iLCIvLyBQYXJ0aWFsIGltcG9ydCBvZiBnbC1tYXRyaXggdmlhIG1vZHVsYXJpemVkIHN0YWNrLWdsIGZvcmtzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFja2dsXG5cbi8vIHZlYzNcblxuLy8gU3Vic3RpdHV0ZSA2NC1iaXQgdmVyc2lvblxuLy8gV2UgbmVlZCB0aGUgZXh0cmEgcHJlY2lzaW9uIHdoZW4gbXVsdGlwbHlpbmcgbWF0cmljZXMgdy9tZXJjYXRvciBwcm9qZWN0ZWQgdmFsdWVzXG5jb25zdCB2ZWMzID0ge1xuICAgIGZyb21WYWx1ZXMgKHgsIHksIHopIHtcbiAgICAgICAgdmFyIG91dCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XG4gICAgICAgIG91dFswXSA9IHg7XG4gICAgICAgIG91dFsxXSA9IHk7XG4gICAgICAgIG91dFsyXSA9IHo7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufTtcblxuXG4vLyBtYXQzXG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQzX25vcm1hbEZyb21NYXQ0fSBmcm9tICdnbC1tYXQzL25vcm1hbC1mcm9tLW1hdDQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfaW52ZXJ0fSBmcm9tICdnbC1tYXQzL2ludmVydCc7XG5cbmNvbnN0IG1hdDMgPSB7XG4gICAgbm9ybWFsRnJvbU1hdDQ6IG1hdDNfbm9ybWFsRnJvbU1hdDQsXG4gICAgaW52ZXJ0OiBtYXQzX2ludmVydFxufTtcblxuXG4vLyBtYXQ0XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X211bHRpcGx5fSBmcm9tICdnbC1tYXQ0L211bHRpcGx5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3RyYW5zbGF0ZX0gZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfc2NhbGV9IGZyb20gJ2dsLW1hdDQvc2NhbGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfcGVyc3BlY3RpdmV9IGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbG9va0F0fSBmcm9tICdnbC1tYXQ0L2xvb2tBdCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9pZGVudGl0eX0gZnJvbSAnZ2wtbWF0NC9pZGVudGl0eSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9jb3B5fSBmcm9tICdnbC1tYXQ0L2NvcHknO1xuXG5jb25zdCBtYXQ0ID0ge1xuICAgIG11bHRpcGx5OiBtYXQ0X211bHRpcGx5LFxuICAgIHRyYW5zbGF0ZTogbWF0NF90cmFuc2xhdGUsXG4gICAgc2NhbGU6IG1hdDRfc2NhbGUsXG4gICAgcGVyc3BlY3RpdmU6IG1hdDRfcGVyc3BlY3RpdmUsXG4gICAgbG9va0F0OiBtYXQ0X2xvb2tBdCxcbiAgICBpZGVudGl0eTogbWF0NF9pZGVudGl0eSxcbiAgICBjb3B5OiBtYXQ0X2NvcHlcbn07XG5cblxuZXhwb3J0IHt2ZWMzLCBtYXQzLCBtYXQ0fTtcbiIsImltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcblxuY29uc3QgTEVWRUxTID0ge1xuICAgIHNpbGVudDogLTEsXG4gICAgZXJyb3I6IDAsXG4gICAgd2FybjogMSxcbiAgICBpbmZvOiAyLFxuICAgIGRlYnVnOiAzLFxuICAgIHRyYWNlOiA0XG59O1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbmZ1bmN0aW9uIG1ldGhvZEZvckxldmVsIChsZXZlbCkge1xuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICBtZXRob2RzW2xldmVsXSA9IG1ldGhvZHNbbGV2ZWxdIHx8IChjb25zb2xlW2xldmVsXSA/IGNvbnNvbGVbbGV2ZWxdIDogY29uc29sZS5sb2cpLmJpbmQoY29uc29sZSk7XG4gICAgICAgIHJldHVybiBtZXRob2RzW2xldmVsXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZyAobXNnX2xldmVsLCAuLi5tc2cpIHtcbiAgICBpZiAoTEVWRUxTW21zZ19sZXZlbF0gPD0gTEVWRUxTW2xvZy5sZXZlbF0pIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIC8vIFByb3h5IHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ19sb2dQcm94eScsIG1zZ19sZXZlbCwgLi4ubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsb2dnZXIgPSBtZXRob2RGb3JMZXZlbChtc2dfbGV2ZWwpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSB0byBjb25zb2xlIChvbiBtYWluIHRocmVhZClcbiAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgVGFuZ3JhbSAke3ZlcnNpb259IFske21zZ19sZXZlbH1dOiAke21zZ1swXX1gLCAuLi5tc2cuc2xpY2UoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sb2cubGV2ZWwgPSAnaW5mbyc7XG5sb2cud29ya2VycyA9IG51bGw7XG5cbmxvZy5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIGxvZy5sZXZlbCA9IGxldmVsO1xuXG4gICAgaWYgKFRocmVhZC5pc19tYWluICYmIEFycmF5LmlzQXJyYXkobG9nLndvcmtlcnMpKSB7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShsb2cud29ya2VycywgJ19sb2dTZXRMZXZlbFByb3h5JywgbGV2ZWwpO1xuICAgIH1cbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIGxvZy5zZXRXb3JrZXJzID0gZnVuY3Rpb24gKHdvcmtlcnMpIHtcbiAgICAgICAgbG9nLndvcmtlcnMgPSB3b3JrZXJzO1xuICAgIH07XG5cblxufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdfbG9nUHJveHknLCBsb2cpOyAgICAgICAgICAgICAgICAgICAvLyBwcm94eSBsb2cgbWVzc2FnZXMgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWRcbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dTZXRMZXZlbFByb3h5JywgbG9nLnNldExldmVsKTsgIC8vIHByb3h5IGxvZyBsZXZlbCBzZXR0aW5nIGZyb20gbWFpbiB0byB3b3JrZXIgdGhyZWFkXG4iLCIvKiBnbG9iYWwgTWVkaWFSZWNvcmRlciAqL1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge2NyZWF0ZU9iamVjdFVSTH0gZnJvbSAnLi91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVkaWFDYXB0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIHNldENhbnZhcyAoY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90LCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNjcmVlbnNob3QgZGF0YSB3aGVuIGF2YWlsYWJsZVxuICAgIHNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTsgLy8gb25seSBjYXB0dXJlIG9uZSBzY3JlZW5zaG90IGF0IGEgdGltZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2lsbCByZXNvbHZlIG9uY2UgcmVuZGVyaW5nIGlzIGNvbXBsZXRlIGFuZCByZW5kZXIgYnVmZmVyIGlzIGNhcHR1cmVkXG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGFmdGVyIHJlbmRlcmluZywgY2FwdHVyZXMgcmVuZGVyIGJ1ZmZlciBhbmQgcmVzb2x2ZXMgcHJvbWlzZSB3aXRoIHRoZSBpbWFnZSBkYXRhXG4gICAgY29tcGxldGVTY3JlZW5zaG90ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVfc2NyZWVuc2hvdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgZGF0YSBVUkwsIGNvbnZlcnQgdG8gYmxvYlxuICAgICAgICAgICAgLy8gU3RyaXAgaG9zdC9taW1ldHlwZS9ldGMuLCBjb252ZXJ0IGJhc2U2NCB0byBiaW5hcnkgd2l0aG91dCBVVEYtOCBtYW5nbGluZ1xuICAgICAgICAgICAgLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS91bmNvbmVkLzQzNzA4MjJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXRvYih1cmwuc2xpY2UoMjIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB3aXRoIHNjcmVlbnNob3QgZGF0YVxuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICdwbmcnIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXJ0cyBjYXB0dXJpbmcgYSB2aWRlbyBzdHJlYW0gZnJvbSB0aGUgY2FudmFzXG4gICAgc3RhcnRWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5NZWRpYVJlY29yZGVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmNhbnZhcyB8fCB0eXBlb2YgdGhpcy5jYW52YXMuY2FwdHVyZVN0cmVhbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgKENhbnZhcy5jYXB0dXJlU3RyZWFtIGFuZC9vciBNZWRpYVJlY29yZGVyIEFQSXMpIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlcicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgYWxyZWFkeSBpbiBwcm9ncmVzcywgY2FsbCBTY2VuZS5zdG9wVmlkZW9DYXB0dXJlKCkgZmlyc3QnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNhcHR1cmVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjYXAgPSB0aGlzLnZpZGVvX2NhcHR1cmUgPSB7fTtcbiAgICAgICAgICAgIGNhcC5jaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGNhcC5zdHJlYW0gPSB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtKCk7XG4gICAgICAgICAgICBjYXAub3B0aW9ucyA9IHsgbWltZVR5cGU6ICd2aWRlby93ZWJtJyB9OyAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIGZvcm1hdCBvcHRpb25zXG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihjYXAuc3RyZWFtLCBjYXAub3B0aW9ucyk7XG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICBjYXAuY2h1bmtzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RvcHBlZCByZWNvcmRpbmc/IENyZWF0ZSB0aGUgZmluYWwgY2FwdHVyZSBmaWxlIGJsb2JcbiAgICAgICAgICAgICAgICBpZiAoY2FwLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihjYXAuY2h1bmtzLCB7IHR5cGU6IGNhcC5vcHRpb25zLm1pbWVUeXBlIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIGFsbCBzdHJlYW0gdHJhY2tzLCBhbmQgc2V0IG9iamVjdHMgdG8gbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYWNrcyA9IGNhcC5zdHJlYW0uZ2V0VHJhY2tzKCkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCh0cmFjayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcC5zdHJlYW0ucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FwLnN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FwLnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICd3ZWJtJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FwLm1lZGlhX3JlY29yZGVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgJ1NjZW5lIHZpZGVvIGNhcHR1cmUgZmFpbGVkJywgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3RvcHMgY2FwdHVyaW5nIGEgdmlkZW8gc3RyZWFtIGZyb20gdGhlIGNhbnZhcywgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2aWRlbyB3aGVuIGF2YWlsYWJsZVxuICAgIHN0b3BWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ05vIHNjZW5lIHZpZGVvIGNhcHR1cmUgaW4gcHJvZ3Jlc3MsIGNhbGwgU2NlbmUuc3RhcnRWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gZmluYWwgc3RyZWFtIGlzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nXG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5tZWRpYV9yZWNvcmRlci5zdG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW9fY2FwdHVyZS5wcm9taXNlO1xuICAgIH1cblxufVxuIiwiLy8gRGVlcC9yZWN1cnNpdmUgbWVyZ2Ugb2Ygb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgaW50byBhIGRlc3RpbmF0aW9uIG9iamVjdFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzIChkZXN0LCAuLi5zb3VyY2VzKSB7XG4gICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICBsZXQgc291cmNlID0gc291cmNlc1tzXTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2UgdGhlIHNvdXJjZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCBpcyBhIGEgbm9uLW51bGwga2V5L3ZhbHVlIG9iamVjdFxuICAgICAgICAgICAgLy8gKGUuZy4gZG9uJ3QgbWVyZ2UgYXJyYXlzLCB0aG9zZSBhcmUgdHJlYXRlZCBhcyBzY2FsYXIgdmFsdWVzOyBudWxsIHZhbHVlcyB3aWxsIG92ZXJ3cml0ZS9lcmFzZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlKVxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3Rba2V5XSAhPT0gbnVsbCAmJiB0eXBlb2YgZGVzdFtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkZXN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyhkZXN0W2tleV0sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyh7fSwgdmFsdWUpOyAvLyBkZXN0aW5hdGlvbiBub3QgYW4gb2JqZWN0LCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlIGlmIHRoZSBzb3VyY2UgcHJvcGVydHkgaXM6IGEgc2NhbGFyIChudW1iZXIvc3RyaW5nKSxcbiAgICAgICAgICAgIC8vIGFuIGFycmF5LCBvciBhIG51bGwgdmFsdWVcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBzb3VyY2UgcHJvcGVydGllcyBhcmUgaWdub3JlZFxuICAgICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG4iLCJpbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9CQiB7XG5cbiAgICBjb25zdHJ1Y3RvciAoeCwgeSwgYSwgdywgaCkge1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IFt3LCBoXTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGE7XG4gICAgICAgIHRoaXMuY2VudHJvaWQgPSBbeCwgeV07XG4gICAgICAgIHRoaXMucXVhZCA9IFtdO1xuICAgICAgICB0aGlzLmF4ZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIG1vdmUgKHB4LCBweSkge1xuICAgIFx0dGhpcy5jZW50cm9pZCA9IFtweCwgcHldO1xuXG4gICAgXHR0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGdldEV4dGVudCAoKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IGFhYmIgPSBbaW5mLCBpbmYsIC1pbmYsIC1pbmZdO1xuXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgYWFiYlswXSA9IE1hdGgubWluKHRoaXMucXVhZFtpXVswXSwgYWFiYlswXSk7XG4gICAgICAgICAgICBhYWJiWzFdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzFdLCBhYWJiWzFdKTtcbiAgICAgICAgICAgIGFhYmJbMl0gPSBNYXRoLm1heCh0aGlzLnF1YWRbaV1bMF0sIGFhYmJbMl0pO1xuICAgICAgICAgICAgYWFiYlszXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVsxXSwgYWFiYlszXSk7XG4gICAgXHR9XG5cbiAgICBcdHJldHVybiBhYWJiO1xuICAgIH1cblxuICAgIHBlcnBBeGVzICgpIHtcbiAgICBcdHRoaXMuYXhlc1swXSA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnN1Yih0aGlzLnF1YWRbMl0sIHRoaXMucXVhZFszXSkpO1xuICAgIFx0dGhpcy5heGVzWzFdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzFdKSk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICBcdGxldCB4ID0gWyBNYXRoLmNvcyh0aGlzLmFuZ2xlKSwgTWF0aC5zaW4odGhpcy5hbmdsZSldO1xuICAgIFx0bGV0IHkgPSBbLU1hdGguc2luKHRoaXMuYW5nbGUpLCBNYXRoLmNvcyh0aGlzLmFuZ2xlKV07XG5cbiAgICBcdHggPSBWZWN0b3IubXVsdCh4LCB0aGlzLmRpbWVuc2lvblswXSAvIDIuMCk7XG4gICAgXHR5ID0gVmVjdG9yLm11bHQoeSwgdGhpcy5kaW1lbnNpb25bMV0gLyAyLjApO1xuXG4gICAgXHR0aGlzLnF1YWRbMF0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1sZWZ0XG4gICAgXHR0aGlzLnF1YWRbMV0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzJdID0gVmVjdG9yLmFkZChWZWN0b3IuYWRkKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzNdID0gVmVjdG9yLmFkZChWZWN0b3Iuc3ViKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1sZWZ0XG5cbiAgICBcdHRoaXMucGVycEF4ZXMoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvamVjdFRvQXhpcyAob2JiLCBheGlzKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IG1pbiA9IGluZjtcbiAgICBcdGxldCBtYXggPSAtaW5mO1xuXG4gICAgXHRsZXQgcXVhZCA9IG9iYi5xdWFkO1xuXG4gICAgXHQvLyBmb3IgZWFjaCBheGlzLCBwcm9qZWN0IG9iYiBxdWFkIHRvIGl0IGFuZCBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlc1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgIGxldCBkID0gIFZlY3Rvci5kb3QocXVhZFtpXSwgYXhpcyk7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGQpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBkKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIFttaW4sIG1heF07XG4gICAgfVxuXG4gICAgc3RhdGljIGF4aXNDb2xsaWRlIChvYmJfYSwgb2JiX2IsIGF4ZXMpIHtcbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgXHRcdGxldCBhX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYSwgYXhlc1tpXSk7XG4gICAgXHRcdGxldCBiX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYiwgYXhlc1tpXSk7XG5cbiAgICBcdFx0aWYgKGJfcHJvalswXSA+IGFfcHJvalsxXSB8fCBiX3Byb2pbMV0gPCBhX3Byb2pbMF0pIHtcbiAgICBcdFx0XHRyZXR1cm4gZmFsc2U7XG4gICAgXHRcdH1cbiAgICBcdH1cbiAgICBcdHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcnNlY3Qob2JiX2EsIG9iYl9iKSB7XG4gICAgXHRyZXR1cm4gT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2EuYXhlcykgJiYgT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2IuYXhlcyk7XG4gICAgfVxuXG59XG5cbiIsIi8vIFByb21pc2VzIHBvbHlmaWxsXG5pbXBvcnQgJ2NvcmUtanMvZXM2L3Byb21pc2UnO1xuXG4vLyBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZXNlIHNwZWNpZmljIGNhc2VzLlxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH0pKCk7XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3Vic2NyaWJlTWl4aW4gKHRhcmdldCkge1xuXG4gICAgbGV0IGxpc3RlbmVycyA9IFtdO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XG5cbiAgICAgICAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1bnN1YnNjcmliZUFsbCgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXIoZXZlbnQsIC4uLmRhdGEpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyW2V2ZW50XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJbZXZlbnRdKC4uLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBDYXVnaHQgZXhjZXB0aW9uIGluIGxpc3RlbmVyIGZvciBldmVudCAnJHtldmVudH0nOmAsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGFzU3Vic2NyaWJlcnNGb3IoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBoYXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyW2V2ZW50XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBoYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGhhcztcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbn1cbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbi8vIE1hcmsgdGhyZWFkIGFzIG1haW4gb3Igd29ya2VyXG5jb25zdCBUaHJlYWQgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgVGhyZWFkO1xuXG50cnkge1xuICAgIGlmICh3aW5kb3cuZG9jdW1lbnQgIT09IEhUTUxEb2N1bWVudCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgVGhyZWFkLmlzX3dvcmtlciA9IGZhbHNlO1xuICAgICAgICBUaHJlYWQuaXNfbWFpbiAgID0gdHJ1ZTtcbiAgICB9XG59XG5jYXRjaCAoZSkge1xuICAgIGlmIChzZWxmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgVGhyZWFkLmlzX3dvcmtlciA9IHRydWU7XG4gICAgICAgIFRocmVhZC5pc19tYWluICAgPSBmYWxzZTtcblxuICAgICAgICAvLyBQYXRjaCBmb3IgM3JkIHBhcnR5IGxpYnMgdGhhdCByZXF1aXJlIHRoZXNlIGdsb2JhbHMgdG8gYmUgcHJlc2VudC4gU3BlY2lmaWNhbGx5LCBGb250RmFjZU9ic2VydmVyLlxuICAgICAgICAvLyBCcml0dGxlIHNvbHV0aW9uIGJ1dCBhbGxvd3MgdGhhdCBsaWJyYXJ5IHRvIGxvYWQgb24gd29ya2VyIHRocmVhZHMuXG4gICAgICAgIHNlbGYud2luZG93ID0geyBkb2N1bWVudDoge30gfTtcbiAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYud2luZG93LmRvY3VtZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuXG4vLyBBZGQgYSBiYXNlIFVSTCBmb3Igc2NoZW1lbGVzcyBvciBwcm90b2NvbC1sZXNzIFVSTHNcbi8vIERlZmF1bHRzIHRvIGFkZGluZyBjdXJyZW50IHdpbmRvdyBwcm90b2NvbCBhbmQgYmFzZSwgb3IgYWRkcyBhIGN1c3RvbSBiYXNlIGlmIHNwZWNpZmllZFxuLy8gTWF5YmUgdXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzIGlmIG1vcmUgcm9idXN0IGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gYWRkQmFzZVVSTCAodXJsLCBiYXNlKSB7XG4gICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNjaGVtZWxlc3MsIGFkZCBwcm90b2NvbFxuICAgIGlmICh1cmwuc3Vic3RyKDAsIDIpID09PSAnLy8nKSB7XG4gICAgICAgIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArIHVybDtcbiAgICB9XG4gICAgLy8gTm8gaHR0cChzKSBvciBkYXRhLCBhZGQgYmFzZVxuICAgIGVsc2UgaWYgKHVybC5zZWFyY2goL14oaHR0cHxodHRwc3xkYXRhfGJsb2IpOi8pIDwgMCkge1xuICAgICAgICB2YXIgcmVsYXRpdmUgPSAodXJsWzBdICE9PSAnLycpO1xuICAgICAgICB2YXIgYmFzZV9pbmZvO1xuICAgICAgICBpZiAoYmFzZSkge1xuICAgICAgICAgICAgYmFzZV9pbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOyAvLyB1c2UgYSB0ZW1wb3JhcnkgZWxlbWVudCB0byBwYXJzZSBVUkxcbiAgICAgICAgICAgIGJhc2VfaW5mby5ocmVmID0gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VfaW5mbyA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xuICAgICAgICAgICAgbGV0IHBhdGggPSBwYXRoRm9yVVJMKGJhc2VfaW5mby5ocmVmKTtcbiAgICAgICAgICAgIHVybCA9IHBhdGggKyB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBFYXN5IHdheVxuICAgICAgICAgICAgaWYgKGJhc2VfaW5mby5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICB1cmwgPSBiYXNlX2luZm8ub3JpZ2luICsgJy8nICsgdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFyZCB3YXkgKElFMTEpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luID0gdXJsLm1hdGNoKC9eKChodHRwfGh0dHBzfGRhdGF8YmxvYik6XFwvXFwvW15cXC9dKlxcLykvKTtcbiAgICAgICAgICAgICAgICBvcmlnaW4gPSAob3JpZ2luICYmIG9yaWdpbi5sZW5ndGggPiAxKSA/IG9yaWdpblswXSA6ICcnO1xuICAgICAgICAgICAgICAgIHVybCA9IG9yaWdpbiArIHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZvclVSTCAodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIHVybC5zZWFyY2goL14oZGF0YXxibG9iKTovKSA9PT0gLTEpIHtcbiAgICAgICAgbGV0IHFzID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICAgICAgaWYgKHFzID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgcXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhhc2ggPSB1cmwuaW5kZXhPZignIycpO1xuICAgICAgICBpZiAoaGFzaCA+IC0xKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyKDAsIGhhc2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVybC5zdWJzdHIoMCwgdXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKSB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaW9uRm9yVVJMICh1cmwpIHtcbiAgICB1cmwgPSB1cmwuc3BsaXQoJy8nKS5wb3AoKTtcbiAgICBsZXQgbGFzdF9kb3QgPSB1cmwubGFzdEluZGV4T2YoJy4nKTtcbiAgICBpZiAobGFzdF9kb3QgPiAtMSkge1xuICAgICAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhsYXN0X2RvdCArIDEpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsYXRpdmVVUkwgKHVybCkge1xuICAgIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAhKHVybC5zZWFyY2goL14oaHR0cHxodHRwc3xkYXRhfGJsb2IpOi8pID4gLTEgfHwgdXJsLnN1YnN0cigwLCAyKSA9PT0gJy8vJyk7XG59XG5cbi8vIFJlc29sdmVzICcuLycgYW5kICcuLi8nIGNvbXBvbmVudHMgZnJvbSByZWxhdGl2ZSBwYXRoLCB0byBnZXQgYSBcImZsYXR0ZW5lZFwiIHBhdGhcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuUmVsYXRpdmVVUkwgKHVybCkge1xuICAgIGxldCBkaXJzID0gKHVybCB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICBmb3IgKGxldCBkID0gMTsgZCA8IGRpcnMubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgaWYgKGRpcnNbZF0gPT09ICcuJykge1xuICAgICAgICAgICAgZGlycy5zcGxpY2UoZCwgMSk7XG4gICAgICAgICAgICBkLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlyc1tkXSA9PT0gJy4uJykge1xuICAgICAgICAgICAgZCA9IGQgKyAwO1xuICAgICAgICAgICAgZGlycy5zcGxpY2UoZC0xLCAyKTtcbiAgICAgICAgICAgIGQtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlycy5qb2luKCcvJyk7XG59XG5cbi8vIEFkZCBhIHNldCBvZiBxdWVyeSBzdHJpbmcgcGFyYW1zIHRvIGEgVVJMXG4vLyBwYXJhbXM6IGhhc2ggb2Yga2V5L3ZhbHVlIHBhaXJzIG9mIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzXG5leHBvcnQgZnVuY3Rpb24gYWRkUGFyYW1zVG9VUkwgKHVybCwgcGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMgfHwgT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICB2YXIgcXNfaW5kZXggPSB1cmwuaW5kZXhPZignPycpO1xuICAgIHZhciBoYXNoX2luZGV4ID0gdXJsLmluZGV4T2YoJyMnKTtcblxuICAgIC8vIFNhdmUgYW5kIHRyaW0gaGFzaFxuICAgIHZhciBoYXNoID0gJyc7XG4gICAgaWYgKGhhc2hfaW5kZXggPiAtMSkge1xuICAgICAgICBoYXNoID0gdXJsLnNsaWNlKGhhc2hfaW5kZXgpO1xuICAgICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaF9pbmRleCk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgcXVlcnkgc3RyaW5nXG4gICAgaWYgKHFzX2luZGV4ID09PSAtMSkge1xuICAgICAgICBxc19pbmRleCA9IHVybC5sZW5ndGg7XG4gICAgICAgIHVybCArPSAnPyc7XG4gICAgfVxuICAgIHFzX2luZGV4Kys7IC8vIGFkdmFuY2VkIHBhc3QgJz8nXG5cbiAgICAvLyBCdWlsZCBxdWVyeSBzdHJpbmcgcGFyYW1zXG4gICAgdmFyIHVybF9wYXJhbXMgPSAnJztcbiAgICBmb3IgKHZhciBwIGluIHBhcmFtcykge1xuICAgICAgICB1cmxfcGFyYW1zICs9IGAke3B9PSR7cGFyYW1zW3BdfSZgO1xuICAgIH1cblxuICAgIC8vIEluc2VydCBuZXcgcXVlcnkgc3RyaW5nIHBhcmFtcyBhbmQgcmVzdG9yZSBoYXNoXG4gICAgLy8gTk9URTogZG9lc24ndCByZXBsYWNlIGFueSB2YWx1ZXMgYWxyZWFkeSBwcmVzZW50IG9uIHF1ZXJ5IHN0cmluZywganVzdCBpbnNlcnRzIGR1cGUgdmFsdWVzXG4gICAgdXJsID0gdXJsLnNsaWNlKDAsIHFzX2luZGV4KSArIHVybF9wYXJhbXMgKyB1cmwuc2xpY2UocXNfaW5kZXgpICsgaGFzaDtcblxuICAgIHJldHVybiB1cmw7XG59XG5cbi8vIFBvbHlmaWxsIChmb3IgU2FmYXJpIGNvbXBhdGliaWxpdHkpXG5sZXQgX2NyZWF0ZU9iamVjdFVSTDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwgKHVybCkge1xuICAgIGlmIChfY3JlYXRlT2JqZWN0VVJMID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX2NyZWF0ZU9iamVjdFVSTCA9ICh3aW5kb3cuVVJMICYmIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKSB8fCAod2luZG93LndlYmtpdFVSTCAmJiB3aW5kb3cud2Via2l0VVJMLmNyZWF0ZU9iamVjdFVSTCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfY3JlYXRlT2JqZWN0VVJMICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfY3JlYXRlT2JqZWN0VVJMID0gbnVsbDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCAob3IgdmVuZG9yIHByZWZpeCkgbm90IGZvdW5kLCB1bmFibGUgdG8gY3JlYXRlIGxvY2FsIGJsb2IgVVJMc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF9jcmVhdGVPYmplY3RVUkwpIHtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVPYmplY3RVUkwodXJsKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuXG4vLyBHZXQgVVJMIHRoYXQgdGhlIGN1cnJlbnQgc2NyaXB0IHdhcyBsb2FkZWQgZnJvbVxuLy8gSWYgY3VycmVudFNjcmlwdCBpcyBub3QgYXZhaWxhYmxlLCBsb29wcyB0aHJvdWdoIDxzY3JpcHQ+IGVsZW1lbnRzIHNlYXJjaGluZyBmb3IgYSBsaXN0IG9mIHByb3ZpZGVkIHBhdGhzXG4vLyBlLmcuIGZpbmRDdXJyZW50VVJMKCd0YW5ncmFtLmRlYnVnLmpzJywgJ3RhbmdyYW0ubWluLmpzJyk7XG5leHBvcnQgZnVuY3Rpb24gZmluZEN1cnJlbnRVUkwgKC4uLnBhdGhzKSB7XG4gICAgLy8gRmluZCBjdXJyZW50bHkgZXhlY3V0aW5nIHNjcmlwdFxuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0O1xuICAgIGlmIChzY3JpcHQpIHtcbiAgICAgICAgcmV0dXJuIHNjcmlwdC5zcmM7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF0aHMpKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIG9uIGxvb3BpbmcgdGhyb3VnaCA8c2NyaXB0PiBlbGVtZW50cyBpZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG4gICAgICAgIGZvciAodmFyIHM9MDsgcyA8IHNjcmlwdHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHBhdGhzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcmlwdHNbc10uc3JjLmluZGV4T2YocGF0aHNbcF0pID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0c1tzXS5zcmM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy8gTWlzY2VsbGFuZW91cyB1dGlsaXRpZXNcbi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbnZhciBVdGlscztcbmV4cG9ydCBkZWZhdWx0IFV0aWxzID0ge307XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ1V0aWxzJywgVXRpbHMpO1xuXG4vLyBCYXNpYyBTYWZhcmkgZGV0ZWN0aW9uXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc5NDQ0NjAvZGV0ZWN0LXNhZmFyaS1icm93c2VyXG5VdGlscy5pc1NhZmFyaSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cbi8vIEJhc2ljIElFMTEgb3IgRWRnZSBkZXRlY3Rpb25cblV0aWxzLmlzTWljcm9zb2Z0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKFRyaWRlbnRcXC83LjB8RWRnZVsgL10oXFxkK1tcXC5cXGRdKykpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cblV0aWxzLl9yZXF1ZXN0cyA9IHt9OyAgICAgICAvLyBYSFIgcmVxdWVzdHMgb24gY3VycmVudCB0aHJlYWRcblV0aWxzLl9wcm94eV9yZXF1ZXN0cyA9IHt9OyAvLyBYSFIgcmVxdWVzdHMgcHJveGllZCB0byBtYWluIHRocmVhZFxuXG4vLyBgcmVxdWVzdF9rZXlgIGlzIGEgdXNlci1wcm92aWRlZCBrZXkgdGhhdCBjYW4gYmUgbGF0ZXIgdXNlZCB0byBjYW5jZWwgdGhlIHJlcXVlc3RcblV0aWxzLmlvID0gZnVuY3Rpb24gKHVybCwgdGltZW91dCA9IDYwMDAwLCByZXNwb25zZVR5cGUgPSAndGV4dCcsIG1ldGhvZCA9ICdHRVQnLCBoZWFkZXJzID0ge30sIHJlcXVlc3Rfa2V5ID0gbnVsbCwgcHJveHkgPSBmYWxzZSkge1xuICAgIGlmIChUaHJlYWQuaXNfd29ya2VyICYmIFV0aWxzLmlzTWljcm9zb2Z0KCkpIHtcbiAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJRTExIGFuZCBFZGdlIHdpbGwgaGFuZyB3ZWIgd29ya2VycyB3aGVuIHBlcmZvcm1pbmcgWEhSIHJlcXVlc3RzXG4gICAgICAgIC8vIFRoZXNlIHJlcXVlc3RzIGNhbiBiZSBwcm94aWVkIHRocm91Z2ggdGhlIG1haW4gdGhyZWFkXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzk1NDU4NjYvXG4gICAgICAgIGxvZygnZGVidWcnLCAnUHJveHlpbmcgcmVxdWVzdCBmb3IgVVJMIHRvIHdvcmtlcicsIHVybCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3Rfa2V5KSB7XG4gICAgICAgICAgICBVdGlscy5fcHJveHlfcmVxdWVzdHNbcmVxdWVzdF9rZXldID0gdHJ1ZTsgLy8gbWFyayBhcyBwcm94aWVkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVXRpbHMuaW8nLCB1cmwsIHRpbWVvdXQsIHJlc3BvbnNlVHlwZSwgbWV0aG9kLCBoZWFkZXJzLCByZXF1ZXN0X2tleSwgdHJ1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXF1ZXN0LnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7XG4gICAgICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoWyd0ZXh0JywgJ2pzb24nXS5pbmRleE9mKHJlcXVlc3QucmVzcG9uc2VUeXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1JlcXVlc3QgZXJyb3Igd2l0aCBhIHN0YXR1cyBvZiAnICsgcmVxdWVzdC5zdGF0dXNUZXh0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldnQpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1RoZXJlIHdhcyBhIG5ldHdvcmsgZXJyb3InICsgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0Lm9udGltZW91dCA9IChldnQpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ3RpbWVvdXQgJysgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdF9rZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgVXRpbHMuX3JlcXVlc3RzW3JlcXVlc3Rfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3h5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyhyZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0X2tleSkge1xuICAgICAgICAgICAgVXRpbHMuX3JlcXVlc3RzW3JlcXVlc3Rfa2V5XSA9IHJlcXVlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59O1xuXG4vLyDDh2FuY2VsIGEgcGVuZGluZyBuZXR3b3JrIHJlcXVlc3QgYnkgdXNlci1wcm92aWRlZCByZXF1ZXN0IGtleVxuVXRpbHMuY2FuY2VsUmVxdWVzdCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvLyBDaGVjayBmb3IgYSByZXF1ZXN0IHRoYXQgd2FzIHByb3hpZWQgdG8gdGhlIG1haW4gdGhyZWFkXG4gICAgaWYgKFRocmVhZC5pc193b3JrZXIgJiYgVXRpbHMuX3Byb3h5X3JlcXVlc3RzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVXRpbHMuY2FuY2VsUmVxdWVzdCcsIGtleSk7IC8vIGZvcndhcmQgdG8gbWFpbiB0aHJlYWRcbiAgICB9XG5cbiAgICBsZXQgcmVxID0gVXRpbHMuX3JlcXVlc3RzW2tleV07XG4gICAgaWYgKHJlcSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYENhbmNlbGxpbmcgbmV0d29yayByZXF1ZXN0IGtleSAnJHtrZXl9J2ApO1xuICAgICAgICBVdGlscy5fcmVxdWVzdHNba2V5XS5hYm9ydCgpO1xuICAgICAgICBkZWxldGUgVXRpbHMuX3JlcXVlc3RzW2tleV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsb2coJ3RyYWNlJywgYENvdWxkIG5vdCBmaW5kIG5ldHdvcmsgcmVxdWVzdCBrZXkgJyR7a2V5fSdgKTtcbiAgICB9XG59O1xuXG4vLyBOZWVkZWQgZm9yIG9sZGVyIGJyb3dzZXJzIHRoYXQgc3RpbGwgc3VwcG9ydCBXZWJHTCAoU2FmYXJpIDYgZXRjLilcblV0aWxzLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID1cbiAgICAgICAgICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIDEwMDAgLzYwKTtcbiAgICAgICAgICAgIH07XG4gICAgfVxufTtcblxuLy8gU3RyaW5naWZ5IGFuIG9iamVjdCBpbnRvIEpTT04sIGJ1dCBjb252ZXJ0IGZ1bmN0aW9ucyB0byBzdHJpbmdzXG5VdGlscy5zZXJpYWxpemVXaXRoRnVuY3Rpb25zID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrLCB2KSB7XG4gICAgICAgIC8vIENvbnZlcnQgZnVuY3Rpb25zIHRvIHN0cmluZ3NcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59O1xuXG4vLyBSZWN1cnNpdmVseSBwYXJzZSBhbiBvYmplY3QsIGF0dGVtcHRpbmcgdG8gY29udmVydCBzdHJpbmcgcHJvcGVydGllcyB0aGF0IGxvb2sgbGlrZSBmdW5jdGlvbnMgYmFjayBpbnRvIGZ1bmN0aW9uc1xuVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zID0gZnVuY3Rpb24ob2JqLCB3cmFwKSB7XG4gICAgLy8gQ29udmVydCBzdHJpbmdcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqID0gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihvYmosIHdyYXApO1xuICAgIH1cbiAgICAvLyBMb29wIHRocm91Z2ggb2JqZWN0IHByb3BlcnRpZXNcbiAgICBlbHNlIGlmIChvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgb2JqW3BdID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKG9ialtwXSwgd3JhcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIENvbnZlcnQgc3RyaW5nIGJhY2sgaW50byBhIGZ1bmN0aW9uXG5VdGlscy5zdHJpbmdUb0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsLCB3cmFwKSB7XG4gICAgLy8gUGFyc2UgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCBib2R5XG4gICAgbGV0IGZtYXRjaCA9XG4gICAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgdmFsLm1hdGNoKC9eXFxzKmZ1bmN0aW9uW14oXSpcXCgoW14pXSopXFwpXFxzKj9cXHsoW1xcc1xcU10qKVxcfSQvbSk7XG5cbiAgICBpZiAoZm1hdGNoICYmIGZtYXRjaC5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgc3JjID0gZm1hdGNoWzJdO1xuICAgICAgICAgICAgbGV0IGFyZ3MgPSBmbWF0Y2hbMV0ubGVuZ3RoID4gMCAmJiBmbWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBhcmdzID0gYXJncy5sZW5ndGggPiAwID8gYXJncyA6IFsnY29udGV4dCddOyAvLyBkZWZhdWx0IHRvIHNpbmdsZSAnY29udGV4dCcgYXJndW1lbnRcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3cmFwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbiguLi5hcmdzLCB3cmFwKHNyYykpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oLi4uYXJncywgc3JjKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGZhbGwtYmFjayB0byBvcmlnaW5hbCB2YWx1ZSBpZiBwYXJzaW5nIGZhaWxlZFxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gRGVmYXVsdCB0byBhbGxvd2luZyBoaWdoIHBpeGVsIGRlbnNpdHlcbi8vIFJldHVybnMgdHJ1ZSBpZiBkaXNwbGF5IGRlbnNpdHkgY2hhbmdlZFxuVXRpbHMudXNlX2hpZ2hfZGVuc2l0eV9kaXNwbGF5ID0gdHJ1ZTtcblV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHByZXYgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gKFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgfHwgMTtcbiAgICByZXR1cm4gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICE9PSBwcmV2O1xufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xufVxuXG4vLyBVc2VkIGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBwb3dlci1vZi0yIGFuZCBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuLy8gVmlhOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyMjQ3L3dlYmdsLXdhaXQtZm9yLXRleHR1cmUtdG8tbG9hZFxuVXRpbHMuaXNQb3dlck9mMiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmICh2YWx1ZSAtIDEpKSA9PT0gMDtcbn07XG5cbi8vIEludGVycG9sYXRlICd4JyBhbG9uZyBhIHNlcmllcyBvZiBjb250cm9sIHBvaW50c1xuLy8gJ3BvaW50cycgaXMgYW4gYXJyYXkgb2YgY29udHJvbCBwb2ludHMgaW4gdGhlIGZvcm0gW3gsIHldXG4vL1xuLy8gRXhhbXBsZTpcbi8vICAgICBDb250cm9sIHBvaW50czpcbi8vICAgICAgICAgWzAsIDVdOiAgd2hlbiB4PTAsIHk9NVxuLy8gICAgICAgICBbNCwgMTBdOiB3aGVuIHg9NCwgeT0xMFxuLy9cbi8vICAgICBVdGlscy5pbnRlcnBvbGF0ZSgyLCBbWzAsIDVdLCBbNCwgMTBdXSk7XG4vLyAgICAgLT4gY29tcHV0ZXMgeD0yLCBoYWxmd2F5IGJldHdlZW4geD0wIGFuZCB4PTQ6ICgxMCAtIDUpIC8gMiArNVxuLy8gICAgIC0+IHJldHVybnMgNy41XG4vL1xuLy8gVE9ETzogYWRkIG90aGVyIGludGVycG9sYXRpb24gbWV0aG9kcyBiZXNpZGVzIGxpbmVhclxuLy9cblV0aWxzLmludGVycG9sYXRlID0gZnVuY3Rpb24oeCwgcG9pbnRzLCB0cmFuc2Zvcm0pIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgcmVzZW1ibGUgYSBsaXN0IG9mIGNvbnRyb2wgcG9pbnRzLCBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSB8fCAhQXJyYXkuaXNBcnJheShwb2ludHNbMF0pKSB7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuXG4gICAgdmFyIHgxLCB4MiwgZCwgeSwgeTEsIHkyO1xuXG4gICAgLy8gTWluIGJvdW5kc1xuICAgIGlmICh4IDw9IHBvaW50c1swXVswXSkge1xuICAgICAgICB5ID0gcG9pbnRzWzBdWzFdO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgeSA9IHRyYW5zZm9ybSh5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXggYm91bmRzXG4gICAgZWxzZSBpZiAoeCA+PSBwb2ludHNbcG9pbnRzLmxlbmd0aC0xXVswXSkge1xuICAgICAgICB5ID0gcG9pbnRzW3BvaW50cy5sZW5ndGgtMV1bMV07XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB5ID0gdHJhbnNmb3JtKHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZpbmQgd2hpY2ggY29udHJvbCBwb2ludHMgeCBpcyBiZXR3ZWVuXG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGk9MDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh4ID49IHBvaW50c1tpXVswXSAmJiB4IDwgcG9pbnRzW2krMV1bMF0pIHtcbiAgICAgICAgICAgICAgICAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAgICAgIHgxID0gcG9pbnRzW2ldWzBdO1xuICAgICAgICAgICAgICAgIHgyID0gcG9pbnRzW2krMV1bMF07XG5cbiAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwb2ludHNbaV1bMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0wOyBjIDwgcG9pbnRzW2ldWzFdLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gdHJhbnNmb3JtKHBvaW50c1tpXVsxXVtjXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB0cmFuc2Zvcm0ocG9pbnRzW2krMV1bMV1bY10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB5MiAtIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbY10gPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBwb2ludHNbaSsxXVsxXVtjXSAtIHBvaW50c1tpXVsxXVtjXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5W2NdID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgcG9pbnRzW2ldWzFdW2NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSB2YWx1ZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB0cmFuc2Zvcm0ocG9pbnRzW2ldWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gdHJhbnNmb3JtKHBvaW50c1tpKzFdWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB5MiAtIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHkxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHBvaW50c1tpKzFdWzFdIC0gcG9pbnRzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHBvaW50c1tpXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geTtcbn07XG5cblV0aWxzLnRvQ1NTQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICBpZiAoY29sb3JbM10gPT09IDEpIHsgLy8gZnVsbCBvcGFjaXR5XG4gICAgICAgIHJldHVybiBgcmdiKCR7Y29sb3Iuc2xpY2UoMCwgMykubWFwKGMgPT4gTWF0aC5yb3VuZChjICogMjU1KSkuam9pbignLCAnKX0pYDtcbiAgICB9XG4gICAgLy8gUkdCIGlzIGJldHdlZW4gWzAsIDI1NV0gb3BhY2l0eSBpcyBiZXR3ZWVuIFswLCAxXVxuICAgIHJldHVybiBgcmdiYSgke2NvbG9yLm1hcCgoYywgaSkgPT4gKGkgPCAzICYmIE1hdGgucm91bmQoYyAqIDI1NSkpIHx8IGMpLmpvaW4oJywgJyl9KWA7XG59O1xuXG5VdGlscy5wb2ludEluVGlsZSA9IGZ1bmN0aW9uIChwb2ludCkge1xuICAgIHJldHVybiBwb2ludFswXSA+PSAwICYmwqBwb2ludFsxXSA+IC1HZW8udGlsZV9zY2FsZSAmJiBwb2ludFswXSA8IEdlby50aWxlX3NjYWxlICYmIHBvaW50WzFdIDw9IDA7XG59O1xuIiwibGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmxldCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uLy4uL3BhY2thZ2UuanNvbicsICd1dGY4JykpO1xubGV0IHZlcnNpb247XG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uID0gJ3YnICsgcGtnLnZlcnNpb247XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG4vLyBXb3JrZXJCcm9rZXIgcm91dGVzIG1lc3NhZ2VzIGJldHdlZW4gd2ViIHdvcmtlcnMgYW5kIHRoZSBtYWluIHRocmVhZCwgYWxsb3dpbmcgZm9yIHNpbXBsZXJcbi8vIGFzeW5jIGNvZGUgdmlhIHByb21pc2VzLiBFeGFtcGxlIHVzYWdlOlxuLy9cbi8vIEluIHdlYiB3b3JrZXIsIHJlZ2lzdGVyIHNlbGYgYXMgYSBjYWxsYWJsZSBcInRhcmdldFwiLCBhbmQgZGVmaW5lIGEgbWV0aG9kOlxuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdzZWxmJywgc2VsZik7XG4vL1xuLy8gICAgIHNlbGYuc3F1YXJlID0gZnVuY3Rpb24gKHgpIHtcbi8vICAgICAgICAgcmV0dXJuIHggKiB4O1xuLy8gICAgIH07XG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGludm9rZSB0aGF0IG1ldGhvZCBhbmQgcmVjZWl2ZSB0aGUgcmVzdWx0IChpZiBhbnkpIGFzIGEgcHJvbWlzZS5cbi8vXG4vLyAgICAgd29ya2VyID0gbmV3IFdvcmtlciguLi4pO1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuc3F1YXJlJywgNSkudGhlbihmdW5jdGlvbih5KSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHkpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgMjVcbi8vXG4vLyBBc3luYyBjb2RlOlxuLy9cbi8vIEZvciBzeW5jaHJvbm91cyBjb2RlIHRoYXQgbXVzdCBwYXNzIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBtYWluIHRocmVhZCwgdGhlIGZ1bmN0aW9uIGNhbiBzaW1wbHlcbi8vIHJldHVybiBhbiBpbW1lZGlhdGUgdmFsdWUgKHNlZSBleGFtcGxlIGFib3ZlKS4gRm9yIGNhc2VzIHdoZXJlIHRoZSB3b3JrZXIgbWV0aG9kIG5lZWRzIHRvIHJ1blxuLy8gYXN5bmNocm9ub3VzIGNvZGUsIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgcHJvbWlzZSwgYW5kIHRoZSByZXNvbHZlZCBvciByZWplY3RlZCB2YWx1ZSB3aWxsXG4vLyBiZSBzZW50IGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIHdoZW4gdGhlIHByb21pc2UgaXMgZnVsZmlsbGVkLlxuLy9cbi8vIEVycm9yIGhhbmRsaW5nOlxuLy9cbi8vIElmIHRoZSB3b3JrZXIgbWV0aG9kIGVpdGhlciB0aHJvd3MgYW4gZXJyb3IsIG9yIHJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQsIGl0IHdpbGwgYmVcbi8vIHNlbnQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgYXMgYSBwcm9taXNlIHJlamVjdGlvbi4gVGhlc2UgdHdvIGV4YW1wbGVzIGFyZSBlcXVpdmFsZW50OlxuLy9cbi8vICAgICBJbiB3b3JrZXIsIHRocm93aW5nIGFuIGVycm9yOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGluIHdvcmtlciEnKTtcbi8vICAgICAgICAgfTtcbi8vXG4vLyAgICAgSW4gd29ya2VyLCByZXR1cm5pbmcgYSByZWplY3RlZCBwcm9taXNlOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdlcnJvciBpbiB3b3JrZXIhJykpO1xuLy8gICAgICAgICB9O1xuLy9cbi8vICAgICBJbiBtYWluIHRocmVhZCwgYm90aCBlcnJvcnMgYXJlIHJlY2VpdmVkIGFzIGEgcHJvbWlzZSByZWplY3Rpb246XG4vL1xuLy8gICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5icm9rZW4nKS50aGVuKFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Y2Nlc3MhJyk7XG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IhJywgZXJyb3IpO1xuLy8gICAgICAgICAgICAgfSk7XG4vL1xuLy8gICAgICAgICAtPiBwcmludHMgJ2Vycm9yISBlcnJvciBpbiB3b3JrZXInXG4vL1xuLy8gQ2FsbGluZyBmcm9tIHdvcmtlciB0byBtYWluIHRocmVhZDpcbi8vXG4vLyBUaGUgc2FtZSBzdHlsZSBvZiBjYWxscyBjYW4gYmUgbWFkZSAqZnJvbSogYSB3ZWIgd29ya2VyLCB0byB0aGUgbWFpbiB0aHJlYWQuIFRoZSBBUEkgaXMgdGhlIHNhbWVcbi8vIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCwgJ3dvcmtlcicsIGlzIG5vdCBuZWVkZWQgZm9yIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgpLFxuLy8gc2luY2UgdGhlIG1haW4gdGhyZWFkIGlzIHRoZSBpbXBsaWNpdCB0YXJnZXQuXG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGRlZmluZSBhIG1ldGhvZCBhbmQgcmVnaXN0ZXIgaXQ6XG4vL1xuLy8gICAgIHZhciBnZW9tZXRyeSA9IHtcbi8vICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbih4LCB5KSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCgnZ2VvbWV0cnknLCBnZW9tZXRyeSk7XG4vL1xuLy8gSW4gd29ya2VyIHRocmVhZCk6XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnZ2VvbWV0cnkubGVuZ3RoJywgMywgNCkudGhlbihmdW5jdGlvbihkKSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKGQpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgNVxuLy9cblxuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxudmFyIFdvcmtlckJyb2tlcjtcbmV4cG9ydCBkZWZhdWx0IFdvcmtlckJyb2tlciA9IHt9O1xuXG4vLyBHbG9iYWwgbGlzdCBvZiBhbGwgd29ya2VyIG1lc3NhZ2VzXG4vLyBVbmlxdWVseSB0cmFja3MgZXZlcnkgY2FsbCBtYWRlIGJldHdlZW4gbWFpbiB0aHJlYWQgYW5kIGEgd29ya2VyXG52YXIgbWVzc2FnZV9pZCA9IDA7XG52YXIgbWVzc2FnZXMgPSB7fTtcblxuLy8gUmVnaXN0ZXIgYW4gb2JqZWN0IHRvIHJlY2VpdmUgY2FsbHMgZnJvbSBvdGhlciB0aHJlYWRcbnZhciB0YXJnZXRzID0ge307XG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0ID0gZnVuY3Rpb24gKG5hbWUsIHRhcmdldCkge1xuICAgIHRhcmdldHNbbmFtZV0gPSB0YXJnZXQ7XG59O1xuXG4vLyBHaXZlbiBhIGRvdC1ub3RhdGlvbi1zdHlsZSBtZXRob2QgbmFtZSwgZS5nLiAnT2JqZWN0Lm9iamVjdC5tZXRob2QnLFxuLy8gZmluZCB0aGUgb2JqZWN0IHRvIGNhbGwgdGhlIG1ldGhvZCBvbiBmcm9tIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgdGFyZ2V0c1xuZnVuY3Rpb24gZmluZFRhcmdldCAobWV0aG9kKSB7XG4gICAgdmFyIGNoYWluID0gW107XG4gICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNoYWluID0gbWV0aG9kLnNwbGl0KCcuJyk7XG4gICAgICAgIG1ldGhvZCA9IGNoYWluLnBvcCgpO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzO1xuXG4gICAgZm9yIChsZXQgbT0wOyBtIDwgY2hhaW4ubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgaWYgKHRhcmdldFtjaGFpblttXV0pIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtjaGFpblttXV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21ldGhvZCwgdGFyZ2V0XTtcbn1cblxuLy8gTWFpbiB0aHJlYWQ6XG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gd29ya2VycywgYW5kIG9wdGlvbmFsbHkgcmVjZWl2ZSBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2Vcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHdvcmtlcnMsIGFuZCBvcHRpb25hbGx5IHNlbmQgYW4gYXN5bmMgcmVzcG9uc2UgYmFjayBhcyBhIHByb21pc2VcbmZ1bmN0aW9uIHNldHVwTWFpblRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byBhIHdvcmtlciwgYW5kIG9wdGlvbmFsbHkgZ2V0IGFuIGFzeW5jIHJlc3BvbnNlXG4gICAgLy8gQXJndW1lbnRzOlxuICAgIC8vICAgLSB3b3JrZXI6IG9uZSBvciBtb3JlIHdlYiB3b3JrZXIgaW5zdGFuY2VzIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKHNpbmdsZSB2YWx1ZSBvciBhcnJheSlcbiAgICAvLyAgIC0gbWV0aG9kOiB0aGUgbWV0aG9kIHdpdGggdGhpcyBuYW1lLCBzcGVjaWZpZWQgd2l0aCBkb3Qtbm90YXRpb24sIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgd29ya2VyXG4gICAgLy8gICAtIG1lc3NhZ2U6IHNwcmVhZCBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGhcbiAgICAvLyBSZXR1cm5zOlxuICAgIC8vICAgLSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBpZiB0aGUgd29ya2VyIG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgKGNvdWxkIGJlIGltbWVkaWF0ZWx5LCBvciBhc3luYylcbiAgICAvL1xuICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSA9IGZ1bmN0aW9uICh3b3JrZXIsIG1ldGhvZCwgLi4ubWVzc2FnZSkge1xuICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIHdvcmtlciBzcGVjaWZpZWQsIHBvc3QgdG8gbXVsdGlwbGVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod29ya2VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHdvcmtlci5tYXAodyA9PiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodywgbWV0aG9kLCAuLi5tZXNzYWdlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBzdGF0ZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlX2lkXSA9IHsgbWV0aG9kLCBtZXNzYWdlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VbMF0gaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSBtZXNzYWdlWzBdLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVswXS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnbWFpbl9zZW5kJywgICAgICAvLyBtYXJrIG1lc3NhZ2UgYXMgbWV0aG9kIGludm9jYXRpb24gZnJvbSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBmdW5jdGlvbiBvZiB0aGlzIG5hbWUgd2l0aGluIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGF5bG9hZFxuICAgICAgICB9O1xuXG4gICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byB3b3JrZXIgdGhyZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZXNzYWdlX2lkKys7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYSB3b3JrZXIgdG8gY29tbXVuaWNhdGUgd2l0aCAtIGVhY2ggd29ya2VyIG11c3QgYmUgcmVnaXN0ZXJlZCBmcm9tIHRoZSBtYWluIHRocmVhZFxuICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIgPSBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgIGlmICghKHdvcmtlciBpbnN0YW5jZW9mIFdvcmtlcikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBhZGQgbm9uLVdvcmtlciBvYmplY3RgLCB3b3JrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBXb3JrZXJCcm9rZXJNYWluVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBtYXliZURlY29kZShldmVudC5kYXRhKTtcbiAgICAgICAgICAgIGxldCBpZCA9IGRhdGEubWVzc2FnZV9pZDtcblxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSB3b3JrZXIsIGFuZCBmdWxmaWxsIHRoYXQgbWVzc2FnZSdzIHByb21pc2VcbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZXNvbHZlKGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGluaXRpYXRpbmcgYSBjYWxsIGZyb20gdGhlIHdvcmtlciwgZGlzcGF0Y2ggdGhlbSxcbiAgICAgICAgICAgIC8vIGFuZCBzZW5kIGFueSByZXR1cm4gdmFsdWUgYmFjayB0byB0aGUgd29ya2VyXG4gICAgICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSAmIHJldHVybiBjYWxsIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfc2VuZCcgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlcXVlc3RlZCBtZXRob2QgYW5kIHNhdmUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhciBbbWV0aG9kX25hbWUsIHRhcmdldF0gPSBmaW5kVGFyZ2V0KGRhdGEubWV0aG9kKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkIG9uIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG9iamVjdCBoYXMgbm8gbWV0aG9kIHdpdGggdGhhdCBuYW1lYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRhcmdldCwgZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaHJvd24gZXJyb3JzIHdpbGwgYmUgcGFzc2VkIGJhY2sgKGluIHN0cmluZyBmb3JtKSB0byB3b3JrZXJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIHdvcmtlclxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSB2YWx1ZS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIGZvciBkZWJ1Z2dpbmdcbiAgICBXb3JrZXJCcm9rZXIuZ2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICB9O1xuXG4gICAgV29ya2VyQnJva2VyLmdldE1lc3NhZ2VJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VfaWQ7XG4gICAgfTtcblxufVxuXG4vLyBXb3JrZXIgdGhyZWFkczpcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSBzZW5kIGFuIGFzeW5jIHJlc3BvbnNlIGJhY2sgYXMgYSBwcm9taXNlXG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IHJlY2VpdmUgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG5mdW5jdGlvbiBzZXR1cFdvcmtlclRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byB0aGUgbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IGdldCBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2VcbiAgICAvLyBBcmd1bWVudHM6XG4gICAgLy8gICAtIG1ldGhvZDogdGhlIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSwgc3BlY2lmaWVkIHdpdGggZG90LW5vdGF0aW9uLCB3aWxsIGJlIGludm9rZWQgb24gdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gICAtIG1lc3NhZ2U6IGFycmF5IG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICAgIC8vIFJldHVybnM6XG4gICAgLy8gICAtIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIGlmIHRoZSBtYWluIHRocmVhZCBtZXRob2QgcmV0dXJucyBhIHZhbHVlIChjb3VsZCBiZSBpbW1lZGlhdGVseSwgb3IgYXN5bmMpXG4gICAgLy9cbiAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAobWV0aG9kLCAuLi5tZXNzYWdlKSB7XG4gICAgICAgIC8vIFRyYWNrIHN0YXRlIG9mIHRoaXMgbWVzc2FnZVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VfaWRdID0geyBtZXRob2QsIG1lc3NhZ2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICB9KTtcblxuICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPT09IDEgJiYgbWVzc2FnZVswXSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IG1lc3NhZ2VbMF0udHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfc2VuZCcsICAgIC8vIG1hcmsgbWVzc2FnZSBhcyBtZXRob2QgaW52b2NhdGlvbiBmcm9tIHdvcmtlclxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBtZXRob2Qgb2YgdGhpcyBuYW1lIG9uIHRoZSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXlsb2FkXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZV9pZCsrO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gV29ya2VyQnJva2VyV29ya2VyVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgZGF0YSA9IG1heWJlRGVjb2RlKGV2ZW50LmRhdGEpO1xuICAgICAgICBsZXQgaWQgPSBkYXRhLm1lc3NhZ2VfaWQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSBtYWluIHRocmVhZCwgYW5kIGZ1bGZpbGwgdGhhdCBtZXNzYWdlJ3MgcHJvbWlzZVxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9yZXBseScpIHtcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZWplY3QoZGF0YS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVzb2x2ZShkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtYWluIHRocmVhZCwgZGlzcGF0Y2ggdGhlbSwgYW5kIHNlbmQgYmFjayBhIHJlcGx5XG4gICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlICYgcmV0dXJuIGNhbGwgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9zZW5kJyAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSByZXF1ZXN0ZWQgd29ya2VyIG1ldGhvZCBhbmQgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB2YXIgW21ldGhvZF9uYW1lLCB0YXJnZXRdID0gZmluZFRhcmdldChkYXRhLm1ldGhvZCk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugbm8gb2JqZWN0IHdpdGggdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQgb24gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcblxuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IGJlY2F1c2Ugd29ya2VyIGhhcyBubyBtZXRob2Qgd2l0aCB0aGF0IG5hbWVgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0YXJnZXQsIGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhyb3duIGVycm9ycyB3aWxsIGJlIHBhc3NlZCBiYWNrIChpbiBzdHJpbmcgZm9ybSkgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHZhbHVlLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxufVxuXG4vLyBTcGVjaWFsIHZhbHVlIHdyYXBwZXIsIHRvIGluZGljYXRlIHRoYXQgd2Ugd2FudCB0byBmaW5kIGFuZCBpbmNsdWRlIHRyYW5zZmVyYWJsZSBvYmplY3RzIGluIHRoZSBtZXNzYWdlXG5Xb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMgPSBmdW5jdGlvbiAoLi4udmFsdWUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm4gbmV3IFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyguLi52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudHJhbnNmZXJhYmxlcyA9IGZpbmRUcmFuc2ZlcmFibGVzKHRoaXMudmFsdWUpO1xufTtcblxuLy8gQnVpbGQgYSBsaXN0IG9mIHRyYW5zZmVyYWJsZSBvYmplY3RzIGZyb20gYSBzb3VyY2Ugb2JqZWN0XG4vLyBSZXR1cm5zIGEgbGlzdCBvZiBpbmZvIGFib3V0IGVhY2ggdHJhbnNmZXJhYmxlOlxuLy8gICAtIG9iamVjdDogdGhlIGFjdHVhbCB0cmFuc2ZlcmFibGUgb2JqZWN0XG4vLyAgIC0gcGFyZW50OiB0aGUgcGFyZW50IG9iamVjdCB0aGF0IHRoZSB0cmFuc2ZlcmFibGUgaXMgYSBwcm9wZXJ0eSBvZiAoaWYgYW55KVxuLy8gICAtIHByb3BlcnR5OiB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgdHJhbnNmZXJhYmxlIG9uIHRoZSBwYXJlbnQgb2JqZWN0IChpZiBhbnkpXG4vLyBUT0RPOiBhZGQgb3B0aW9uIGluIGNhc2UgeW91IERPTidUIHdhbnQgdG8gdHJhbnNmZXIgb2JqZWN0c1xuZnVuY3Rpb24gZmluZFRyYW5zZmVyYWJsZXMoc291cmNlLCBwYXJlbnQgPSBudWxsLCBwcm9wZXJ0eSA9IG51bGwsIGxpc3QgPSBbXSkge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIC8vIENoZWNrIGVhY2ggYXJyYXkgZWxlbWVudFxuICAgICAgICBzb3VyY2UuZm9yRWFjaCgoeCwgaSkgPT4gZmluZFRyYW5zZmVyYWJsZXMoeCwgc291cmNlLCBpLCBsaXN0KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIElzIHRoZSBvYmplY3QgYSB0cmFuc2ZlcmFibGUgYXJyYXkgYnVmZmVyP1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IG9iamVjdDogc291cmNlLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9yIGxvb2tzIGxpa2UgYSB0eXBlZCBhcnJheSAoaGFzIGFuIGFycmF5IGJ1ZmZlciBwcm9wZXJ0eSk/XG4gICAgICAgIGVsc2UgaWYgKHNvdXJjZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgbGlzdC5wdXNoKHsgb2JqZWN0OiBzb3VyY2UuYnVmZmVyLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBlYWNoIHByb3BlcnR5XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBmaW5kVHJhbnNmZXJhYmxlcyhzb3VyY2VbcHJvcF0sIHNvdXJjZSwgcHJvcCwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIFJlbW92ZSBuZXV0ZXJlZCB0cmFuc2ZlcmFibGVzIGZyb20gcGFyZW50IG9iamVjdHMsIGFzIHRoZXkgc2hvdWxkIG5vIGxvbmdlciBiZSBhY2Nlc3NlZCBhZnRlciB0cmFuc2ZlclxuZnVuY3Rpb24gZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0cmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyYW5zZmVyYWJsZXMuZmlsdGVyKHQgPT4gdC5wYXJlbnQgJiYgdC5wcm9wZXJ0eSkuZm9yRWFjaCh0ID0+IGRlbGV0ZSB0LnBhcmVudFt0LnByb3BlcnR5XSk7XG59XG5cbi8vIE1lc3NhZ2UgcGF5bG9hZCBjYW4gYmUgc3RyaW5naWZpZWQgZm9yIGZhc3RlciB0cmFuc2ZlciwgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB0cmFuc2ZlcmFibGUgb2JqZWN0c1xuZnVuY3Rpb24gbWF5YmVFbmNvZGUgKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpIHtcbiAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cblxuLy8gUGFyc2Ugc3RyaW5naWZpZWQgbWVzc2FnZSBwYXlsb2FkXG5mdW5jdGlvbiBtYXliZURlY29kZSAoZGF0YSkge1xuICAgIHJldHVybiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGEpO1xufVxuXG4vLyBTZXR1cCB0aGlzIHRocmVhZCBhcyBhcHByb3ByaWF0ZVxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgc2V0dXBNYWluVGhyZWFkKCk7XG59XG5cbmlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgc2V0dXBXb3JrZXJUaHJlYWQoKTtcbn1cbiIsIi8qKiogVmVjdG9yIGZ1bmN0aW9ucyAtIHZlY3RvcnMgcHJvdmlkZWQgYXMgW3gsIHksIHpdIGFycmF5cyAqKiovXG5cbnZhciBWZWN0b3I7XG5leHBvcnQgZGVmYXVsdCBWZWN0b3IgPSB7fTtcblxuVmVjdG9yLnNldCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIFYgPSBbXTtcbiAgICB2YXIgbGltID0gdi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBWW2ldID0gdltpXTtcbiAgICB9XG4gICAgcmV0dXJuIFY7XG59O1xuXG5WZWN0b3IubmVnID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgViA9IFtdO1xuICAgIHZhciBsaW0gPSB2Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIFZbaV0gPSB2W2ldICogLTE7XG4gICAgfVxuICAgIHJldHVybiBWO1xufTtcblxuLy8gQWRkaXRpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5hZGQgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICB2W2ldID0gdjFbaV0gKyB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBTdWJzdHJhY3Rpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5zdWIgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIHZbaV0gPSB2MVtpXSAtIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cblZlY3Rvci5zaWduZWRfYXJlYSA9IGZ1bmN0aW9uICh2MSwgdjIsIHYzKSB7XG4gICAgcmV0dXJuICh2MlswXS12MVswXSkqKHYzWzFdLXYxWzFdKSAtICh2M1swXS12MVswXSkqKHYyWzFdLXYxWzFdKTtcbn07XG5cbi8vIE11bHRpcGxpY2F0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IubXVsdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBsZW4gPSB2MS5sZW5ndGgsXG4gICAgICAgIGk7XG5cbiAgICBpZiAodHlwZW9mIHYyID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBNdWxpdHBseSBieSBzY2FsYXJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gKiB2MjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTXVsdGlwbHkgdHdvIHZlY3RvcnNcbiAgICAgICAgbGVuID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldICogdjJbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBEaXZpc2lvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRpdiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBpO1xuICAgIGlmKHR5cGVvZiB2MiA9PT0gJ251bWJlcicpe1xuICAgICAgICAvLyBEaXZpZGUgYnkgc2NhbGFyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpdmlkZSB0byB2ZWN0b3JzXG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIEdldCAyRCBwZXJwZW5kaWN1bGFyXG5WZWN0b3IucGVycCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICByZXR1cm4gWyB2MlsxXSAtIHYxWzFdLFxuICAgICAgICAgICAgIHYxWzBdIC0gdjJbMF0gXTtcbn07XG5cbi8vIEdldCAyRCB2ZWN0b3Igcm90YXRlZFxuVmVjdG9yLnJvdCA9IGZ1bmN0aW9uICh2LCBhKSB7XG4gICAgdmFyIGMgPSBNYXRoLmNvcyhhKTtcbiAgICB2YXIgcyA9IE1hdGguc2luKGEpO1xuICAgIHJldHVybiBbdlswXSAqIGMgLSB2WzFdICogcyxcbiAgICAgICAgICAgIHZbMF0gKiBzICsgdlsxXSAqIGNdO1xufTtcblxuLy8gR2V0IDJEIGhlYWRpbmcgYW5nbGVcblZlY3Rvci5hbmdsZSA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LHgpO1xufTtcblxuLy8gR2V0IGFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvcnNcblZlY3Rvci5hbmdsZUJldHdlZW4gPSBmdW5jdGlvbihBLCBCKXtcbiAgICB2YXIgZGVsdGEgPSBWZWN0b3IuZG90KEEsIEIpO1xuICAgIGlmIChkZWx0YSA8IC0xKSB7XG4gICAgICAgIGRlbHRhID0gLTE7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmFjb3MoZGVsdGEpO1xufTtcblxuLy8gQ29tcGFyZSB0d28gcG9pbnRzXG5WZWN0b3IuaXNFcXVhbCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbGVuID0gdjEubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHYxW2ldICE9PSB2MltpXSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBWZWN0b3IgbGVuZ3RoIHNxdWFyZWRcblZlY3Rvci5sZW5ndGhTcSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiAodlswXSp2WzBdICsgdlsxXSp2WzFdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodi5sZW5ndGggPj0gMykge1xuICAgICAgICByZXR1cm4gKHZbMF0qdlswXSArIHZbMV0qdlsxXSArIHZbMl0qdlsyXSk7XG4gICAgfVxuICAgIHJldHVybiAwO1xufTtcblxuLy8gVmVjdG9yIGxlbmd0aFxuVmVjdG9yLmxlbmd0aCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChWZWN0b3IubGVuZ3RoU3EodikpO1xufTtcblxuLy8gTm9ybWFsaXplIGEgdmVjdG9yXG5WZWN0b3Iubm9ybWFsaXplID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgZDtcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgfSBlbHNlIGlmICh2Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGQgPSB2WzBdKnZbMF0gKyB2WzFdKnZbMV0gKyB2WzJdKnZbMl07XG4gICAgICAgIGQgPSBNYXRoLnNxcnQoZCk7XG5cbiAgICAgICAgaWYgKGQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbdlswXSAvIGQsIHZbMV0gLyBkLCB2WzJdIC8gZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFswLCAwLCAwXTtcbn07XG5cbi8vIENyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5jcm9zcyAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgKHYxWzFdICogdjJbMl0pIC0gKHYxWzJdICogdjJbMV0pLFxuICAgICAgICAodjFbMl0gKiB2MlswXSkgLSAodjFbMF0gKiB2MlsyXSksXG4gICAgICAgICh2MVswXSAqIHYyWzFdKSAtICh2MVsxXSAqIHYyWzBdKVxuICAgIF07XG59O1xuXG4vLyBEb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRvdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCwgdjIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIG4gKz0gdjFbaV0gKiB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG59O1xuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IENhbWVyYSBmcm9tICcuL2NhbWVyYSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBjb25zdCBWSUVXX1BBTl9TTkFQX1RJTUUgPSAwLjU7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuXG4gICAgY29uc3RydWN0b3IgKHNjZW5lLCBvcHRpb25zKSB7XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaWNlcygpO1xuXG4gICAgICAgIHRoaXMuem9vbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucGFubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhbm5pbmdfc3RvcF9hdCA9IDA7XG4gICAgICAgIHRoaXMucGFuX3NuYXBfdGltZXIgPSAwO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b29tX2RpcmVjdGlvbiA9IDA7XG5cbiAgICAgICAgLy8gU2l6ZSBvZiB2aWV3cG9ydCBpbiBDU1MgcGl4ZWxzLCBkZXZpY2UgcGl4ZWxzLCBhbmQgbWVyY2F0b3IgbWV0ZXJzXG4gICAgICAgIHRoaXMuc2l6ZSA9IHtcbiAgICAgICAgICAgIGNzczoge30sXG4gICAgICAgICAgICBkZXZpY2U6IHt9LFxuICAgICAgICAgICAgbWV0ZXJzOiB7fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzcGVjdCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5idWZmZXIgPSAwO1xuICAgICAgICB0aGlzLmNvbnRpbnVvdXNfem9vbSA9ICh0eXBlb2Ygb3B0aW9ucy5jb250aW51b3VzWm9vbSA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnMuY29udGludW91c1pvb20gOiB0cnVlO1xuICAgICAgICB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWwgPSAwOyAvLyBsZXZlbC1vZi1kZXRhaWwgZG93bnNhbXBsaW5nIHRvIGFwcGx5IHRvIHRpbGUgbG9hZGluZ1xuICAgICAgICB0aGlzLnByZXNlcnZlX3RpbGVzX3dpdGhpbl96b29tID0gMTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RhdGUgYmVmb3JlIHNjZW5lIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjYW1lcmFcbiAgICBjcmVhdGVDYW1lcmEgKCkge1xuICAgICAgICBsZXQgYWN0aXZlX2NhbWVyYSA9IHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGlmIChhY3RpdmVfY2FtZXJhKSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYSA9IENhbWVyYS5jcmVhdGUoYWN0aXZlX2NhbWVyYSwgdGhpcywgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1thY3RpdmVfY2FtZXJhXSk7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGVWaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnICYmIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbWVyYSBzZXQgYXMgYWN0aXZlLCB1c2UgZmlyc3Qgb25lXG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXMubGVuZ3RoICYmIGtleXNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSBhbmQgcmVjb21waWxlIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEgKG5hbWUpIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXS5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDbGVhciBwcmV2aW91c2x5IGFjdGl2ZSBjYW1lcmFcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09IG5hbWUgJiYgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1twcmV2XSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW3ByZXZdLmFjdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2NlbmUudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlKCk7XG4gICAgICAgIHRoaXMucGFuX3NuYXBfdGltZXIgPSAoKCtuZXcgRGF0ZSgpKSAtIHRoaXMucGFubmluZ19zdG9wX2F0KSAvIDEwMDA7XG4gICAgfVxuXG4gICAgLy8gU2V0IGxvZ2ljYWwgcGl4ZWwgc2l6ZSBvZiB2aWV3cG9ydFxuICAgIHNldFZpZXdwb3J0U2l6ZSAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLnNpemUuY3NzID0geyB3aWR0aCwgaGVpZ2h0IH07XG4gICAgICAgIHRoaXMuc2l6ZS5kZXZpY2UgPSB7XG4gICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLndpZHRoICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLmhlaWdodCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3BlY3QgPSB0aGlzLnNpemUuY3NzLndpZHRoIC8gdGhpcy5zaXplLmNzcy5oZWlnaHQ7XG4gICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBtYXAgdmlldywgY2FuIGJlIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBsYXQvbG5nIGFuZC9vciB6b29tXG4gICAgc2V0VmlldyAoeyBsbmcsIGxhdCwgem9vbSB9ID0ge30pIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZXQgY2VudGVyXG4gICAgICAgIGlmICh0eXBlb2YgbG5nID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNlbnRlciB8fCBsbmcgIT09IHRoaXMuY2VudGVyLmxuZyB8fCBsYXQgIT09IHRoaXMuY2VudGVyLmxhdCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyID0geyBsbmc6IEdlby53cmFwTG5nKGxuZyksIGxhdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHpvb21cbiAgICAgICAgaWYgKHR5cGVvZiB6b29tID09PSAnbnVtYmVyJyAmJiB6b29tICE9PSB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRab29tKHpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuXG4gICAgc2V0Wm9vbSAoem9vbSkge1xuICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RfdGlsZV96b29tID0gdGhpcy50aWxlX3pvb207XG4gICAgICAgIGxldCB0aWxlX3pvb20gPSB0aGlzLnRpbGVab29tKHpvb20pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGludW91c196b29tKSB7XG4gICAgICAgICAgICB6b29tID0gdGlsZV96b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGVfem9vbSAhPT0gbGFzdF90aWxlX3pvb20pIHtcbiAgICAgICAgICAgIHRoaXMuem9vbV9kaXJlY3Rpb24gPSB0aWxlX3pvb20gPiBsYXN0X3RpbGVfem9vbSA/IDEgOiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnRpbGVfem9vbSA9IHRpbGVfem9vbTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICBzdGFydFpvb20gKCkge1xuICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaG9vc2UgdGhlIGJhc2Ugem9vbSBsZXZlbCB0byB1c2UgZm9yIGEgZ2l2ZW4gZnJhY3Rpb25hbCB6b29tXG4gICAgYmFzZVpvb20gKHpvb20pIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioem9vbSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGEgZ2l2ZW4gdmlldyB6b29tLCB3aGF0IHRpbGUgem9vbSBzaG91bGQgYmUgbG9hZGVkP1xuICAgIHRpbGVab29tICh2aWV3X3pvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVpvb20odmlld196b29tKSAtIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgYSBnaXZlbiB0aWxlIHpvb20sIHdoYXQgc3R5bGUgem9vbSBzaG91bGQgYmUgdXNlZD9cbiAgICBzdHlsZVpvb20gKHRpbGVfem9vbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlWm9vbSh0aWxlX3pvb20pICsgdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsO1xuICAgIH1cblxuICAgIHNldFBhbm5pbmcgKHBhbm5pbmcpIHtcbiAgICAgICAgdGhpcy5wYW5uaW5nID0gcGFubmluZztcbiAgICAgICAgaWYgKCF0aGlzLnBhbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucGFubmluZ19zdG9wX2F0ID0gKCtuZXcgRGF0ZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlYWR5ICgpIHtcbiAgICAgICAgLy8gVE9ETzogYmV0dGVyIGNvbmNlcHQgb2YgXCJyZWFkaW5lc3NcIiBzdGF0ZT9cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemUuY3NzLndpZHRoICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuem9vbSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHZpZXdwb3J0IGJvdW5kcyBiYXNlZCBvbiBjdXJyZW50IGNlbnRlciBhbmQgem9vbVxuICAgIHVwZGF0ZUJvdW5kcyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy56b29tKTtcblxuICAgICAgICAvLyBTaXplIG9mIHRoZSBoYWxmLXZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdGhpcy5zaXplLm1ldGVycyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc2l6ZS5jc3Mud2lkdGggKiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICB5OiB0aGlzLnNpemUuY3NzLmhlaWdodCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENlbnRlciBvZiB2aWV3cG9ydCBpbiBtZXRlcnMsIGFuZCB0aWxlXG4gICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoW3RoaXMuY2VudGVyLmxuZywgdGhpcy5jZW50ZXIubGF0XSk7XG4gICAgICAgIHRoaXMuY2VudGVyLm1ldGVycyA9IHsgeCwgeSB9O1xuXG4gICAgICAgIHRoaXMuY2VudGVyLnRpbGUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55XSwgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgIC8vIEJvdW5kcyBpbiBtZXRlcnNcbiAgICAgICAgdGhpcy5ib3VuZHMgPSB7XG4gICAgICAgICAgICBzdzoge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54IC0gdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSAtIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZToge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54ICsgdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSArIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ21vdmUnKTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7IC8vIFRPRE8gYXV0b21hdGUgdmlhIG1vdmUgZXZlbnQ/XG4gICAgfVxuXG4gICAgZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuYm91bmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgeiA9IHRoaXMudGlsZV96b29tO1xuICAgICAgICBsZXQgc3cgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMuc3cueCwgdGhpcy5ib3VuZHMuc3cueV0sIHopO1xuICAgICAgICBsZXQgbmUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMubmUueCwgdGhpcy5ib3VuZHMubmUueV0sIHopO1xuXG4gICAgICAgIGxldCBjb29yZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IHN3LnggLSB0aGlzLmJ1ZmZlcjsgeCA8PSBuZS54ICsgdGhpcy5idWZmZXI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IG5lLnkgLSB0aGlzLmJ1ZmZlcjsgeSA8PSBzdy55ICsgdGhpcy5idWZmZXI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKFRpbGUuY29vcmQoeyB4LCB5LCB6IH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0b28gZmFyIG91dHNpZGUgb2Ygdmlld1xuICAgIHBydW5lVGlsZXNGb3JWaWV3ICgpIHtcbiAgICAgICAgLy8gVE9ETzogd2lsbCB0aGlzIGZ1bmN0aW9uIGV2ZXIgYmUgY2FsbGVkIHdoZW4gdmlldyBpc24ndCByZWFkeT9cbiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZSBhIHNwZWNpZmllZCAjIG9mIHRpbGVzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0IGJvcmRlclxuICAgICAgICBsZXQgYm9yZGVyX3RpbGVzID0gW1xuICAgICAgICAgICAgTWF0aC5jZWlsKChNYXRoLmZsb29yKHRoaXMuc2l6ZS5jc3Mud2lkdGggLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMiksXG4gICAgICAgICAgICBNYXRoLmNlaWwoKE1hdGguZmxvb3IodGhpcy5zaXplLmNzcy5oZWlnaHQgLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMilcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlIHx8IHRpbGUucHJveHlfZm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGlsZXMgb3V0c2lkZSBnaXZlbiB6b29tIHRoYXQgYXJlIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgJiYgdGlsZS5zdHlsZV96b29tICE9PSB0aGlzLnRpbGVfem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIGlmIHRvbyBmYXIgZnJvbSBjdXJyZW50IHpvb21cbiAgICAgICAgICAgIGxldCB6ZGlmZiA9IE1hdGguYWJzKHRpbGUuc3R5bGVfem9vbSAtIHRoaXMudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmICh6ZGlmZiA+IHRoaXMucHJlc2VydmVfdGlsZXNfd2l0aGluX3pvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHRpbGVzIGF0IGRpZmZlcmVudCB6b29tc1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIHRpbGVzIG91dHNpZGUgYW4gYXJlYSBzdXJyb3VuZGluZyB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZHMueCAtIHRoaXMuY2VudGVyLnRpbGUueCkgLSBib3JkZXJfdGlsZXNbMF0gPiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmlldzogcmVtb3ZlIHRpbGUgJHt0aWxlLmtleX0gKGFzICR7Y29vcmRzLnh9LyR7Y29vcmRzLnl9LyR7dGhpcy50aWxlX3pvb219KSBmb3IgYmVpbmcgdG9vIGZhciBvdXQgb2YgdmlzaWJsZSBhcmVhICoqKmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoY29vcmRzLnkgLSB0aGlzLmNlbnRlci50aWxlLnkpIC0gYm9yZGVyX3RpbGVzWzFdID4gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZpZXc6IHJlbW92ZSB0aWxlICR7dGlsZS5rZXl9IChhcyAke2Nvb3Jkcy54fS8ke2Nvb3Jkcy55fS8ke3RoaXMudGlsZV96b29tfSkgZm9yIGJlaW5nIHRvbyBmYXIgb3V0IG9mIHZpc2libGUgYXJlYSAqKipgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb2NhdGUgbW9kZWwtdmlldyBtYXRyaWNlc1xuICAgIC8vIDY0LWJpdCB2ZXJzaW9ucyBhcmUgZm9yIENQVSBjYWxjdWF0aW9uc1xuICAgIC8vIDMyLWJpdCB2ZXJzaW9ucyBhcmUgZG93bnNhbXBsZWQgYW5kIHNlbnQgdG8gR1BVXG4gICAgY3JlYXRlTWF0cmljZXMgKCkge1xuICAgICAgICB0aGlzLm1hdHJpY2VzID0ge307XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWwgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbDMyID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWxfdmlldyA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsX3ZpZXczMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm5vcm1hbCA9IG5ldyBGbG9hdDY0QXJyYXkoOSk7XG4gICAgICAgIHRoaXMubWF0cmljZXMubm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IG1vZGVsL3ZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlcyBmb3IgYSB0aWxlXG4gICAgc2V0dXBUaWxlICh0aWxlLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgLy8gVE9ETzogY2FsYyB0aGVzZSBvbmNlIHBlciB0aWxlIChjdXJyZW50bHkgYmVpbmcgbmVlZGxlc3NseSByZS1jYWxjdWxhdGVkIHBlci10aWxlLXBlci1zdHlsZSlcbiAgICAgICAgdGlsZS5zZXR1cFByb2dyYW0odGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG5cbiAgICAgICAgLy8gTW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgICAgIHRoaXMuY2FtZXJhLnNldHVwTWF0cmljZXModGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGdlbmVyYWwgdW5pZm9ybXMgdGhhdCBtdXN0IGJlIHVwZGF0ZWQgb25jZSBwZXIgcHJvZ3JhbVxuICAgIHNldHVwUHJvZ3JhbSAocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3Jlc29sdXRpb24nLCBbdGhpcy5zaXplLmRldmljZS53aWR0aCwgdGhpcy5zaXplLmRldmljZS5oZWlnaHRdKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXBfcG9zaXRpb24nLCBbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55LCB0aGlzLnpvb21dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21ldGVyc19wZXJfcGl4ZWwnLCB0aGlzLm1ldGVyc19wZXJfcGl4ZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3ZpZXdfcGFuX3NuYXBfdGltZXInLCB0aGlzLnBhbl9zbmFwX3RpbWVyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3ZpZXdfcGFubmluZycsIHRoaXMucGFubmluZyk7XG5cbiAgICAgICAgdGhpcy5jYW1lcmEuc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgIH1cblxuICAgIC8vIFZpZXcgcmVxdWlyZXMgc29tZSBhbmltYXRpb24sIHN1Y2ggYXMgYWZ0ZXIgcGFubmluZyBzdG9wc1xuICAgIGlzQW5pbWF0aW5nICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnBhbl9zbmFwX3RpbWVyIDw9IFZJRVdfUEFOX1NOQVBfVElNRSk7XG4gICAgfVxuXG59XG4iXX0= +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLWFzYXAuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzNi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2ZvbnRmYWNlb2JzZXJ2ZXIvZm9udGZhY2VvYnNlcnZlci5zdGFuZGFsb25lLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9pbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9ub3JtYWwtZnJvbS1tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvY29weS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2lkZW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbG9va0F0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbXVsdGlwbHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9wZXJzcGVjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3NjYWxlLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvdHJhbnNsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2dsLXNoYWRlci1lcnJvcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2xvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvYmFzZTY0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2VkT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2lvbnMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2NyYzMyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZXh0ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2ZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbG9hZC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqc1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9BcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL0RhdGFSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9Ob2RlQnVmZmVyUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvU3RyaW5nUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvVWludDhBcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL3JlYWRlckZvci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vQ29udmVydFdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NyYzMyUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhV29ya2VyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vR2VuZXJpY1dvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL1N0cmVhbUhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRmOC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBPYmplY3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9hZGxlcjMyLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJub2RlX21vZHVsZXMvcGJmL2J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG9wb2pzb24tY2xpZW50L2Rpc3QvdG9wb2pzb24tY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMiLCJzcmMvYnVpbGRlcnMvY29tbW9uLmpzIiwic3JjL2J1aWxkZXJzL3BvaW50cy5qcyIsInNyYy9idWlsZGVycy9wb2x5Z29ucy5qcyIsInNyYy9idWlsZGVycy9wb2x5bGluZXMuanMiLCJzcmMvY2FtZXJhLmpzIiwic3JjL2dlby5qcyIsInNyYy9nbC9jb25zdGFudHMuanMiLCJzcmMvZ2wvY29udGV4dC5qcyIsInNyYy9nbC9leHRlbnNpb25zLmpzIiwic3JjL2dsL2dsc2wuanMiLCJzcmMvZ2wvcmVuZGVyX3N0YXRlLmpzIiwic3JjL2dsL3NoYWRlcl9wcm9ncmFtLmpzIiwic3JjL2dsL3RleHR1cmUuanMiLCJzcmMvZ2wvdmFvLmpzIiwic3JjL2dsL3Zib19tZXNoLmpzIiwic3JjL2dsL3ZlcnRleF9kYXRhLmpzIiwic3JjL2dsL3ZlcnRleF9lbGVtZW50cy5qcyIsInNyYy9nbC92ZXJ0ZXhfbGF5b3V0LmpzIiwic3JjL2xhYmVscy9jb2xsaXNpb24uanMiLCJzcmMvbGFiZWxzL2ludGVyc2VjdC5qcyIsInNyYy9sYWJlbHMvbGFiZWwuanMiLCJzcmMvbGFiZWxzL2xhYmVsX2xpbmUuanMiLCJzcmMvbGFiZWxzL2xhYmVsX3BvaW50LmpzIiwic3JjL2xhYmVscy9wb2ludF9hbmNob3IuanMiLCJzcmMvbGFiZWxzL3BvaW50X3BsYWNlbWVudC5qcyIsInNyYy9sYWJlbHMvcmVwZWF0X2dyb3VwLmpzIiwic3JjL2xlYWZsZXRfbGF5ZXIuanMiLCJzcmMvbGlnaHQuanMiLCJzcmMvbWF0ZXJpYWwuanMiLCJzcmMvbW9kdWxlLmpzIiwic3JjL3NjZW5lLmpzIiwic3JjL3NjZW5lX2J1bmRsZS5qcyIsInNyYy9zY2VuZV9sb2FkZXIuanMiLCJzcmMvc2NlbmVfd29ya2VyLmpzIiwic3JjL3NlbGVjdGlvbi5qcyIsInNyYy9zb3VyY2VzL2RhdGFfc291cmNlLmpzIiwic3JjL3NvdXJjZXMvZ2VvanNvbi5qcyIsInNyYy9zb3VyY2VzL212dC5qcyIsInNyYy9zb3VyY2VzL3Jhc3Rlci5qcyIsInNyYy9zb3VyY2VzL3RvcG9qc29uLmpzIiwic3JjL3N0eWxlcy9maWx0ZXIuanMiLCJzcmMvc3R5bGVzL2xheWVyLmpzIiwic3JjL3N0eWxlcy9saW5lcy9kYXNoYXJyYXkuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2xpbmVzLmpzIiwic3JjL3N0eWxlcy9wb2ludHMvcG9pbnRzLmpzIiwic3JjL3N0eWxlcy9wb2x5Z29ucy9wb2x5Z29ucy5qcyIsInNyYy9zdHlsZXMvcmFzdGVyL3Jhc3Rlci5qcyIsInNyYy9zdHlsZXMvc3R5bGUuanMiLCJzcmMvc3R5bGVzL3N0eWxlX21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3N0eWxlX3BhcnNlci5qcyIsInNyYy9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC9mb250X21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3RleHQvdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X2xhYmVscy5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X3NldHRpbmdzLmpzIiwic3JjL3RpbGUuanMiLCJzcmMvdGlsZV9tYW5hZ2VyLmpzIiwic3JjL3RpbGVfcHlyYW1pZC5qcyIsInNyYy91dGlscy9kZWJ1Z19zZXR0aW5ncy5qcyIsInNyYy91dGlscy9lcnJvcnMuanMiLCJzcmMvdXRpbHMvZ2wtbWF0cml4LmpzIiwic3JjL3V0aWxzL2xvZy5qcyIsInNyYy91dGlscy9tZWRpYV9jYXB0dXJlLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9wb2x5ZmlsbHMuanMiLCJzcmMvdXRpbHMvc3Vic2NyaWJlLmpzIiwic3JjL3V0aWxzL3RocmVhZC5qcyIsInNyYy91dGlscy91cmxzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3dkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGpEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy8yQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbmdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFrQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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dXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyByYXdBc2FwIHByb3ZpZGVzIGV2ZXJ5dGhpbmcgd2UgbmVlZCBleGNlcHQgZXhjZXB0aW9uIG1hbmFnZW1lbnQuXG52YXIgcmF3QXNhcCA9IHJlcXVpcmUoXCIuL3Jhd1wiKTtcbi8vIFJhd1Rhc2tzIGFyZSByZWN5Y2xlZCB0byByZWR1Y2UgR0MgY2h1cm4uXG52YXIgZnJlZVRhc2tzID0gW107XG4vLyBXZSBxdWV1ZSBlcnJvcnMgdG8gZW5zdXJlIHRoZXkgYXJlIHRocm93biBpbiByaWdodCBvcmRlciAoRklGTykuXG4vLyBBcnJheS1hcy1xdWV1ZSBpcyBnb29kIGVub3VnaCBoZXJlLCBzaW5jZSB3ZSBhcmUganVzdCBkZWFsaW5nIHdpdGggZXhjZXB0aW9ucy5cbnZhciBwZW5kaW5nRXJyb3JzID0gW107XG52YXIgcmVxdWVzdEVycm9yVGhyb3cgPSByYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcih0aHJvd0ZpcnN0RXJyb3IpO1xuXG5mdW5jdGlvbiB0aHJvd0ZpcnN0RXJyb3IoKSB7XG4gICAgaWYgKHBlbmRpbmdFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IHBlbmRpbmdFcnJvcnMuc2hpZnQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbHMgYSB0YXNrIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgcmV0dXJuaW5nLCBpbiBpdHMgb3duIGV2ZW50LCB3aXRoIHByaW9yaXR5XG4gKiBvdmVyIG90aGVyIGV2ZW50cyBsaWtlIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVwYWludC4gQW4gZXJyb3IgdGhyb3duIGZyb20gYW5cbiAqIGV2ZW50IHdpbGwgbm90IGludGVycnVwdCwgbm9yIGV2ZW4gc3Vic3RhbnRpYWxseSBzbG93IGRvd24gdGhlIHByb2Nlc3Npbmcgb2ZcbiAqIG90aGVyIGV2ZW50cywgYnV0IHdpbGwgYmUgcmF0aGVyIHBvc3Rwb25lZCB0byBhIGxvd2VyIHByaW9yaXR5IGV2ZW50LlxuICogQHBhcmFtIHt7Y2FsbH19IHRhc2sgQSBjYWxsYWJsZSBvYmplY3QsIHR5cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm9cbiAqIGFyZ3VtZW50cy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhc2FwO1xuZnVuY3Rpb24gYXNhcCh0YXNrKSB7XG4gICAgdmFyIHJhd1Rhc2s7XG4gICAgaWYgKGZyZWVUYXNrcy5sZW5ndGgpIHtcbiAgICAgICAgcmF3VGFzayA9IGZyZWVUYXNrcy5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByYXdUYXNrID0gbmV3IFJhd1Rhc2soKTtcbiAgICB9XG4gICAgcmF3VGFzay50YXNrID0gdGFzaztcbiAgICByYXdBc2FwKHJhd1Rhc2spO1xufVxuXG4vLyBXZSB3cmFwIHRhc2tzIHdpdGggcmVjeWNsYWJsZSB0YXNrIG9iamVjdHMuICBBIHRhc2sgb2JqZWN0IGltcGxlbWVudHNcbi8vIGBjYWxsYCwganVzdCBsaWtlIGEgZnVuY3Rpb24uXG5mdW5jdGlvbiBSYXdUYXNrKCkge1xuICAgIHRoaXMudGFzayA9IG51bGw7XG59XG5cbi8vIFRoZSBzb2xlIHB1cnBvc2Ugb2Ygd3JhcHBpbmcgdGhlIHRhc2sgaXMgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgcmVjeWNsZVxuLy8gdGhlIHRhc2sgb2JqZWN0IGFmdGVyIGl0cyBzaW5nbGUgdXNlLlxuUmF3VGFzay5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICB0aGlzLnRhc2suY2FsbCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChhc2FwLm9uZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaG9vayBleGlzdHMgcHVyZWx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgICAgICAgICAgLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0XG4gICAgICAgICAgICAvLyBkZXBlbmRzIG9uIGl0cyBleGlzdGVuY2UuXG4gICAgICAgICAgICBhc2FwLm9uZXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gYSB3ZWIgYnJvd3NlciwgZXhjZXB0aW9ucyBhcmUgbm90IGZhdGFsLiBIb3dldmVyLCB0byBhdm9pZFxuICAgICAgICAgICAgLy8gc2xvd2luZyBkb3duIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIHRhc2tzLCB3ZSByZXRocm93IHRoZSBlcnJvciBpbiBhXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB0dXJuLlxuICAgICAgICAgICAgcGVuZGluZ0Vycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIHJlcXVlc3RFcnJvclRocm93KCk7XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgICAgICBmcmVlVGFza3NbZnJlZVRhc2tzLmxlbmd0aF0gPSB0aGlzO1xuICAgIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXNlIHRoZSBmYXN0ZXN0IG1lYW5zIHBvc3NpYmxlIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGl0cyBvd24gdHVybiwgd2l0aFxuLy8gcHJpb3JpdHkgb3ZlciBvdGhlciBldmVudHMgaW5jbHVkaW5nIElPLCBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlZHJhd1xuLy8gZXZlbnRzIGluIGJyb3dzZXJzLlxuLy9cbi8vIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSB0YXNrIHdpbGwgcGVybWFuZW50bHkgaW50ZXJydXB0IHRoZSBwcm9jZXNzaW5nIG9mXG4vLyBzdWJzZXF1ZW50IHRhc2tzLiBUaGUgaGlnaGVyIGxldmVsIGBhc2FwYCBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSB0YXNrLCB0aGF0IHRoZSB0YXNrIHF1ZXVlIHdpbGwgY29udGludWUgZmx1c2hpbmcgYXNcbi8vIHNvb24gYXMgcG9zc2libGUsIGJ1dCBpZiB5b3UgdXNlIGByYXdBc2FwYCBkaXJlY3RseSwgeW91IGFyZSByZXNwb25zaWJsZSB0b1xuLy8gZWl0aGVyIGVuc3VyZSB0aGF0IG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHlvdXIgdGFzaywgb3IgdG8gbWFudWFsbHlcbi8vIGNhbGwgYHJhd0FzYXAucmVxdWVzdEZsdXNoYCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxubW9kdWxlLmV4cG9ydHMgPSByYXdBc2FwO1xuZnVuY3Rpb24gcmF3QXNhcCh0YXNrKSB7XG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmVxdWVzdEZsdXNoKCk7XG4gICAgICAgIGZsdXNoaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRXF1aXZhbGVudCB0byBwdXNoLCBidXQgYXZvaWRzIGEgZnVuY3Rpb24gY2FsbC5cbiAgICBxdWV1ZVtxdWV1ZS5sZW5ndGhdID0gdGFzaztcbn1cblxudmFyIHF1ZXVlID0gW107XG4vLyBPbmNlIGEgZmx1c2ggaGFzIGJlZW4gcmVxdWVzdGVkLCBubyBmdXJ0aGVyIGNhbGxzIHRvIGByZXF1ZXN0Rmx1c2hgIGFyZVxuLy8gbmVjZXNzYXJ5IHVudGlsIHRoZSBuZXh0IGBmbHVzaGAgY29tcGxldGVzLlxudmFyIGZsdXNoaW5nID0gZmFsc2U7XG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBtZXRob2QgdGhhdCBhdHRlbXB0cyB0byBraWNrXG4vLyBvZmYgYSBgZmx1c2hgIGV2ZW50IGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIGBmbHVzaGAgd2lsbCBhdHRlbXB0IHRvIGV4aGF1c3Rcbi8vIHRoZSBldmVudCBxdWV1ZSBiZWZvcmUgeWllbGRpbmcgdG8gdGhlIGJyb3dzZXIncyBvd24gZXZlbnQgbG9vcC5cbnZhciByZXF1ZXN0Rmx1c2g7XG4vLyBUaGUgcG9zaXRpb24gb2YgdGhlIG5leHQgdGFzayB0byBleGVjdXRlIGluIHRoZSB0YXNrIHF1ZXVlLiBUaGlzIGlzXG4vLyBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0byBgZmx1c2hgIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3VtZWQgaWZcbi8vIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLlxudmFyIGluZGV4ID0gMDtcbi8vIElmIGEgdGFzayBzY2hlZHVsZXMgYWRkaXRpb25hbCB0YXNrcyByZWN1cnNpdmVseSwgdGhlIHRhc2sgcXVldWUgY2FuIGdyb3dcbi8vIHVuYm91bmRlZC4gVG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiwgdGhlIHRhc2sgcXVldWUgd2lsbCBwZXJpb2RpY2FsbHlcbi8vIHRydW5jYXRlIGFscmVhZHktY29tcGxldGVkIHRhc2tzLlxudmFyIGNhcGFjaXR5ID0gMTAyNDtcblxuLy8gVGhlIGZsdXNoIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgdGFza3MgdGhhdCBoYXZlIGJlZW4gc2NoZWR1bGVkIHdpdGhcbi8vIGByYXdBc2FwYCB1bmxlc3MgYW5kIHVudGlsIG9uZSBvZiB0aG9zZSB0YXNrcyB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuLy8gSWYgYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24sIGBmbHVzaGAgZW5zdXJlcyB0aGF0IGl0cyBzdGF0ZSB3aWxsIHJlbWFpblxuLy8gY29uc2lzdGVudCBhbmQgd2lsbCByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgd2hlbiBjYWxsZWQgYWdhaW4uXG4vLyBIb3dldmVyLCBgZmx1c2hgIGRvZXMgbm90IG1ha2UgYW55IGFycmFuZ2VtZW50cyB0byBiZSBjYWxsZWQgYWdhaW4gaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBBZHZhbmNlIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgdGFzay4gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbFxuICAgICAgICAvLyBiZWdpbiBmbHVzaGluZyBvbiB0aGUgbmV4dCB0YXNrIHRoZSB0YXNrIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHF1ZXVlW2N1cnJlbnRJbmRleF0uY2FsbCgpO1xuICAgICAgICAvLyBQcmV2ZW50IGxlYWtpbmcgbWVtb3J5IGZvciBsb25nIGNoYWlucyBvZiByZWN1cnNpdmUgY2FsbHMgdG8gYGFzYXBgLlxuICAgICAgICAvLyBJZiB3ZSBjYWxsIGBhc2FwYCB3aXRoaW4gdGFza3Mgc2NoZWR1bGVkIGJ5IGBhc2FwYCwgdGhlIHF1ZXVlIHdpbGxcbiAgICAgICAgLy8gZ3JvdywgYnV0IHRvIGF2b2lkIGFuIE8obikgd2FsayBmb3IgZXZlcnkgdGFzayB3ZSBleGVjdXRlLCB3ZSBkb24ndFxuICAgICAgICAvLyBzaGlmdCB0YXNrcyBvZmYgdGhlIHF1ZXVlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGV4ZWN1dGVkLlxuICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBwZXJpb2RpY2FsbHkgc2hpZnQgMTAyNCB0YXNrcyBvZmYgdGhlIHF1ZXVlLlxuICAgICAgICBpZiAoaW5kZXggPiBjYXBhY2l0eSkge1xuICAgICAgICAgICAgLy8gTWFudWFsbHkgc2hpZnQgYWxsIHZhbHVlcyBzdGFydGluZyBhdCB0aGUgaW5kZXggYmFjayB0byB0aGVcbiAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuXG4gICAgICAgICAgICBmb3IgKHZhciBzY2FuID0gMCwgbmV3TGVuZ3RoID0gcXVldWUubGVuZ3RoIC0gaW5kZXg7IHNjYW4gPCBuZXdMZW5ndGg7IHNjYW4rKykge1xuICAgICAgICAgICAgICAgIHF1ZXVlW3NjYW5dID0gcXVldWVbc2NhbiArIGluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLmxlbmd0aCAtPSBpbmRleDtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGluZGV4ID0gMDtcbiAgICBmbHVzaGluZyA9IGZhbHNlO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb21cbi8vIGV2ZXJ5IGF2YWlsYWJsZSBTYXVjZUxhYnMgU2VsZW5pdW0gd2ViIGRyaXZlciB3b3JrZXIgYXQgdGltZSBvZiB3cml0aW5nLlxuLy8gaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMW1HLTVVWUd1cDVxeEdkRU1Xa2hQNkJXQ3owNTNOVWIyRTFRb1VUVTE2dUEvZWRpdCNnaWQ9NzgzNzI0NTkzXG5cbi8vIFNhZmFyaSA2IGFuZCA2LjEgZm9yIGRlc2t0b3AsIGlQYWQsIGFuZCBpUGhvbmUgYXJlIHRoZSBvbmx5IGJyb3dzZXJzIHRoYXRcbi8vIGhhdmUgV2ViS2l0TXV0YXRpb25PYnNlcnZlciBidXQgbm90IHVuLXByZWZpeGVkIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXN0IHVzZSBgZ2xvYmFsYCBvciBgc2VsZmAgaW5zdGVhZCBvZiBgd2luZG93YCB0byB3b3JrIGluIGJvdGggZnJhbWVzIGFuZCB3ZWJcbi8vIHdvcmtlcnMuIGBnbG9iYWxgIGlzIGEgcHJvdmlzaW9uIG9mIEJyb3dzZXJpZnksIE1yLCBNcnMsIG9yIE1vcC5cblxuLyogZ2xvYmFscyBzZWxmICovXG52YXIgc2NvcGUgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogc2VsZjtcbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IHNjb3BlLk11dGF0aW9uT2JzZXJ2ZXIgfHwgc2NvcGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuLy8gTXV0YXRpb25PYnNlcnZlcnMgYXJlIGRlc2lyYWJsZSBiZWNhdXNlIHRoZXkgaGF2ZSBoaWdoIHByaW9yaXR5IGFuZCB3b3JrXG4vLyByZWxpYWJseSBldmVyeXdoZXJlIHRoZXkgYXJlIGltcGxlbWVudGVkLlxuLy8gVGhleSBhcmUgaW1wbGVtZW50ZWQgaW4gYWxsIG1vZGVybiBicm93c2Vycy5cbi8vXG4vLyAtIEFuZHJvaWQgNC00LjNcbi8vIC0gQ2hyb21lIDI2LTM0XG4vLyAtIEZpcmVmb3ggMTQtMjlcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbi8vIC0gaVBhZCBTYWZhcmkgNi03LjFcbi8vIC0gaVBob25lIFNhZmFyaSA3LTcuMVxuLy8gLSBTYWZhcmkgNi03XG5pZiAodHlwZW9mIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihmbHVzaCk7XG5cbi8vIE1lc3NhZ2VDaGFubmVscyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBnaXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIEhUTUxcbi8vIHRhc2sgcXVldWUsIGFyZSBpbXBsZW1lbnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCwgU2FmYXJpIDUuMC0xLCBhbmQgT3BlcmFcbi8vIDExLTEyLCBhbmQgaW4gd2ViIHdvcmtlcnMgaW4gbWFueSBlbmdpbmVzLlxuLy8gQWx0aG91Z2ggbWVzc2FnZSBjaGFubmVscyB5aWVsZCB0byBhbnkgcXVldWVkIHJlbmRlcmluZyBhbmQgSU8gdGFza3MsIHRoZXlcbi8vIHdvdWxkIGJlIGJldHRlciB0aGFuIGltcG9zaW5nIHRoZSA0bXMgZGVsYXkgb2YgdGltZXJzLlxuLy8gSG93ZXZlciwgdGhleSBkbyBub3Qgd29yayByZWxpYWJseSBpbiBJbnRlcm5ldCBFeHBsb3JlciBvciBTYWZhcmkuXG5cbi8vIEludGVybmV0IEV4cGxvcmVyIDEwIGlzIHRoZSBvbmx5IGJyb3dzZXIgdGhhdCBoYXMgc2V0SW1tZWRpYXRlIGJ1dCBkb2VzXG4vLyBub3QgaGF2ZSBNdXRhdGlvbk9ic2VydmVycy5cbi8vIEFsdGhvdWdoIHNldEltbWVkaWF0ZSB5aWVsZHMgdG8gdGhlIGJyb3dzZXIncyByZW5kZXJlciwgaXQgd291bGQgYmVcbi8vIHByZWZlcnJhYmxlIHRvIGZhbGxpbmcgYmFjayB0byBzZXRUaW1lb3V0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmVcbi8vIHRoZSBtaW5pbXVtIDRtcyBwZW5hbHR5LlxuLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwIE1vYmlsZSAoYW5kXG4vLyBEZXNrdG9wIHRvIGEgbGVzc2VyIGV4dGVudCkgdGhhdCByZW5kZXJzIGJvdGggc2V0SW1tZWRpYXRlIGFuZFxuLy8gTWVzc2FnZUNoYW5uZWwgdXNlbGVzcyBmb3IgdGhlIHB1cnBvc2VzIG9mIEFTQVAuXG4vLyBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3EvaXNzdWVzLzM5NlxuXG4vLyBUaW1lcnMgYXJlIGltcGxlbWVudGVkIHVuaXZlcnNhbGx5LlxuLy8gV2UgZmFsbCBiYWNrIHRvIHRpbWVycyBpbiB3b3JrZXJzIGluIG1vc3QgZW5naW5lcywgYW5kIGluIGZvcmVncm91bmRcbi8vIGNvbnRleHRzIGluIHRoZSBmb2xsb3dpbmcgYnJvd3NlcnMuXG4vLyBIb3dldmVyLCBub3RlIHRoYXQgZXZlbiB0aGlzIHNpbXBsZSBjYXNlIHJlcXVpcmVzIG51YW5jZXMgdG8gb3BlcmF0ZSBpbiBhXG4vLyBicm9hZCBzcGVjdHJ1bSBvZiBicm93c2Vycy5cbi8vXG4vLyAtIEZpcmVmb3ggMy0xM1xuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciA2LTlcbi8vIC0gaVBhZCBTYWZhcmkgNC4zXG4vLyAtIEx5bnggMi44Ljdcbn0gZWxzZSB7XG4gICAgcmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGZsdXNoKTtcbn1cblxuLy8gYHJlcXVlc3RGbHVzaGAgcmVxdWVzdHMgdGhhdCB0aGUgaGlnaCBwcmlvcml0eSBldmVudCBxdWV1ZSBiZSBmbHVzaGVkIGFzXG4vLyBzb29uIGFzIHBvc3NpYmxlLlxuLy8gVGhpcyBpcyB1c2VmdWwgdG8gcHJldmVudCBhbiBlcnJvciB0aHJvd24gaW4gYSB0YXNrIGZyb20gc3RhbGxpbmcgdGhlIGV2ZW50XG4vLyBxdWV1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhbmRsZWQgYnkgTm9kZS5qc+KAmXNcbi8vIGBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIilgIG9yIGJ5IGEgZG9tYWluLlxucmF3QXNhcC5yZXF1ZXN0Rmx1c2ggPSByZXF1ZXN0Rmx1c2g7XG5cbi8vIFRvIHJlcXVlc3QgYSBoaWdoIHByaW9yaXR5IGV2ZW50LCB3ZSBpbmR1Y2UgYSBtdXRhdGlvbiBvYnNlcnZlciBieSB0b2dnbGluZ1xuLy8gdGhlIHRleHQgb2YgYSB0ZXh0IG5vZGUgYmV0d2VlbiBcIjFcIiBhbmQgXCItMVwiLlxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICB2YXIgdG9nZ2xlID0gMTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pO1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgdG9nZ2xlID0gLXRvZ2dsZTtcbiAgICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlO1xuICAgIH07XG59XG5cbi8vIFRoZSBtZXNzYWdlIGNoYW5uZWwgdGVjaG5pcXVlIHdhcyBkaXNjb3ZlcmVkIGJ5IE1hbHRlIFVibCBhbmQgd2FzIHRoZVxuLy8gb3JpZ2luYWwgZm91bmRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LlxuLy8gaHR0cDovL3d3dy5ub25ibG9ja2luZy5pby8yMDExLzA2L3dpbmRvd25leHR0aWNrLmh0bWxcblxuLy8gU2FmYXJpIDYuMC41IChhdCBsZWFzdCkgaW50ZXJtaXR0ZW50bHkgZmFpbHMgdG8gY3JlYXRlIG1lc3NhZ2UgcG9ydHMgb24gYVxuLy8gcGFnZSdzIGZpcnN0IGxvYWQuIFRoYW5rZnVsbHksIHRoaXMgdmVyc2lvbiBvZiBTYWZhcmkgc3VwcG9ydHNcbi8vIE11dGF0aW9uT2JzZXJ2ZXJzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGZhbGwgYmFjayBpbiB0aGF0IGNhc2UuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NZXNzYWdlQ2hhbm5lbChjYWxsYmFjaykge1xuLy8gICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4vLyAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gRm9yIHJlYXNvbnMgZXhwbGFpbmVkIGFib3ZlLCB3ZSBhcmUgYWxzbyB1bmFibGUgdG8gdXNlIGBzZXRJbW1lZGlhdGVgXG4vLyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy5cbi8vIEV2ZW4gaWYgd2Ugd2VyZSwgdGhlcmUgaXMgYW5vdGhlciBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAuXG4vLyBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBhc3NpZ24gYHNldEltbWVkaWF0ZWAgdG8gYHJlcXVlc3RGbHVzaGAgYmVjYXVzZVxuLy8gYHNldEltbWVkaWF0ZWAgbXVzdCBiZSBjYWxsZWQgKmJ5IG5hbWUqIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB3cmFwcGVkIGluIGFcbi8vIGNsb3N1cmUuXG4vLyBOZXZlciBmb3JnZXQuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21TZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gU2FmYXJpIDYuMCBoYXMgYSBwcm9ibGVtIHdoZXJlIHRpbWVycyB3aWxsIGdldCBsb3N0IHdoaWxlIHRoZSB1c2VyIGlzXG4vLyBzY3JvbGxpbmcuIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBpbXBhY3QgQVNBUCBiZWNhdXNlIFNhZmFyaSA2LjAgc3VwcG9ydHNcbi8vIG11dGF0aW9uIG9ic2VydmVycywgc28gdGhhdCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGluc3RlYWQuXG4vLyBIb3dldmVyLCBpZiB3ZSBldmVyIGVsZWN0IHRvIHVzZSB0aW1lcnMgaW4gU2FmYXJpLCB0aGUgcHJldmFsZW50IHdvcmstYXJvdW5kXG4vLyBpcyB0byBhZGQgYSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYWxscyBmb3IgYSBmbHVzaC5cblxuLy8gYHNldFRpbWVvdXRgIGRvZXMgbm90IGNhbGwgdGhlIHBhc3NlZCBjYWxsYmFjayBpZiB0aGUgZGVsYXkgaXMgbGVzcyB0aGFuXG4vLyBhcHByb3hpbWF0ZWx5IDcgaW4gd2ViIHdvcmtlcnMgaW4gRmlyZWZveCA4IHRocm91Z2ggMTgsIGFuZCBzb21ldGltZXMgbm90XG4vLyBldmVuIHRoZW4uXG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgLy8gV2UgZGlzcGF0Y2ggYSB0aW1lb3V0IHdpdGggYSBzcGVjaWZpZWQgZGVsYXkgb2YgMCBmb3IgZW5naW5lcyB0aGF0XG4gICAgICAgIC8vIGNhbiByZWxpYWJseSBhY2NvbW1vZGF0ZSB0aGF0IHJlcXVlc3QuIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHNuYXBwZWRcbiAgICAgICAgLy8gdG8gYSA0IG1pbGlzZWNvbmQgZGVsYXksIGJ1dCBvbmNlIHdlJ3JlIGZsdXNoaW5nLCB0aGVyZSdzIG5vIGRlbGF5XG4gICAgICAgIC8vIGJldHdlZW4gZXZlbnRzLlxuICAgICAgICB2YXIgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoaGFuZGxlVGltZXIsIDApO1xuICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGlzIHRpbWVyIGdldHMgZnJlcXVlbnRseSBkcm9wcGVkIGluIEZpcmVmb3hcbiAgICAgICAgLy8gd29ya2Vycywgd2UgZW5saXN0IGFuIGludGVydmFsIGhhbmRsZSB0aGF0IHdpbGwgdHJ5IHRvIGZpcmVcbiAgICAgICAgLy8gYW4gZXZlbnQgMjAgdGltZXMgcGVyIHNlY29uZCB1bnRpbCBpdCBzdWNjZWVkcy5cbiAgICAgICAgdmFyIGludGVydmFsSGFuZGxlID0gc2V0SW50ZXJ2YWwoaGFuZGxlVGltZXIsIDUwKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVUaW1lcigpIHtcbiAgICAgICAgICAgIC8vIFdoaWNoZXZlciB0aW1lciBzdWNjZWVkcyB3aWxsIGNhbmNlbCBib3RoIHRpbWVycyBhbmRcbiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8gVGhpcyBpcyBmb3IgYGFzYXAuanNgIG9ubHkuXG4vLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXQgZGVwZW5kcyBvblxuLy8gaXRzIGV4aXN0ZW5jZS5cbnJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyO1xuXG4vLyBBU0FQIHdhcyBvcmlnaW5hbGx5IGEgbmV4dFRpY2sgc2hpbSBpbmNsdWRlZCBpbiBRLiBUaGlzIHdhcyBmYWN0b3JlZCBvdXRcbi8vIGludG8gdGhpcyBBU0FQIHBhY2thZ2UuIEl0IHdhcyBsYXRlciBhZGFwdGVkIHRvIFJTVlAgd2hpY2ggbWFkZSBmdXJ0aGVyXG4vLyBhbWVuZG1lbnRzLiBUaGVzZSBkZWNpc2lvbnMsIHBhcnRpY3VsYXJseSB0byBtYXJnaW5hbGl6ZSBNZXNzYWdlQ2hhbm5lbCBhbmRcbi8vIHRvIGNhcHR1cmUgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaW4gYSBjbG9zdXJlLCB3ZXJlIGludGVncmF0ZWRcbi8vIGJhY2sgaW50byBBU0FQIHByb3Blci5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9jZGRmNzIzMjU0NmE5Y2Y4NTg1MjRiNzVjZGU2ZjllZGY3MjYyMGE3L2xpYi9yc3ZwL2FzYXAuanNcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIHBsYWNlSG9sZGVyc0NvdW50IChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIHRoZSBudW1iZXIgb2YgZXF1YWwgc2lnbnMgKHBsYWNlIGhvbGRlcnMpXG4gIC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcbiAgLy8gcmVwcmVzZW50IG9uZSBieXRlXG4gIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lLCB0aGVuIHRoZSB0aHJlZSBjaGFyYWN0ZXJzIGJlZm9yZSBpdCByZXByZXNlbnQgMiBieXRlc1xuICAvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG4gIHJldHVybiBiNjRbbGVuIC0gMl0gPT09ICc9JyA/IDIgOiBiNjRbbGVuIC0gMV0gPT09ICc9JyA/IDEgOiAwXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbiAgcmV0dXJuIGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVyc0NvdW50KGI2NClcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBwbGFjZUhvbGRlcnMgPSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG5cbiAgYXJyID0gbmV3IEFycihsZW4gKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlblxuXG4gIHZhciBMID0gMFxuXG4gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9IGVsc2UgaWYgKHBsYWNlSG9sZGVycyA9PT0gMSkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICsgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9PSdcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgKHVpbnQ4W2xlbiAtIDFdKVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz0nXG4gIH1cblxuICBwYXJ0cy5wdXNoKG91dHB1dClcblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5Qcm9taXNlOyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpXG4gICwgQXJyYXlQcm90byAgPSBBcnJheS5wcm90b3R5cGU7XG5pZihBcnJheVByb3RvW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpe1xuICBpZighKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSl7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59OyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCB0b0luZGV4ICAgPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihJU19JTkNMVURFUyl7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG4gICAgICAsIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICBpZih2YWx1ZSAhPSB2YWx1ZSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG4gICAgICBpZihPW2luZGV4XSA9PT0gZWwpcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTsiLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJylcbiAgLy8gRVMzIHdyb25nIGhlcmVcbiAgLCBBUkcgPSBjb2YoZnVuY3Rpb24oKXsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59OyIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07IiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcbmlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07IiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCByZWRlZmluZSAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSlcbiAgICAsIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZih0YXJnZXQpcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYoZXhwb3J0c1trZXldICE9IG91dCloaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZihJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dClleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTsiLCJ2YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNhbGwgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKVxuICAsIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgZ2V0SXRlckZuICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpXG4gICwgQlJFQUsgICAgICAgPSB7fVxuICAsIFJFVFVSTiAgICAgID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUil7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSlcbiAgICAsIGYgICAgICA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKVxuICAgICwgaW5kZXggID0gMFxuICAgICwgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZih0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZihpc0FycmF5SXRlcihpdGVyRm4pKWZvcihsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyApe1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07IiwidmFyIGRQICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OyIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7IiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGF0KXtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2goYXJncy5sZW5ndGgpe1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncyk7XG59OyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59OyIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCBJVEVSQVRPUiAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoKGUpe1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYocmV0ICE9PSB1bmRlZmluZWQpYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGRlc2NyaXB0b3IgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwge25leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCl9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTsiLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZG9uZSwgdmFsdWUpe1xuICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlOyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKXBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUoaGVhZCl7XG4gICAgICBmbiAgID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgaWYoaGVhZClub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZihpc05vZGUpe1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXJcbiAgfSBlbHNlIGlmKE9ic2VydmVyKXtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZVxuICAgICAgLCBub2RlICAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKXtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihmbil7XG4gICAgdmFyIHRhc2sgPSB7Zm46IGZuLCBuZXh0OiB1bmRlZmluZWR9O1xuICAgIGlmKGxhc3QpbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZighaGVhZCl7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59OyIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcbiAgICAsIGx0ICAgICA9ICc8J1xuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuICB2YXIgcmVzdWx0O1xuICBpZihPICE9PSBudWxsKXtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyl7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07IiwidmFyIGRQICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcyl7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAsIGkgPSAwXG4gICAgLCBQO1xuICB3aGlsZShsZW5ndGggPiBpKWRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTsiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59OyIsInZhciBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHRvSU9iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpXG4gICwgSUVfUFJPVE8gICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAsIGkgICAgICA9IDBcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBrZXk7XG4gIGZvcihrZXkgaW4gTylpZihrZXkgIT0gSUVfUFJPVE8paGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTsiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pe1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07IiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMsIHNhZmUpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBTUkMgICAgICAgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJylcbiAgLCBUT19TVFJJTkcgPSAndG9TdHJpbmcnXG4gICwgJHRvU3RyaW5nID0gRnVuY3Rpb25bVE9fU1RSSU5HXVxuICAsIFRQTCAgICAgICA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBrZXksIHZhbCwgc2FmZSl7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYoT1trZXldID09PSB2YWwpcmV0dXJuO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZihPID09PSBnbG9iYWwpe1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBpZighc2FmZSl7XG4gICAgICBkZWxldGUgT1trZXldO1xuICAgICAgaGlkZShPLCBrZXksIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKE9ba2V5XSlPW2tleV0gPSB2YWw7XG4gICAgICBlbHNlIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH1cbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBkUCAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgU1BFQ0lFUyAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSl7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pZFAuZihDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59OyIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgaGFzID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgdGFnLCBzdGF0KXtcbiAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xufTsiLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTsiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuICAsIHN0b3JlICA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG59OyIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgU1BFQ0lFUyAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywgRCl7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3IsIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIGRlZmluZWQgICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRPX1NUUklORyl7XG4gIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG4gICAgICAsIGkgPSB0b0ludGVnZXIocG9zKVxuICAgICAgLCBsID0gcy5sZW5ndGhcbiAgICAgICwgYSwgYjtcbiAgICBpZihpIDwgMCB8fCBpID49IGwpcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07IiwidmFyIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgaW52b2tlICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faW52b2tlJylcbiAgLCBodG1sICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19odG1sJylcbiAgLCBjZWwgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgc2V0VGFzayAgICAgICAgICAgID0gZ2xvYmFsLnNldEltbWVkaWF0ZVxuICAsIGNsZWFyVGFzayAgICAgICAgICA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZVxuICAsIE1lc3NhZ2VDaGFubmVsICAgICA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbFxuICAsIGNvdW50ZXIgICAgICAgICAgICA9IDBcbiAgLCBxdWV1ZSAgICAgICAgICAgICAgPSB7fVxuICAsIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24oKXtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIGlmKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSl7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYoIXNldFRhc2sgfHwgIWNsZWFyVGFzayl7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pe1xuICAgIHZhciBhcmdzID0gW10sIGkgPSAxO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uKCl7XG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpe1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZihyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcycpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmKE1lc3NhZ2VDaGFubmVsKXtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsO1xuICAgIHBvcnQgICAgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZihPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbigpe1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogICBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpbmRleCwgbGVuZ3RoKXtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07IiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59OyIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07IiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpe1xuICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59OyIsInZhciBpZCA9IDBcbiAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59OyIsInZhciBzdG9yZSAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpXG4gICwgdWlkICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgU3ltYm9sICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbFxuICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlOyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ICE9IHVuZGVmaW5lZClyZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJylcbiAgLCBzdGVwICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBJdGVyYXRvcnMgICAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBraW5kICA9IHRoaXMuX2tcbiAgICAsIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJyl7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufSIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2xhc3NvZiAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgJGV4cG9ydCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBpc09iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuSW5zdGFuY2UgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIHRhc2sgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBtaWNyb3Rhc2sgICAgICAgICAgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpXG4gICwgUFJPTUlTRSAgICAgICAgICAgID0gJ1Byb21pc2UnXG4gICwgVHlwZUVycm9yICAgICAgICAgID0gZ2xvYmFsLlR5cGVFcnJvclxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgJFByb21pc2UgICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgICAgICAgICAgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGVtcHR5ICAgICAgICAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBJbnRlcm5hbCwgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24oKXtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSAgICAgPSAkUHJvbWlzZS5yZXNvbHZlKDEpXG4gICAgICAsIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbihleGVjKXsgZXhlYyhlbXB0eSwgZW1wdHkpOyB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICByZXR1cm4gc2FtZUNvbnN0cnVjdG9yKCRQcm9taXNlLCBDKVxuICAgID8gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgOiBuZXcgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbigkJHJlc29sdmUsICQkcmVqZWN0KXtcbiAgICBpZihyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ICA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCAgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihwcm9taXNlLCBpc1JlamVjdCl7XG4gIGlmKHByb21pc2UuX24pcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBvayAgICA9IHByb21pc2UuX3MgPT0gMVxuICAgICAgLCBpICAgICA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uKHJlYWN0aW9uKXtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWxcbiAgICAgICAgLCByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZVxuICAgICAgICAsIHJlamVjdCAgPSByZWFjdGlvbi5yZWplY3RcbiAgICAgICAgLCBkb21haW4gID0gcmVhY3Rpb24uZG9tYWluXG4gICAgICAgICwgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoaGFuZGxlcil7XG4gICAgICAgICAgaWYoIW9rKXtcbiAgICAgICAgICAgIGlmKHByb21pc2UuX2ggPT0gMilvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihoYW5kbGVyID09PSB0cnVlKXJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgYWJydXB0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZihhYnJ1cHQpdGhyb3cgYWJydXB0LmVycm9yO1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgaWYocHJvbWlzZS5faCA9PSAxKXJldHVybiBmYWxzZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jXG4gICAgLCBpICAgICA9IDBcbiAgICAsIHJlYWN0aW9uO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmKGlzTm9kZSl7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpe1xuICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92fSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZighcHJvbWlzZS5fYSlwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXNcbiAgICAsIHRoZW47XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocHJvbWlzZSA9PT0gdmFsdWUpdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKXtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgICAgICB2YXIgd3JhcHBlciA9IHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7X3c6IHByb21pc2UsIF9kOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2goZXJyKXtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpe1xuICAgICAgdmFyIHJlYWN0aW9uICAgID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayAgICAgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgICA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX2EpdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX3Mpbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGVkKXtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHByb21pc2UgID0gbmV3IEludGVybmFsO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCAgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtQcm9taXNlOiAkUHJvbWlzZX0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVqZWN0ICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpe1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZih4IGluc3RhbmNlb2YgJFByb21pc2UgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpKXJldHVybiB4O1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZXNvbHZlICA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICAkJHJlc29sdmUoeCk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZXNvbHZlICAgID0gY2FwYWJpbGl0eS5yZXNvbHZlXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgdmFyIHZhbHVlcyAgICA9IFtdXG4gICAgICAgICwgaW5kZXggICAgID0gMFxuICAgICAgICAsIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICB2YXIgJGluZGV4ICAgICAgICA9IGluZGV4KytcbiAgICAgICAgICAsIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICBpZihhbHJlYWR5Q2FsbGVkKXJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkICA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24oaXRlcmF0ZWQpe1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBpbmRleCA9IHRoaXMuX2lcbiAgICAsIHBvaW50O1xuICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xufSk7IiwidmFyICRpdGVyYXRvcnMgICAgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpXG4gICwgcmVkZWZpbmUgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBnbG9iYWwgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgSXRlcmF0b3JzICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgd2tzICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICwgSVRFUkFUT1IgICAgICA9IHdrcygnaXRlcmF0b3InKVxuICAsIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJylcbiAgLCBBcnJheVZhbHVlcyAgID0gSXRlcmF0b3JzLkFycmF5O1xuXG5mb3IodmFyIGNvbGxlY3Rpb25zID0gWydOb2RlTGlzdCcsICdET01Ub2tlbkxpc3QnLCAnTWVkaWFMaXN0JywgJ1N0eWxlU2hlZXRMaXN0JywgJ0NTU1J1bGVMaXN0J10sIGkgPSAwOyBpIDwgNTsgaSsrKXtcbiAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuICAgICwgcHJvdG8gICAgICA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGVcbiAgICAsIGtleTtcbiAgaWYocHJvdG8pe1xuICAgIGlmKCFwcm90b1tJVEVSQVRPUl0paGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZighcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgZm9yKGtleSBpbiAkaXRlcmF0b3JzKWlmKCFwcm90b1trZXldKXJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlKSByZXR1cm4gdHJpYW5nbGVzO1xuXG4gICAgdmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIHNpemU7XG5cbiAgICBpZiAoaGFzSG9sZXMpIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSk7XG5cbiAgICAvLyBpZiB0aGUgc2hhcGUgaXMgbm90IHRvbyBzaW1wbGUsIHdlJ2xsIHVzZSB6LW9yZGVyIGN1cnZlIGhhc2ggbGF0ZXI7IGNhbGN1bGF0ZSBwb2x5Z29uIGJib3hcbiAgICBpZiAoZGF0YS5sZW5ndGggPiA4MCAqIGRpbSkge1xuICAgICAgICBtaW5YID0gbWF4WCA9IGRhdGFbMF07XG4gICAgICAgIG1pblkgPSBtYXhZID0gZGF0YVsxXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltKSB7XG4gICAgICAgICAgICB4ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHkgPSBkYXRhW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtaW5YLCBtaW5ZIGFuZCBzaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuICAgICAgICBzaXplID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcbiAgICB9XG5cbiAgICBlYXJjdXRMaW5rZWQob3V0ZXJOb2RlLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICByZXR1cm4gdHJpYW5nbGVzO1xufVxuXG4vLyBjcmVhdGUgYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QgZnJvbSBwb2x5Z29uIHBvaW50cyBpbiB0aGUgc3BlY2lmaWVkIHdpbmRpbmcgb3JkZXJcbmZ1bmN0aW9uIGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBjbG9ja3dpc2UpIHtcbiAgICB2YXIgaSwgbGFzdDtcblxuICAgIGlmIChjbG9ja3dpc2UgPT09IChzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkgPiAwKSkge1xuICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSBlbmQgLSBkaW07IGkgPj0gc3RhcnQ7IGkgLT0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfVxuXG4gICAgaWYgKGxhc3QgJiYgZXF1YWxzKGxhc3QsIGxhc3QubmV4dCkpIHtcbiAgICAgICAgcmVtb3ZlTm9kZShsYXN0KTtcbiAgICAgICAgbGFzdCA9IGxhc3QubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFzdDtcbn1cblxuLy8gZWxpbWluYXRlIGNvbGluZWFyIG9yIGR1cGxpY2F0ZSBwb2ludHNcbmZ1bmN0aW9uIGZpbHRlclBvaW50cyhzdGFydCwgZW5kKSB7XG4gICAgaWYgKCFzdGFydCkgcmV0dXJuIHN0YXJ0O1xuICAgIGlmICghZW5kKSBlbmQgPSBzdGFydDtcblxuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGFnYWluO1xuICAgIGRvIHtcbiAgICAgICAgYWdhaW4gPSBmYWxzZTtcblxuICAgICAgICBpZiAoIXAuc3RlaW5lciAmJiAoZXF1YWxzKHAsIHAubmV4dCkgfHwgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPT09IDApKSB7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcCA9IGVuZCA9IHAucHJldjtcbiAgICAgICAgICAgIGlmIChwID09PSBwLm5leHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgYWdhaW4gPSB0cnVlO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwID0gcC5uZXh0O1xuICAgICAgICB9XG4gICAgfSB3aGlsZSAoYWdhaW4gfHwgcCAhPT0gZW5kKTtcblxuICAgIHJldHVybiBlbmQ7XG59XG5cbi8vIG1haW4gZWFyIHNsaWNpbmcgbG9vcCB3aGljaCB0cmlhbmd1bGF0ZXMgYSBwb2x5Z29uIChnaXZlbiBhcyBhIGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIHBhc3MpIHtcbiAgICBpZiAoIWVhcikgcmV0dXJuO1xuXG4gICAgLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuICAgIGlmICghcGFzcyAmJiBzaXplKSBpbmRleEN1cnZlKGVhciwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICB2YXIgc3RvcCA9IGVhcixcbiAgICAgICAgcHJldiwgbmV4dDtcblxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBlYXJzLCBzbGljaW5nIHRoZW0gb25lIGJ5IG9uZVxuICAgIHdoaWxlIChlYXIucHJldiAhPT0gZWFyLm5leHQpIHtcbiAgICAgICAgcHJldiA9IGVhci5wcmV2O1xuICAgICAgICBuZXh0ID0gZWFyLm5leHQ7XG5cbiAgICAgICAgaWYgKHNpemUgPyBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIHNpemUpIDogaXNFYXIoZWFyKSkge1xuICAgICAgICAgICAgLy8gY3V0IG9mZiB0aGUgdHJpYW5nbGVcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHByZXYuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChlYXIuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChuZXh0LmkgLyBkaW0pO1xuXG4gICAgICAgICAgICByZW1vdmVOb2RlKGVhcik7XG5cbiAgICAgICAgICAgIC8vIHNraXBwaW5nIHRoZSBuZXh0IHZlcnRpY2UgbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXG4gICAgICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7XG4gICAgICAgICAgICBzdG9wID0gbmV4dC5uZXh0O1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhciA9IG5leHQ7XG5cbiAgICAgICAgLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcbiAgICAgICAgaWYgKGVhciA9PT0gc3RvcCkge1xuICAgICAgICAgICAgLy8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cbiAgICAgICAgICAgIGlmICghcGFzcykge1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDEpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhlYXIsIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIHNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICAvLyBmaXJzdCBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBpbmNyZWFzaW5nIHotb3JkZXJcbiAgICB2YXIgcCA9IGVhci5uZXh0WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyB0aGVuIGxvb2sgZm9yIHBvaW50cyBpbiBkZWNyZWFzaW5nIHotb3JkZXJcbiAgICBwID0gZWFyLnByZXZaO1xuXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBnbyB0aHJvdWdoIGFsbCBwb2x5Z29uIG5vZGVzIGFuZCBjdXJlIHNtYWxsIGxvY2FsIHNlbGYtaW50ZXJzZWN0aW9uc1xuZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzLCBkaW0pIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGEgPSBwLnByZXYsXG4gICAgICAgICAgICBiID0gcC5uZXh0Lm5leHQ7XG5cbiAgICAgICAgaWYgKCFlcXVhbHMoYSwgYikgJiYgaW50ZXJzZWN0cyhhLCBwLCBwLm5leHQsIGIpICYmIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSkge1xuXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChhLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocC5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGIuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHAubmV4dCk7XG5cbiAgICAgICAgICAgIHAgPSBzdGFydCA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gcDtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgb3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcbiAgICBpZiAob3V0ZXJOb2RlKSB7XG4gICAgICAgIHZhciBiID0gc3BsaXRQb2x5Z29uKG91dGVyTm9kZSwgaG9sZSk7XG4gICAgICAgIGZpbHRlclBvaW50cyhiLCBiLm5leHQpO1xuICAgIH1cbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgdmFyIHAgPSBvdXRlck5vZGUsXG4gICAgICAgIGh4ID0gaG9sZS54LFxuICAgICAgICBoeSA9IGhvbGUueSxcbiAgICAgICAgcXggPSAtSW5maW5pdHksXG4gICAgICAgIG07XG5cbiAgICAvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG4gICAgLy8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxuICAgIGRvIHtcbiAgICAgICAgaWYgKGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSkge1xuICAgICAgICAgICAgdmFyIHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7XG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcbiAgICAgICAgICAgICAgICBxeCA9IHg7XG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC55KSByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLm5leHQueSkgcmV0dXJuIHAubmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7XG5cbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGh4ID09PSBxeCkgcmV0dXJuIG0ucHJldjsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbG93ZXIgZW5kcG9pbnRcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIG9mIGhvbGUgcG9pbnQsIHNlZ21lbnQgaW50ZXJzZWN0aW9uIGFuZCBlbmRwb2ludDtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcbiAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxuXG4gICAgdmFyIHN0b3AgPSBtLFxuICAgICAgICBteCA9IG0ueCxcbiAgICAgICAgbXkgPSBtLnksXG4gICAgICAgIHRhbk1pbiA9IEluZmluaXR5LFxuICAgICAgICB0YW47XG5cbiAgICBwID0gbS5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IHN0b3ApIHtcbiAgICAgICAgaWYgKGh4ID49IHAueCAmJiBwLnggPj0gbXggJiZcbiAgICAgICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkpKSB7XG5cbiAgICAgICAgICAgIHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcblxuICAgICAgICAgICAgaWYgKCh0YW4gPCB0YW5NaW4gfHwgKHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCkpICYmIGxvY2FsbHlJbnNpZGUocCwgaG9sZSkpIHtcbiAgICAgICAgICAgICAgICBtID0gcDtcbiAgICAgICAgICAgICAgICB0YW5NaW4gPSB0YW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnogPT09IG51bGwpIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgIHAucHJldlogPSBwLnByZXY7XG4gICAgICAgIHAubmV4dFogPSBwLm5leHQ7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XG4gICAgcC5wcmV2WiA9IG51bGw7XG5cbiAgICBzb3J0TGlua2VkKHApO1xufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcbmZ1bmN0aW9uIHNvcnRMaW5rZWQobGlzdCkge1xuICAgIHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcbiAgICAgICAgaW5TaXplID0gMTtcblxuICAgIGRvIHtcbiAgICAgICAgcCA9IGxpc3Q7XG4gICAgICAgIGxpc3QgPSBudWxsO1xuICAgICAgICB0YWlsID0gbnVsbDtcbiAgICAgICAgbnVtTWVyZ2VzID0gMDtcblxuICAgICAgICB3aGlsZSAocCkge1xuICAgICAgICAgICAgbnVtTWVyZ2VzKys7XG4gICAgICAgICAgICBxID0gcDtcbiAgICAgICAgICAgIHBTaXplID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpblNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHBTaXplKys7XG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgaWYgKCFxKSBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcVNpemUgPSBpblNpemU7XG5cbiAgICAgICAgICAgIHdoaWxlIChwU2l6ZSA+IDAgfHwgKHFTaXplID4gMCAmJiBxKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHBTaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHFTaXplID09PSAwIHx8ICFxKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAueiA8PSBxLnopIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFpbCkgdGFpbC5uZXh0WiA9IGU7XG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcblxuICAgICAgICAgICAgICAgIGUucHJldlogPSB0YWlsO1xuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwID0gcTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xuICAgICAgICBpblNpemUgKj0gMjtcblxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xuXG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIHNpemUgb2YgdGhlIGRhdGEgYm91bmRpbmcgYm94XG5mdW5jdGlvbiB6T3JkZXIoeCwgeSwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIC8vIGNvb3JkcyBhcmUgdHJhbnNmb3JtZWQgaW50byBub24tbmVnYXRpdmUgMTUtYml0IGludGVnZXIgcmFuZ2VcbiAgICB4ID0gMzI3NjcgKiAoeCAtIG1pblgpIC8gc2l6ZTtcbiAgICB5ID0gMzI3NjcgKiAoeSAtIG1pblkpIC8gc2l6ZTtcblxuICAgIHggPSAoeCB8ICh4IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeCA9ICh4IHwgKHggPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB4ID0gKHggfCAoeCA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHggPSAoeCB8ICh4IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICB5ID0gKHkgfCAoeSA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeSA9ICh5IHwgKHkgPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB5ID0gKHkgfCAoeSA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgcmV0dXJuIHggfCAoeSA8PCAxKTtcbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuZnVuY3Rpb24gZ2V0TGVmdG1vc3Qoc3RhcnQpIHtcbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBsZWZ0bW9zdCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueCA8IGxlZnRtb3N0LngpIGxlZnRtb3N0ID0gcDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gbGVmdG1vc3Q7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcbiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpIC0gKGF4IC0gcHgpICogKGN5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGF4IC0gcHgpICogKGJ5IC0gcHkpIC0gKGJ4IC0gcHgpICogKGF5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpIC0gKGN4IC0gcHgpICogKGJ5IC0gcHkpID49IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHtcbiAgICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJlxuICAgICAgICAgICBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkgJiYgbWlkZGxlSW5zaWRlKGEsIGIpO1xufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5mdW5jdGlvbiBhcmVhKHAsIHEsIHIpIHtcbiAgICByZXR1cm4gKHEueSAtIHAueSkgKiAoci54IC0gcS54KSAtIChxLnggLSBwLngpICogKHIueSAtIHEueSk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBwb2ludHMgYXJlIGVxdWFsXG5mdW5jdGlvbiBlcXVhbHMocDEsIHAyKSB7XG4gICAgcmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxuZnVuY3Rpb24gaW50ZXJzZWN0cyhwMSwgcTEsIHAyLCBxMikge1xuICAgIGlmICgoZXF1YWxzKHAxLCBxMSkgJiYgZXF1YWxzKHAyLCBxMikpIHx8XG4gICAgICAgIChlcXVhbHMocDEsIHEyKSAmJiBlcXVhbHMocDIsIHExKSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBhcmVhKHAxLCBxMSwgcDIpID4gMCAhPT0gYXJlYShwMSwgcTEsIHEyKSA+IDAgJiZcbiAgICAgICAgICAgYXJlYShwMiwgcTIsIHAxKSA+IDAgIT09IGFyZWEocDIsIHEyLCBxMSkgPiAwO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oYSwgYikge1xuICAgIHZhciBwID0gYTtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcbiAgICAgICAgICAgICAgICBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpIHJldHVybiB0cnVlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoYSwgYikge1xuICAgIHJldHVybiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA8IDAgP1xuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XG4gICAgICAgIGFyZWEoYSwgYiwgYS5wcmV2KSA8IDAgfHwgYXJlYShhLCBhLm5leHQsIGIpIDwgMDtcbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoYSwgYikge1xuICAgIHZhciBwID0gYSxcbiAgICAgICAgaW5zaWRlID0gZmFsc2UsXG4gICAgICAgIHB4ID0gKGEueCArIGIueCkgLyAyLFxuICAgICAgICBweSA9IChhLnkgKyBiLnkpIC8gMjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgoKHAueSA+IHB5KSAhPT0gKHAubmV4dC55ID4gcHkpKSAmJiAocHggPCAocC5uZXh0LnggLSBwLngpICogKHB5IC0gcC55KSAvIChwLm5leHQueSAtIHAueSkgKyBwLngpKVxuICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBpbnNpZGU7XG59XG5cbi8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bztcbi8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZ1xuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgYTIgPSBuZXcgTm9kZShhLmksIGEueCwgYS55KSxcbiAgICAgICAgYjIgPSBuZXcgTm9kZShiLmksIGIueCwgYi55KSxcbiAgICAgICAgYW4gPSBhLm5leHQsXG4gICAgICAgIGJwID0gYi5wcmV2O1xuXG4gICAgYS5uZXh0ID0gYjtcbiAgICBiLnByZXYgPSBhO1xuXG4gICAgYTIubmV4dCA9IGFuO1xuICAgIGFuLnByZXYgPSBhMjtcblxuICAgIGIyLm5leHQgPSBhMjtcbiAgICBhMi5wcmV2ID0gYjI7XG5cbiAgICBicC5uZXh0ID0gYjI7XG4gICAgYjIucHJldiA9IGJwO1xuXG4gICAgcmV0dXJuIGIyO1xufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZShpLCB4LCB5LCBsYXN0KSB7XG4gICAgdmFyIHAgPSBuZXcgTm9kZShpLCB4LCB5KTtcblxuICAgIGlmICghbGFzdCkge1xuICAgICAgICBwLnByZXYgPSBwO1xuICAgICAgICBwLm5leHQgPSBwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0O1xuICAgICAgICBwLnByZXYgPSBsYXN0O1xuICAgICAgICBsYXN0Lm5leHQucHJldiA9IHA7XG4gICAgICAgIGxhc3QubmV4dCA9IHA7XG4gICAgfVxuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKHApIHtcbiAgICBwLm5leHQucHJldiA9IHAucHJldjtcbiAgICBwLnByZXYubmV4dCA9IHAubmV4dDtcblxuICAgIGlmIChwLnByZXZaKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjtcbiAgICBpZiAocC5uZXh0WikgcC5uZXh0Wi5wcmV2WiA9IHAucHJldlo7XG59XG5cbmZ1bmN0aW9uIE5vZGUoaSwgeCwgeSkge1xuICAgIC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcbiAgICB0aGlzLmkgPSBpO1xuXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGljZSBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgdGhpcy5uZXh0ID0gbnVsbDtcblxuICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcbiAgICB0aGlzLnogPSBudWxsO1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxuICAgIHRoaXMucHJldlogPSBudWxsO1xuICAgIHRoaXMubmV4dFogPSBudWxsO1xuXG4gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcbiAgICB0aGlzLnN0ZWluZXIgPSBmYWxzZTtcbn1cblxuLy8gcmV0dXJuIGEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvbHlnb24gYXJlYSBhbmQgaXRzIHRyaWFuZ3VsYXRpb24gYXJlYTtcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cbmVhcmN1dC5kZXZpYXRpb24gPSBmdW5jdGlvbiAoZGF0YSwgaG9sZUluZGljZXMsIGRpbSwgdHJpYW5nbGVzKSB7XG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuICAgIHZhciBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblxuICAgIHZhciBwb2x5Z29uQXJlYSA9IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSkpO1xuICAgIGlmIChoYXNIb2xlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBwb2x5Z29uQXJlYSAtPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyaWFuZ2xlc0FyZWEgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGEgPSB0cmlhbmdsZXNbaV0gKiBkaW07XG4gICAgICAgIHZhciBiID0gdHJpYW5nbGVzW2kgKyAxXSAqIGRpbTtcbiAgICAgICAgdmFyIGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xuICAgICAgICB0cmlhbmdsZXNBcmVhICs9IE1hdGguYWJzKFxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2NdKSAqIChkYXRhW2IgKyAxXSAtIGRhdGFbYSArIDFdKSAtXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxuICAgICAgICBNYXRoLmFicygodHJpYW5nbGVzQXJlYSAtIHBvbHlnb25BcmVhKSAvIHBvbHlnb25BcmVhKTtcbn07XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xuICAgICAgICBzdW0gKz0gKGRhdGFbal0gLSBkYXRhW2ldKSAqIChkYXRhW2kgKyAxXSArIGRhdGFbaiArIDFdKTtcbiAgICAgICAgaiA9IGk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbi8vIHR1cm4gYSBwb2x5Z29uIGluIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZm9ybSAoZS5nLiBhcyBpbiBHZW9KU09OKSBpbnRvIGEgZm9ybSBFYXJjdXQgYWNjZXB0c1xuZWFyY3V0LmZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBkaW0gPSBkYXRhWzBdWzBdLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0ge3ZlcnRpY2VzOiBbXSwgaG9sZXM6IFtdLCBkaW1lbnNpb25zOiBkaW19LFxuICAgICAgICBob2xlSW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaW07IGQrKykgcmVzdWx0LnZlcnRpY2VzLnB1c2goZGF0YVtpXVtqXVtkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBob2xlSW5kZXggKz0gZGF0YVtpIC0gMV0ubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0LmhvbGVzLnB1c2goaG9sZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsIihmdW5jdGlvbigpe3ZhciBrPSEhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcjtmdW5jdGlvbiBsKGEsYil7az9hLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIixiLCExKTphLmF0dGFjaEV2ZW50KFwic2Nyb2xsXCIsYil9ZnVuY3Rpb24gdihhKXtkb2N1bWVudC5ib2R5P2EoKTprP2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsYSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQoXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIixmdW5jdGlvbigpe1wiaW50ZXJhY3RpdmVcIiE9ZG9jdW1lbnQucmVhZHlTdGF0ZSYmXCJjb21wbGV0ZVwiIT1kb2N1bWVudC5yZWFkeVN0YXRlfHxhKCl9KX07ZnVuY3Rpb24gdyhhKXt0aGlzLmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0aGlzLmEuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIik7dGhpcy5hLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpKTt0aGlzLmI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5jPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5nPS0xO3RoaXMuYi5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7dGhpcy5jLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO292ZXJmbG93OnNjcm9sbDtmb250LXNpemU6MTZweDtcIjtcbnRoaXMuZi5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7dGhpcy5oLnN0eWxlLmNzc1RleHQ9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyMDAlO2hlaWdodDoyMDAlO2ZvbnQtc2l6ZToxNnB4O21heC13aWR0aDpub25lO1wiO3RoaXMuYi5hcHBlbmRDaGlsZCh0aGlzLmgpO3RoaXMuYy5hcHBlbmRDaGlsZCh0aGlzLmYpO3RoaXMuYS5hcHBlbmRDaGlsZCh0aGlzLmIpO3RoaXMuYS5hcHBlbmRDaGlsZCh0aGlzLmMpfVxuZnVuY3Rpb24geShhLGIpe2EuYS5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7bWluLXdpZHRoOjIwcHg7bWluLWhlaWdodDoyMHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDphdXRvO21hcmdpbjowO3BhZGRpbmc6MDt0b3A6LTk5OXB4O2xlZnQ6LTk5OXB4O3doaXRlLXNwYWNlOm5vd3JhcDtmb250OlwiK2IrXCI7XCJ9ZnVuY3Rpb24geihhKXt2YXIgYj1hLmEub2Zmc2V0V2lkdGgsYz1iKzEwMDthLmYuc3R5bGUud2lkdGg9YytcInB4XCI7YS5jLnNjcm9sbExlZnQ9YzthLmIuc2Nyb2xsTGVmdD1hLmIuc2Nyb2xsV2lkdGgrMTAwO3JldHVybiBhLmchPT1iPyhhLmc9YiwhMCk6ITF9ZnVuY3Rpb24gQShhLGIpe2Z1bmN0aW9uIGMoKXt2YXIgYT1tO3ooYSkmJm51bGwhPT1hLmEucGFyZW50Tm9kZSYmYihhLmcpfXZhciBtPWE7bChhLmIsYyk7bChhLmMsYyk7eihhKX07ZnVuY3Rpb24gQihhLGIpe3ZhciBjPWJ8fHt9O3RoaXMuZmFtaWx5PWE7dGhpcy5zdHlsZT1jLnN0eWxlfHxcIm5vcm1hbFwiO3RoaXMud2VpZ2h0PWMud2VpZ2h0fHxcIm5vcm1hbFwiO3RoaXMuc3RyZXRjaD1jLnN0cmV0Y2h8fFwibm9ybWFsXCJ9dmFyIEM9bnVsbCxEPW51bGwsSD0hIXdpbmRvdy5Gb250RmFjZTtmdW5jdGlvbiBJKCl7aWYobnVsbD09PUQpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dHJ5e2Euc3R5bGUuZm9udD1cImNvbmRlbnNlZCAxMDBweCBzYW5zLXNlcmlmXCJ9Y2F0Y2goYil7fUQ9XCJcIiE9PWEuc3R5bGUuZm9udH1yZXR1cm4gRH1mdW5jdGlvbiBKKGEsYil7cmV0dXJuW2Euc3R5bGUsYS53ZWlnaHQsSSgpP2Euc3RyZXRjaDpcIlwiLFwiMTAwcHhcIixiXS5qb2luKFwiIFwiKX1cbkIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLG09YXx8XCJCRVNic3d5XCIseD1ifHwzRTMsRT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtpZihIKXt2YXIgSz1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGUoKXsobmV3IERhdGUpLmdldFRpbWUoKS1FPj14P2IoKTpkb2N1bWVudC5mb250cy5sb2FkKEooYyxjLmZhbWlseSksbSkudGhlbihmdW5jdGlvbihjKXsxPD1jLmxlbmd0aD9hKCk6c2V0VGltZW91dChlLDI1KX0sZnVuY3Rpb24oKXtiKCl9KX1lKCl9KSxMPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYyl7c2V0VGltZW91dChjLHgpfSk7UHJvbWlzZS5yYWNlKFtMLEtdKS50aGVuKGZ1bmN0aW9uKCl7YShjKX0sZnVuY3Rpb24oKXtiKGMpfSl9ZWxzZSB2KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcSgpe3ZhciBiO2lmKGI9LTEhPWYmJi0xIT1nfHwtMSE9ZiYmLTEhPWh8fC0xIT1nJiYtMSE9XG5oKShiPWYhPWcmJmYhPWgmJmchPWgpfHwobnVsbD09PUMmJihiPS9BcHBsZVdlYktpdFxcLyhbMC05XSspKD86XFwuKFswLTldKykpLy5leGVjKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxDPSEhYiYmKDUzNj5wYXJzZUludChiWzFdLDEwKXx8NTM2PT09cGFyc2VJbnQoYlsxXSwxMCkmJjExPj1wYXJzZUludChiWzJdLDEwKSkpLGI9QyYmKGY9PXImJmc9PXImJmg9PXJ8fGY9PXQmJmc9PXQmJmg9PXR8fGY9PXUmJmc9PXUmJmg9PXUpKSxiPSFiO2ImJihudWxsIT09ZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksY2xlYXJUaW1lb3V0KEcpLGEoYykpfWZ1bmN0aW9uIEYoKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1FPj14KW51bGwhPT1kLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxiKGMpO2Vsc2V7dmFyIGE9ZG9jdW1lbnQuaGlkZGVuO2lmKCEwPT09YXx8dm9pZCAwPT09YSlmPWUuYS5vZmZzZXRXaWR0aCxnPW4uYS5vZmZzZXRXaWR0aCxcbmg9cC5hLm9mZnNldFdpZHRoLHEoKTtHPXNldFRpbWVvdXQoRiw1MCl9fXZhciBlPW5ldyB3KG0pLG49bmV3IHcobSkscD1uZXcgdyhtKSxmPS0xLGc9LTEsaD0tMSxyPS0xLHQ9LTEsdT0tMSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksRz0wO2QuZGlyPVwibHRyXCI7eShlLEooYyxcInNhbnMtc2VyaWZcIikpO3kobixKKGMsXCJzZXJpZlwiKSk7eShwLEooYyxcIm1vbm9zcGFjZVwiKSk7ZC5hcHBlbmRDaGlsZChlLmEpO2QuYXBwZW5kQ2hpbGQobi5hKTtkLmFwcGVuZENoaWxkKHAuYSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKTtyPWUuYS5vZmZzZXRXaWR0aDt0PW4uYS5vZmZzZXRXaWR0aDt1PXAuYS5vZmZzZXRXaWR0aDtGKCk7QShlLGZ1bmN0aW9uKGEpe2Y9YTtxKCl9KTt5KGUsSihjLCdcIicrYy5mYW1pbHkrJ1wiLHNhbnMtc2VyaWYnKSk7QShuLGZ1bmN0aW9uKGEpe2c9YTtxKCl9KTt5KG4sSihjLCdcIicrYy5mYW1pbHkrJ1wiLHNlcmlmJykpO0EocCxmdW5jdGlvbihhKXtoPVxuYTtxKCl9KTt5KHAsSihjLCdcIicrYy5mYW1pbHkrJ1wiLG1vbm9zcGFjZScpKX0pfSl9O3dpbmRvdy5Gb250RmFjZU9ic2VydmVyPUI7d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIucHJvdG90eXBlLmNoZWNrPXdpbmRvdy5Gb250RmFjZU9ic2VydmVyLnByb3RvdHlwZS5sb2FkPUIucHJvdG90eXBlLmxvYWQ7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGUmJihtb2R1bGUuZXhwb3J0cz13aW5kb3cuRm9udEZhY2VPYnNlcnZlcik7fSgpKTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGlwO1xuXG4vKiBjbGlwIGZlYXR1cmVzIGJldHdlZW4gdHdvIGF4aXMtcGFyYWxsZWwgbGluZXM6XG4gKiAgICAgfCAgICAgICAgfFxuICogIF9fX3xfX18gICAgIHwgICAgIC9cbiAqIC8gICB8ICAgXFxfX19ffF9fX18vXG4gKiAgICAgfCAgICAgICAgfFxuICovXG5cbmZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgbWluQWxsLCBtYXhBbGwpIHtcblxuICAgIGsxIC89IHNjYWxlO1xuICAgIGsyIC89IHNjYWxlO1xuXG4gICAgaWYgKG1pbkFsbCA+PSBrMSAmJiBtYXhBbGwgPD0gazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtaW5BbGwgPiBrMiB8fCBtYXhBbGwgPCBrMSkgcmV0dXJuIG51bGw7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICB2YXIgY2xpcHBlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgbWluLCBtYXg7XG5cbiAgICAgICAgbWluID0gZmVhdHVyZS5taW5bYXhpc107XG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4W2F4aXNdO1xuXG4gICAgICAgIGlmIChtaW4gPj0gazEgJiYgbWF4IDw9IGsyKSB7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPiBrMiB8fCBtYXggPCBrMSkgY29udGludWU7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICAgICAgdmFyIHNsaWNlcyA9IHR5cGUgPT09IDEgP1xuICAgICAgICAgICAgICAgIGNsaXBQb2ludHMoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcykgOlxuICAgICAgICAgICAgICAgIGNsaXBHZW9tZXRyeShnZW9tZXRyeSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIHR5cGUgPT09IDMpO1xuXG4gICAgICAgIGlmIChzbGljZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBpZiBhIGZlYXR1cmUgZ290IGNsaXBwZWQsIGl0IHdpbGwgbGlrZWx5IGdldCBjbGlwcGVkIG9uIHRoZSBuZXh0IHpvb20gbGV2ZWwgYXMgd2VsbCxcbiAgICAgICAgICAgIC8vIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBiYm94ZXNcbiAgICAgICAgICAgIGNsaXBwZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHNsaWNlcyxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmVzW2ldLnRhZ3MgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBtaW46IGZlYXR1cmUubWluLFxuICAgICAgICAgICAgICAgIG1heDogZmVhdHVyZS5tYXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWQubGVuZ3RoID8gY2xpcHBlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsaXBQb2ludHMoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcykge1xuICAgIHZhciBzbGljZSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYSA9IGdlb21ldHJ5W2ldLFxuICAgICAgICAgICAgYWsgPSBhW2F4aXNdO1xuXG4gICAgICAgIGlmIChhayA+PSBrMSAmJiBhayA8PSBrMikgc2xpY2UucHVzaChhKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCBjbG9zZWQpIHtcblxuICAgIHZhciBzbGljZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgYWsgPSAwLFxuICAgICAgICAgICAgYmsgPSAwLFxuICAgICAgICAgICAgYiA9IG51bGwsXG4gICAgICAgICAgICBwb2ludHMgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFyZWEgPSBwb2ludHMuYXJlYSxcbiAgICAgICAgICAgIGRpc3QgPSBwb2ludHMuZGlzdCxcbiAgICAgICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgICAgICBhLCBqLCBsYXN0O1xuXG4gICAgICAgIHZhciBzbGljZSA9IFtdO1xuXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW4gLSAxOyBqKyspIHtcbiAgICAgICAgICAgIGEgPSBiIHx8IHBvaW50c1tqXTtcbiAgICAgICAgICAgIGIgPSBwb2ludHNbaiArIDFdO1xuICAgICAgICAgICAgYWsgPSBiayB8fCBhW2F4aXNdO1xuICAgICAgICAgICAgYmsgPSBiW2F4aXNdO1xuXG4gICAgICAgICAgICBpZiAoYWsgPCBrMSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKChiayA+IGsyKSkgeyAvLyAtLS18LS0tLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSwgaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA+PSBrMSkgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazEpKTsgLy8gLS0tfC0tPiAgfFxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFrID4gazIpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPCBrMSkpIHsgLy8gPC0tfC0tLS0tfC0tLVxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMiksIGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPD0gazIpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7IC8vIHwgIDwtLXwtLS1cblxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmsgPCBrMSkgeyAvLyA8LS18LS0tICB8XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA+IGsyKSB7IC8vIHwgIC0tLXwtLT5cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHwgLS0+IHxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCB0aGUgbGFzdCBwb2ludFxuICAgICAgICBhID0gcG9pbnRzW2xlbiAtIDFdO1xuICAgICAgICBhayA9IGFbYXhpc107XG4gICAgICAgIGlmIChhayA+PSBrMSAmJiBhayA8PSBrMikgc2xpY2UucHVzaChhKTtcblxuICAgICAgICAvLyBjbG9zZSB0aGUgcG9seWdvbiBpZiBpdHMgZW5kcG9pbnRzIGFyZSBub3QgdGhlIHNhbWUgYWZ0ZXIgY2xpcHBpbmdcblxuICAgICAgICBsYXN0ID0gc2xpY2Vbc2xpY2UubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjbG9zZWQgJiYgbGFzdCAmJiAoc2xpY2VbMF1bMF0gIT09IGxhc3RbMF0gfHwgc2xpY2VbMF1bMV0gIT09IGxhc3RbMV0pKSBzbGljZS5wdXNoKHNsaWNlWzBdKTtcblxuICAgICAgICAvLyBhZGQgdGhlIGZpbmFsIHNsaWNlXG4gICAgICAgIG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBzbGljZXM7XG59XG5cbmZ1bmN0aW9uIG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpIHtcbiAgICBpZiAoc2xpY2UubGVuZ3RoKSB7XG4gICAgICAgIC8vIHdlIGRvbid0IHJlY2FsY3VsYXRlIHRoZSBhcmVhL2xlbmd0aCBvZiB0aGUgdW5jbGlwcGVkIGdlb21ldHJ5IGJlY2F1c2UgdGhlIGNhc2Ugd2hlcmUgaXQgZ29lc1xuICAgICAgICAvLyBiZWxvdyB0aGUgdmlzaWJpbGl0eSB0aHJlc2hvbGQgYXMgYSByZXN1bHQgb2YgY2xpcHBpbmcgaXMgcmFyZSwgc28gd2UgYXZvaWQgZG9pbmcgdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgICBzbGljZS5hcmVhID0gYXJlYTtcbiAgICAgICAgc2xpY2UuZGlzdCA9IGRpc3Q7XG5cbiAgICAgICAgc2xpY2VzLnB1c2goc2xpY2UpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcblxudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZSgnLi9zaW1wbGlmeScpO1xuXG4vLyBjb252ZXJ0cyBHZW9KU09OIGZlYXR1cmUgaW50byBhbiBpbnRlcm1lZGlhdGUgcHJvamVjdGVkIEpTT04gdmVjdG9yIGZvcm1hdCB3aXRoIHNpbXBsaWZpY2F0aW9uIGRhdGFcblxuZnVuY3Rpb24gY29udmVydChkYXRhLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBbXTtcblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEsIHRvbGVyYW5jZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaW5nbGUgZ2VvbWV0cnkgb3IgYSBnZW9tZXRyeSBjb2xsZWN0aW9uXG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7Z2VvbWV0cnk6IGRhdGF9LCB0b2xlcmFuY2UpO1xuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBmZWF0dXJlLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIHR5cGUgPSBnZW9tLnR5cGUsXG4gICAgICAgIGNvb3JkcyA9IGdlb20uY29vcmRpbmF0ZXMsXG4gICAgICAgIHRhZ3MgPSBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgIGksIGosIHJpbmdzO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMSwgW3Byb2plY3RQb2ludChjb29yZHMpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMSwgcHJvamVjdChjb29yZHMpKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAyLCBbcHJvamVjdChjb29yZHMsIHRvbGVyYW5jZSldKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICByaW5ncyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCB0eXBlID09PSAnUG9seWdvbicgPyAzIDogMiwgcmluZ3MpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHJpbmdzLnB1c2gocHJvamVjdChjb29yZHNbaV1bal0sIHRvbGVyYW5jZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDMsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGdlb20uZ2VvbWV0cmllc1tpXSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB0YWdzXG4gICAgICAgICAgICB9LCB0b2xlcmFuY2UpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuJyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGUodGFncywgdHlwZSwgZ2VvbWV0cnkpIHtcbiAgICB2YXIgZmVhdHVyZSA9IHtcbiAgICAgICAgZ2VvbWV0cnk6IGdlb21ldHJ5LFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB0YWdzOiB0YWdzIHx8IG51bGwsXG4gICAgICAgIG1pbjogWzIsIDFdLCAvLyBpbml0aWFsIGJib3ggdmFsdWVzO1xuICAgICAgICBtYXg6IFstMSwgMF0gIC8vIG5vdGUgdGhhdCBjb29yZHMgYXJlIHVzdWFsbHkgaW4gWzAuLjFdIHJhbmdlXG4gICAgfTtcbiAgICBjYWxjQkJveChmZWF0dXJlKTtcbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdChsb25sYXRzLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgcHJvamVjdGVkID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25sYXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb2plY3RlZC5wdXNoKHByb2plY3RQb2ludChsb25sYXRzW2ldKSk7XG4gICAgfVxuICAgIGlmICh0b2xlcmFuY2UpIHtcbiAgICAgICAgc2ltcGxpZnkocHJvamVjdGVkLCB0b2xlcmFuY2UpO1xuICAgICAgICBjYWxjU2l6ZShwcm9qZWN0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvamVjdGVkO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0UG9pbnQocCkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbihwWzFdICogTWF0aC5QSSAvIDE4MCksXG4gICAgICAgIHggPSAocFswXSAvIDM2MCArIDAuNSksXG4gICAgICAgIHkgPSAoMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJKTtcblxuICAgIHkgPSB5IDwgLTEgPyAtMSA6XG4gICAgICAgIHkgPiAxID8gMSA6IHk7XG5cbiAgICByZXR1cm4gW3gsIHksIDBdO1xufVxuXG4vLyBjYWxjdWxhdGUgYXJlYSBhbmQgbGVuZ3RoIG9mIHRoZSBwb2x5XG5mdW5jdGlvbiBjYWxjU2l6ZShwb2ludHMpIHtcbiAgICB2YXIgYXJlYSA9IDAsXG4gICAgICAgIGRpc3QgPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGEsIGI7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGEgPSBiIHx8IHBvaW50c1tpXTtcbiAgICAgICAgYiA9IHBvaW50c1tpICsgMV07XG5cbiAgICAgICAgYXJlYSArPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdO1xuXG4gICAgICAgIC8vIHVzZSBNYW5oYXR0YW4gZGlzdGFuY2UgaW5zdGVhZCBvZiBFdWNsaWRpYW4gb25lIHRvIGF2b2lkIGV4cGVuc2l2ZSBzcXVhcmUgcm9vdCBjb21wdXRhdGlvblxuICAgICAgICBkaXN0ICs9IE1hdGguYWJzKGJbMF0gLSBhWzBdKSArIE1hdGguYWJzKGJbMV0gLSBhWzFdKTtcbiAgICB9XG4gICAgcG9pbnRzLmFyZWEgPSBNYXRoLmFicyhhcmVhIC8gMik7XG4gICAgcG9pbnRzLmRpc3QgPSBkaXN0O1xufVxuXG4vLyBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgYm91bmRpbmcgYm94IGZvciBmYXN0ZXIgY2xpcHBpbmcgbGF0ZXJcbmZ1bmN0aW9uIGNhbGNCQm94KGZlYXR1cmUpIHtcbiAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICBtaW4gPSBmZWF0dXJlLm1pbixcbiAgICAgICAgbWF4ID0gZmVhdHVyZS5tYXg7XG5cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5KTtcbiAgICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIGNhbGNSaW5nQkJveChtaW4sIG1heCwgZ2VvbWV0cnlbaV0pO1xuXG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIGNhbGNSaW5nQkJveChtaW4sIG1heCwgcG9pbnRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgbWluWzBdID0gTWF0aC5taW4ocFswXSwgbWluWzBdKTtcbiAgICAgICAgbWF4WzBdID0gTWF0aC5tYXgocFswXSwgbWF4WzBdKTtcbiAgICAgICAgbWluWzFdID0gTWF0aC5taW4ocFsxXSwgbWluWzFdKTtcbiAgICAgICAgbWF4WzFdID0gTWF0aC5tYXgocFsxXSwgbWF4WzFdKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VvanNvbnZ0O1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJy4vY29udmVydCcpLCAvLyBHZW9KU09OIGNvbnZlcnNpb24gYW5kIHByZXByb2Nlc3NpbmdcbiAgICBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyksICAgICAgIC8vIHN0cmlwZSBjbGlwcGluZyBhbGdvcml0aG1cbiAgICB3cmFwID0gcmVxdWlyZSgnLi93cmFwJyksICAgICAgIC8vIGRhdGUgbGluZSBwcm9jZXNzaW5nXG4gICAgY3JlYXRlVGlsZSA9IHJlcXVpcmUoJy4vdGlsZScpOyAvLyBmaW5hbCBzaW1wbGlmaWVkIHRpbGUgZ2VuZXJhdGlvblxuXG5cbmZ1bmN0aW9uIGdlb2pzb252dChkYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIEdlb0pTT05WVChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIG9wdGlvbnMpO1xuXG4gICAgdmFyIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdwcmVwcm9jZXNzIGRhdGEnKTtcblxuICAgIHZhciB6MiA9IDEgPDwgb3B0aW9ucy5tYXhab29tLCAvLyAyXnpcbiAgICAgICAgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogb3B0aW9ucy5leHRlbnQpKTtcblxuICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICB0aGlzLnRpbGVDb29yZHMgPSBbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3ByZXByb2Nlc3MgZGF0YScpO1xuICAgICAgICBjb25zb2xlLmxvZygnaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkJywgb3B0aW9ucy5pbmRleE1heFpvb20sIG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB7fTtcbiAgICAgICAgdGhpcy50b3RhbCA9IDA7XG4gICAgfVxuXG4gICAgZmVhdHVyZXMgPSB3cmFwKGZlYXR1cmVzLCBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LCBpbnRlcnNlY3RYKTtcblxuICAgIC8vIHN0YXJ0IHNsaWNpbmcgZnJvbSB0aGUgdG9wIHRpbGUgZG93blxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHRoaXMuc3BsaXRUaWxlKGZlYXR1cmVzLCAwLCAwLCAwKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSBjb25zb2xlLmxvZygnZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkJywgdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcywgdGhpcy50aWxlc1swXS5udW1Qb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aWxlcyBnZW5lcmF0ZWQ6JywgdGhpcy50b3RhbCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0cykpO1xuICAgIH1cbn1cblxuR2VvSlNPTlZULnByb3RvdHlwZS5vcHRpb25zID0ge1xuICAgIG1heFpvb206IDE0LCAgICAgICAgICAgIC8vIG1heCB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBvblxuICAgIGluZGV4TWF4Wm9vbTogNSwgICAgICAgIC8vIG1heCB6b29tIGluIHRoZSB0aWxlIGluZGV4XG4gICAgaW5kZXhNYXhQb2ludHM6IDEwMDAwMCwgLy8gbWF4IG51bWJlciBvZiBwb2ludHMgcGVyIHRpbGUgaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBzb2xpZENoaWxkcmVuOiBmYWxzZSwgICAvLyB3aGV0aGVyIHRvIHRpbGUgc29saWQgc3F1YXJlIHRpbGVzIGZ1cnRoZXJcbiAgICB0b2xlcmFuY2U6IDMsICAgICAgICAgICAvLyBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyKVxuICAgIGV4dGVudDogNDA5NiwgICAgICAgICAgIC8vIHRpbGUgZXh0ZW50XG4gICAgYnVmZmVyOiA2NCwgICAgICAgICAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgZGVidWc6IDAgICAgICAgICAgICAgICAgLy8gbG9nZ2luZyBsZXZlbCAoMCwgMSBvciAyKVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5zcGxpdFRpbGUgPSBmdW5jdGlvbiAoZmVhdHVyZXMsIHosIHgsIHksIGN6LCBjeCwgY3kpIHtcblxuICAgIHZhciBzdGFjayA9IFtmZWF0dXJlcywgeiwgeCwgeV0sXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHByb2Nlc3NpbmcgcXVldWVcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB6ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGZlYXR1cmVzID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgdmFyIHoyID0gMSA8PCB6LFxuICAgICAgICAgICAgaWQgPSB0b0lEKHosIHgsIHkpLFxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdLFxuICAgICAgICAgICAgdGlsZVRvbGVyYW5jZSA9IHogPT09IG9wdGlvbnMubWF4Wm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KTtcblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY3JlYXRpb24nKTtcblxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdID0gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHgsIHksIHRpbGVUb2xlcmFuY2UsIHogPT09IG9wdGlvbnMubWF4Wm9vbSk7XG4gICAgICAgICAgICB0aGlzLnRpbGVDb29yZHMucHVzaCh7ejogeiwgeDogeCwgeTogeX0pO1xuXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgeiwgeCwgeSwgdGlsZS5udW1GZWF0dXJlcywgdGlsZS5udW1Qb2ludHMsIHRpbGUubnVtU2ltcGxpZmllZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgnY3JlYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9ICd6JyArIHo7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0c1trZXldID0gKHRoaXMuc3RhdHNba2V5XSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgZ2VvbWV0cnkgaW4gdGlsZSBzbyB0aGF0IHdlIGNhbiBkcmlsbCBkb3duIGxhdGVyIGlmIHdlIHN0b3Agbm93XG4gICAgICAgIHRpbGUuc291cmNlID0gZmVhdHVyZXM7XG5cbiAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgdGhlIHRpbGUgaXMgc29saWQgY2xpcHBlZCBzcXVhcmVcbiAgICAgICAgaWYgKCFvcHRpb25zLnNvbGlkQ2hpbGRyZW4gJiYgaXNDbGlwcGVkU3F1YXJlKHRpbGUsIG9wdGlvbnMuZXh0ZW50LCBvcHRpb25zLmJ1ZmZlcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXG4gICAgICAgIGlmICghY3opIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgbWF4IHpvb20sIG9yIGlmIHRoZSB0aWxlIGlzIHRvbyBzaW1wbGVcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBhIGRyaWxsZG93biB0byBhIHNwZWNpZmljIHRpbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgYmFzZSB6b29tIG9yIG91ciB0YXJnZXQgdGlsZSB6b29tXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHogPT09IGN6KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgaXQncyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIHRhcmdldCB0aWxlXG4gICAgICAgICAgICB2YXIgbSA9IDEgPDwgKGN6IC0geik7XG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBzbGljZSBmdXJ0aGVyIGRvd24sIG5vIG5lZWQgdG8ga2VlcCBzb3VyY2UgZ2VvbWV0cnlcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY2xpcHBpbmcnKTtcblxuICAgICAgICAvLyB2YWx1ZXMgd2UnbGwgdXNlIGZvciBjbGlwcGluZ1xuICAgICAgICB2YXIgazEgPSAwLjUgKiBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIGludGVyc2VjdFgsIHRpbGUubWluWzBdLCB0aWxlLm1heFswXSk7XG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgejIsIHggKyBrMiwgeCArIGs0LCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYmwgPSBjbGlwKGxlZnQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgICAgICBiciA9IGNsaXAocmlnaHQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnY2xpcHBpbmcnKTtcblxuICAgICAgICBpZiAodGwpIHN0YWNrLnB1c2godGwsIHogKyAxLCB4ICogMiwgICAgIHkgKiAyKTtcbiAgICAgICAgaWYgKGJsKSBzdGFjay5wdXNoKGJsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBpZiAodHIpIHN0YWNrLnB1c2godHIsIHogKyAxLCB4ICogMiArIDEsIHkgKiAyKTtcbiAgICAgICAgaWYgKGJyKSBzdGFjay5wdXNoKGJyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMiArIDEpO1xuICAgIH1cbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uICh6LCB4LCB5KSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICB2YXIgejIgPSAxIDw8IHo7XG4gICAgeCA9ICgoeCAlIHoyKSArIHoyKSAlIHoyOyAvLyB3cmFwIHRpbGUgeCBjb29yZGluYXRlXG5cbiAgICB2YXIgaWQgPSB0b0lEKHosIHgsIHkpO1xuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWQnLCB6MCwgeDAsIHkwKTtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAocGFyZW50LnNvdXJjZSkge1xuICAgICAgICBpZiAoaXNDbGlwcGVkU3F1YXJlKHBhcmVudCwgZXh0ZW50LCBvcHRpb25zLmJ1ZmZlcikpIHJldHVybiB0cmFuc2Zvcm1UaWxlKHBhcmVudCwgZXh0ZW50KTtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICAgICAgdGhpcy5zcGxpdFRpbGUocGFyZW50LnNvdXJjZSwgejAsIHgwLCB5MCwgeiwgeCwgeSk7XG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnZHJpbGxpbmcgZG93bicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy50aWxlc1tpZF0pIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG59O1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHRpbGUsIGV4dGVudCkge1xuICAgIGlmICh0aWxlLnRyYW5zZm9ybWVkKSByZXR1cm4gdGlsZTtcblxuICAgIHZhciB6MiA9IHRpbGUuejIsXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIGdlb21bal0gPSB0cmFuc2Zvcm1Qb2ludChnZW9tW2pdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciByaW5nID0gZ2VvbVtqXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmluZy5sZW5ndGg7IGsrKykgcmluZ1trXSA9IHRyYW5zZm9ybVBvaW50KHJpbmdba10sIGV4dGVudCwgejIsIHR4LCB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChwLCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICB2YXIgeCA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMF0gKiB6MiAtIHR4KSksXG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzFdICogejIgLSB0eSkpO1xuICAgIHJldHVybiBbeCwgeV07XG59XG5cbmZ1bmN0aW9uIHRvSUQoeiwgeCwgeSkge1xuICAgIHJldHVybiAoKCgxIDw8IHopICogeSArIHgpICogMzIpICsgejtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WChhLCBiLCB4KSB7XG4gICAgcmV0dXJuIFt4LCAoeCAtIGFbMF0pICogKGJbMV0gLSBhWzFdKSAvIChiWzBdIC0gYVswXSkgKyBhWzFdLCAxXTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFkoYSwgYiwgeSkge1xuICAgIHJldHVybiBbKHkgLSBhWzFdKSAqIChiWzBdIC0gYVswXSkgLyAoYlsxXSAtIGFbMV0pICsgYVswXSwgeSwgMV07XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cblxuLy8gY2hlY2tzIHdoZXRoZXIgYSB0aWxlIGlzIGEgd2hvbGUtYXJlYSBmaWxsIGFmdGVyIGNsaXBwaW5nOyBpZiBpdCBpcywgdGhlcmUncyBubyBzZW5zZSBzbGljaW5nIGl0IGZ1cnRoZXJcbmZ1bmN0aW9uIGlzQ2xpcHBlZFNxdWFyZSh0aWxlLCBleHRlbnQsIGJ1ZmZlcikge1xuXG4gICAgdmFyIGZlYXR1cmVzID0gdGlsZS5zb3VyY2U7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1swXTtcbiAgICBpZiAoZmVhdHVyZS50eXBlICE9PSAzIHx8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbiA9IGZlYXR1cmUuZ2VvbWV0cnlbMF0ubGVuZ3RoO1xuICAgIGlmIChsZW4gIT09IDUpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHAgPSB0cmFuc2Zvcm1Qb2ludChmZWF0dXJlLmdlb21ldHJ5WzBdW2ldLCBleHRlbnQsIHRpbGUuejIsIHRpbGUueCwgdGlsZS55KTtcbiAgICAgICAgaWYgKChwWzBdICE9PSAtYnVmZmVyICYmIHBbMF0gIT09IGV4dGVudCArIGJ1ZmZlcikgfHxcbiAgICAgICAgICAgIChwWzFdICE9PSAtYnVmZmVyICYmIHBbMV0gIT09IGV4dGVudCArIGJ1ZmZlcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzaW1wbGlmeTtcblxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZnVuY3Rpb24gc2ltcGxpZnkocG9pbnRzLCB0b2xlcmFuY2UpIHtcblxuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgZmlyc3QgPSAwLFxuICAgICAgICBsYXN0ID0gbGVuIC0gMSxcbiAgICAgICAgc3RhY2sgPSBbXSxcbiAgICAgICAgaSwgbWF4U3FEaXN0LCBzcURpc3QsIGluZGV4O1xuXG4gICAgLy8gYWx3YXlzIHJldGFpbiB0aGUgZW5kcG9pbnRzICgxIGlzIHRoZSBtYXggdmFsdWUpXG4gICAgcG9pbnRzW2ZpcnN0XVsyXSA9IDE7XG4gICAgcG9pbnRzW2xhc3RdWzJdID0gMTtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHN0YWNrXG4gICAgd2hpbGUgKGxhc3QpIHtcblxuICAgICAgICBtYXhTcURpc3QgPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IGZpcnN0ICsgMTsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICAgICAgc3FEaXN0ID0gZ2V0U3FTZWdEaXN0KHBvaW50c1tpXSwgcG9pbnRzW2ZpcnN0XSwgcG9pbnRzW2xhc3RdKTtcblxuICAgICAgICAgICAgaWYgKHNxRGlzdCA+IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtYXhTcURpc3QgPSBzcURpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4U3FEaXN0ID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHBvaW50c1tpbmRleF1bMl0gPSBtYXhTcURpc3Q7IC8vIHNhdmUgdGhlIHBvaW50IGltcG9ydGFuY2UgaW4gc3F1YXJlZCBwaXhlbHMgYXMgYSB6IGNvb3JkaW5hdGVcbiAgICAgICAgICAgIHN0YWNrLnB1c2goZmlyc3QpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChpbmRleCk7XG4gICAgICAgICAgICBmaXJzdCA9IGluZGV4O1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBmaXJzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHAsIGEsIGIpIHtcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLFxuICAgICAgICBweCA9IHBbMF0sIHB5ID0gcFsxXSxcbiAgICAgICAgZHggPSBieCAtIHgsXG4gICAgICAgIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVGlsZTtcblxuZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHR4LCB0eSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG4gICAgdmFyIHRpbGUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxuICAgICAgICBudW1TaW1wbGlmaWVkOiAwLFxuICAgICAgICBudW1GZWF0dXJlczogMCxcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB4OiB0eCxcbiAgICAgICAgeTogdHksXG4gICAgICAgIHoyOiB6MixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW46IFsyLCAxXSxcbiAgICAgICAgbWF4OiBbLTEsIDBdXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRpbGUubnVtRmVhdHVyZXMrKztcbiAgICAgICAgYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlc1tpXSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KTtcblxuICAgICAgICB2YXIgbWluID0gZmVhdHVyZXNbaV0ubWluLFxuICAgICAgICAgICAgbWF4ID0gZmVhdHVyZXNbaV0ubWF4O1xuXG4gICAgICAgIGlmIChtaW5bMF0gPCB0aWxlLm1pblswXSkgdGlsZS5taW5bMF0gPSBtaW5bMF07XG4gICAgICAgIGlmIChtaW5bMV0gPCB0aWxlLm1pblsxXSkgdGlsZS5taW5bMV0gPSBtaW5bMV07XG4gICAgICAgIGlmIChtYXhbMF0gPiB0aWxlLm1heFswXSkgdGlsZS5tYXhbMF0gPSBtYXhbMF07XG4gICAgICAgIGlmIChtYXhbMV0gPiB0aWxlLm1heFsxXSkgdGlsZS5tYXhbMV0gPSBtYXhbMV07XG4gICAgfVxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmUsIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuXG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICBzaW1wbGlmaWVkID0gW10sXG4gICAgICAgIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBpLCBqLCByaW5nLCBwO1xuXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcblxuICAgICAgICAvLyBzaW1wbGlmeSBhbmQgdHJhbnNmb3JtIHByb2plY3RlZCBjb29yZGluYXRlcyBmb3IgdGlsZSBnZW9tZXRyeVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZyA9IGdlb21baV07XG5cbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgdGlueSBwb2x5bGluZXMgJiBwb2x5Z29uc1xuICAgICAgICAgICAgaWYgKCFub1NpbXBsaWZ5ICYmICgodHlwZSA9PT0gMiAmJiByaW5nLmRpc3QgPCB0b2xlcmFuY2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAzICYmIHJpbmcuYXJlYSA8IHNxVG9sZXJhbmNlKSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNpbXBsaWZpZWRSaW5nID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcCA9IHJpbmdbal07XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBwb2ludHMgd2l0aCBpbXBvcnRhbmNlID4gdG9sZXJhbmNlXG4gICAgICAgICAgICAgICAgaWYgKG5vU2ltcGxpZnkgfHwgcFsyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRSaW5nLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goc2ltcGxpZmllZFJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICBnZW9tZXRyeTogc2ltcGxpZmllZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MgfHwgbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcDtcblxuZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgYnVmZmVyLCBpbnRlcnNlY3RYKSB7XG4gICAgdmFyIG1lcmdlZCA9IGZlYXR1cmVzLFxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIDEsIC0xIC0gYnVmZmVyLCBidWZmZXIsICAgICAwLCBpbnRlcnNlY3RYLCAtMSwgMiksIC8vIGxlZnQgd29ybGQgY29weVxuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcblxuICAgIGlmIChsZWZ0IHx8IHJpZ2h0KSB7XG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIGludGVyc2VjdFgsIC0xLCAyKTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcblxuICAgICAgICBpZiAobGVmdCkgbWVyZ2VkID0gc2hpZnRGZWF0dXJlQ29vcmRzKGxlZnQsIDEpLmNvbmNhdChtZXJnZWQpOyAvLyBtZXJnZSBsZWZ0IGludG8gY2VudGVyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3RmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnksIG9mZnNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0ZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IG5ld0dlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmUudGFncyxcbiAgICAgICAgICAgIG1pbjogW2ZlYXR1cmUubWluWzBdICsgb2Zmc2V0LCBmZWF0dXJlLm1pblsxXV0sXG4gICAgICAgICAgICBtYXg6IFtmZWF0dXJlLm1heFswXSArIG9mZnNldCwgZmVhdHVyZS5tYXhbMV1dXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gc2hpZnRDb29yZHMocG9pbnRzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3UG9pbnRzID0gW107XG4gICAgbmV3UG9pbnRzLmFyZWEgPSBwb2ludHMuYXJlYTtcbiAgICBuZXdQb2ludHMuZGlzdCA9IHBvaW50cy5kaXN0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3UG9pbnRzLnB1c2goW3BvaW50c1tpXVswXSArIG9mZnNldCwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaV1bMl1dKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50cztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaW52ZXJ0XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDNcbiAqXG4gKiBAYWxpYXMgbWF0My5pbnZlcnRcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXVxuICB2YXIgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XVxuICB2YXIgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XVxuXG4gIHZhciBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjFcbiAgdmFyIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjBcbiAgdmFyIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMFxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgdmFyIGRldCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSArIGEwMiAqIGIyMVxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSBiMDEgKiBkZXRcbiAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0XG4gIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0XG4gIG91dFszXSA9IGIxMSAqIGRldFxuICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldFxuICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXRcbiAgb3V0WzZdID0gYjIxICogZGV0XG4gIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldFxuICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldFxuXG4gIHJldHVybiBvdXRcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gbm9ybWFsRnJvbU1hdDRcblxuLyoqXG4qIENhbGN1bGF0ZXMgYSAzeDMgbm9ybWFsIG1hdHJpeCAodHJhbnNwb3NlIGludmVyc2UpIGZyb20gdGhlIDR4NCBtYXRyaXhcbipcbiogQGFsaWFzIG1hdDMubm9ybWFsRnJvbU1hdDRcbiogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuKiBAcGFyYW0ge21hdDR9IGEgTWF0NCB0byBkZXJpdmUgdGhlIG5vcm1hbCBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xuZnVuY3Rpb24gbm9ybWFsRnJvbU1hdDQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdXG4gIHZhciBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddXG4gIHZhciBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV1cbiAgdmFyIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdXG5cbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMFxuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwXG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTBcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMVxuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExXG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTJcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMFxuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwXG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzBcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMVxuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxXG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzJcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBiMDAgKiBiMTFcbiAgICAgICAgICAtIGIwMSAqIGIxMFxuICAgICAgICAgICsgYjAyICogYjA5XG4gICAgICAgICAgKyBiMDMgKiBiMDhcbiAgICAgICAgICAtIGIwNCAqIGIwN1xuICAgICAgICAgICsgYjA1ICogYjA2XG5cbiAgaWYgKCFkZXQpIHJldHVybiBudWxsXG4gIGRldCA9IDEuMCAvIGRldFxuXG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0XG4gIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0XG4gIG91dFsyXSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0XG5cbiAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXRcbiAgb3V0WzRdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXRcbiAgb3V0WzVdID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXRcblxuICBvdXRbNl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldFxuICBvdXRbN10gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldFxuICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldFxuXG4gIHJldHVybiBvdXRcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gY29weTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcblxuLyoqXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59OyIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsb29rQXQ7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge3ZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcbiAqIEBwYXJhbSB7dmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgICB2YXIgeDAsIHgxLCB4MiwgeTAsIHkxLCB5MiwgejAsIHoxLCB6MiwgbGVuLFxuICAgICAgICBleWV4ID0gZXllWzBdLFxuICAgICAgICBleWV5ID0gZXllWzFdLFxuICAgICAgICBleWV6ID0gZXllWzJdLFxuICAgICAgICB1cHggPSB1cFswXSxcbiAgICAgICAgdXB5ID0gdXBbMV0sXG4gICAgICAgIHVweiA9IHVwWzJdLFxuICAgICAgICBjZW50ZXJ4ID0gY2VudGVyWzBdLFxuICAgICAgICBjZW50ZXJ5ID0gY2VudGVyWzFdLFxuICAgICAgICBjZW50ZXJ6ID0gY2VudGVyWzJdO1xuXG4gICAgaWYgKE1hdGguYWJzKGV5ZXggLSBjZW50ZXJ4KSA8IDAuMDAwMDAxICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXkgLSBjZW50ZXJ5KSA8IDAuMDAwMDAxICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IDAuMDAwMDAxKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eShvdXQpO1xuICAgIH1cblxuICAgIHowID0gZXlleCAtIGNlbnRlcng7XG4gICAgejEgPSBleWV5IC0gY2VudGVyeTtcbiAgICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuXG4gICAgbGVuID0gMSAvIE1hdGguc3FydCh6MCAqIHowICsgejEgKiB6MSArIHoyICogejIpO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuXG4gICAgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxO1xuICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gICAgbGVuID0gTWF0aC5zcXJ0KHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeDAgPSAwO1xuICAgICAgICB4MSA9IDA7XG4gICAgICAgIHgyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB4MCAqPSBsZW47XG4gICAgICAgIHgxICo9IGxlbjtcbiAgICAgICAgeDIgKj0gbGVuO1xuICAgIH1cblxuICAgIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gICAgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgICB5MiA9IHowICogeDEgLSB6MSAqIHgwO1xuXG4gICAgbGVuID0gTWF0aC5zcXJ0KHkwICogeTAgKyB5MSAqIHkxICsgeTIgKiB5Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeTAgPSAwO1xuICAgICAgICB5MSA9IDA7XG4gICAgICAgIHkyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB5MCAqPSBsZW47XG4gICAgICAgIHkxICo9IGxlbjtcbiAgICAgICAgeTIgKj0gbGVuO1xuICAgIH1cblxuICAgIG91dFswXSA9IHgwO1xuICAgIG91dFsxXSA9IHkwO1xuICAgIG91dFsyXSA9IHowO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0geDE7XG4gICAgb3V0WzVdID0geTE7XG4gICAgb3V0WzZdID0gejE7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4MjtcbiAgICBvdXRbOV0gPSB5MjtcbiAgICBvdXRbMTBdID0gejI7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICAgIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IG11bHRpcGx5O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDQnc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07XG5cbiAgICAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcbiAgICB2YXIgYjAgID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTsgIFxuICAgIG91dFswXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbMV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzJdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFszXSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYls0XTsgYjEgPSBiWzVdOyBiMiA9IGJbNl07IGIzID0gYls3XTtcbiAgICBvdXRbNF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzVdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFs2XSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbN10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbOF07IGIxID0gYls5XTsgYjIgPSBiWzEwXTsgYjMgPSBiWzExXTtcbiAgICBvdXRbOF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzldID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsxMF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzExXSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYlsxMl07IGIxID0gYlsxM107IGIyID0gYlsxNF07IGIzID0gYlsxNV07XG4gICAgb3V0WzEyXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbMTNdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsxNF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzE1XSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHBlcnNwZWN0aXZlO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3Z5IFZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgaW4gcmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIHBlcnNwZWN0aXZlKG91dCwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSBmO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxMV0gPSAtMTtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gKDIgKiBmYXIgKiBuZWFyKSAqIG5mO1xuICAgIG91dFsxNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gc2NhbGU7XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdGhlIHZlYzMgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICoqL1xuZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl07XG5cbiAgICBvdXRbMF0gPSBhWzBdICogeDtcbiAgICBvdXRbMV0gPSBhWzFdICogeDtcbiAgICBvdXRbMl0gPSBhWzJdICogeDtcbiAgICBvdXRbM10gPSBhWzNdICogeDtcbiAgICBvdXRbNF0gPSBhWzRdICogeTtcbiAgICBvdXRbNV0gPSBhWzVdICogeTtcbiAgICBvdXRbNl0gPSBhWzZdICogeTtcbiAgICBvdXRbN10gPSBhWzddICogeTtcbiAgICBvdXRbOF0gPSBhWzhdICogejtcbiAgICBvdXRbOV0gPSBhWzldICogejtcbiAgICBvdXRbMTBdID0gYVsxMF0gKiB6O1xuICAgIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gdHJhbnNsYXRlO1xuXG4vKipcbiAqIFRyYW5zbGF0ZSBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXSxcbiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLFxuICAgICAgICBhMTAsIGExMSwgYTEyLCBhMTMsXG4gICAgICAgIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICAgIGlmIChhID09PSBvdXQpIHtcbiAgICAgICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICAgICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICAgICAgYTIwID0gYVs4XTsgYTIxID0gYVs5XTsgYTIyID0gYVsxMF07IGEyMyA9IGFbMTFdO1xuXG4gICAgICAgIG91dFswXSA9IGEwMDsgb3V0WzFdID0gYTAxOyBvdXRbMl0gPSBhMDI7IG91dFszXSA9IGEwMztcbiAgICAgICAgb3V0WzRdID0gYTEwOyBvdXRbNV0gPSBhMTE7IG91dFs2XSA9IGExMjsgb3V0WzddID0gYTEzO1xuICAgICAgICBvdXRbOF0gPSBhMjA7IG91dFs5XSA9IGEyMTsgb3V0WzEwXSA9IGEyMjsgb3V0WzExXSA9IGEyMztcblxuICAgICAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBwYXJzZUVycm9yc1xuXG5mdW5jdGlvbiBwYXJzZUVycm9ycyhsb2cpIHtcbiAgbG9nID0gU3RyaW5nKGxvZylcblxuICB2YXIgbG9ncyA9IFtdXG4gIHZhciByZXN1bHRcblxuICB3aGlsZSAocmVzdWx0ID0gbG9nLm1hdGNoKC9FUlJPUlxcOihbXlxcbl0rKS8pKSB7XG4gICAgbG9nID0gbG9nLnNsaWNlKHJlc3VsdC5pbmRleCArIDEpXG5cbiAgICB2YXIgbGluZSA9IHJlc3VsdFsxXS50cmltKClcbiAgICB2YXIgc2VwcyA9IGxpbmUuc3BsaXQoJzonKVxuICAgIHZhciBlbXNnID0gc2Vwcy5zbGljZSgyKS5qb2luKCc6JykudHJpbSgpXG4gICAgdmFyIGZpbGUgPSBwYXJzZUludChzZXBzWzBdLCAxMClcbiAgICB2YXIgbGluZSA9IHBhcnNlSW50KHNlcHNbMV0sIDEwKVxuXG4gICAgbG9ncy5wdXNoKHtcbiAgICAgICAgbWVzc2FnZTogZW1zZ1xuICAgICAgLCBmaWxlOiBmaWxlXG4gICAgICAsIGxpbmU6IGxpbmVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGxvZ3Ncbn1cbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvKiFcbiAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXJcbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuXG4vLyBUaGUgX2lzQnVmZmVyIGNoZWNrIGlzIGZvciBTYWZhcmkgNS03IHN1cHBvcnQsIGJlY2F1c2UgaXQncyBtaXNzaW5nXG4vLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIChpc0J1ZmZlcihvYmopIHx8IGlzU2xvd0J1ZmZlcihvYmopIHx8ICEhb2JqLl9pc0J1ZmZlcilcbn1cblxuZnVuY3Rpb24gaXNCdWZmZXIgKG9iaikge1xuICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxufVxuXG4vLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LlxuZnVuY3Rpb24gaXNTbG93QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0J1ZmZlcihvYmouc2xpY2UoMCwgMCkpXG59XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgeWFtbCA9IHJlcXVpcmUoJy4vbGliL2pzLXlhbWwuanMnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHlhbWw7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIGxvYWRlciA9IHJlcXVpcmUoJy4vanMteWFtbC9sb2FkZXInKTtcbi8vIHZhciBkdW1wZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvZHVtcGVyJyk7XG5cblxuZnVuY3Rpb24gZGVwcmVjYXRlZChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiAnICsgbmFtZSArICcgaXMgZGVwcmVjYXRlZCBhbmQgY2Fubm90IGJlIHVzZWQuJyk7XG4gIH07XG59XG5cblxubW9kdWxlLmV4cG9ydHMuVHlwZSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC90eXBlJyk7XG5tb2R1bGUuZXhwb3J0cy5TY2hlbWEgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYScpO1xubW9kdWxlLmV4cG9ydHMuRkFJTFNBRkVfU0NIRU1BICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2pzb24nKTtcbm1vZHVsZS5leHBvcnRzLkNPUkVfU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2NvcmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICAgICAgICAgID0gbG9hZGVyLmxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICAgICAgICAgID0gbG9hZGVyLmxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZEFsbDtcbi8vIG1vZHVsZS5leHBvcnRzLmR1bXAgICAgICAgICAgICAgICAgPSBkdW1wZXIuZHVtcDtcbi8vIG1vZHVsZS5leHBvcnRzLnNhZmVEdW1wICAgICAgICAgICAgPSBkdW1wZXIuc2FmZUR1bXA7XG5tb2R1bGUuZXhwb3J0cy5ZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL2V4Y2VwdGlvbicpO1xuXG4vLyBEZXByZWNhdGVkIHNjaGVtYSBuYW1lcyBmcm9tIEpTLVlBTUwgMi4wLnhcbm1vZHVsZS5leHBvcnRzLk1JTklNQUxfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuU0FGRV9TQ0hFTUEgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG4vLyBEZXByZWNhdGVkIGZ1bmN0aW9ucyBmcm9tIEpTLVlBTUwgMS54Lnhcbm1vZHVsZS5leHBvcnRzLnNjYW4gICAgICAgICAgID0gZGVwcmVjYXRlZCgnc2NhbicpO1xubW9kdWxlLmV4cG9ydHMucGFyc2UgICAgICAgICAgPSBkZXByZWNhdGVkKCdwYXJzZScpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZSAgICAgICAgPSBkZXByZWNhdGVkKCdjb21wb3NlJyk7XG5tb2R1bGUuZXhwb3J0cy5hZGRDb25zdHJ1Y3RvciA9IGRlcHJlY2F0ZWQoJ2FkZENvbnN0cnVjdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gaXNOb3RoaW5nKHN1YmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHx8IChzdWJqZWN0ID09PSBudWxsKTtcbn1cblxuXG5mdW5jdGlvbiBpc09iamVjdChzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICdvYmplY3QnKSAmJiAoc3ViamVjdCAhPT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gdG9BcnJheShzZXF1ZW5jZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShzZXF1ZW5jZSkpIHJldHVybiBzZXF1ZW5jZTtcbiAgZWxzZSBpZiAoaXNOb3RoaW5nKHNlcXVlbmNlKSkgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBbIHNlcXVlbmNlIF07XG59XG5cblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBpbmRleCwgbGVuZ3RoLCBrZXksIHNvdXJjZUtleXM7XG5cbiAgaWYgKHNvdXJjZSkge1xuICAgIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAga2V5ID0gc291cmNlS2V5c1tpbmRleF07XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cblxuZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgY291bnQpIHtcbiAgdmFyIHJlc3VsdCA9ICcnLCBjeWNsZTtcblxuICBmb3IgKGN5Y2xlID0gMDsgY3ljbGUgPCBjb3VudDsgY3ljbGUgKz0gMSkge1xuICAgIHJlc3VsdCArPSBzdHJpbmc7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIGlzTmVnYXRpdmVaZXJvKG51bWJlcikge1xuICByZXR1cm4gKG51bWJlciA9PT0gMCkgJiYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gMSAvIG51bWJlcik7XG59XG5cblxubW9kdWxlLmV4cG9ydHMuaXNOb3RoaW5nICAgICAgPSBpc05vdGhpbmc7XG5tb2R1bGUuZXhwb3J0cy5pc09iamVjdCAgICAgICA9IGlzT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMudG9BcnJheSAgICAgICAgPSB0b0FycmF5O1xubW9kdWxlLmV4cG9ydHMucmVwZWF0ICAgICAgICAgPSByZXBlYXQ7XG5tb2R1bGUuZXhwb3J0cy5pc05lZ2F0aXZlWmVybyA9IGlzTmVnYXRpdmVaZXJvO1xubW9kdWxlLmV4cG9ydHMuZXh0ZW5kICAgICAgICAgPSBleHRlbmQ7XG4iLCIvLyBZQU1MIGVycm9yIGNsYXNzLiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg0NTg5ODRcbi8vXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIFlBTUxFeGNlcHRpb24ocmVhc29uLCBtYXJrKSB7XG4gIC8vIFN1cGVyIGNvbnN0cnVjdG9yXG4gIEVycm9yLmNhbGwodGhpcyk7XG5cbiAgLy8gSW5jbHVkZSBzdGFjayB0cmFjZSBpbiBlcnJvciBvYmplY3RcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgLy8gQ2hyb21lIGFuZCBOb2RlSlNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGRiwgSUUgMTArIGFuZCBTYWZhcmkgNisuIEZhbGxiYWNrIGZvciBvdGhlcnNcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjayB8fCAnJztcbiAgfVxuXG4gIHRoaXMubmFtZSA9ICdZQU1MRXhjZXB0aW9uJztcbiAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gIHRoaXMubWFyayA9IG1hcms7XG4gIHRoaXMubWVzc2FnZSA9ICh0aGlzLnJlYXNvbiB8fCAnKHVua25vd24gcmVhc29uKScpICsgKHRoaXMubWFyayA/ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpIDogJycpO1xufVxuXG5cbi8vIEluaGVyaXQgZnJvbSBFcnJvclxuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFlBTUxFeGNlcHRpb247XG5cblxuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLm5hbWUgKyAnOiAnO1xuXG4gIHJlc3VsdCArPSB0aGlzLnJlYXNvbiB8fCAnKHVua25vd24gcmVhc29uKSc7XG5cbiAgaWYgKCFjb21wYWN0ICYmIHRoaXMubWFyaykge1xuICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gWUFNTEV4Y2VwdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBtYXgtbGVuLG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cblxudmFyIGNvbW1vbiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gICAgICAgPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIE1hcmsgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL21hcmsnKTtcbnZhciBERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG52YXIgREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5cbnZhciBDT05URVhUX0ZMT1dfSU4gICA9IDE7XG52YXIgQ09OVEVYVF9GTE9XX09VVCAgPSAyO1xudmFyIENPTlRFWFRfQkxPQ0tfSU4gID0gMztcbnZhciBDT05URVhUX0JMT0NLX09VVCA9IDQ7XG5cblxudmFyIENIT01QSU5HX0NMSVAgID0gMTtcbnZhciBDSE9NUElOR19TVFJJUCA9IDI7XG52YXIgQ0hPTVBJTkdfS0VFUCAgPSAzO1xuXG5cbnZhciBQQVRURVJOX05PTl9QUklOVEFCTEUgICAgICAgICA9IC9bXFx4MDAtXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUZcXHg3Ri1cXHg4NFxceDg2LVxceDlGXFx1RkZGRVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdLztcbnZhciBQQVRURVJOX05PTl9BU0NJSV9MSU5FX0JSRUFLUyA9IC9bXFx4ODVcXHUyMDI4XFx1MjAyOV0vO1xudmFyIFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTICAgICAgID0gL1ssXFxbXFxdXFx7XFx9XS87XG52YXIgUEFUVEVSTl9UQUdfSEFORExFICAgICAgICAgICAgPSAvXig/OiF8ISF8IVthLXpcXC1dKyEpJC9pO1xudmFyIFBBVFRFUk5fVEFHX1VSSSAgICAgICAgICAgICAgID0gL14oPzohfFteLFxcW1xcXVxce1xcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcXC0jO1xcL1xcPzpAJj1cXCtcXCQsX1xcLiF+XFwqJ1xcKFxcKVxcW1xcXV0pKiQvaTtcblxuXG5mdW5jdGlvbiBpc19FT0woYykge1xuICByZXR1cm4gKGMgPT09IDB4MEEvKiBMRiAqLykgfHwgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dISVRFX1NQQUNFKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDA5LyogVGFiICovKSB8fCAoYyA9PT0gMHgyMC8qIFNwYWNlICovKTtcbn1cblxuZnVuY3Rpb24gaXNfV1NfT1JfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDA5LyogVGFiICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MjAvKiBTcGFjZSAqLykgfHxcbiAgICAgICAgIChjID09PSAweDBBLyogTEYgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwRC8qIENSICovKTtcbn1cblxuZnVuY3Rpb24gaXNfRkxPV19JTkRJQ0FUT1IoYykge1xuICByZXR1cm4gYyA9PT0gMHgyQy8qICwgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4NUIvKiBbICovIHx8XG4gICAgICAgICBjID09PSAweDVELyogXSAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg3Qi8qIHsgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0QvKiB9ICovO1xufVxuXG5mdW5jdGlvbiBmcm9tSGV4Q29kZShjKSB7XG4gIHZhciBsYztcblxuICBpZiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkge1xuICAgIHJldHVybiBjIC0gMHgzMDtcbiAgfVxuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSovXG4gIGxjID0gYyB8IDB4MjA7XG5cbiAgaWYgKCgweDYxLyogYSAqLyA8PSBsYykgJiYgKGxjIDw9IDB4NjYvKiBmICovKSkge1xuICAgIHJldHVybiBsYyAtIDB4NjEgKyAxMDtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlZEhleExlbihjKSB7XG4gIGlmIChjID09PSAweDc4LyogeCAqLykgeyByZXR1cm4gMjsgfVxuICBpZiAoYyA9PT0gMHg3NS8qIHUgKi8pIHsgcmV0dXJuIDQ7IH1cbiAgaWYgKGMgPT09IDB4NTUvKiBVICovKSB7IHJldHVybiA4OyB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmcm9tRGVjaW1hbENvZGUoYykge1xuICBpZiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkge1xuICAgIHJldHVybiBjIC0gMHgzMDtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlRXNjYXBlU2VxdWVuY2UoYykge1xuICByZXR1cm4gKGMgPT09IDB4MzAvKiAwICovKSA/ICdcXHgwMCcgOlxuICAgICAgICAoYyA9PT0gMHg2MS8qIGEgKi8pID8gJ1xceDA3JyA6XG4gICAgICAgIChjID09PSAweDYyLyogYiAqLykgPyAnXFx4MDgnIDpcbiAgICAgICAgKGMgPT09IDB4NzQvKiB0ICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHgwOS8qIFRhYiAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4NkUvKiBuICovKSA/ICdcXHgwQScgOlxuICAgICAgICAoYyA9PT0gMHg3Ni8qIHYgKi8pID8gJ1xceDBCJyA6XG4gICAgICAgIChjID09PSAweDY2LyogZiAqLykgPyAnXFx4MEMnIDpcbiAgICAgICAgKGMgPT09IDB4NzIvKiByICovKSA/ICdcXHgwRCcgOlxuICAgICAgICAoYyA9PT0gMHg2NS8qIGUgKi8pID8gJ1xceDFCJyA6XG4gICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pID8gJyAnIDpcbiAgICAgICAgKGMgPT09IDB4MjIvKiBcIiAqLykgPyAnXFx4MjInIDpcbiAgICAgICAgKGMgPT09IDB4MkYvKiAvICovKSA/ICcvJyA6XG4gICAgICAgIChjID09PSAweDVDLyogXFwgKi8pID8gJ1xceDVDJyA6XG4gICAgICAgIChjID09PSAweDRFLyogTiAqLykgPyAnXFx4ODUnIDpcbiAgICAgICAgKGMgPT09IDB4NUYvKiBfICovKSA/ICdcXHhBMCcgOlxuICAgICAgICAoYyA9PT0gMHg0Qy8qIEwgKi8pID8gJ1xcdTIwMjgnIDpcbiAgICAgICAgKGMgPT09IDB4NTAvKiBQICovKSA/ICdcXHUyMDI5JyA6ICcnO1xufVxuXG5mdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjKSB7XG4gIGlmIChjIDw9IDB4RkZGRikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICB9XG4gIC8vIEVuY29kZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXJcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0NvZGVfcG9pbnRzX1UuMkIwMTAwMDBfdG9fVS4yQjEwRkZGRlxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgLSAweDAxMDAwMCkgPj4gMTApICsgMHhEODAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgLSAweDAxMDAwMCkgJiAweDAzRkYpICsgMHhEQzAwKTtcbn1cblxudmFyIHNpbXBsZUVzY2FwZUNoZWNrID0gbmV3IEFycmF5KDI1Nik7IC8vIGludGVnZXIsIGZvciBmYXN0IGFjY2Vzc1xudmFyIHNpbXBsZUVzY2FwZU1hcCA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICBzaW1wbGVFc2NhcGVDaGVja1tpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpID8gMSA6IDA7XG4gIHNpbXBsZUVzY2FwZU1hcFtpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpO1xufVxuXG5cbmZ1bmN0aW9uIFN0YXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHRoaXMuaW5wdXQgPSBpbnB1dDtcblxuICB0aGlzLmZpbGVuYW1lICA9IG9wdGlvbnNbJ2ZpbGVuYW1lJ10gIHx8IG51bGw7XG4gIHRoaXMuc2NoZW1hICAgID0gb3B0aW9uc1snc2NoZW1hJ10gICAgfHwgREVGQVVMVF9GVUxMX1NDSEVNQTtcbiAgdGhpcy5vbldhcm5pbmcgPSBvcHRpb25zWydvbldhcm5pbmcnXSB8fCBudWxsO1xuICB0aGlzLmxlZ2FjeSAgICA9IG9wdGlvbnNbJ2xlZ2FjeSddICAgIHx8IGZhbHNlO1xuICB0aGlzLmpzb24gICAgICA9IG9wdGlvbnNbJ2pzb24nXSAgICAgIHx8IGZhbHNlO1xuICB0aGlzLmxpc3RlbmVyICA9IG9wdGlvbnNbJ2xpc3RlbmVyJ10gIHx8IG51bGw7XG5cbiAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDtcbiAgdGhpcy50eXBlTWFwICAgICAgID0gdGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwO1xuXG4gIHRoaXMubGVuZ3RoICAgICA9IGlucHV0Lmxlbmd0aDtcbiAgdGhpcy5wb3NpdGlvbiAgID0gMDtcbiAgdGhpcy5saW5lICAgICAgID0gMDtcbiAgdGhpcy5saW5lU3RhcnQgID0gMDtcbiAgdGhpcy5saW5lSW5kZW50ID0gMDtcblxuICB0aGlzLmRvY3VtZW50cyA9IFtdO1xuXG4gIC8qXG4gIHRoaXMudmVyc2lvbjtcbiAgdGhpcy5jaGVja0xpbmVCcmVha3M7XG4gIHRoaXMudGFnTWFwO1xuICB0aGlzLmFuY2hvck1hcDtcbiAgdGhpcy50YWc7XG4gIHRoaXMuYW5jaG9yO1xuICB0aGlzLmtpbmQ7XG4gIHRoaXMucmVzdWx0OyovXG5cbn1cblxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgWUFNTEV4Y2VwdGlvbihcbiAgICBtZXNzYWdlLFxuICAgIG5ldyBNYXJrKHN0YXRlLmZpbGVuYW1lLCBzdGF0ZS5pbnB1dCwgc3RhdGUucG9zaXRpb24sIHN0YXRlLmxpbmUsIChzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydCkpKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICB0aHJvdyBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dXYXJuaW5nKHN0YXRlLCBtZXNzYWdlKSB7XG4gIGlmIChzdGF0ZS5vbldhcm5pbmcpIHtcbiAgICBzdGF0ZS5vbldhcm5pbmcuY2FsbChudWxsLCBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSk7XG4gIH1cbn1cblxuXG52YXIgZGlyZWN0aXZlSGFuZGxlcnMgPSB7XG5cbiAgWUFNTDogZnVuY3Rpb24gaGFuZGxlWWFtbERpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIG1hdGNoLCBtYWpvciwgbWlub3I7XG5cbiAgICBpZiAoc3RhdGUudmVyc2lvbiAhPT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mICVZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1lBTUwgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBtYXRjaCA9IC9eKFswLTldKylcXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7XG5cbiAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIGFyZ3VtZW50IG9mIHRoZSBZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIG1ham9yID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG5cbiAgICBpZiAobWFqb3IgIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cblxuICAgIHN0YXRlLnZlcnNpb24gPSBhcmdzWzBdO1xuICAgIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IChtaW5vciA8IDIpO1xuXG4gICAgaWYgKG1pbm9yICE9PSAxICYmIG1pbm9yICE9PSAyKSB7XG4gICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuICB9LFxuXG4gIFRBRzogZnVuY3Rpb24gaGFuZGxlVGFnRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgaGFuZGxlLCBwcmVmaXg7XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdUQUcgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSB0d28gYXJndW1lbnRzJyk7XG4gICAgfVxuXG4gICAgaGFuZGxlID0gYXJnc1swXTtcbiAgICBwcmVmaXggPSBhcmdzWzFdO1xuXG4gICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdChoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgaGFuZGxlIChmaXJzdCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCBoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlcmUgaXMgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHN1ZmZpeCBmb3IgXCInICsgaGFuZGxlICsgJ1wiIHRhZyBoYW5kbGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHByZWZpeCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS50YWdNYXBbaGFuZGxlXSA9IHByZWZpeDtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZSwgc3RhcnQsIGVuZCwgY2hlY2tKc29uKSB7XG4gIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7XG5cbiAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgX3Jlc3VsdCA9IHN0YXRlLmlucHV0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgaWYgKGNoZWNrSnNvbikge1xuICAgICAgZm9yIChfcG9zaXRpb24gPSAwLCBfbGVuZ3RoID0gX3Jlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgIF9wb3NpdGlvbiA8IF9sZW5ndGg7XG4gICAgICAgICAgIF9wb3NpdGlvbiArPSAxKSB7XG4gICAgICAgIF9jaGFyYWN0ZXIgPSBfcmVzdWx0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcbiAgICAgICAgaWYgKCEoX2NoYXJhY3RlciA9PT0gMHgwOSB8fFxuICAgICAgICAgICAgICAoMHgyMCA8PSBfY2hhcmFjdGVyICYmIF9jaGFyYWN0ZXIgPD0gMHgxMEZGRkYpKSkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCB2YWxpZCBKU09OIGNoYXJhY3RlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChQQVRURVJOX05PTl9QUklOVEFCTEUudGVzdChfcmVzdWx0KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZSBzdHJlYW0gY29udGFpbnMgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgc3RhdGUucmVzdWx0ICs9IF9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgZGVzdGluYXRpb24sIHNvdXJjZSwgb3ZlcnJpZGFibGVLZXlzKSB7XG4gIHZhciBzb3VyY2VLZXlzLCBrZXksIGluZGV4LCBxdWFudGl0eTtcblxuICBpZiAoIWNvbW1vbi5pc09iamVjdChzb3VyY2UpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Nhbm5vdCBtZXJnZSBtYXBwaW5nczsgdGhlIHByb3ZpZGVkIHNvdXJjZSBvYmplY3QgaXMgdW5hY2NlcHRhYmxlJyk7XG4gIH1cblxuICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuXG4gICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChkZXN0aW5hdGlvbiwga2V5KSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgb3ZlcnJpZGFibGVLZXlzW2tleV0gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSB7XG4gIHZhciBpbmRleCwgcXVhbnRpdHk7XG5cbiAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTtcblxuICBpZiAoX3Jlc3VsdCA9PT0gbnVsbCkge1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfVxuXG4gIGlmIChrZXlUYWcgPT09ICd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZU5vZGUpKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZVtpbmRleF0sIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFzdGF0ZS5qc29uICYmXG4gICAgICAgICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmXG4gICAgICAgIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRlZCBtYXBwaW5nIGtleScpO1xuICAgIH1cbiAgICBfcmVzdWx0W2tleU5vZGVdID0gdmFsdWVOb2RlO1xuICAgIGRlbGV0ZSBvdmVycmlkYWJsZUtleXNba2V5Tm9kZV07XG4gIH1cblxuICByZXR1cm4gX3Jlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVhZExpbmVCcmVhayhzdGF0ZSkge1xuICB2YXIgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4MEEvKiBMRiAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MEQvKiBDUiAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDBBLyogTEYgKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIGxpbmUgYnJlYWsgaXMgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIHN0YXRlLmxpbmUgKz0gMTtcbiAgc3RhdGUubGluZVN0YXJ0ID0gc3RhdGUucG9zaXRpb247XG59XG5cbmZ1bmN0aW9uIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGFsbG93Q29tbWVudHMsIGNoZWNrSW5kZW50KSB7XG4gIHZhciBsaW5lQnJlYWtzID0gMCxcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChhbGxvd0NvbW1lbnRzICYmIGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8ge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9IHdoaWxlIChjaCAhPT0gMHgwQS8qIExGICovICYmIGNoICE9PSAweDBELyogQ1IgKi8gJiYgY2ggIT09IDApO1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGxpbmVCcmVha3MrKztcbiAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwO1xuXG4gICAgICB3aGlsZSAoY2ggPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNoZWNrSW5kZW50ICE9PSAtMSAmJiBsaW5lQnJlYWtzICE9PSAwICYmIHN0YXRlLmxpbmVJbmRlbnQgPCBjaGVja0luZGVudCkge1xuICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ2RlZmljaWVudCBpbmRlbnRhdGlvbicpO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVCcmVha3M7XG59XG5cbmZ1bmN0aW9uIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAvLyBDb25kaXRpb24gc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCBpcyB0ZXN0ZWRcbiAgLy8gaW4gcGFyZW50IG9uIGVhY2ggY2FsbCwgZm9yIGVmZmljaWVuY3kuIE5vIG5lZWRzIHRvIHRlc3QgaGVyZSBhZ2Fpbi5cbiAgaWYgKChjaCA9PT0gMHgyRC8qIC0gKi8gfHwgY2ggPT09IDB4MkUvKiAuICovKSAmJlxuICAgICAgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMSkgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDIpKSB7XG5cbiAgICBfcG9zaXRpb24gKz0gMztcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAwIHx8IGlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgY291bnQpIHtcbiAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgfSBlbHNlIGlmIChjb3VudCA+IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgY291bnQgLSAxKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCwgd2l0aGluRmxvd0NvbGxlY3Rpb24pIHtcbiAgdmFyIHByZWNlZGluZyxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoYXNQZW5kaW5nQ29udGVudCxcbiAgICAgIF9saW5lLFxuICAgICAgX2xpbmVTdGFydCxcbiAgICAgIF9saW5lSW5kZW50LFxuICAgICAgX2tpbmQgPSBzdGF0ZS5raW5kLFxuICAgICAgX3Jlc3VsdCA9IHN0YXRlLnJlc3VsdCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGlzX1dTX09SX0VPTChjaCkgICAgICB8fFxuICAgICAgaXNfRkxPV19JTkRJQ0FUT1IoY2gpIHx8XG4gICAgICBjaCA9PT0gMHgyMy8qICMgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI2LyogJiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MkEvKiAqICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMS8qICEgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDdDLyogfCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4M0UvKiA+ICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNy8qICcgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDIyLyogXCIgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI1LyogJSAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NDAvKiBAICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg2MC8qIGAgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8XG4gICAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBwcmVjZWRpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uIC0gMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0wocHJlY2VkaW5nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkgfHxcbiAgICAgICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgICAgYnJlYWs7XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICAgIF9saW5lU3RhcnQgPSBzdGF0ZS5saW5lU3RhcnQ7XG4gICAgICBfbGluZUluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgLTEpO1xuXG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+PSBub2RlSW5kZW50KSB7XG4gICAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9IGNhcHR1cmVFbmQ7XG4gICAgICAgIHN0YXRlLmxpbmUgPSBfbGluZTtcbiAgICAgICAgc3RhdGUubGluZVN0YXJ0ID0gX2xpbmVTdGFydDtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCA9IF9saW5lSW5kZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzUGVuZGluZ0NvbnRlbnQpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHN0YXRlLmxpbmUgLSBfbGluZSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgIH1cblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTtcblxuICBpZiAoc3RhdGUucmVzdWx0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gX2tpbmQ7XG4gIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2gsXG4gICAgICBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQ7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjcvKiAnICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyNy8qICcgKi8pIHtcbiAgICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGV4TGVuZ3RoLFxuICAgICAgaGV4UmVzdWx0LFxuICAgICAgdG1wLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjIvKiBcIiAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDIyLyogXCIgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NUMvKiBcXCAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCk7XG5cbiAgICAgICAgLy8gVE9ETzogcmV3b3JrIHRvIGlubGluZSBmbiB3aXRoIG5vIHR5cGUgY2FzdD9cbiAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYgJiYgc2ltcGxlRXNjYXBlQ2hlY2tbY2hdKSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBzaW1wbGVFc2NhcGVNYXBbY2hdO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgICB9IGVsc2UgaWYgKCh0bXAgPSBlc2NhcGVkSGV4TGVuKGNoKSkgPiAwKSB7XG4gICAgICAgIGhleExlbmd0aCA9IHRtcDtcbiAgICAgICAgaGV4UmVzdWx0ID0gMDtcblxuICAgICAgICBmb3IgKDsgaGV4TGVuZ3RoID4gMDsgaGV4TGVuZ3RoLS0pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoKHRtcCA9IGZyb21IZXhDb2RlKGNoKSkgPj0gMCkge1xuICAgICAgICAgICAgaGV4UmVzdWx0ID0gKGhleFJlc3VsdCA8PCA0KSArIHRtcDtcblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZXhwZWN0ZWQgaGV4YWRlY2ltYWwgY2hhcmFjdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNoYXJGcm9tQ29kZXBvaW50KGhleFJlc3VsdCk7XG5cbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gZXNjYXBlIHNlcXVlbmNlJyk7XG4gICAgICB9XG5cbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCkpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXInKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgcmVhZE5leHQgPSB0cnVlLFxuICAgICAgX2xpbmUsXG4gICAgICBfdGFnICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9yZXN1bHQsXG4gICAgICBfYW5jaG9yICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIHRlcm1pbmF0b3IsXG4gICAgICBpc1BhaXIsXG4gICAgICBpc0V4cGxpY2l0UGFpcixcbiAgICAgIGlzTWFwcGluZyxcbiAgICAgIG92ZXJyaWRhYmxlS2V5cyA9IHt9LFxuICAgICAga2V5Tm9kZSxcbiAgICAgIGtleVRhZyxcbiAgICAgIHZhbHVlTm9kZSxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDVCLyogWyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDVEOy8qIF0gKi9cbiAgICBpc01hcHBpbmcgPSBmYWxzZTtcbiAgICBfcmVzdWx0ID0gW107XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4N0IvKiB7ICovKSB7XG4gICAgdGVybWluYXRvciA9IDB4N0Q7LyogfSAqL1xuICAgIGlzTWFwcGluZyA9IHRydWU7XG4gICAgX3Jlc3VsdCA9IHt9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSB0ZXJtaW5hdG9yKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICBzdGF0ZS5raW5kID0gaXNNYXBwaW5nID8gJ21hcHBpbmcnIDogJ3NlcXVlbmNlJztcbiAgICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFyZWFkTmV4dCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ21pc3NlZCBjb21tYSBiZXR3ZWVuIGZsb3cgY29sbGVjdGlvbiBlbnRyaWVzJyk7XG4gICAgfVxuXG4gICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSBmYWxzZTtcblxuICAgIGlmIChjaCA9PT0gMHgzRi8qID8gKi8pIHtcbiAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG4gICAgICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKGlzRXhwbGljaXRQYWlyIHx8IHN0YXRlLmxpbmUgPT09IF9saW5lKSAmJiBjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGlzUGFpciA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcbiAgICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXBwaW5nKSB7XG4gICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKTtcbiAgICB9IGVsc2UgaWYgKGlzUGFpcikge1xuICAgICAgX3Jlc3VsdC5wdXNoKHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIG51bGwsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3Jlc3VsdC5wdXNoKGtleU5vZGUpO1xuICAgIH1cblxuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMHgyQy8qICwgKi8pIHtcbiAgICAgIHJlYWROZXh0ID0gdHJ1ZTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhZE5leHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjYXB0dXJlU3RhcnQsXG4gICAgICBmb2xkaW5nLFxuICAgICAgY2hvbXBpbmcgICAgICAgPSBDSE9NUElOR19DTElQLFxuICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSBmYWxzZSxcbiAgICAgIHRleHRJbmRlbnQgICAgID0gbm9kZUluZGVudCxcbiAgICAgIGVtcHR5TGluZXMgICAgID0gMCxcbiAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2UsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg3Qy8qIHwgKi8pIHtcbiAgICBmb2xkaW5nID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4M0UvKiA+ICovKSB7XG4gICAgZm9sZGluZyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkIvKiArICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgICAgaWYgKENIT01QSU5HX0NMSVAgPT09IGNob21waW5nKSB7XG4gICAgICAgIGNob21waW5nID0gKGNoID09PSAweDJCLyogKyAqLykgPyBDSE9NUElOR19LRUVQIDogQ0hPTVBJTkdfU1RSSVA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCh0bXAgPSBmcm9tRGVjaW1hbENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICBpZiAodG1wID09PSAwKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgZXhwbGljaXQgaW5kZW50YXRpb24gd2lkdGggb2YgYSBibG9jayBzY2FsYXI7IGl0IGNhbm5vdCBiZSBsZXNzIHRoYW4gb25lJyk7XG4gICAgICB9IGVsc2UgaWYgKCFkZXRlY3RlZEluZGVudCkge1xuICAgICAgICB0ZXh0SW5kZW50ID0gbm9kZUluZGVudCArIHRtcCAtIDE7XG4gICAgICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYW4gaW5kZW50YXRpb24gd2lkdGggaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpO1xuXG4gICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcbiAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICB3aGlsZSAoKCFkZXRlY3RlZEluZGVudCB8fCBzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgJiZcbiAgICAgICAgICAgKGNoID09PSAweDIwLyogU3BhY2UgKi8pKSB7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCFkZXRlY3RlZEluZGVudCAmJiBzdGF0ZS5saW5lSW5kZW50ID4gdGV4dEluZGVudCkge1xuICAgICAgdGV4dEluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGVtcHR5TGluZXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEVuZCBvZiB0aGUgc2NhbGFyLlxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkge1xuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBjaG9tcGluZy5cbiAgICAgIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfS0VFUCkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKGNob21waW5nID09PSBDSE9NUElOR19DTElQKSB7XG4gICAgICAgIGlmIChkZXRlY3RlZEluZGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgdGhlIHNjYWxhciBpcyBub3QgZW1wdHkuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJyZWFrIHRoaXMgYHdoaWxlYCBjeWNsZSBhbmQgZ28gdG8gdGhlIGZ1bmNpdG9uJ3MgZXBpbG9ndWUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBGb2xkZWQgc3R5bGU6IHVzZSBmYW5jeSBydWxlcyB0byBoYW5kbGUgbGluZSBicmVha3MuXG4gICAgaWYgKGZvbGRpbmcpIHtcblxuICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIChtb3JlLWluZGVudGVkIGxpbmVzKSBhcmUgbm90IGZvbGRlZC5cbiAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuXG4gICAgICAvLyBFbmQgb2YgbW9yZS1pbmRlbnRlZCBibG9jay5cbiAgICAgIH0gZWxzZSBpZiAoYXRNb3JlSW5kZW50ZWQpIHtcbiAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcblxuICAgICAgLy8gSnVzdCBvbmUgbGluZSBicmVhayAtIHBlcmNlaXZlIGFzIHRoZSBzYW1lIGxpbmUuXG4gICAgICB9IGVsc2UgaWYgKGVtcHR5TGluZXMgPT09IDApIHtcbiAgICAgICAgaWYgKGRldGVjdGVkSW5kZW50KSB7IC8vIGkuZS4gb25seSBpZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBzb21lIHNjYWxhciBjb250ZW50LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gICAgICAgIH1cblxuICAgICAgLy8gU2V2ZXJhbCBsaW5lIGJyZWFrcyAtIHBlcmNlaXZlIGFzIGRpZmZlcmVudCBsaW5lcy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzKTtcbiAgICAgIH1cblxuICAgIC8vIExpdGVyYWwgc3R5bGU6IGp1c3QgYWRkIGV4YWN0IG51bWJlciBvZiBsaW5lIGJyZWFrcyBiZXR3ZWVuIGNvbnRlbnQgbGluZXMuXG4gICAgfSBlbHNlIGlmIChkZXRlY3RlZEluZGVudCkge1xuICAgICAgLy8gSWYgY3VycmVudCBsaW5lIGlzbid0IHRoZSBmaXJzdCBvbmUgLSBjb3VudCBsaW5lIGJyZWFrIGZyb20gdGhlIGxhc3QgY29udGVudCBsaW5lLlxuICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gY2FzZSBvZiB0aGUgZmlyc3QgY29udGVudCBsaW5lIC0gY291bnQgb25seSBlbXB0eSBsaW5lcy5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzKTtcbiAgICB9XG5cbiAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7XG4gICAgZW1wdHlMaW5lcyA9IDA7XG4gICAgY2FwdHVyZVN0YXJ0ID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB3aGlsZSAoIWlzX0VPTChjaCkgJiYgKGNoICE9PSAwKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIF9saW5lLFxuICAgICAgX3RhZyAgICAgID0gc3RhdGUudGFnLFxuICAgICAgX2FuY2hvciAgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgX3Jlc3VsdCAgID0gW10sXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBkZXRlY3RlZCAgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuXG4gICAgaWYgKGNoICE9PSAweDJELyogLSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgaWYgKCFpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA8PSBub2RlSW5kZW50KSB7XG4gICAgICAgIF9yZXN1bHQucHVzaChudWxsKTtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgX3Jlc3VsdC5wdXNoKHN0YXRlLnJlc3VsdCk7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmICgoc3RhdGUubGluZSA9PT0gX2xpbmUgfHwgc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgaW5kZW50YXRpb24gb2YgYSBzZXF1ZW5jZSBlbnRyeScpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZXRlY3RlZCkge1xuICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICBzdGF0ZS5raW5kID0gJ3NlcXVlbmNlJztcbiAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgbm9kZUluZGVudCwgZmxvd0luZGVudCkge1xuICB2YXIgZm9sbG93aW5nLFxuICAgICAgYWxsb3dDb21wYWN0LFxuICAgICAgX2xpbmUsXG4gICAgICBfdGFnICAgICAgICAgID0gc3RhdGUudGFnLFxuICAgICAgX2FuY2hvciAgICAgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICAgICAgPSB7fSxcbiAgICAgIG92ZXJyaWRhYmxlS2V5cyA9IHt9LFxuICAgICAga2V5VGFnICAgICAgICA9IG51bGwsXG4gICAgICBrZXlOb2RlICAgICAgID0gbnVsbCxcbiAgICAgIHZhbHVlTm9kZSAgICAgPSBudWxsLFxuICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlLFxuICAgICAgZGV0ZWN0ZWQgICAgICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuICAgIF9saW5lID0gc3RhdGUubGluZTsgLy8gU2F2ZSB0aGUgY3VycmVudCBsaW5lLlxuXG4gICAgLy9cbiAgICAvLyBFeHBsaWNpdCBub3RhdGlvbiBjYXNlLiBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGJsb2NrczpcbiAgICAvLyBmaXJzdCBmb3IgdGhlIGtleSAoZGVub3RlZCBieSBcIj9cIikgYW5kIHNlY29uZCBmb3IgdGhlIHZhbHVlIChkZW5vdGVkIGJ5IFwiOlwiKVxuICAgIC8vXG4gICAgaWYgKChjaCA9PT0gMHgzRi8qID8gKi8gfHwgY2ggPT09IDB4M0EvKiA6ICovKSAmJiBpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICBhdEV4cGxpY2l0S2V5ID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTtcblxuICAgICAgfSBlbHNlIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIC8vIGkuZS4gMHgzQS8qIDogKi8gPT09IGNoYXJhY3RlciBhZnRlciB0aGUgZXhwbGljaXQga2V5LlxuICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQnKTtcbiAgICAgIH1cblxuICAgICAgc3RhdGUucG9zaXRpb24gKz0gMTtcbiAgICAgIGNoID0gZm9sbG93aW5nO1xuXG4gICAgLy9cbiAgICAvLyBJbXBsaWNpdCBub3RhdGlvbiBjYXNlLiBGbG93LXN0eWxlIG5vZGUgYXMgdGhlIGtleSBmaXJzdCwgdGhlbiBcIjpcIiwgYW5kIHRoZSB2YWx1ZS5cbiAgICAvL1xuICAgIH0gZWxzZSBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19PVVQsIGZhbHNlLCB0cnVlKSkge1xuXG4gICAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmICghaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Egd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgZXhwZWN0ZWQgYWZ0ZXIgdGhlIGtleS12YWx1ZSBzZXBhcmF0b3Igd2l0aGluIGEgYmxvY2sgbWFwcGluZycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICAgIGFsbG93Q29tcGFjdCA9IGZhbHNlO1xuICAgICAgICAgIGtleVRhZyA9IHN0YXRlLnRhZztcbiAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2FuIG5vdCByZWFkIGFuIGltcGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBjb2xvbiBpcyBtaXNzZWQnKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2FuIG5vdCByZWFkIGEgYmxvY2sgbWFwcGluZyBlbnRyeTsgYSBtdWx0aWxpbmUga2V5IG1heSBub3QgYmUgYW4gaW1wbGljaXQga2V5Jyk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByZXN1bHQgb2YgYGNvbXBvc2VOb2RlYC5cbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhazsgLy8gUmVhZGluZyBpcyBkb25lLiBHbyB0byB0aGUgZXBpbG9ndWUuXG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBDb21tb24gcmVhZGluZyBjb2RlIGZvciBib3RoIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBub3RhdGlvbnMuXG4gICAgLy9cbiAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUgfHwgc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQpIHtcbiAgICAgIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19PVVQsIHRydWUsIGFsbG93Q29tcGFjdCkpIHtcbiAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeScpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIC8vIEVwaWxvZ3VlLlxuICAvL1xuXG4gIC8vIFNwZWNpYWwgY2FzZTogbGFzdCBtYXBwaW5nJ3Mgbm9kZSBjb250YWlucyBvbmx5IHRoZSBrZXkgaW4gZXhwbGljaXQgbm90YXRpb24uXG4gIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRoZSByZXN1bHRpbmcgbWFwcGluZy5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnbWFwcGluZyc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBkZXRlY3RlZDtcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBpc1ZlcmJhdGltID0gZmFsc2UsXG4gICAgICBpc05hbWVkICAgID0gZmFsc2UsXG4gICAgICB0YWdIYW5kbGUsXG4gICAgICB0YWdOYW1lLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjEvKiAhICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhIHRhZyBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHgzQy8qIDwgKi8pIHtcbiAgICBpc1ZlcmJhdGltID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICB0YWdIYW5kbGUgPSAnISEnO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2Uge1xuICAgIHRhZ0hhbmRsZSA9ICchJztcbiAgfVxuXG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgY2ggIT09IDB4M0UvKiA+ICovKTtcblxuICAgIGlmIChzdGF0ZS5wb3NpdGlvbiA8IHN0YXRlLmxlbmd0aCkge1xuICAgICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSB2ZXJiYXRpbSB0YWcnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICAgICAgaWYgKCFpc05hbWVkKSB7XG4gICAgICAgICAgdGFnSGFuZGxlID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QodGFnSGFuZGxlKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWVkIHRhZyBoYW5kbGUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaXNOYW1lZCA9IHRydWU7XG4gICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGV4Y2xhbWF0aW9uIG1hcmtzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUy50ZXN0KHRhZ05hbWUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBmbG93IGluZGljYXRvciBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogJyArIHRhZ05hbWUpO1xuICB9XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBzdGF0ZS50YWcgPSB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCB0YWdIYW5kbGUpKSB7XG4gICAgc3RhdGUudGFnID0gc3RhdGUudGFnTWFwW3RhZ0hhbmRsZV0gKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnIScpIHtcbiAgICBzdGF0ZS50YWcgPSAnIScgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnISEnKSB7XG4gICAgc3RhdGUudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOicgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZGVjbGFyZWQgdGFnIGhhbmRsZSBcIicgKyB0YWdIYW5kbGUgKyAnXCInKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI2LyogJiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgc3RhdGUuYW5jaG9yID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQWxpYXMoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiwgYWxpYXMsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyQS8qICogKi8pIHJldHVybiBmYWxzZTtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBhbGlhcyA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmICghc3RhdGUuYW5jaG9yTWFwLmhhc093blByb3BlcnR5KGFsaWFzKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmlkZW50aWZpZWQgYWxpYXMgXCInICsgYWxpYXMgKyAnXCInKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VsdCA9IHN0YXRlLmFuY2hvck1hcFthbGlhc107XG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbXBvc2VOb2RlKHN0YXRlLCBwYXJlbnRJbmRlbnQsIG5vZGVDb250ZXh0LCBhbGxvd1RvU2VlaywgYWxsb3dDb21wYWN0KSB7XG4gIHZhciBhbGxvd0Jsb2NrU3R5bGVzLFxuICAgICAgYWxsb3dCbG9ja1NjYWxhcnMsXG4gICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMsXG4gICAgICBpbmRlbnRTdGF0dXMgPSAxLCAvLyAxOiB0aGlzPnBhcmVudCwgMDogdGhpcz1wYXJlbnQsIC0xOiB0aGlzPHBhcmVudFxuICAgICAgYXROZXdMaW5lICA9IGZhbHNlLFxuICAgICAgaGFzQ29udGVudCA9IGZhbHNlLFxuICAgICAgdHlwZUluZGV4LFxuICAgICAgdHlwZVF1YW50aXR5LFxuICAgICAgdHlwZSxcbiAgICAgIGZsb3dJbmRlbnQsXG4gICAgICBibG9ja0luZGVudDtcblxuICBpZiAoc3RhdGUubGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5saXN0ZW5lcignb3BlbicsIHN0YXRlKTtcbiAgfVxuXG4gIHN0YXRlLnRhZyAgICA9IG51bGw7XG4gIHN0YXRlLmFuY2hvciA9IG51bGw7XG4gIHN0YXRlLmtpbmQgICA9IG51bGw7XG4gIHN0YXRlLnJlc3VsdCA9IG51bGw7XG5cbiAgYWxsb3dCbG9ja1N0eWxlcyA9IGFsbG93QmxvY2tTY2FsYXJzID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zID1cbiAgICBDT05URVhUX0JMT0NLX09VVCA9PT0gbm9kZUNvbnRleHQgfHxcbiAgICBDT05URVhUX0JMT0NLX0lOICA9PT0gbm9kZUNvbnRleHQ7XG5cbiAgaWYgKGFsbG93VG9TZWVrKSB7XG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgYXROZXdMaW5lID0gdHJ1ZTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSkge1xuICAgIHdoaWxlIChyZWFkVGFnUHJvcGVydHkoc3RhdGUpIHx8IHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZSkpIHtcbiAgICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgICAgYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYWxsb3dCbG9ja1N0eWxlcztcblxuICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMpIHtcbiAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhdE5ld0xpbmUgfHwgYWxsb3dDb21wYWN0O1xuICB9XG5cbiAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSB8fCBDT05URVhUX0JMT0NLX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICBpZiAoQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCB8fCBDT05URVhUX0ZMT1dfT1VUID09PSBub2RlQ29udGV4dCkge1xuICAgICAgZmxvd0luZGVudCA9IHBhcmVudEluZGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmxvd0luZGVudCA9IHBhcmVudEluZGVudCArIDE7XG4gICAgfVxuXG4gICAgYmxvY2tJbmRlbnQgPSBzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydDtcblxuICAgIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICAgIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgJiZcbiAgICAgICAgICAocmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIGJsb2NrSW5kZW50KSB8fFxuICAgICAgICAgICByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBibG9ja0luZGVudCwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBmbG93SW5kZW50KSkge1xuICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoYWxsb3dCbG9ja1NjYWxhcnMgJiYgcmVhZEJsb2NrU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSkgfHxcbiAgICAgICAgICAgIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpIHx8XG4gICAgICAgICAgICByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVhZEFsaWFzKHN0YXRlKSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCB8fCBzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhbGlhcyBub2RlIHNob3VsZCBub3QgaGF2ZSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlLnRhZyA9ICc/JztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluZGVudFN0YXR1cyA9PT0gMCkge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlOiBibG9jayBzZXF1ZW5jZXMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBzYW1lIGluZGVudGF0aW9uIGxldmVsIGFzIHRoZSBwYXJlbnQuXG4gICAgICAvLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI3OTk3ODRcbiAgICAgIGhhc0NvbnRlbnQgPSBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgJiYgcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIGJsb2NrSW5kZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUudGFnICE9PSBudWxsICYmIHN0YXRlLnRhZyAhPT0gJyEnKSB7XG4gICAgaWYgKHN0YXRlLnRhZyA9PT0gJz8nKSB7XG4gICAgICBmb3IgKHR5cGVJbmRleCA9IDAsIHR5cGVRdWFudGl0eSA9IHN0YXRlLmltcGxpY2l0VHlwZXMubGVuZ3RoO1xuICAgICAgICAgICB0eXBlSW5kZXggPCB0eXBlUXVhbnRpdHk7XG4gICAgICAgICAgIHR5cGVJbmRleCArPSAxKSB7XG4gICAgICAgIHR5cGUgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzW3R5cGVJbmRleF07XG5cbiAgICAgICAgLy8gSW1wbGljaXQgcmVzb2x2aW5nIGlzIG5vdCBhbGxvd2VkIGZvciBub24tc2NhbGFyIHR5cGVzLCBhbmQgJz8nXG4gICAgICAgIC8vIG5vbi1zcGVjaWZpYyB0YWcgaXMgb25seSBhc3NpZ25lZCB0byBwbGFpbiBzY2FsYXJzLiBTbywgaXQgaXNuJ3RcbiAgICAgICAgLy8gbmVlZGVkIHRvIGNoZWNrIGZvciAna2luZCcgY29uZm9ybWl0eS5cblxuICAgICAgICBpZiAodHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTtcbiAgICAgICAgICBzdGF0ZS50YWcgPSB0eXBlLnRhZztcbiAgICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnR5cGVNYXAsIHN0YXRlLnRhZykpIHtcbiAgICAgIHR5cGUgPSBzdGF0ZS50eXBlTWFwW3N0YXRlLnRhZ107XG5cbiAgICAgIGlmIChzdGF0ZS5yZXN1bHQgIT09IG51bGwgJiYgdHlwZS5raW5kICE9PSBzdGF0ZS5raW5kKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPCcgKyBzdGF0ZS50YWcgKyAnPiB0YWc7IGl0IHNob3VsZCBiZSBcIicgKyB0eXBlLmtpbmQgKyAnXCIsIG5vdCBcIicgKyBzdGF0ZS5raW5kICsgJ1wiJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgcmVzb2x2ZSBhIG5vZGUgd2l0aCAhPCcgKyBzdGF0ZS50YWcgKyAnPiBleHBsaWNpdCB0YWcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biB0YWcgITwnICsgc3RhdGUudGFnICsgJz4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUubGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5saXN0ZW5lcignY2xvc2UnLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnRhZyAhPT0gbnVsbCB8fCAgc3RhdGUuYW5jaG9yICE9PSBudWxsIHx8IGhhc0NvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHJlYWREb2N1bWVudChzdGF0ZSkge1xuICB2YXIgZG9jdW1lbnRTdGFydCA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgX3Bvc2l0aW9uLFxuICAgICAgZGlyZWN0aXZlTmFtZSxcbiAgICAgIGRpcmVjdGl2ZUFyZ3MsXG4gICAgICBoYXNEaXJlY3RpdmVzID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBzdGF0ZS52ZXJzaW9uID0gbnVsbDtcbiAgc3RhdGUuY2hlY2tMaW5lQnJlYWtzID0gc3RhdGUubGVnYWN5O1xuICBzdGF0ZS50YWdNYXAgPSB7fTtcbiAgc3RhdGUuYW5jaG9yTWFwID0ge307XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IDAgfHwgY2ggIT09IDB4MjUvKiAlICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBkaXJlY3RpdmVOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gICAgZGlyZWN0aXZlQXJncyA9IFtdO1xuXG4gICAgaWYgKGRpcmVjdGl2ZU5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2RpcmVjdGl2ZSBuYW1lIG11c3Qgbm90IGJlIGxlc3MgdGhhbiBvbmUgY2hhcmFjdGVyIGluIGxlbmd0aCcpO1xuICAgIH1cblxuICAgIHdoaWxlIChjaCAhPT0gMCkge1xuICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19FT0woY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSBicmVhaztcblxuICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGRpcmVjdGl2ZUFyZ3MucHVzaChzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKGNoICE9PSAwKSByZWFkTGluZUJyZWFrKHN0YXRlKTtcblxuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChkaXJlY3RpdmVIYW5kbGVycywgZGlyZWN0aXZlTmFtZSkpIHtcbiAgICAgIGRpcmVjdGl2ZUhhbmRsZXJzW2RpcmVjdGl2ZU5hbWVdKHN0YXRlLCBkaXJlY3RpdmVOYW1lLCBkaXJlY3RpdmVBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5rbm93biBkb2N1bWVudCBkaXJlY3RpdmUgXCInICsgZGlyZWN0aXZlTmFtZSArICdcIicpO1xuICAgIH1cbiAgfVxuXG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gMCAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgICAgID09PSAweDJELyogLSAqLyAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpID09PSAweDJELyogLSAqLyAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDIpID09PSAweDJELyogLSAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIH0gZWxzZSBpZiAoaGFzRGlyZWN0aXZlcykge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmVzIGVuZCBtYXJrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBjb21wb3NlTm9kZShzdGF0ZSwgc3RhdGUubGluZUluZGVudCAtIDEsIENPTlRFWFRfQkxPQ0tfT1VULCBmYWxzZSwgdHJ1ZSk7XG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICBpZiAoc3RhdGUuY2hlY2tMaW5lQnJlYWtzICYmXG4gICAgICBQQVRURVJOX05PTl9BU0NJSV9MSU5FX0JSRUFLUy50ZXN0KHN0YXRlLmlucHV0LnNsaWNlKGRvY3VtZW50U3RhcnQsIHN0YXRlLnBvc2l0aW9uKSkpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdub24tQVNDSUkgbGluZSBicmVha3MgYXJlIGludGVycHJldGVkIGFzIGNvbnRlbnQnKTtcbiAgfVxuXG4gIHN0YXRlLmRvY3VtZW50cy5wdXNoKHN0YXRlLnJlc3VsdCk7XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuXG4gICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDJFLyogLiAqLykge1xuICAgICAgc3RhdGUucG9zaXRpb24gKz0gMztcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2VuZCBvZiB0aGUgc3RyZWFtIG9yIGEgZG9jdW1lbnQgc2VwYXJhdG9yIGlzIGV4cGVjdGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucykge1xuICBpbnB1dCA9IFN0cmluZyhpbnB1dCk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChpbnB1dC5sZW5ndGggIT09IDApIHtcblxuICAgIC8vIEFkZCB0YWlsaW5nIGBcXG5gIGlmIG5vdCBleGlzdHNcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChpbnB1dC5sZW5ndGggLSAxKSAhPT0gMHgwQS8qIExGICovICYmXG4gICAgICAgIGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEQvKiBDUiAqLykge1xuICAgICAgaW5wdXQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gU3RyaXAgQk9NXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgICAgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSBuZXcgU3RhdGUoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIC8vIFVzZSAwIGFzIHN0cmluZyB0ZXJtaW5hdG9yLiBUaGF0IHNpZ25pZmljYW50bHkgc2ltcGxpZmllcyBib3VuZHMgY2hlY2suXG4gIHN0YXRlLmlucHV0ICs9ICdcXDAnO1xuXG4gIHdoaWxlIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyMC8qIFNwYWNlICovKSB7XG4gICAgc3RhdGUubGluZUluZGVudCArPSAxO1xuICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucG9zaXRpb24gPCAoc3RhdGUubGVuZ3RoIC0gMSkpIHtcbiAgICByZWFkRG9jdW1lbnQoc3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlLmRvY3VtZW50cztcbn1cblxuXG5mdW5jdGlvbiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvciwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyksIGluZGV4LCBsZW5ndGg7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGRvY3VtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgaXRlcmF0b3IoZG9jdW1lbnRzW2luZGV4XSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBsb2FkKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKTtcblxuICBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkKi9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRzWzBdO1xuICB9XG4gIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdleHBlY3RlZCBhIHNpbmdsZSBkb2N1bWVudCBpbiB0aGUgc3RyZWFtLCBidXQgZm91bmQgbW9yZScpO1xufVxuXG5cbmZ1bmN0aW9uIHNhZmVMb2FkQWxsKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMpIHtcbiAgbG9hZEFsbChpbnB1dCwgb3V0cHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZChpbnB1dCwgb3B0aW9ucykge1xuICByZXR1cm4gbG9hZChpbnB1dCwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgPSBsb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgPSBsb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBzYWZlTG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkICAgID0gc2FmZUxvYWQ7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuZnVuY3Rpb24gTWFyayhuYW1lLCBidWZmZXIsIHBvc2l0aW9uLCBsaW5lLCBjb2x1bW4pIHtcbiAgdGhpcy5uYW1lICAgICA9IG5hbWU7XG4gIHRoaXMuYnVmZmVyICAgPSBidWZmZXI7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5saW5lICAgICA9IGxpbmU7XG4gIHRoaXMuY29sdW1uICAgPSBjb2x1bW47XG59XG5cblxuTWFyay5wcm90b3R5cGUuZ2V0U25pcHBldCA9IGZ1bmN0aW9uIGdldFNuaXBwZXQoaW5kZW50LCBtYXhMZW5ndGgpIHtcbiAgdmFyIGhlYWQsIHN0YXJ0LCB0YWlsLCBlbmQsIHNuaXBwZXQ7XG5cbiAgaWYgKCF0aGlzLmJ1ZmZlcikgcmV0dXJuIG51bGw7XG5cbiAgaW5kZW50ID0gaW5kZW50IHx8IDQ7XG4gIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCA3NTtcblxuICBoZWFkID0gJyc7XG4gIHN0YXJ0ID0gdGhpcy5wb3NpdGlvbjtcblxuICB3aGlsZSAoc3RhcnQgPiAwICYmICdcXHgwMFxcclxcblxceDg1XFx1MjAyOFxcdTIwMjknLmluZGV4T2YodGhpcy5idWZmZXIuY2hhckF0KHN0YXJ0IC0gMSkpID09PSAtMSkge1xuICAgIHN0YXJ0IC09IDE7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gLSBzdGFydCA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIGhlYWQgPSAnIC4uLiAnO1xuICAgICAgc3RhcnQgKz0gNTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHRhaWwgPSAnJztcbiAgZW5kID0gdGhpcy5wb3NpdGlvbjtcblxuICB3aGlsZSAoZW5kIDwgdGhpcy5idWZmZXIubGVuZ3RoICYmICdcXHgwMFxcclxcblxceDg1XFx1MjAyOFxcdTIwMjknLmluZGV4T2YodGhpcy5idWZmZXIuY2hhckF0KGVuZCkpID09PSAtMSkge1xuICAgIGVuZCArPSAxO1xuICAgIGlmIChlbmQgLSB0aGlzLnBvc2l0aW9uID4gKG1heExlbmd0aCAvIDIgLSAxKSkge1xuICAgICAgdGFpbCA9ICcgLi4uICc7XG4gICAgICBlbmQgLT0gNTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNuaXBwZXQgPSB0aGlzLmJ1ZmZlci5zbGljZShzdGFydCwgZW5kKTtcblxuICByZXR1cm4gY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCkgKyBoZWFkICsgc25pcHBldCArIHRhaWwgKyAnXFxuJyArXG4gICAgICAgICBjb21tb24ucmVwZWF0KCcgJywgaW5kZW50ICsgdGhpcy5wb3NpdGlvbiAtIHN0YXJ0ICsgaGVhZC5sZW5ndGgpICsgJ14nO1xufTtcblxuXG5NYXJrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGNvbXBhY3QpIHtcbiAgdmFyIHNuaXBwZXQsIHdoZXJlID0gJyc7XG5cbiAgaWYgKHRoaXMubmFtZSkge1xuICAgIHdoZXJlICs9ICdpbiBcIicgKyB0aGlzLm5hbWUgKyAnXCIgJztcbiAgfVxuXG4gIHdoZXJlICs9ICdhdCBsaW5lICcgKyAodGhpcy5saW5lICsgMSkgKyAnLCBjb2x1bW4gJyArICh0aGlzLmNvbHVtbiArIDEpO1xuXG4gIGlmICghY29tcGFjdCkge1xuICAgIHNuaXBwZXQgPSB0aGlzLmdldFNuaXBwZXQoKTtcblxuICAgIGlmIChzbmlwcGV0KSB7XG4gICAgICB3aGVyZSArPSAnOlxcbicgKyBzbmlwcGV0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3aGVyZTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNYXJrO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4qL1xuXG52YXIgY29tbW9uICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgVHlwZSAgICAgICAgICA9IHJlcXVpcmUoJy4vdHlwZScpO1xuXG5cbmZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7XG4gIHZhciBleGNsdWRlID0gW107XG5cbiAgc2NoZW1hLmluY2x1ZGUuZm9yRWFjaChmdW5jdGlvbiAoaW5jbHVkZWRTY2hlbWEpIHtcbiAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTtcbiAgfSk7XG5cbiAgc2NoZW1hW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKGN1cnJlbnRUeXBlKSB7XG4gICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHByZXZpb3VzVHlwZSwgcHJldmlvdXNJbmRleCkge1xuICAgICAgaWYgKHByZXZpb3VzVHlwZS50YWcgPT09IGN1cnJlbnRUeXBlLnRhZykge1xuICAgICAgICBleGNsdWRlLnB1c2gocHJldmlvdXNJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uICh0eXBlLCBpbmRleCkge1xuICAgIHJldHVybiBleGNsdWRlLmluZGV4T2YoaW5kZXgpID09PSAtMTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gY29tcGlsZU1hcCgvKiBsaXN0cy4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge30sIGluZGV4LCBsZW5ndGg7XG5cbiAgZnVuY3Rpb24gY29sbGVjdFR5cGUodHlwZSkge1xuICAgIHJlc3VsdFt0eXBlLnRhZ10gPSB0eXBlO1xuICB9XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgYXJndW1lbnRzW2luZGV4XS5mb3JFYWNoKGNvbGxlY3RUeXBlKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuZnVuY3Rpb24gU2NoZW1hKGRlZmluaXRpb24pIHtcbiAgdGhpcy5pbmNsdWRlICA9IGRlZmluaXRpb24uaW5jbHVkZSAgfHwgW107XG4gIHRoaXMuaW1wbGljaXQgPSBkZWZpbml0aW9uLmltcGxpY2l0IHx8IFtdO1xuICB0aGlzLmV4cGxpY2l0ID0gZGVmaW5pdGlvbi5leHBsaWNpdCB8fCBbXTtcblxuICB0aGlzLmltcGxpY2l0LmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBpZiAodHlwZS5sb2FkS2luZCAmJiB0eXBlLmxvYWRLaW5kICE9PSAnc2NhbGFyJykge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1RoZXJlIGlzIGEgbm9uLXNjYWxhciB0eXBlIGluIHRoZSBpbXBsaWNpdCBsaXN0IG9mIGEgc2NoZW1hLiBJbXBsaWNpdCByZXNvbHZpbmcgb2Ygc3VjaCB0eXBlcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5jb21waWxlZEltcGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2ltcGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkRXhwbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAnZXhwbGljaXQnLCBbXSk7XG4gIHRoaXMuY29tcGlsZWRUeXBlTWFwICA9IGNvbXBpbGVNYXAodGhpcy5jb21waWxlZEltcGxpY2l0LCB0aGlzLmNvbXBpbGVkRXhwbGljaXQpO1xufVxuXG5cblNjaGVtYS5ERUZBVUxUID0gbnVsbDtcblxuXG5TY2hlbWEuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlU2NoZW1hKCkge1xuICB2YXIgc2NoZW1hcywgdHlwZXM7XG5cbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgc2NoZW1hcyA9IFNjaGVtYS5ERUZBVUxUO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMF07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMjpcbiAgICAgIHNjaGVtYXMgPSBhcmd1bWVudHNbMF07XG4gICAgICB0eXBlcyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBTY2hlbWEuY3JlYXRlIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBzY2hlbWFzID0gY29tbW9uLnRvQXJyYXkoc2NoZW1hcyk7XG4gIHR5cGVzID0gY29tbW9uLnRvQXJyYXkodHlwZXMpO1xuXG4gIGlmICghc2NoZW1hcy5ldmVyeShmdW5jdGlvbiAoc2NoZW1hKSB7IHJldHVybiBzY2hlbWEgaW5zdGFuY2VvZiBTY2hlbWE7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIHN1cGVyIHNjaGVtYXMgKG9yIGEgc2luZ2xlIFNjaGVtYSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVNjaGVtYSBvYmplY3QuJyk7XG4gIH1cblxuICBpZiAoIXR5cGVzLmV2ZXJ5KGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0eXBlIGluc3RhbmNlb2YgVHlwZTsgfSkpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignU3BlY2lmaWVkIGxpc3Qgb2YgWUFNTCB0eXBlcyAob3IgYSBzaW5nbGUgVHlwZSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVR5cGUgb2JqZWN0LicpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTY2hlbWEoe1xuICAgIGluY2x1ZGU6IHNjaGVtYXMsXG4gICAgZXhwbGljaXQ6IHR5cGVzXG4gIH0pO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwNDkyM1xuLy9cbi8vIE5PVEU6IEpTLVlBTUwgZG9lcyBub3Qgc3VwcG9ydCBzY2hlbWEtc3BlY2lmaWMgdGFnIHJlc29sdXRpb24gcmVzdHJpY3Rpb25zLlxuLy8gU28sIENvcmUgc2NoZW1hIGhhcyBubyBkaXN0aW5jdGlvbnMgZnJvbSBKU09OIHNjaGVtYSBpcyBKUy1ZQU1MLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vanNvbicpXG4gIF1cbn0pO1xuIiwiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgbG9hZGAgZnVuY3Rpb24uXG4vLyBJdCBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vL1xuLy8gVGhpcyBzY2hlbWEgaXMgYmFzZWQgb24gSlMtWUFNTCdzIGRlZmF1bHQgc2FmZSBzY2hlbWEgYW5kIGluY2x1ZGVzXG4vLyBKYXZhU2NyaXB0LXNwZWNpZmljIHR5cGVzOiAhIWpzL3VuZGVmaW5lZCwgISFqcy9yZWdleHAgYW5kICEhanMvZnVuY3Rpb24uXG4vL1xuLy8gQWxzbyB0aGlzIHNjaGVtYSBpcyB1c2VkIGFzIGRlZmF1bHQgYmFzZSBzY2hlbWEgYXQgYFNjaGVtYS5jcmVhdGVgIGZ1bmN0aW9uLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWEuREVGQVVMVCA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9kZWZhdWx0X3NhZmUnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvdW5kZWZpbmVkJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9yZWdleHAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL2Z1bmN0aW9uJylcbiAgXVxufSk7XG4iLCIvLyBKUy1ZQU1MJ3MgZGVmYXVsdCBzY2hlbWEgZm9yIGBzYWZlTG9hZGAgZnVuY3Rpb24uXG4vLyBJdCBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vL1xuLy8gVGhpcyBzY2hlbWEgaXMgYmFzZWQgb24gc3RhbmRhcmQgWUFNTCdzIENvcmUgc2NoZW1hIGFuZCBpbmNsdWRlcyBtb3N0IG9mXG4vLyBleHRyYSB0eXBlcyBkZXNjcmliZWQgYXQgWUFNTCB0YWcgcmVwb3NpdG9yeS4gKGh0dHA6Ly95YW1sLm9yZy90eXBlLylcblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2NvcmUnKVxuICBdLFxuICBpbXBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvdGltZXN0YW1wJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9tZXJnZScpXG4gIF0sXG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9iaW5hcnknKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL29tYXAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3BhaXJzJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXQnKVxuICBdXG59KTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBGYWlsc2FmZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDIzNDZcblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zdHInKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3NlcScpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWFwJylcbiAgXVxufSk7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgSlNPTiBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDMyMzFcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCB0aGlzIHNjaGVtYSBpcyBub3Qgc3VjaCBzdHJpY3QgYXMgZGVmaW5lZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy8gSXQgYWxsb3dzIG51bWJlcnMgaW4gYmluYXJ5IG5vdGFpb24sIHVzZSBgTnVsbGAgYW5kIGBOVUxMYCBhcyBgbnVsbGAsIGV0Yy5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2ZhaWxzYWZlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL251bGwnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Jvb2wnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2ludCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvZmxvYXQnKVxuICBdXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xuXG52YXIgVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TID0gW1xuICAna2luZCcsXG4gICdyZXNvbHZlJyxcbiAgJ2NvbnN0cnVjdCcsXG4gICdpbnN0YW5jZU9mJyxcbiAgJ3ByZWRpY2F0ZScsXG4gICdyZXByZXNlbnQnLFxuICAnZGVmYXVsdFN0eWxlJyxcbiAgJ3N0eWxlQWxpYXNlcydcbl07XG5cbnZhciBZQU1MX05PREVfS0lORFMgPSBbXG4gICdzY2FsYXInLFxuICAnc2VxdWVuY2UnLFxuICAnbWFwcGluZydcbl07XG5cbmZ1bmN0aW9uIGNvbXBpbGVTdHlsZUFsaWFzZXMobWFwKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBpZiAobWFwICE9PSBudWxsKSB7XG4gICAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgbWFwW3N0eWxlXS5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICByZXN1bHRbU3RyaW5nKGFsaWFzKV0gPSBzdHlsZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gVHlwZSh0YWcsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdVbmtub3duIG9wdGlvbiBcIicgKyBuYW1lICsgJ1wiIGlzIG1ldCBpbiBkZWZpbml0aW9uIG9mIFwiJyArIHRhZyArICdcIiBZQU1MIHR5cGUuJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBUT0RPOiBBZGQgdGFnIGZvcm1hdCBjaGVjay5cbiAgdGhpcy50YWcgICAgICAgICAgPSB0YWc7XG4gIHRoaXMua2luZCAgICAgICAgID0gb3B0aW9uc1sna2luZCddICAgICAgICAgfHwgbnVsbDtcbiAgdGhpcy5yZXNvbHZlICAgICAgPSBvcHRpb25zWydyZXNvbHZlJ10gICAgICB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xuICB0aGlzLmNvbnN0cnVjdCAgICA9IG9wdGlvbnNbJ2NvbnN0cnVjdCddICAgIHx8IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhOyB9O1xuICB0aGlzLmluc3RhbmNlT2YgICA9IG9wdGlvbnNbJ2luc3RhbmNlT2YnXSAgIHx8IG51bGw7XG4gIHRoaXMucHJlZGljYXRlICAgID0gb3B0aW9uc1sncHJlZGljYXRlJ10gICAgfHwgbnVsbDtcbiAgdGhpcy5yZXByZXNlbnQgICAgPSBvcHRpb25zWydyZXByZXNlbnQnXSAgICB8fCBudWxsO1xuICB0aGlzLmRlZmF1bHRTdHlsZSA9IG9wdGlvbnNbJ2RlZmF1bHRTdHlsZSddIHx8IG51bGw7XG4gIHRoaXMuc3R5bGVBbGlhc2VzID0gY29tcGlsZVN0eWxlQWxpYXNlcyhvcHRpb25zWydzdHlsZUFsaWFzZXMnXSB8fCBudWxsKTtcblxuICBpZiAoWUFNTF9OT0RFX0tJTkRTLmluZGV4T2YodGhpcy5raW5kKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBraW5kIFwiJyArIHRoaXMua2luZCArICdcIiBpcyBzcGVjaWZpZWQgZm9yIFwiJyArIHRhZyArICdcIiBZQU1MIHR5cGUuJyk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUeXBlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuXG4vLyBBIHRyaWNrIGZvciBicm93c2VyaWZpZWQgdmVyc2lvbi5cbi8vIFNpbmNlIHdlIG1ha2UgYnJvd3NlcmlmaWVyIHRvIGlnbm9yZSBgYnVmZmVyYCBtb2R1bGUsIE5vZGVCdWZmZXIgd2lsbCBiZSB1bmRlZmluZWRcbnZhciBOb2RlQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIFR5cGUgICAgICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cblxuLy8gWyA2NCwgNjUsIDY2IF0gLT4gWyBwYWRkaW5nLCBDUiwgTEYgXVxudmFyIEJBU0U2NF9NQVAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cXG5cXHInO1xuXG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sQmluYXJ5KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgY29kZSwgaWR4LCBiaXRsZW4gPSAwLCBtYXggPSBkYXRhLmxlbmd0aCwgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IG9uZSBieSBvbmUuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGNvZGUgPSBtYXAuaW5kZXhPZihkYXRhLmNoYXJBdChpZHgpKTtcblxuICAgIC8vIFNraXAgQ1IvTEZcbiAgICBpZiAoY29kZSA+IDY0KSBjb250aW51ZTtcblxuICAgIC8vIEZhaWwgb24gaWxsZWdhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKGNvZGUgPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBiaXRsZW4gKz0gNjtcbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBhbnkgYml0cyBsZWZ0LCBzb3VyY2Ugd2FzIGNvcnJ1cHRlZFxuICByZXR1cm4gKGJpdGxlbiAlIDgpID09PSAwO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQmluYXJ5KGRhdGEpIHtcbiAgdmFyIGlkeCwgdGFpbGJpdHMsXG4gICAgICBpbnB1dCA9IGRhdGEucmVwbGFjZSgvW1xcclxcbj1dL2csICcnKSwgLy8gcmVtb3ZlIENSL0xGICYgcGFkZGluZyB0byBzaW1wbGlmeSBzY2FuXG4gICAgICBtYXggPSBpbnB1dC5sZW5ndGgsXG4gICAgICBtYXAgPSBCQVNFNjRfTUFQLFxuICAgICAgYml0cyA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICAvLyBDb2xsZWN0IGJ5IDYqNCBiaXRzICgzIGJ5dGVzKVxuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGlmICgoaWR4ICUgNCA9PT0gMCkgJiYgaWR4KSB7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDgpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaChiaXRzICYgMHhGRik7XG4gICAgfVxuXG4gICAgYml0cyA9IChiaXRzIDw8IDYpIHwgbWFwLmluZGV4T2YoaW5wdXQuY2hhckF0KGlkeCkpO1xuICB9XG5cbiAgLy8gRHVtcCB0YWlsXG5cbiAgdGFpbGJpdHMgPSAobWF4ICUgNCkgKiA2O1xuXG4gIGlmICh0YWlsYml0cyA9PT0gMCkge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDE2KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDgpICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxOCkge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDEwKSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDIpICYgMHhGRik7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDEyKSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gNCkgJiAweEZGKTtcbiAgfVxuXG4gIC8vIFdyYXAgaW50byBCdWZmZXIgZm9yIE5vZGVKUyBhbmQgbGVhdmUgQXJyYXkgZm9yIGJyb3dzZXJcbiAgaWYgKE5vZGVCdWZmZXIpIHJldHVybiBuZXcgTm9kZUJ1ZmZlcihyZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxCaW5hcnkob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnJywgYml0cyA9IDAsIGlkeCwgdGFpbCxcbiAgICAgIG1heCA9IG9iamVjdC5sZW5ndGgsXG4gICAgICBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgZXZlcnkgdGhyZWUgYnl0ZXMgdG8gNCBBU0NJSSBjaGFyYWN0ZXJzLlxuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGlmICgoaWR4ICUgMyA9PT0gMCkgJiYgaWR4KSB7XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDE4KSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMikgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbYml0cyAmIDB4M0ZdO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA4KSArIG9iamVjdFtpZHhdO1xuICB9XG5cbiAgLy8gRHVtcCB0YWlsXG5cbiAgdGFpbCA9IG1heCAlIDM7XG5cbiAgaWYgKHRhaWwgPT09IDApIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDE4KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA2KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbYml0cyAmIDB4M0ZdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDIpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEwKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzIDw8IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gIH0gZWxzZSBpZiAodGFpbCA9PT0gMSkge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzIDw8IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0JpbmFyeShvYmplY3QpIHtcbiAgcmV0dXJuIE5vZGVCdWZmZXIgJiYgTm9kZUJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJpbmFyeSxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQmluYXJ5LFxuICBwcmVkaWNhdGU6IGlzQmluYXJ5LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxCaW5hcnlcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICd0cnVlJyB8fCBkYXRhID09PSAnVHJ1ZScgfHwgZGF0YSA9PT0gJ1RSVUUnKSkgfHxcbiAgICAgICAgIChtYXggPT09IDUgJiYgKGRhdGEgPT09ICdmYWxzZScgfHwgZGF0YSA9PT0gJ0ZhbHNlJyB8fCBkYXRhID09PSAnRkFMU0UnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCb29sZWFuKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICd0cnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVFJVRSc7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBCb29sZWFuXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJvb2xlYW4sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJvb2xlYW4sXG4gIHByZWRpY2F0ZTogaXNCb29sZWFuLFxuICByZXByZXNlbnQ6IHtcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICd0cnVlJyA6ICdmYWxzZSc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVFJVRScgOiAnRkFMU0UnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RydWUnIDogJ0ZhbHNlJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIFR5cGUgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIFlBTUxfRkxPQVRfUEFUVEVSTiA9IG5ldyBSZWdFeHAoXG4gICdeKD86Wy0rXT8oPzpbMC05XVswLTlfXSopXFxcXC5bMC05X10qKD86W2VFXVstK11bMC05XSspPycgK1xuICAnfFxcXFwuWzAtOV9dKyg/OltlRV1bLStdWzAtOV0rKT8nICtcbiAgJ3xbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFxcXC5bMC05X10qJyArXG4gICd8Wy0rXT9cXFxcLig/OmluZnxJbmZ8SU5GKScgK1xuICAnfFxcXFwuKD86bmFufE5hTnxOQU4pKSQnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxGbG9hdChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKCFZQU1MX0ZMT0FUX1BBVFRFUk4udGVzdChkYXRhKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sRmxvYXQoZGF0YSkge1xuICB2YXIgdmFsdWUsIHNpZ24sIGJhc2UsIGRpZ2l0cztcblxuICB2YWx1ZSAgPSBkYXRhLnJlcGxhY2UoL18vZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gIHNpZ24gICA9IHZhbHVlWzBdID09PSAnLScgPyAtMSA6IDE7XG4gIGRpZ2l0cyA9IFtdO1xuXG4gIGlmICgnKy0nLmluZGV4T2YodmFsdWVbMF0pID49IDApIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnLmluZicpIHtcbiAgICByZXR1cm4gKHNpZ24gPT09IDEpID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUgPT09ICcubmFuJykge1xuICAgIHJldHVybiBOYU47XG5cbiAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgPj0gMCkge1xuICAgIHZhbHVlLnNwbGl0KCc6JykuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VGbG9hdCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwLjA7XG4gICAgYmFzZSA9IDE7XG5cbiAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgdmFsdWUgKz0gZCAqIGJhc2U7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG4gIHJldHVybiBzaWduICogcGFyc2VGbG9hdCh2YWx1ZSwgMTApO1xufVxuXG5cbnZhciBTQ0lFTlRJRklDX1dJVEhPVVRfRE9UID0gL15bLStdP1swLTldK2UvO1xuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sRmxvYXQob2JqZWN0LCBzdHlsZSkge1xuICB2YXIgcmVzO1xuXG4gIGlmIChpc05hTihvYmplY3QpKSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICcubmFuJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLk5BTic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy5OYU4nO1xuICAgIH1cbiAgfSBlbHNlIGlmIChOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5JTkYnO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuSW5mJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy0uaW5mJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLS5JTkYnO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICctLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKSB7XG4gICAgcmV0dXJuICctMC4wJztcbiAgfVxuXG4gIHJlcyA9IG9iamVjdC50b1N0cmluZygxMCk7XG5cbiAgLy8gSlMgc3RyaW5naWZpZXIgY2FuIGJ1aWxkIHNjaWVudGlmaWMgZm9ybWF0IHdpdGhvdXQgZG90czogNWUtMTAwLFxuICAvLyB3aGlsZSBZQU1MIHJlcXVyZXMgZG90OiA1LmUtMTAwLiBGaXggaXQgd2l0aCBzaW1wbGUgaGFja1xuXG4gIHJldHVybiBTQ0lFTlRJRklDX1dJVEhPVVRfRE9ULnRlc3QocmVzKSA/IHJlcy5yZXBsYWNlKCdlJywgJy5lJykgOiByZXM7XG59XG5cbmZ1bmN0aW9uIGlzRmxvYXQob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IE51bWJlcl0nKSAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgIT09IDAgfHwgY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sRmxvYXQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEZsb2F0LFxuICBwcmVkaWNhdGU6IGlzRmxvYXQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEZsb2F0LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIFR5cGUgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gaXNIZXhDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB8fFxuICAgICAgICAgKCgweDQxLyogQSAqLyA8PSBjKSAmJiAoYyA8PSAweDQ2LyogRiAqLykpIHx8XG4gICAgICAgICAoKDB4NjEvKiBhICovIDw9IGMpICYmIChjIDw9IDB4NjYvKiBmICovKSk7XG59XG5cbmZ1bmN0aW9uIGlzT2N0Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzcvKiA3ICovKSk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjQ29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sSW50ZWdlcihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgaGFzRGlnaXRzID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoIW1heCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNoID0gZGF0YVtpbmRleF07XG5cbiAgLy8gc2lnblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuICB9XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICAvLyAwXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gbWF4KSByZXR1cm4gdHJ1ZTtcbiAgICBjaCA9IGRhdGFbKytpbmRleF07XG5cbiAgICAvLyBiYXNlIDIsIGJhc2UgOCwgYmFzZSAxNlxuXG4gICAgaWYgKGNoID09PSAnYicpIHtcbiAgICAgIC8vIGJhc2UgMlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGNoICE9PSAnMCcgJiYgY2ggIT09ICcxJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgICB9XG5cblxuICAgIGlmIChjaCA9PT0gJ3gnKSB7XG4gICAgICAvLyBiYXNlIDE2XG4gICAgICBpbmRleCsrO1xuXG4gICAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzSGV4Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgICB9XG5cbiAgICAvLyBiYXNlIDhcbiAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICBpZiAoIWlzT2N0Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgfVxuXG4gIC8vIGJhc2UgMTAgKGV4Y2VwdCAwKSBvciBiYXNlIDYwXG5cbiAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgaWYgKGNoID09PSAnOicpIGJyZWFrO1xuICAgIGlmICghaXNEZWNDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gIH1cblxuICBpZiAoIWhhc0RpZ2l0cykgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIGlmICFiYXNlNjAgLSBkb25lO1xuICBpZiAoY2ggIT09ICc6JykgcmV0dXJuIHRydWU7XG5cbiAgLy8gYmFzZTYwIGFsbW9zdCBub3QgdXNlZCwgbm8gbmVlZHMgdG8gb3B0aW1pemVcbiAgcmV0dXJuIC9eKDpbMC01XT9bMC05XSkrJC8udGVzdChkYXRhLnNsaWNlKGluZGV4KSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxJbnRlZ2VyKGRhdGEpIHtcbiAgdmFyIHZhbHVlID0gZGF0YSwgc2lnbiA9IDEsIGNoLCBiYXNlLCBkaWdpdHMgPSBbXTtcblxuICBpZiAodmFsdWUuaW5kZXhPZignXycpICE9PSAtMSkge1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXy9nLCAnJyk7XG4gIH1cblxuICBjaCA9IHZhbHVlWzBdO1xuXG4gIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHtcbiAgICBpZiAoY2ggPT09ICctJykgc2lnbiA9IC0xO1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gICAgY2ggPSB2YWx1ZVswXTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gMDtcblxuICBpZiAoY2ggPT09ICcwJykge1xuICAgIGlmICh2YWx1ZVsxXSA9PT0gJ2InKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCAyKTtcbiAgICBpZiAodmFsdWVbMV0gPT09ICd4JykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTYpO1xuICAgIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDgpO1xuICB9XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJzonKSAhPT0gLTEpIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlSW50KHYsIDEwKSk7XG4gICAgfSk7XG5cbiAgICB2YWx1ZSA9IDA7XG4gICAgYmFzZSA9IDE7XG5cbiAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgdmFsdWUgKz0gKGQgKiBiYXNlKTtcbiAgICAgIGJhc2UgKj0gNjA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2lnbiAqIHZhbHVlO1xuXG4gIH1cblxuICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCAxMCk7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZWdlcihvYmplY3QpIHtcbiAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmXG4gICAgICAgICAob2JqZWN0ICUgMSA9PT0gMCAmJiAhY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEludGVnZXIsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEludGVnZXIsXG4gIHByZWRpY2F0ZTogaXNJbnRlZ2VyLFxuICByZXByZXNlbnQ6IHtcbiAgICBiaW5hcnk6ICAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzBiJyArIG9iamVjdC50b1N0cmluZygyKTsgfSxcbiAgICBvY3RhbDogICAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzAnICArIG9iamVjdC50b1N0cmluZyg4KTsgfSxcbiAgICBkZWNpbWFsOiAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gICAgICAgIG9iamVjdC50b1N0cmluZygxMCk7IH0sXG4gICAgaGV4YWRlY2ltYWw6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcweCcgKyBvYmplY3QudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnZGVjaW1hbCcsXG4gIHN0eWxlQWxpYXNlczoge1xuICAgIGJpbmFyeTogICAgICBbIDIsICAnYmluJyBdLFxuICAgIG9jdGFsOiAgICAgICBbIDgsICAnb2N0JyBdLFxuICAgIGRlY2ltYWw6ICAgICBbIDEwLCAnZGVjJyBdLFxuICAgIGhleGFkZWNpbWFsOiBbIDE2LCAnaGV4JyBdXG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXNwcmltYTtcblxuLy8gQnJvd3NlcmlmaWVkIHZlcnNpb24gZG9lcyBub3QgaGF2ZSBlc3ByaW1hXG4vL1xuLy8gMS4gRm9yIG5vZGUuanMganVzdCByZXF1aXJlIG1vZHVsZSBhcyBkZXBzXG4vLyAyLiBGb3IgYnJvd3NlciB0cnkgdG8gcmVxdWlyZSBtdWR1bGUgdmlhIGV4dGVybmFsIEFNRCBzeXN0ZW0uXG4vLyAgICBJZiBub3QgZm91bmQgLSB0cnkgdG8gZmFsbGJhY2sgdG8gd2luZG93LmVzcHJpbWEuIElmIG5vdFxuLy8gICAgZm91bmQgdG9vIC0gdGhlbiBmYWlsIHRvIHBhcnNlLlxuLy9cbnRyeSB7XG4gIC8vIHdvcmthcm91bmQgdG8gZXhjbHVkZSBwYWNrYWdlIGZyb20gYnJvd3NlcmlmeSBsaXN0LlxuICB2YXIgX3JlcXVpcmUgPSByZXF1aXJlO1xuICBlc3ByaW1hID0gX3JlcXVpcmUoJ2VzcHJpbWEnKTtcbn0gY2F0Y2ggKF8pIHtcbiAgLypnbG9iYWwgd2luZG93ICovXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgZXNwcmltYSA9IHdpbmRvdy5lc3ByaW1hO1xufVxuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgc291cmNlID0gJygnICsgZGF0YSArICcpJyxcbiAgICAgICAgYXN0ICAgID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSk7XG5cbiAgICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgICAgYXN0LmJvZHkubGVuZ3RoICAgICAgICAgICAgICE9PSAxICAgICAgICAgICAgICAgICAgICAgfHxcbiAgICAgICAgYXN0LmJvZHlbMF0udHlwZSAgICAgICAgICAgICE9PSAnRXhwcmVzc2lvblN0YXRlbWVudCcgfHxcbiAgICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgLypqc2xpbnQgZXZpbDp0cnVlKi9cblxuICB2YXIgc291cmNlID0gJygnICsgZGF0YSArICcpJyxcbiAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pLFxuICAgICAgcGFyYW1zID0gW10sXG4gICAgICBib2R5O1xuXG4gIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgYXN0LmJvZHkubGVuZ3RoICAgICAgICAgICAgICE9PSAxICAgICAgICAgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5wYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICBwYXJhbXMucHVzaChwYXJhbS5uYW1lKTtcbiAgfSk7XG5cbiAgYm9keSA9IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24uYm9keS5yYW5nZTtcblxuICAvLyBFc3ByaW1hJ3MgcmFuZ2VzIGluY2x1ZGUgdGhlIGZpcnN0ICd7JyBhbmQgdGhlIGxhc3QgJ30nIGNoYXJhY3RlcnMgb25cbiAgLy8gZnVuY3Rpb24gZXhwcmVzc2lvbnMuIFNvIGN1dCB0aGVtIG91dC5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1uZXctZnVuYyovXG4gIHJldHVybiBuZXcgRnVuY3Rpb24ocGFyYW1zLCBzb3VyY2Uuc2xpY2UoYm9keVswXSArIDEsIGJvZHlbMV0gLSAxKSk7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbihvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL2Z1bmN0aW9uJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIHByZWRpY2F0ZTogaXNGdW5jdGlvbixcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb25cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBpZiByZWdleHAgc3RhcnRzIHdpdGggJy8nIGl0IGNhbiBoYXZlIG1vZGlmaWVycyBhbmQgbXVzdCBiZSBwcm9wZXJseSBjbG9zZWRcbiAgLy8gYC9mb28vZ2ltYCAtIG1vZGlmaWVycyB0YWlsIGNhbiBiZSBtYXhpbXVtIDMgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG5cbiAgICBpZiAobW9kaWZpZXJzLmxlbmd0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIC8sIGlzIHNob3VsZCBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkXG4gICAgaWYgKHJlZ2V4cFtyZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDFdICE9PSAnLycpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gYC9mb28vZ2ltYCAtIHRhaWwgY2FuIGJlIG1heGltdW0gNCBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcbiAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cCwgbW9kaWZpZXJzKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgdmFyIHJlc3VsdCA9ICcvJyArIG9iamVjdC5zb3VyY2UgKyAnLyc7XG5cbiAgaWYgKG9iamVjdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmIChvYmplY3QubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAob2JqZWN0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3JlZ2V4cCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAsXG4gIHByZWRpY2F0ZTogaXNSZWdFeHAsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIC8qZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkKi9cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICd1bmRlZmluZWQnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy91bmRlZmluZWQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkLFxuICBwcmVkaWNhdGU6IGlzVW5kZWZpbmVkLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bWFwJywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDoge307IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxNZXJnZShkYXRhKSB7XG4gIHJldHVybiBkYXRhID09PSAnPDwnIHx8IGRhdGEgPT09IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxNZXJnZVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE51bGwoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSAxICYmIGRhdGEgPT09ICd+JykgfHxcbiAgICAgICAgIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICdudWxsJyB8fCBkYXRhID09PSAnTnVsbCcgfHwgZGF0YSA9PT0gJ05VTEwnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxOdWxsLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxOdWxsLFxuICBwcmVkaWNhdGU6IGlzTnVsbCxcbiAgcmVwcmVzZW50OiB7XG4gICAgY2Fub25pY2FsOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnfic7ICAgIH0sXG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnbnVsbCc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTlVMTCc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTnVsbCc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfdG9TdHJpbmcgICAgICAgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE9tYXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG9iamVjdEtleXMgPSBbXSwgaW5kZXgsIGxlbmd0aCwgcGFpciwgcGFpcktleSwgcGFpckhhc0tleSxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG4gICAgcGFpckhhc0tleSA9IGZhbHNlO1xuXG4gICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAnW29iamVjdCBPYmplY3RdJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChwYWlyS2V5IGluIHBhaXIpIHtcbiAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChwYWlyLCBwYWlyS2V5KSkge1xuICAgICAgICBpZiAoIXBhaXJIYXNLZXkpIHBhaXJIYXNLZXkgPSB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBhaXJIYXNLZXkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChvYmplY3RLZXlzLmluZGV4T2YocGFpcktleSkgPT09IC0xKSBvYmplY3RLZXlzLnB1c2gocGFpcktleSk7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE9tYXAoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6b21hcCcsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxPbWFwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxPbWFwXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFBhaXJzKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmVzdWx0W2luZGV4XSA9IFsga2V5c1swXSwgcGFpcltrZXlzWzBdXSBdO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gW107XG5cbiAgdmFyIGluZGV4LCBsZW5ndGgsIHBhaXIsIGtleXMsIHJlc3VsdCxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHBhaXIpO1xuXG4gICAgcmVzdWx0W2luZGV4XSA9IFsga2V5c1swXSwgcGFpcltrZXlzWzBdXSBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sUGFpcnMsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFBhaXJzXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnNlcScsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxTZXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGtleSwgb2JqZWN0ID0gZGF0YTtcblxuICBmb3IgKGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICBpZiAob2JqZWN0W2tleV0gIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFNldChkYXRhKSB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxTZXQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFNldFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6ICcnOyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX1RJTUVTVEFNUF9SRUdFWFAgPSBuZXcgUmVnRXhwKFxuICAnXihbMC05XVswLTldWzAtOV1bMC05XSknICAgICAgICAgICsgLy8gWzFdIHllYXJcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFsyXSBtb250aFxuICAnLShbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICsgLy8gWzNdIGRheVxuICAnKD86KD86W1R0XXxbIFxcXFx0XSspJyAgICAgICAgICAgICAgKyAvLyAuLi5cbiAgJyhbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICArIC8vIFs0XSBob3VyXG4gICc6KFswLTldWzAtOV0pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNV0gbWludXRlXG4gICc6KFswLTldWzAtOV0pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNl0gc2Vjb25kXG4gICcoPzpcXFxcLihbMC05XSopKT8nICAgICAgICAgICAgICAgICArIC8vIFs3XSBmcmFjdGlvblxuICAnKD86WyBcXFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KScgKyAvLyBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyXG4gICcoPzo6KFswLTldWzAtOV0pKT8pKT8pPyQnKTsgICAgICAgICAvLyBbMTFdIHR6X21pbnV0ZVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFRpbWVzdGFtcChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFRpbWVzdGFtcChkYXRhKSB7XG4gIHZhciBtYXRjaCwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uID0gMCxcbiAgICAgIGRlbHRhID0gbnVsbCwgdHpfaG91ciwgdHpfbWludXRlLCBkYXRlO1xuXG4gIG1hdGNoID0gWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSk7XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0RhdGUgcmVzb2x2ZSBlcnJvcicpO1xuXG4gIC8vIG1hdGNoOiBbMV0geWVhciBbMl0gbW9udGggWzNdIGRheVxuXG4gIHllYXIgPSArKG1hdGNoWzFdKTtcbiAgbW9udGggPSArKG1hdGNoWzJdKSAtIDE7IC8vIEpTIG1vbnRoIHN0YXJ0cyB3aXRoIDBcbiAgZGF5ID0gKyhtYXRjaFszXSk7XG5cbiAgaWYgKCFtYXRjaFs0XSkgeyAvLyBubyBob3VyXG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXkpKTtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbNF0gaG91ciBbNV0gbWludXRlIFs2XSBzZWNvbmQgWzddIGZyYWN0aW9uXG5cbiAgaG91ciA9ICsobWF0Y2hbNF0pO1xuICBtaW51dGUgPSArKG1hdGNoWzVdKTtcbiAgc2Vjb25kID0gKyhtYXRjaFs2XSk7XG5cbiAgaWYgKG1hdGNoWzddKSB7XG4gICAgZnJhY3Rpb24gPSBtYXRjaFs3XS5zbGljZSgwLCAzKTtcbiAgICB3aGlsZSAoZnJhY3Rpb24ubGVuZ3RoIDwgMykgeyAvLyBtaWxsaS1zZWNvbmRzXG4gICAgICBmcmFjdGlvbiArPSAnMCc7XG4gICAgfVxuICAgIGZyYWN0aW9uID0gK2ZyYWN0aW9uO1xuICB9XG5cbiAgLy8gbWF0Y2g6IFs4XSB0eiBbOV0gdHpfc2lnbiBbMTBdIHR6X2hvdXIgWzExXSB0el9taW51dGVcblxuICBpZiAobWF0Y2hbOV0pIHtcbiAgICB0el9ob3VyID0gKyhtYXRjaFsxMF0pO1xuICAgIHR6X21pbnV0ZSA9ICsobWF0Y2hbMTFdIHx8IDApO1xuICAgIGRlbHRhID0gKHR6X2hvdXIgKiA2MCArIHR6X21pbnV0ZSkgKiA2MDAwMDsgLy8gZGVsdGEgaW4gbWlsaS1zZWNvbmRzXG4gICAgaWYgKG1hdGNoWzldID09PSAnLScpIGRlbHRhID0gLWRlbHRhO1xuICB9XG5cbiAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikpO1xuXG4gIGlmIChkZWx0YSkgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpIC0gZGVsdGEpO1xuXG4gIHJldHVybiBkYXRlO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sVGltZXN0YW1wKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sVGltZXN0YW1wLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAsXG4gIGluc3RhbmNlT2Y6IERhdGUsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbFRpbWVzdGFtcFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuLy8gcHJpdmF0ZSBwcm9wZXJ0eVxudmFyIF9rZXlTdHIgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XG5cblxuLy8gcHVibGljIG1ldGhvZCBmb3IgZW5jb2Rpbmdcbi8vIGV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcbi8vICAgICB2YXIgb3V0cHV0ID0gW107XG4vLyAgICAgdmFyIGNocjEsIGNocjIsIGNocjMsIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ7XG4vLyAgICAgdmFyIGkgPSAwLCBsZW4gPSBpbnB1dC5sZW5ndGgsIHJlbWFpbmluZ0J5dGVzID0gbGVuO1xuXG4vLyAgICAgdmFyIGlzQXJyYXkgPSB1dGlscy5nZXRUeXBlT2YoaW5wdXQpICE9PSBcInN0cmluZ1wiO1xuLy8gICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7XG4vLyAgICAgICAgIHJlbWFpbmluZ0J5dGVzID0gbGVuIC0gaTtcblxuLy8gICAgICAgICBpZiAoIWlzQXJyYXkpIHtcbi8vICAgICAgICAgICAgIGNocjEgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG4vLyAgICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0LmNoYXJDb2RlQXQoaSsrKSA6IDA7XG4vLyAgICAgICAgICAgICBjaHIzID0gaSA8IGxlbiA/IGlucHV0LmNoYXJDb2RlQXQoaSsrKSA6IDA7XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICBjaHIxID0gaW5wdXRbaSsrXTtcbi8vICAgICAgICAgICAgIGNocjIgPSBpIDwgbGVuID8gaW5wdXRbaSsrXSA6IDA7XG4vLyAgICAgICAgICAgICBjaHIzID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgZW5jMSA9IGNocjEgPj4gMjtcbi8vICAgICAgICAgZW5jMiA9ICgoY2hyMSAmIDMpIDw8IDQpIHwgKGNocjIgPj4gNCk7XG4vLyAgICAgICAgIGVuYzMgPSByZW1haW5pbmdCeXRlcyA+IDEgPyAoKChjaHIyICYgMTUpIDw8IDIpIHwgKGNocjMgPj4gNikpIDogNjQ7XG4vLyAgICAgICAgIGVuYzQgPSByZW1haW5pbmdCeXRlcyA+IDIgPyAoY2hyMyAmIDYzKSA6IDY0O1xuXG4vLyAgICAgICAgIG91dHB1dC5wdXNoKF9rZXlTdHIuY2hhckF0KGVuYzEpICsgX2tleVN0ci5jaGFyQXQoZW5jMikgKyBfa2V5U3RyLmNoYXJBdChlbmMzKSArIF9rZXlTdHIuY2hhckF0KGVuYzQpKTtcblxuLy8gICAgIH1cblxuLy8gICAgIHJldHVybiBvdXRwdXQuam9pbihcIlwiKTtcbi8vIH07XG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGRlY29kaW5nXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgdmFyIGNocjEsIGNocjIsIGNocjM7XG4gICAgdmFyIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ7XG4gICAgdmFyIGkgPSAwLCByZXN1bHRJbmRleCA9IDA7XG5cbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXFw9XS9nLCBcIlwiKTtcblxuICAgIHZhciB0b3RhbExlbmd0aCA9IGlucHV0Lmxlbmd0aCAqIDMgLyA0O1xuICAgIGlmKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAxKSA9PT0gX2tleVN0ci5jaGFyQXQoNjQpKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoLS07XG4gICAgfVxuICAgIGlmKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAyKSA9PT0gX2tleVN0ci5jaGFyQXQoNjQpKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoLS07XG4gICAgfVxuICAgIHZhciBvdXRwdXQ7XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICBvdXRwdXQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuXG4gICAgICAgIGVuYzEgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmMyID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMyA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzQgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuXG4gICAgICAgIGNocjEgPSAoZW5jMSA8PCAyKSB8IChlbmMyID4+IDQpO1xuICAgICAgICBjaHIyID0gKChlbmMyICYgMTUpIDw8IDQpIHwgKGVuYzMgPj4gMik7XG4gICAgICAgIGNocjMgPSAoKGVuYzMgJiAzKSA8PCA2KSB8IGVuYzQ7XG5cbiAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMTtcblxuICAgICAgICBpZiAoZW5jMyAhPT0gNjQpIHtcbiAgICAgICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuYzQgIT09IDY0KSB7XG4gICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIzO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG52YXIgRGF0YVdvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFXb3JrZXInKTtcbnZhciBEYXRhTGVuZ3RoUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUnKTtcbnZhciBDcmMzMlByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vQ3JjMzJQcm9iZScpO1xudmFyIERhdGFMZW5ndGhQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZScpO1xuXG4vKipcbiAqIFJlcHJlc2VudCBhIGNvbXByZXNzZWQgb2JqZWN0LCB3aXRoIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGRlY29tcHJlc3MgaXQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb21wcmVzc2VkU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb21wcmVzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHVuY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgYWZ0ZXIgZGVjb21wcmVzc2lvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmMzMiB0aGUgY3JjMzIgb2YgdGhlIGRlY29tcHJlc3NlZCBmaWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXByZXNzaW9uIHRoZSB0eXBlIG9mIGNvbXByZXNzaW9uLCBzZWUgbGliL2NvbXByZXNzaW9ucy5qcy5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBjb21wcmVzc2VkIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIENvbXByZXNzZWRPYmplY3QoY29tcHJlc3NlZFNpemUsIHVuY29tcHJlc3NlZFNpemUsIGNyYzMyLCBjb21wcmVzc2lvbiwgZGF0YSkge1xuICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSBjb21wcmVzc2VkU2l6ZTtcbiAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSB1bmNvbXByZXNzZWRTaXplO1xuICAgIHRoaXMuY3JjMzIgPSBjcmMzMjtcbiAgICB0aGlzLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb247XG4gICAgdGhpcy5jb21wcmVzc2VkQ29udGVudCA9IGRhdGE7XG59XG5cbkNvbXByZXNzZWRPYmplY3QucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHdvcmtlciB0byBnZXQgdGhlIHVuY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgZ2V0Q29udGVudFdvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBEYXRhV29ya2VyKGV4dGVybmFsLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSlcbiAgICAgICAgLnBpcGUodGhpcy5jb21wcmVzc2lvbi51bmNvbXByZXNzV29ya2VyKCkpXG4gICAgICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJkYXRhX2xlbmd0aFwiKSk7XG5cbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB3b3JrZXIub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYodGhpcy5zdHJlYW1JbmZvWydkYXRhX2xlbmd0aCddICE9PSB0aGF0LnVuY29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWcgOiB1bmNvbXByZXNzZWQgZGF0YSBzaXplIG1pc21hdGNoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHdvcmtlciB0byBnZXQgdGhlIGNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIGdldENvbXByZXNzZWRXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzZWRTaXplXCIsIHRoaXMuY29tcHJlc3NlZFNpemUpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcInVuY29tcHJlc3NlZFNpemVcIiwgdGhpcy51bmNvbXByZXNzZWRTaXplKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjcmMzMlwiLCB0aGlzLmNyYzMyKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2lvblwiLCB0aGlzLmNvbXByZXNzaW9uKVxuICAgICAgICA7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDaGFpbiB0aGUgZ2l2ZW4gd29ya2VyIHdpdGggb3RoZXIgd29ya2VycyB0byBjb21wcmVzcyB0aGUgY29udGVudCB3aXRoIHRoZVxuICogZ2l2ZW4gY29tcHJlc2lvbi5cbiAqIEBwYXJhbSB7R2VuZXJpY1dvcmtlcn0gdW5jb21wcmVzc2VkV29ya2VyIHRoZSB3b3JrZXIgdG8gcGlwZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy5cbiAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSBuZXcgd29ya2VyIGNvbXByZXNzaW5nIHRoZSBjb250ZW50LlxuICovXG5Db21wcmVzc2VkT2JqZWN0LmNyZWF0ZVdvcmtlckZyb20gPSBmdW5jdGlvbiAodW5jb21wcmVzc2VkV29ya2VyLCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgcmV0dXJuIHVuY29tcHJlc3NlZFdvcmtlclxuICAgIC5waXBlKG5ldyBDcmMzMlByb2JlKCkpXG4gICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcInVuY29tcHJlc3NlZFNpemVcIikpXG4gICAgLnBpcGUoY29tcHJlc3Npb24uY29tcHJlc3NXb3JrZXIoY29tcHJlc3Npb25PcHRpb25zKSlcbiAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwiY29tcHJlc3NlZFNpemVcIikpXG4gICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIiwgY29tcHJlc3Npb24pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wcmVzc2VkT2JqZWN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpO1xuXG5leHBvcnRzLlNUT1JFID0ge1xuICAgIG1hZ2ljOiBcIlxceDAwXFx4MDBcIixcbiAgICAvLyBjb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uIChjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICAvLyAgICAgcmV0dXJuIG5ldyBHZW5lcmljV29ya2VyKFwiU1RPUkUgY29tcHJlc3Npb25cIik7XG4gICAgLy8gfSxcbiAgICB1bmNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNXb3JrZXIoXCJTVE9SRSBkZWNvbXByZXNzaW9uXCIpO1xuICAgIH1cbn07XG5leHBvcnRzLkRFRkxBVEUgPSByZXF1aXJlKCcuL2ZsYXRlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi96bGliL2NyYzMyLmpzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZVxuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICAgIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gICAgZm9yKHZhciBuID0wOyBuIDwgMjU2OyBuKyspe1xuICAgICAgICBjID0gbjtcbiAgICAgICAgZm9yKHZhciBrID0wOyBrIDwgODsgaysrKXtcbiAgICAgICAgICAgIGMgPSAoKGMmMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgICAgICB9XG4gICAgICAgIHRhYmxlW25dID0gYztcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgICB2YXIgdCA9IGNyY1RhYmxlLCBlbmQgPSBwb3MgKyBsZW47XG5cbiAgICBjcmMgPSBjcmMgXiAoLTEpO1xuXG4gICAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrICkge1xuICAgICAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuLy8gVGhhdCdzIGFsbCBmb3IgdGhlIHBha28gZnVuY3Rpb25zLlxuXG4vKipcbiAqIENvbXB1dGUgdGhlIGNyYzMyIG9mIGEgc3RyaW5nLlxuICogVGhpcyBpcyBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIGZ1bmN0aW9uIGNyYzMyLCBidXQgZm9yIHN0cmluZ3MuIFVzaW5nIHRoZVxuICogc2FtZSBmdW5jdGlvbiBmb3IgdGhlIHR3byB1c2UgY2FzZXMgbGVhZHMgdG8gaG9ycmlibGUgcGVyZm9ybWFuY2VzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGNyYyB0aGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIGNyYy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgY3JjMzIgY29tcHV0YXRpb24uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBjb21wdXRlZCBjcmMzMi5cbiAqL1xuZnVuY3Rpb24gY3JjMzJzdHIoY3JjLCBzdHIsIGxlbiwgcG9zKSB7XG4gICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcblxuICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBzdHIuY2hhckNvZGVBdChpKSkgJiAweEZGXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmMzMndyYXBwZXIoaW5wdXQsIGNyYykge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCIgfHwgIWlucHV0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB2YXIgaXNBcnJheSA9IHV0aWxzLmdldFR5cGVPZihpbnB1dCkgIT09IFwic3RyaW5nXCI7XG5cbiAgICBpZihpc0FycmF5KSB7XG4gICAgICAgIHJldHVybiBjcmMzMihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNyYzMyc3RyKGNyY3wwLCBpbnB1dCwgaW5wdXQubGVuZ3RoLCAwKTtcbiAgICB9XG59O1xuLy8gdmltOiBzZXQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLmJhc2U2NCA9IGZhbHNlO1xuZXhwb3J0cy5iaW5hcnkgPSBmYWxzZTtcbmV4cG9ydHMuZGlyID0gZmFsc2U7XG5leHBvcnRzLmNyZWF0ZUZvbGRlcnMgPSB0cnVlO1xuZXhwb3J0cy5kYXRlID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb24gPSBudWxsO1xuZXhwb3J0cy5jb21wcmVzc2lvbk9wdGlvbnMgPSBudWxsO1xuZXhwb3J0cy5jb21tZW50ID0gbnVsbDtcbmV4cG9ydHMudW5peFBlcm1pc3Npb25zID0gbnVsbDtcbmV4cG9ydHMuZG9zUGVybWlzc2lvbnMgPSBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyB2YXIgRVM2UHJvbWlzZSA9IHJlcXVpcmUoXCJlczYtcHJvbWlzZVwiKS5Qcm9taXNlO1xuXG4vKipcbiAqIExldCB0aGUgdXNlciB1c2UvY2hhbmdlIHNvbWUgaW1wbGVtZW50YXRpb25zLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBQcm9taXNlOiB3aW5kb3cuUHJvbWlzZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBVU0VfVFlQRURBUlJBWSA9ICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbnZhciBwYWtvID0gcmVxdWlyZShcInBha29cIik7XG52YXIgdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZShcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIik7XG5cbnZhciBBUlJBWV9UWVBFID0gVVNFX1RZUEVEQVJSQVkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIjtcblxuZXhwb3J0cy5tYWdpYyA9IFwiXFx4MDhcXHgwMFwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIHdvcmtlciB0aGF0IHVzZXMgcGFrbyB0byBpbmZsYXRlL2RlZmxhdGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb24gdGhlIG5hbWUgb2YgdGhlIHBha28gZnVuY3Rpb24gdG8gY2FsbCA6IGVpdGhlciBcIkRlZmxhdGVcIiBvciBcIkluZmxhdGVcIi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIChkZSljb21wcmVzc2luZy5cbiAqL1xuZnVuY3Rpb24gRmxhdGVXb3JrZXIoYWN0aW9uLCBvcHRpb25zKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiRmxhdGVXb3JrZXIvXCIgKyBhY3Rpb24pO1xuXG4gICAgdGhpcy5fcGFrbyA9IG5ldyBwYWtvW2FjdGlvbl0oe1xuICAgICAgICByYXc6dHJ1ZSxcbiAgICAgICAgbGV2ZWwgOiBvcHRpb25zLmxldmVsIHx8IC0xIC8vIGRlZmF1bHQgY29tcHJlc3Npb25cbiAgICB9KTtcbiAgICAvLyB0aGUgYG1ldGFgIG9iamVjdCBmcm9tIHRoZSBsYXN0IGNodW5rIHJlY2VpdmVkXG4gICAgLy8gdGhpcyBhbGxvdyB0aGlzIHdvcmtlciB0byBwYXNzIGFyb3VuZCBtZXRhZGF0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3Bha28ub25EYXRhID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBzZWxmLnB1c2goe1xuICAgICAgICAgICAgZGF0YSA6IGRhdGEsXG4gICAgICAgICAgICBtZXRhIDogc2VsZi5tZXRhXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbnV0aWxzLmluaGVyaXRzKEZsYXRlV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLm1ldGEgPSBjaHVuay5tZXRhO1xuICAgIHRoaXMuX3Bha28ucHVzaCh1dGlscy50cmFuc2Zvcm1UbyhBUlJBWV9UWVBFLCBjaHVuay5kYXRhKSwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuZmx1c2hcbiAqL1xuRmxhdGVXb3JrZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmZsdXNoLmNhbGwodGhpcyk7XG4gICAgdGhpcy5fcGFrby5wdXNoKFtdLCB0cnVlKTtcbn07XG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5jbGVhblVwXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5jbGVhblVwID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKTtcbiAgICB0aGlzLl9wYWtvID0gbnVsbDtcbn07XG5cbmV4cG9ydHMuY29tcHJlc3NXb3JrZXIgPSBmdW5jdGlvbiAoY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBGbGF0ZVdvcmtlcihcIkRlZmxhdGVcIiwgY29tcHJlc3Npb25PcHRpb25zKTtcbn07XG5leHBvcnRzLnVuY29tcHJlc3NXb3JrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBGbGF0ZVdvcmtlcihcIkluZmxhdGVcIiwge30pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBhIG9mIHppcCBmaWxlIGluIGpzXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSlNaaXAoKSB7XG4gICAgLy8gaWYgdGhpcyBjb25zdHJ1Y3RvciBpc8KgdXNlZCB3aXRob3V0wqBgbmV3YCwgaXTCoGFkZHMgYG5ld2AgYmVmb3JlwqBpdHNlbGY6XG4gICAgaWYoISh0aGlzIGluc3RhbmNlb2YgSlNaaXApKSB7XG4gICAgICAgIHJldHVybiBuZXcgSlNaaXAoKTtcbiAgICB9XG5cbiAgICBpZihhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgfVxuXG4gICAgLy8gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbGVzIDpcbiAgICAvLyB7XG4gICAgLy8gICBcImZvbGRlci9cIiA6IHsuLi59LFxuICAgIC8vICAgXCJmb2xkZXIvZGF0YS50eHRcIiA6IHsuLi59XG4gICAgLy8gfVxuICAgIHRoaXMuZmlsZXMgPSB7fTtcblxuICAgIHRoaXMuY29tbWVudCA9IG51bGw7XG5cbiAgICAvLyBXaGVyZSB3ZSBhcmUgaW4gdGhlIGhpZXJhcmNoeVxuICAgIHRoaXMucm9vdCA9IFwiXCI7XG4gICAgdGhpcy5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbmV3T2JqID0gbmV3IEpTWmlwKCk7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2ldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBuZXdPYmpbaV0gPSB0aGlzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfTtcbn1cbkpTWmlwLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vb2JqZWN0Jyk7XG5KU1ppcC5wcm90b3R5cGUubG9hZEFzeW5jID0gcmVxdWlyZSgnLi9sb2FkJyk7XG5KU1ppcC5zdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG5KU1ppcC5kZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxuSlNaaXAubG9hZEFzeW5jID0gZnVuY3Rpb24gKGNvbnRlbnQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEpTWmlwKCkubG9hZEFzeW5jKGNvbnRlbnQsIG9wdGlvbnMpO1xufTtcblxuSlNaaXAuZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcbm1vZHVsZS5leHBvcnRzID0gSlNaaXA7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgWmlwRW50cmllcyA9IHJlcXVpcmUoJy4vemlwRW50cmllcycpO1xudmFyIENyYzMyUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9DcmMzMlByb2JlJyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKFwiLi9ub2RlanNVdGlsc1wiKTtcblxuLyoqXG4gKiBDaGVjayB0aGUgQ1JDMzIgb2YgYW4gZW50cnkuXG4gKiBAcGFyYW0ge1ppcEVudHJ5fSB6aXBFbnRyeSB0aGUgemlwIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybiB7UHJvbWlzZX0gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnRyeUNSQzMyKHppcEVudHJ5KSB7XG4gICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHdvcmtlciA9IHppcEVudHJ5LmRlY29tcHJlc3NlZC5nZXRDb250ZW50V29ya2VyKCkucGlwZShuZXcgQ3JjMzJQcm9iZSgpKTtcbiAgICAgICAgd29ya2VyLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh3b3JrZXIuc3RyZWFtSW5mby5jcmMzMiAhPT0gemlwRW50cnkuZGVjb21wcmVzc2VkLmNyYzMyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBDUkMzMiBtaXNtYXRjaFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpO1xuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGEsIG9wdGlvbnMpIHtcbiAgICB2YXIgemlwID0gdGhpcztcbiAgICBvcHRpb25zID0gdXRpbHMuZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAgICAgYmFzZTY0OiBmYWxzZSxcbiAgICAgICAgY2hlY2tDUkMzMjogZmFsc2UsXG4gICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogZmFsc2UsXG4gICAgICAgIGNyZWF0ZUZvbGRlcnM6IGZhbHNlLFxuICAgICAgICBkZWNvZGVGaWxlTmFtZTogdXRmOC51dGY4ZGVjb2RlXG4gICAgfSk7XG5cbiAgICBpZiAobm9kZWpzVXRpbHMuaXNOb2RlICYmIG5vZGVqc1V0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJKU1ppcCBjYW4ndCBhY2NlcHQgYSBzdHJlYW0gd2hlbiBsb2FkaW5nIGEgemlwIGZpbGUuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMucHJlcGFyZUNvbnRlbnQoXCJ0aGUgbG9hZGVkIHppcCBmaWxlXCIsIGRhdGEsIHRydWUsIG9wdGlvbnMub3B0aW1pemVkQmluYXJ5U3RyaW5nLCBvcHRpb25zLmJhc2U2NClcbiAgICAudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHZhciB6aXBFbnRyaWVzID0gbmV3IFppcEVudHJpZXMob3B0aW9ucyk7XG4gICAgICAgIHppcEVudHJpZXMubG9hZChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHppcEVudHJpZXM7XG4gICAgfSkudGhlbihmdW5jdGlvbiBjaGVja0NSQzMyKHppcEVudHJpZXMpIHtcbiAgICAgICAgdmFyIHByb21pc2VzID0gW2V4dGVybmFsLlByb21pc2UucmVzb2x2ZSh6aXBFbnRyaWVzKV07XG4gICAgICAgIHZhciBmaWxlcyA9IHppcEVudHJpZXMuZmlsZXM7XG4gICAgICAgIGlmIChvcHRpb25zLmNoZWNrQ1JDMzIpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNoZWNrRW50cnlDUkMzMihmaWxlc1tpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfSkudGhlbihmdW5jdGlvbiBhZGRGaWxlcyhyZXN1bHRzKSB7XG4gICAgICAgIHZhciB6aXBFbnRyaWVzID0gcmVzdWx0cy5zaGlmdCgpO1xuICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSBmaWxlc1tpXTtcbiAgICAgICAgICAgIHppcC5maWxlKGlucHV0LmZpbGVOYW1lU3RyLCBpbnB1dC5kZWNvbXByZXNzZWQsIHtcbiAgICAgICAgICAgICAgICBiaW5hcnk6IHRydWUsXG4gICAgICAgICAgICAgICAgb3B0aW1pemVkQmluYXJ5U3RyaW5nOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRhdGU6IGlucHV0LmRhdGUsXG4gICAgICAgICAgICAgICAgZGlyOiBpbnB1dC5kaXIsXG4gICAgICAgICAgICAgICAgY29tbWVudCA6IGlucHV0LmZpbGVDb21tZW50U3RyLmxlbmd0aCA/IGlucHV0LmZpbGVDb21tZW50U3RyIDogbnVsbCxcbiAgICAgICAgICAgICAgICB1bml4UGVybWlzc2lvbnMgOiBpbnB1dC51bml4UGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgZG9zUGVybWlzc2lvbnMgOiBpbnB1dC5kb3NQZXJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXJzOiBvcHRpb25zLmNyZWF0ZUZvbGRlcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh6aXBFbnRyaWVzLnppcENvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICB6aXAuY29tbWVudCA9IHppcEVudHJpZXMuemlwQ29tbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB6aXA7XG4gICAgfSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4uL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCB1c2UgYSBub2RlanMgc3RyZWFtIGFzIHNvdXJjZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGVudHJ5IGZvciB0aGlzIHN0cmVhbS5cbiAqIEBwYXJhbSB7UmVhZGFibGV9IHN0cmVhbSB0aGUgbm9kZWpzIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyKGZpbGVuYW1lLCBzdHJlYW0pIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yIFwiICsgZmlsZW5hbWUpO1xuICAgIHRoaXMuX3Vwc3RyZWFtRW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9iaW5kU3RyZWFtKHN0cmVhbSk7XG59XG5cbnV0aWxzLmluaGVyaXRzKE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogUHJlcGFyZSB0aGUgc3RyZWFtIGFuZCBiaW5kIHRoZSBjYWxsYmFja3Mgb24gaXQuXG4gKiBEbyB0aGlzIEFTQVAgb24gbm9kZSAwLjEwICEgQSBsYXp5IGJpbmRpbmcgZG9lc24ndCBhbHdheXMgd29yay5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gdGhlIG5vZGVqcyBzdHJlYW0gdG8gdXNlLlxuICovXG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLl9iaW5kU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgc3RyZWFtXG4gICAgLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgc2VsZi5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IGNodW5rLFxuICAgICAgICAgICAgbWV0YSA6IHtcbiAgICAgICAgICAgICAgICBwZXJjZW50IDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmKHNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoc2VsZi5pc1BhdXNlZCkge1xuICAgICAgICAgICAgc2VsZi5fdXBzdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmVuZCgpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucGF1c2UuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3N0cmVhbS5wYXVzZSgpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYodGhpcy5fdXBzdHJlYW1FbmRlZCkge1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5SZWFkYWJsZTtcblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG51dGlsLmluaGVyaXRzKE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIsIFJlYWRhYmxlKTtcblxuLyoqXG4qIEEgbm9kZWpzIHN0cmVhbSB1c2luZyBhIHdvcmtlciBhcyBzb3VyY2UuXG4qIEBzZWUgdGhlIFNvdXJjZVdyYXBwZXIgaW4gaHR0cDovL25vZGVqcy5vcmcvYXBpL3N0cmVhbS5odG1sXG4qIEBjb25zdHJ1Y3RvclxuKiBAcGFyYW0ge1N0cmVhbUhlbHBlcn0gaGVscGVyIHRoZSBoZWxwZXIgd3JhcHBpbmcgdGhlIHdvcmtlclxuKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgbm9kZWpzIHN0cmVhbSBvcHRpb25zXG4qIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNiIHRoZSB1cGRhdGUgY2FsbGJhY2suXG4qL1xuZnVuY3Rpb24gTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcihoZWxwZXIsIG9wdGlvbnMsIHVwZGF0ZUNiKSB7XG4gICAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl9oZWxwZXIgPSBoZWxwZXI7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaGVscGVyLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZGF0YSwgbWV0YSkge1xuICAgICAgICBpZiAoIXNlbGYucHVzaChkYXRhKSkge1xuICAgICAgICAgICAgc2VsZi5faGVscGVyLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodXBkYXRlQ2IpIHtcbiAgICAgICAgICAgIHVwZGF0ZUNiKG1ldGEpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAub24oXCJlcnJvclwiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYucHVzaChudWxsKTtcbiAgICB9KTtcbn1cblxuXG5Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2hlbHBlci5yZXN1bWUoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiB0aGlzIGlzIHJ1bm5pbmcgaW4gTm9kZWpzLCB3aWxsIGJlIHVuZGVmaW5lZCBpbiBhIGJyb3dzZXIuXG4gICAgICogSW4gYSBicm93c2VyLCBicm93c2VyaWZ5IHdvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGFuZCB0aGUgd2hvbGUgbW9kdWxlXG4gICAgICogd2lsbCBiZSByZXNvbHZlZCBhbiBlbXB0eSBvYmplY3QuXG4gICAgICovXG4gICAgaXNOb2RlIDogdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIixcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgbm9kZWpzIEJ1ZmZlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0aGUgZGF0YSB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZW5jb2RpbmcgdGhlIGVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJuIHtCdWZmZXJ9IGEgbmV3IEJ1ZmZlci5cbiAgICAgKi9cbiAgICBuZXdCdWZmZXIgOiBmdW5jdGlvbihkYXRhLCBlbmNvZGluZyl7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyKGRhdGEsIGVuY29kaW5nKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZpbmQgb3V0IGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYiB0aGUgb2JqZWN0IHRvIHRlc3QuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgQnVmZmVyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNCdWZmZXIgOiBmdW5jdGlvbihiKXtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihiKTtcbiAgICB9LFxuXG4gICAgaXNTdHJlYW0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoub24gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5wYXVzZSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLnJlc3VtZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyB2YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG4vLyB2YXIgU3RyZWFtSGVscGVyID0gcmVxdWlyZSgnLi9zdHJlYW0vU3RyZWFtSGVscGVyJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIFppcE9iamVjdCA9IHJlcXVpcmUoJy4vemlwT2JqZWN0Jyk7XG4vLyB2YXIgZ2VuZXJhdGUgPSByZXF1aXJlKFwiLi9nZW5lcmF0ZVwiKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoXCIuL25vZGVqc1V0aWxzXCIpO1xudmFyIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlciA9IHJlcXVpcmUoXCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXJcIik7XG5cblxuLyoqXG4gKiBBZGQgYSBmaWxlIGluIHRoZSBjdXJyZW50IGZvbGRlci5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvIHRoZSBvcHRpb25zIG9mIHRoZSBmaWxlXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZmlsZS5cbiAqL1xudmFyIGZpbGVBZGQgPSBmdW5jdGlvbihuYW1lLCBkYXRhLCBvKSB7XG4gICAgLy8gYmUgc3VyZSBzdWIgZm9sZGVycyBleGlzdFxuICAgIHZhciBkYXRhVHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKSxcbiAgICAgICAgcGFyZW50O1xuXG5cbiAgICAvKlxuICAgICAqIENvcnJlY3Qgb3B0aW9ucy5cbiAgICAgKi9cblxuICAgIG8gPSB1dGlscy5leHRlbmQobyB8fCB7fSwgZGVmYXVsdHMpO1xuICAgIG8uZGF0ZSA9IG8uZGF0ZSB8fCBuZXcgRGF0ZSgpO1xuICAgIGlmIChvLmNvbXByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICAgIG8uY29tcHJlc3Npb24gPSBvLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvLnVuaXhQZXJtaXNzaW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBvLnVuaXhQZXJtaXNzaW9ucyA9IHBhcnNlSW50KG8udW5peFBlcm1pc3Npb25zLCA4KTtcbiAgICB9XG5cbiAgICAvLyBVTlhfSUZESVIgIDAwNDAwMDAgc2VlIHppcGluZm8uY1xuICAgIGlmIChvLnVuaXhQZXJtaXNzaW9ucyAmJiAoby51bml4UGVybWlzc2lvbnMgJiAweDQwMDApKSB7XG4gICAgICAgIG8uZGlyID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQml0IDQgICAgRGlyZWN0b3J5XG4gICAgaWYgKG8uZG9zUGVybWlzc2lvbnMgJiYgKG8uZG9zUGVybWlzc2lvbnMgJiAweDAwMTApKSB7XG4gICAgICAgIG8uZGlyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoby5kaXIpIHtcbiAgICAgICAgbmFtZSA9IGZvcmNlVHJhaWxpbmdTbGFzaChuYW1lKTtcbiAgICB9XG4gICAgaWYgKG8uY3JlYXRlRm9sZGVycyAmJiAocGFyZW50ID0gcGFyZW50Rm9sZGVyKG5hbWUpKSkge1xuICAgICAgICBmb2xkZXJBZGQuY2FsbCh0aGlzLCBwYXJlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIHZhciBpc1VuaWNvZGVTdHJpbmcgPSBkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBvLmJpbmFyeSA9PT0gZmFsc2UgJiYgby5iYXNlNjQgPT09IGZhbHNlO1xuICAgIG8uYmluYXJ5ID0gIWlzVW5pY29kZVN0cmluZztcblxuXG4gICAgdmFyIGlzQ29tcHJlc3NlZEVtcHR5ID0gKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0KSAmJiBkYXRhLnVuY29tcHJlc3NlZFNpemUgPT09IDA7XG5cbiAgICBpZiAoaXNDb21wcmVzc2VkRW1wdHkgfHwgby5kaXIgfHwgIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgby5iYXNlNjQgPSBmYWxzZTtcbiAgICAgICAgby5iaW5hcnkgPSB0cnVlO1xuICAgICAgICBkYXRhID0gXCJcIjtcbiAgICAgICAgby5jb21wcmVzc2lvbiA9IFwiU1RPUkVcIjtcbiAgICAgICAgZGF0YVR5cGUgPSBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQ29udmVydCBjb250ZW50IHRvIGZpdC5cbiAgICAgKi9cblxuICAgIHZhciB6aXBPYmplY3RDb250ZW50ID0gbnVsbDtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QgfHwgZGF0YSBpbnN0YW5jZW9mIEdlbmVyaWNXb3JrZXIpIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IGRhdGE7XG4gICAgfSBlbHNlIGlmIChub2RlanNVdGlscy5pc05vZGUgJiYgbm9kZWpzVXRpbHMuaXNTdHJlYW0oZGF0YSkpIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IG5ldyBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIobmFtZSwgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IHV0aWxzLnByZXBhcmVDb250ZW50KG5hbWUsIGRhdGEsIG8uYmluYXJ5LCBvLm9wdGltaXplZEJpbmFyeVN0cmluZywgby5iYXNlNjQpO1xuICAgIH1cblxuICAgIHZhciBvYmplY3QgPSBuZXcgWmlwT2JqZWN0KG5hbWUsIHppcE9iamVjdENvbnRlbnQsIG8pO1xuICAgIHRoaXMuZmlsZXNbbmFtZV0gPSBvYmplY3Q7XG4gICAgLypcbiAgICBUT0RPOiB3ZSBjYW4ndCB0aHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSB3ZSBoYXZlIGFzeW5jIHByb21pc2VzXG4gICAgKHdlIGNhbiBoYXZlIGEgcHJvbWlzZSBvZiBhIERhdGUoKSBmb3IgZXhhbXBsZSkgYnV0IHJldHVybmluZyBhXG4gICAgcHJvbWlzZSBpcyB1c2VsZXNzIGJlY2F1c2UgZmlsZShuYW1lLCBkYXRhKSByZXR1cm5zIHRoZSBKU1ppcFxuICAgIG9iamVjdCBmb3IgY2hhaW5pbmcuIFNob3VsZCB3ZSBicmVhayB0aGF0IHRvIGFsbG93IHRoZSB1c2VyXG4gICAgdG8gY2F0Y2ggdGhlIGVycm9yID9cblxuICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoemlwT2JqZWN0Q29udGVudClcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG4gICAgKi9cbn07XG5cbi8qKlxuICogRmluZCB0aGUgcGFyZW50IGZvbGRlciBvZiB0aGUgcGF0aC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byB1c2VcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHBhcmVudCBmb2xkZXIsIG9yIFwiXCJcbiAqL1xudmFyIHBhcmVudEZvbGRlciA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgaWYgKHBhdGguc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIHZhciBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgcmV0dXJuIChsYXN0U2xhc2ggPiAwKSA/IHBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCkgOiBcIlwiO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIHdpdGggYSBzbGFzaCBhdCB0aGUgZW5kLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcGF0aCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guXG4gKi9cbnZhciBmb3JjZVRyYWlsaW5nU2xhc2ggPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgLy8gQ2hlY2sgdGhlIG5hbWUgZW5kcyB3aXRoIGEgL1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSAhPT0gXCIvXCIpIHtcbiAgICAgICAgcGF0aCArPSBcIi9cIjsgLy8gSUUgZG9lc24ndCBsaWtlIHN1YnN0cigtMSlcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59O1xuXG4vKipcbiAqIEFkZCBhIChzdWIpIGZvbGRlciBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGZvbGRlcidzIG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IFtjcmVhdGVGb2xkZXJzXSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdWJcbiAqICBmb2xkZXJzLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIG5ldyBmb2xkZXIuXG4gKi9cbnZhciBmb2xkZXJBZGQgPSBmdW5jdGlvbihuYW1lLCBjcmVhdGVGb2xkZXJzKSB7XG4gICAgY3JlYXRlRm9sZGVycyA9ICh0eXBlb2YgY3JlYXRlRm9sZGVycyAhPT0gJ3VuZGVmaW5lZCcpID8gY3JlYXRlRm9sZGVycyA6IGRlZmF1bHRzLmNyZWF0ZUZvbGRlcnM7XG5cbiAgICBuYW1lID0gZm9yY2VUcmFpbGluZ1NsYXNoKG5hbWUpO1xuXG4gICAgLy8gRG9lcyB0aGlzIGZvbGRlciBhbHJlYWR5IGV4aXN0P1xuICAgIGlmICghdGhpcy5maWxlc1tuYW1lXSkge1xuICAgICAgICBmaWxlQWRkLmNhbGwodGhpcywgbmFtZSwgbnVsbCwge1xuICAgICAgICAgICAgZGlyOiB0cnVlLFxuICAgICAgICAgICAgY3JlYXRlRm9sZGVyczogY3JlYXRlRm9sZGVyc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsZXNbbmFtZV07XG59O1xuXG4vKipcbiogQ3Jvc3Mtd2luZG93LCBjcm9zcy1Ob2RlLWNvbnRleHQgcmVndWxhciBleHByZXNzaW9uIGRldGVjdGlvblxuKiBAcGFyYW0gIHtPYmplY3R9ICBvYmplY3QgQW55dGhpbmdcbiogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbixcbiogZmFsc2Ugb3RoZXJ3aXNlXG4qL1xuZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufVxuXG4vLyByZXR1cm4gdGhlIGFjdHVhbCBwcm90b3R5cGUgb2YgSlNaaXBcbnZhciBvdXQgPSB7XG4gICAgLyoqXG4gICAgICogQHNlZSBsb2FkQXN5bmNcbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQ2FsbCBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIGVudHJ5IGF0IHRoaXMgZm9sZGVyIGxldmVsLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIHRoZSBjYWxsYmFjayBmdW5jdGlvbjpcbiAgICAgKiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBmaWxlKSB7Li4ufVxuICAgICAqIEl0IHRha2VzIDIgYXJndW1lbnRzIDogdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIGZvckVhY2g6IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIHZhciBmaWxlbmFtZSwgcmVsYXRpdmVQYXRoLCBmaWxlO1xuICAgICAgICBmb3IgKGZpbGVuYW1lIGluIHRoaXMuZmlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlcy5oYXNPd25Qcm9wZXJ0eShmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW2ZpbGVuYW1lXTtcbiAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGZpbGVuYW1lLnNsaWNlKHRoaXMucm9vdC5sZW5ndGgsIGZpbGVuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAocmVsYXRpdmVQYXRoICYmIGZpbGVuYW1lLnNsaWNlKDAsIHRoaXMucm9vdC5sZW5ndGgpID09PSB0aGlzLnJvb3QpIHsgLy8gdGhlIGZpbGUgaXMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICAgICAgICAgIGNiKHJlbGF0aXZlUGF0aCwgZmlsZSk7IC8vIFRPRE8gcmV2ZXJzZSB0aGUgcGFyYW1ldGVycyA/IG5lZWQgdG8gYmUgY2xlYW4gQU5EIGNvbnNpc3RlbnQgd2l0aCB0aGUgZmlsdGVyIHNlYXJjaCBmbi4uLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBuZXN0ZWQgZmlsZXMvZm9sZGVycyB3aXRoIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2VhcmNoIHRoZSBwcmVkaWNhdGUgdG8gdXNlIDpcbiAgICAgKiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBmaWxlKSB7Li4ufVxuICAgICAqIEl0IHRha2VzIDIgYXJndW1lbnRzIDogdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBmaWxlLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBtYXRjaGluZyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmaWx0ZXI6IGZ1bmN0aW9uKHNlYXJjaCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBlbnRyeSkge1xuICAgICAgICAgICAgaWYgKHNlYXJjaChyZWxhdGl2ZVBhdGgsIGVudHJ5KSkgeyAvLyB0aGUgZmlsZSBtYXRjaGVzIHRoZSBmdW5jdGlvblxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZmlsZSB0byB0aGUgemlwIGZpbGUsIG9yIHNlYXJjaCBhIGZpbGUuXG4gICAgICogQHBhcmFtICAge3N0cmluZ3xSZWdFeHB9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYWRkIChpZiBkYXRhIGlzIGRlZmluZWQpLFxuICAgICAqIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGZpbmQgKGlmIG5vIGRhdGEpIG9yIGEgcmVnZXggdG8gbWF0Y2ggZmlsZXMuXG4gICAgICogQHBhcmFtICAge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSAgVGhlIGZpbGUgZGF0YSwgZWl0aGVyIHJhdyBvciBiYXNlNjQgZW5jb2RlZFxuICAgICAqIEBwYXJhbSAgIHtPYmplY3R9IG8gICAgIEZpbGUgb3B0aW9uc1xuICAgICAqIEByZXR1cm4gIHtKU1ppcHxPYmplY3R8QXJyYXl9IHRoaXMgSlNaaXAgb2JqZWN0ICh3aGVuIGFkZGluZyBhIGZpbGUpLFxuICAgICAqIGEgZmlsZSAod2hlbiBzZWFyY2hpbmcgYnkgc3RyaW5nKSBvciBhbiBhcnJheSBvZiBmaWxlcyAod2hlbiBzZWFyY2hpbmcgYnkgcmVnZXgpLlxuICAgICAqL1xuICAgIGZpbGU6IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChpc1JlZ0V4cChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciByZWdleHAgPSBuYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFmaWxlLmRpciAmJiByZWdleHAudGVzdChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIHRleHRcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5maWxlc1t0aGlzLnJvb3QgKyBuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAob2JqICYmICFvYmouZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IDogd2UgaGF2ZSBkYXRhICFcbiAgICAgICAgICAgIG5hbWUgPSB0aGlzLnJvb3QgKyBuYW1lO1xuICAgICAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUsIGRhdGEsIG8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHppcCBmaWxlLCBvciBzZWFyY2guXG4gICAgICogQHBhcmFtICAge1N0cmluZ3xSZWdFeHB9IGFyZyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIGFkZCwgb3IgYSByZWdleCB0byBzZWFyY2ggZm9sZGVycy5cbiAgICAgKiBAcmV0dXJuICB7SlNaaXB9IGFuIG9iamVjdCB3aXRoIHRoZSBuZXcgZGlyZWN0b3J5IGFzIHRoZSByb290LCBvciBhbiBhcnJheSBjb250YWluaW5nIG1hdGNoaW5nIGZvbGRlcnMuXG4gICAgICovXG4gICAgZm9sZGVyOiBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUmVnRXhwKGFyZykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5kaXIgJiYgYXJnLnRlc3QocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWxzZSwgbmFtZSBpcyBhIG5ldyBmb2xkZXJcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnJvb3QgKyBhcmc7XG4gICAgICAgIHZhciBuZXdGb2xkZXIgPSBmb2xkZXJBZGQuY2FsbCh0aGlzLCBuYW1lKTtcblxuICAgICAgICAvLyBBbGxvdyBjaGFpbmluZyBieSByZXR1cm5pbmcgYSBuZXcgb2JqZWN0IHdpdGggdGhpcyBmb2xkZXIgYXMgdGhlIHJvb3RcbiAgICAgICAgdmFyIHJldCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmV0LnJvb3QgPSBuZXdGb2xkZXIubmFtZTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9Ly8sXG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBmaWxlLCBvciBhIGRpcmVjdG9yeSBhbmQgYWxsIHN1Yi1maWxlcywgZnJvbSB0aGUgemlwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gZGVsZXRlXG4gICAgICogQHJldHVybiB7SlNaaXB9IHRoaXMgSlNaaXAgb2JqZWN0XG4gICAgICovXG4gICAgLy8gcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgLy8gICAgIG5hbWUgPSB0aGlzLnJvb3QgKyBuYW1lO1xuICAgIC8vICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZXNbbmFtZV07XG4gICAgLy8gICAgIGlmICghZmlsZSkge1xuICAgIC8vICAgICAgICAgLy8gTG9vayBmb3IgYW55IGZvbGRlcnNcbiAgICAvLyAgICAgICAgIGlmIChuYW1lLnNsaWNlKC0xKSAhPT0gXCIvXCIpIHtcbiAgICAvLyAgICAgICAgICAgICBuYW1lICs9IFwiL1wiO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbbmFtZV07XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBpZiAoZmlsZSAmJiAhZmlsZS5kaXIpIHtcbiAgICAvLyAgICAgICAgIC8vIGZpbGVcbiAgICAvLyAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgLy8gbWF5YmUgYSBmb2xkZXIsIGRlbGV0ZSByZWN1cnNpdmVseVxuICAgIC8vICAgICAgICAgdmFyIGtpZHMgPSB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gZmlsZS5uYW1lLnNsaWNlKDAsIG5hbWUubGVuZ3RoKSA9PT0gbmFtZTtcbiAgICAvLyAgICAgICAgIH0pO1xuICAgIC8vICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsZXNba2lkc1tpXS5uYW1lXTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiB0aGlzO1xuICAgIC8vIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBnZW5lcmF0ZSB0aGUgemlwIGZpbGUgOlxuICAgICAqIC0gY29tcHJlc3Npb24sIFwiU1RPUkVcIiBieSBkZWZhdWx0LlxuICAgICAqIC0gdHlwZSwgXCJiYXNlNjRcIiBieSBkZWZhdWx0LiBWYWx1ZXMgYXJlIDogc3RyaW5nLCBiYXNlNjQsIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBibG9iLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEFycmF5QnVmZmVyfEJ1ZmZlcnxCbG9ifSB0aGUgemlwIGZpbGVcbiAgICAgKi9cbiAgICAvLyBnZW5lcmF0ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbiAgICAvLyB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzIGFuIGludGVybmFsIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBnZW5lcmF0ZSB0aGUgemlwIGZpbGUgOlxuICAgICAqIC0gY29tcHJlc3Npb24sIFwiU1RPUkVcIiBieSBkZWZhdWx0LlxuICAgICAqIC0gdHlwZSwgXCJiYXNlNjRcIiBieSBkZWZhdWx0LiBWYWx1ZXMgYXJlIDogc3RyaW5nLCBiYXNlNjQsIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBibG9iLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIHN0cmVhbWVkIHppcCBmaWxlLlxuICAgICAqL1xuICAgIC8vIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW06IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyAgIHZhciB3b3JrZXIsIG9wdHMgPSB7fTtcbiAgICAvLyAgIHRyeSB7XG4gICAgLy8gICAgICAgb3B0cyA9IHV0aWxzLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgLy8gICAgICAgICAgIHN0cmVhbUZpbGVzOiBmYWxzZSxcbiAgICAvLyAgICAgICAgICAgY29tcHJlc3Npb246IFwiU1RPUkVcIixcbiAgICAvLyAgICAgICAgICAgY29tcHJlc3Npb25PcHRpb25zIDogbnVsbCxcbiAgICAvLyAgICAgICAgICAgdHlwZTogXCJcIixcbiAgICAvLyAgICAgICAgICAgcGxhdGZvcm06IFwiRE9TXCIsXG4gICAgLy8gICAgICAgICAgIGNvbW1lbnQ6IG51bGwsXG4gICAgLy8gICAgICAgICAgIG1pbWVUeXBlOiAnYXBwbGljYXRpb24vemlwJyxcbiAgICAvLyAgICAgICAgICAgZW5jb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGVuY29kZVxuICAgIC8vICAgICAgIH0pO1xuXG4gICAgLy8gICAgICAgb3B0cy50eXBlID0gb3B0cy50eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gICAgICAgb3B0cy5jb21wcmVzc2lvbiA9IG9wdHMuY29tcHJlc3Npb24udG9VcHBlckNhc2UoKTtcblxuICAgIC8vICAgICAgIC8vIFwiYmluYXJ5c3RyaW5nXCIgaXMgcHJlZmVyZWQgYnV0IHRoZSBpbnRlcm5hbHMgdXNlIFwic3RyaW5nXCIuXG4gICAgLy8gICAgICAgaWYob3B0cy50eXBlID09PSBcImJpbmFyeXN0cmluZ1wiKSB7XG4gICAgLy8gICAgICAgICBvcHRzLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIGlmICghb3B0cy50eXBlKSB7XG4gICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuXCIpO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChvcHRzLnR5cGUpO1xuXG4gICAgLy8gICAgICAgLy8gYWNjZXB0IG5vZGVqcyBgcHJvY2Vzcy5wbGF0Zm9ybWBcbiAgICAvLyAgICAgICBpZihcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgfHxcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ2ZyZWVic2QnIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdsaW51eCcgfHxcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ3N1bm9zJ1xuICAgIC8vICAgICAgICkge1xuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID0gXCJVTklYXCI7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIGlmIChvcHRpb25zLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPSBcIkRPU1wiO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIHZhciBjb21tZW50ID0gb3B0cy5jb21tZW50IHx8IHRoaXMuY29tbWVudCB8fCBcIlwiO1xuICAgIC8vICAgICAgIHdvcmtlciA9IGdlbmVyYXRlLmdlbmVyYXRlV29ya2VyKHRoaXMsIG9wdHMsIGNvbW1lbnQpO1xuICAgIC8vICAgfSBjYXRjaCAoZSkge1xuICAgIC8vICAgICB3b3JrZXIgPSBuZXcgR2VuZXJpY1dvcmtlcihcImVycm9yXCIpO1xuICAgIC8vICAgICB3b3JrZXIuZXJyb3IoZSk7XG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gbmV3IFN0cmVhbUhlbHBlcih3b3JrZXIsIG9wdHMudHlwZSB8fCBcInN0cmluZ1wiLCBvcHRzLm1pbWVUeXBlKTtcbiAgICAvLyB9LFxuICAgIC8vIC8qKlxuICAgIC8vICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhc3luY2hyb25vdXNseS5cbiAgICAvLyAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW1cbiAgICAvLyAgKi9cbiAgICAvLyBnZW5lcmF0ZUFzeW5jOiBmdW5jdGlvbihvcHRpb25zLCBvblVwZGF0ZSkge1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKG9wdGlvbnMpLmFjY3VtdWxhdGUob25VcGRhdGUpO1xuICAgIC8vIH0sXG4gICAgLy8gLyoqXG4gICAgLy8gICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzeW5jaHJvbm91c2x5LlxuICAgIC8vICAqIEBzZWUgZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbVxuICAgIC8vICAqL1xuICAgIC8vIGdlbmVyYXRlTm9kZVN0cmVhbTogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHtcbiAgICAvLyAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgLy8gICAgICAgICBvcHRpb25zLnR5cGUgPSBcIm5vZGVidWZmZXJcIjtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKG9wdGlvbnMpLnRvTm9kZWpzU3RyZWFtKG9uVXBkYXRlKTtcbiAgICAvLyB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBvdXQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgRGF0YVJlYWRlciA9IHJlcXVpcmUoJy4vRGF0YVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gQXJyYXlSZWFkZXIoZGF0YSkge1xuICAgIERhdGFSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdGRhdGFbaV0gPSBkYXRhW2ldICYgMHhGRjtcblx0fVxufVxudXRpbHMuaW5oZXJpdHMoQXJyYXlSZWFkZXIsIERhdGFSZWFkZXIpO1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIuYnl0ZUF0XG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5ieXRlQXQgPSBmdW5jdGlvbihpKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLnplcm8gKyBpXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmUgPSBmdW5jdGlvbihzaWcpIHtcbiAgICB2YXIgc2lnMCA9IHNpZy5jaGFyQ29kZUF0KDApLFxuICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksXG4gICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSxcbiAgICAgICAgc2lnMyA9IHNpZy5jaGFyQ29kZUF0KDMpO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDQ7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPT09IHNpZzAgJiYgdGhpcy5kYXRhW2kgKyAxXSA9PT0gc2lnMSAmJiB0aGlzLmRhdGFbaSArIDJdID09PSBzaWcyICYmIHRoaXMuZGF0YVtpICsgM10gPT09IHNpZzMpIHtcbiAgICAgICAgICAgIHJldHVybiBpIC0gdGhpcy56ZXJvO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlID0gZnVuY3Rpb24gKHNpZykge1xuICAgIHZhciBzaWcwID0gc2lnLmNoYXJDb2RlQXQoMCksXG4gICAgICAgIHNpZzEgPSBzaWcuY2hhckNvZGVBdCgxKSxcbiAgICAgICAgc2lnMiA9IHNpZy5jaGFyQ29kZUF0KDIpLFxuICAgICAgICBzaWczID0gc2lnLmNoYXJDb2RlQXQoMyksXG4gICAgICAgIGRhdGEgPSB0aGlzLnJlYWREYXRhKDQpO1xuICAgIHJldHVybiBzaWcwID09PSBkYXRhWzBdICYmIHNpZzEgPT09IGRhdGFbMV0gJiYgc2lnMiA9PT0gZGF0YVsyXSAmJiBzaWczID09PSBkYXRhWzNdO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIGlmKHNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5UmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gRGF0YVJlYWRlcihkYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTsgLy8gdHlwZSA6IHNlZSBpbXBsZW1lbnRhdGlvblxuICAgIHRoaXMubGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgdGhpcy56ZXJvID0gMDtcbn1cbkRhdGFSZWFkZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCB3aWxsIG5vdCBnbyB0b28gZmFyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvZmZzZXQgdGhlIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIGNoZWNrLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG4gICAgY2hlY2tPZmZzZXQ6IGZ1bmN0aW9uKG9mZnNldCkge1xuICAgICAgICB0aGlzLmNoZWNrSW5kZXgodGhpcy5pbmRleCArIG9mZnNldCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSBzcGVjaWZlZCBpbmRleCB3aWxsIG5vdCBiZSB0b28gZmFyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdJbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gICAgICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIGNoZWNrSW5kZXg6IGZ1bmN0aW9uKG5ld0luZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IHRoaXMuemVybyArIG5ld0luZGV4IHx8IG5ld0luZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSBcIiArIHRoaXMubGVuZ3RoICsgXCIsIGFza2VkIGluZGV4ID0gXCIgKyAobmV3SW5kZXgpICsgXCIpLiBDb3JydXB0ZWQgemlwID9cIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5ld0luZGV4IFRoZSBuZXcgaW5kZXguXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBuZXcgaW5kZXggaXMgb3V0IG9mIHRoZSBkYXRhLlxuICAgICAqL1xuICAgIHNldEluZGV4OiBmdW5jdGlvbihuZXdJbmRleCkge1xuICAgICAgICB0aGlzLmNoZWNrSW5kZXgobmV3SW5kZXgpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3SW5kZXg7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTa2lwIHRoZSBuZXh0IG4gYnl0ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgbmV3IGluZGV4IGlzIG91dCBvZiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICBza2lwOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIHRoaXMuc2V0SW5kZXgodGhpcy5pbmRleCArIG4pO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGkgdGhlIGluZGV4IHRvIHVzZS5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IGEgYnl0ZS5cbiAgICAgKi9cbiAgICBieXRlQXQ6IGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXh0IG51bWJlciB3aXRoIGEgZ2l2ZW4gYnl0ZSBzaXplLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBjb3JyZXNwb25kaW5nIG51bWJlci5cbiAgICAgKi9cbiAgICByZWFkSW50OiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICAgICAgZm9yIChpID0gdGhpcy5pbmRleCArIHNpemUgLSAxOyBpID49IHRoaXMuaW5kZXg7IGktLSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIHRoaXMuYnl0ZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBzdHJpbmcgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7c3RyaW5nfSB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcuXG4gICAgICovXG4gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8oXCJzdHJpbmdcIiwgdGhpcy5yZWFkRGF0YShzaXplKSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgcmF3IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uLCA8c2l6ZT4gYnl0ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIHJhdyBkYXRhLCBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy5cbiAgICAgKi9cbiAgICByZWFkRGF0YTogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiBhIHppcCBzaWduYXR1cmUgKDQgYnl0ZXMpLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWcgdGhlIHNpZ25hdHVyZSB0byBmaW5kLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VyZW5jZSwgLTEgaWYgbm90IGZvdW5kLlxuICAgICAqL1xuICAgIGxhc3RJbmRleE9mU2lnbmF0dXJlOiBmdW5jdGlvbihzaWcpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgc2lnbmF0dXJlICg0IGJ5dGVzKSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgY29tcGFyZSBpdCB3aXRoIHNpZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnIHRoZSBleHBlY3RlZCBzaWduYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1cmUgbWF0Y2hlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHJlYWRBbmRDaGVja1NpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBkYXRlLlxuICAgICAqIEByZXR1cm4ge0RhdGV9IHRoZSBkYXRlLlxuICAgICAqL1xuICAgIHJlYWREYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRvc3RpbWUgPSB0aGlzLnJlYWRJbnQoNCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhcbiAgICAgICAgKChkb3N0aW1lID4+IDI1KSAmIDB4N2YpICsgMTk4MCwgLy8geWVhclxuICAgICAgICAoKGRvc3RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvLyBtb250aFxuICAgICAgICAoZG9zdGltZSA+PiAxNikgJiAweDFmLCAvLyBkYXlcbiAgICAgICAgKGRvc3RpbWUgPj4gMTEpICYgMHgxZiwgLy8gaG91clxuICAgICAgICAoZG9zdGltZSA+PiA1KSAmIDB4M2YsIC8vIG1pbnV0ZVxuICAgICAgICAoZG9zdGltZSAmIDB4MWYpIDw8IDEpKTsgLy8gc2Vjb25kXG4gICAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBVaW50OEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9VaW50OEFycmF5UmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpIHtcbiAgICBVaW50OEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhOb2RlQnVmZmVyUmVhZGVyLCBVaW50OEFycmF5UmVhZGVyKTtcblxuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuTm9kZUJ1ZmZlclJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVCdWZmZXJSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgRGF0YVJlYWRlciA9IHJlcXVpcmUoJy4vRGF0YVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gU3RyaW5nUmVhZGVyKGRhdGEpIHtcbiAgICBEYXRhUmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhTdHJpbmdSZWFkZXIsIERhdGFSZWFkZXIpO1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIuYnl0ZUF0XG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnplcm8gKyBpKTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5sYXN0SW5kZXhPZihzaWcpIC0gdGhpcy56ZXJvO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVhZERhdGEoNCk7XG4gICAgcmV0dXJuIHNpZyA9PT0gZGF0YTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgLy8gdGhpcyB3aWxsIHdvcmsgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgYXBwbGllZCB0aGUgXCImIDB4ZmZcIiBtYXNrLlxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9BcnJheVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gVWludDhBcnJheVJlYWRlcihkYXRhKSB7XG4gICAgQXJyYXlSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcbn1cbnV0aWxzLmluaGVyaXRzKFVpbnQ4QXJyYXlSZWFkZXIsIEFycmF5UmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cblVpbnQ4QXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgaWYoc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBpbiBJRTEwLCB3aGVuIHVzaW5nIHN1YmFycmF5KGlkeCwgaWR4KSwgd2UgZ2V0IHRoZSBhcnJheSBbMHgwMF0gaW5zdGVhZCBvZiBbXS5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IFVpbnQ4QXJyYXlSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4uL3N1cHBvcnQnKTtcbnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTtcbnZhciBTdHJpbmdSZWFkZXIgPSByZXF1aXJlKCcuL1N0cmluZ1JlYWRlcicpO1xudmFyIE5vZGVCdWZmZXJSZWFkZXIgPSByZXF1aXJlKCcuL05vZGVCdWZmZXJSZWFkZXInKTtcbnZhciBVaW50OEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9VaW50OEFycmF5UmVhZGVyJyk7XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVhZGVyIGFkYXB0ZWQgdG8gdGhlIGRhdGEuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgZGF0YSB0byByZWFkLlxuICogQHJldHVybiB7RGF0YVJlYWRlcn0gdGhlIGRhdGEgcmVhZGVyLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7XG4gICAgdXRpbHMuY2hlY2tTdXBwb3J0KHR5cGUpO1xuICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiICYmICFzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdSZWFkZXIoZGF0YSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVCdWZmZXJSZWFkZXIoZGF0YSk7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKFwidWludDhhcnJheVwiLCBkYXRhKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXJyYXlSZWFkZXIodXRpbHMudHJhbnNmb3JtVG8oXCJhcnJheVwiLCBkYXRhKSk7XG59O1xuXG4vLyB2aW06IHNldCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDpcbiIsIid1c2Ugc3RyaWN0JztcbmV4cG9ydHMuTE9DQUxfRklMRV9IRUFERVIgPSBcIlBLXFx4MDNcXHgwNFwiO1xuZXhwb3J0cy5DRU5UUkFMX0ZJTEVfSEVBREVSID0gXCJQS1xceDAxXFx4MDJcIjtcbmV4cG9ydHMuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gXCJQS1xceDA1XFx4MDZcIjtcbmV4cG9ydHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiA9IFwiUEtcXHgwNlxceDA3XCI7XG5leHBvcnRzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCA9IFwiUEtcXHgwNlxceDA2XCI7XG5leHBvcnRzLkRBVEFfREVTQ1JJUFRPUiA9IFwiUEtcXHgwN1xceDA4XCI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNvbnZlcnQgY2h1bmtzIHRvIGEgc3BlY2lmaWVkIHR5cGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBkZXN0VHlwZSB0aGUgZGVzdGluYXRpb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gQ29udmVydFdvcmtlcihkZXN0VHlwZSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkNvbnZlcnRXb3JrZXIgdG8gXCIgKyBkZXN0VHlwZSk7XG4gICAgdGhpcy5kZXN0VHlwZSA9IGRlc3RUeXBlO1xufVxudXRpbHMuaW5oZXJpdHMoQ29udmVydFdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5Db252ZXJ0V29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogdXRpbHMudHJhbnNmb3JtVG8odGhpcy5kZXN0VHlwZSwgY2h1bmsuZGF0YSksXG4gICAgICAgIG1ldGEgOiBjaHVuay5tZXRhXG4gICAgfSk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDb252ZXJ0V29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIGNyYzMyID0gcmVxdWlyZSgnLi4vY3JjMzInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgd2hpY2ggY2FsY3VsYXRlIHRoZSBjcmMzMiBvZiB0aGUgZGF0YSBmbG93aW5nIHRocm91Z2guXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gQ3JjMzJQcm9iZSgpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJDcmMzMlByb2JlXCIpO1xufVxudXRpbHMuaW5oZXJpdHMoQ3JjMzJQcm9iZSwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5DcmMzMlByb2JlLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnN0cmVhbUluZm8uY3JjMzIgPSBjcmMzMihjaHVuay5kYXRhLCB0aGlzLnN0cmVhbUluZm8uY3JjMzIgfHwgMCk7XG4gICAgdGhpcy5wdXNoKGNodW5rKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IENyYzMyUHJvYmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNhbGN1bGF0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBkYXRhIGZsb3dpbmcgdGhyb3VnaC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lIHRoZSBuYW1lIHVzZWQgdG8gZXhwb3NlIHRoZSBsZW5ndGhcbiAqL1xuZnVuY3Rpb24gRGF0YUxlbmd0aFByb2JlKHByb3BOYW1lKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiRGF0YUxlbmd0aFByb2JlIGZvciBcIiArIHByb3BOYW1lKTtcbiAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7XG4gICAgdGhpcy53aXRoU3RyZWFtSW5mbyhwcm9wTmFtZSwgMCk7XG59XG51dGlscy5pbmhlcml0cyhEYXRhTGVuZ3RoUHJvYmUsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuRGF0YUxlbmd0aFByb2JlLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZihjaHVuaykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdIHx8IDA7XG4gICAgICAgIHRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXSA9IGxlbmd0aCArIGNodW5rLmRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsuY2FsbCh0aGlzLCBjaHVuayk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBEYXRhTGVuZ3RoUHJvYmU7XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG5cbi8vIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY2h1bmtzXG4vLyBUT0RPIGV4cG9zZSB0aGlzIGFzIGEgcHVibGljIHZhcmlhYmxlXG52YXIgREVGQVVMVF9CTE9DS19TSVpFID0gMTYgKiAxMDI0O1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgcmVhZHMgYSBjb250ZW50IGFuZCBlbWl0cyBjaHVua3MuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7UHJvbWlzZX0gZGF0YVAgdGhlIHByb21pc2Ugb2YgdGhlIGRhdGEgdG8gc3BsaXRcbiAqL1xuZnVuY3Rpb24gRGF0YVdvcmtlcihkYXRhUCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkRhdGFXb3JrZXJcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZGF0YUlzUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB0aGlzLm1heCA9IDA7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICB0aGlzLnR5cGUgPSBcIlwiO1xuXG4gICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gICAgZGF0YVAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBzZWxmLmRhdGFJc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5kYXRhID0gZGF0YTtcbiAgICAgICAgc2VsZi5tYXggPSBkYXRhICYmIGRhdGEubGVuZ3RoIHx8IDA7XG4gICAgICAgIHNlbGYudHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKTtcbiAgICAgICAgaWYoIXNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3RpY2tBbmRSZXBlYXQoKTtcbiAgICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgfSk7XG59XG5cbnV0aWxzLmluaGVyaXRzKERhdGFXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5jbGVhblVwXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG59O1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5yZXN1bWVcbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90aWNrU2NoZWR1bGVkICYmIHRoaXMuZGF0YUlzUmVhZHkpIHtcbiAgICAgICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsIFtdLCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIFRyaWdnZXIgYSB0aWNrIGEgc2NoZWR1bGUgYW4gb3RoZXIgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLlxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5fdGlja0FuZFJlcGVhdCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RpY2soKTtcbiAgICBpZighdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsIFtdLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgfVxufTtcblxuLyoqXG4gKiBSZWFkIGFuZCBwdXNoIGEgY2h1bmsuXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLl90aWNrID0gZnVuY3Rpb24oKSB7XG5cbiAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHNpemUgPSBERUZBVUxUX0JMT0NLX1NJWkU7XG4gICAgdmFyIGRhdGEgPSBudWxsLCBuZXh0SW5kZXggPSBNYXRoLm1pbih0aGlzLm1heCwgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIGlmICh0aGlzLmluZGV4ID49IHRoaXMubWF4KSB7XG4gICAgICAgIC8vIEVPRlxuICAgICAgICByZXR1cm4gdGhpcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2godGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJzdHJpbmcodGhpcy5pbmRleCwgbmV4dEluZGV4KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInVpbnQ4YXJyYXlcIjpcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIm5vZGVidWZmZXJcIjpcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICByZXR1cm4gdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBkYXRhLFxuICAgICAgICAgICAgbWV0YSA6IHtcbiAgICAgICAgICAgICAgICBwZXJjZW50IDogdGhpcy5tYXggPyB0aGlzLmluZGV4IC8gdGhpcy5tYXggKiAxMDAgOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IGRvZXMgbm90aGluZyBidXQgcGFzc2luZyBjaHVua3MgdG8gdGhlIG5leHQgb25lLiBUaGlzIGlzIGxpa2VcbiAqIGEgbm9kZWpzIHN0cmVhbSBidXQgd2l0aCBzb21lIGRpZmZlcmVuY2VzLiBPbiB0aGUgZ29vZCBzaWRlIDpcbiAqIC0gaXQgd29ya3Mgb24gSUUgNi05IHdpdGhvdXQgYW55IGlzc3VlIC8gcG9seWZpbGxcbiAqIC0gaXQgd2VpZ2h0cyBsZXNzIHRoYW4gdGhlIGZ1bGwgZGVwZW5kZW5jaWVzIGJ1bmRsZWQgd2l0aCBicm93c2VyaWZ5XG4gKiAtIGl0IGZvcndhcmRzIGVycm9ycyAobm8gbmVlZCB0byBkZWNsYXJlIGFuIGVycm9yIGhhbmRsZXIgRVZFUllXSEVSRSlcbiAqXG4gKiBBIGNodW5rIGlzIGFuIG9iamVjdCB3aXRoIDIgYXR0cmlidXRlcyA6IGBtZXRhYCBhbmQgYGRhdGFgLiBUaGUgZm9ybWVyIGlzIGFuXG4gKiBvYmplY3QgY29udGFpbmluZyBhbnl0aGluZyAoYHBlcmNlbnRgIGZvciBleGFtcGxlKSwgc2VlIGVhY2ggd29ya2VyIGZvciBtb3JlXG4gKiBkZXRhaWxzLiBUaGUgbGF0dGVyIGlzIHRoZSByZWFsIGRhdGEgKFN0cmluZywgVWludDhBcnJheSwgZXRjKS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKG1haW5seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpXG4gKi9cbmZ1bmN0aW9uIEdlbmVyaWNXb3JrZXIobmFtZSkge1xuICAgIC8vIHRoZSBuYW1lIG9mIHRoZSB3b3JrZXJcbiAgICB0aGlzLm5hbWUgPSBuYW1lIHx8IFwiZGVmYXVsdFwiO1xuICAgIC8vIGFuIG9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIGFib3V0IHRoZSB3b3JrZXJzIGNoYWluXG4gICAgdGhpcy5zdHJlYW1JbmZvID0ge307XG4gICAgLy8gYW4gZXJyb3Igd2hpY2ggaGFwcGVuZWQgd2hlbiB0aGUgd29ya2VyIHdhcyBwYXVzZWRcbiAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gbnVsbDtcbiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSB0byBiZSBtZXJnZWQgYnkgdGhpcyB3b3JrZXIgaW50byB0aGUgZ2VuZXJhbCBtZXRhZGF0YVxuICAgIHRoaXMuZXh0cmFTdHJlYW1JbmZvID0ge307XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIHBhdXNlZCAoYW5kIHNob3VsZCBub3QgZG8gYW55dGhpbmcpLCBmYWxzZSBvdGhlcndpc2VcbiAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcbiAgICAvLyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgZmluaXNoZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc0ZpbmlzaGVkID0gZmFsc2U7XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGxvY2tlZCB0byBwcmV2ZW50IGZ1cnRoZXIgc3RydWN0dXJlIHVwZGF0ZXMgKHBpcGUpLCBmYWxzZSBvdGhlcndpc2VcbiAgICB0aGlzLmlzTG9ja2VkID0gZmFsc2U7XG4gICAgLy8gdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IHtcbiAgICAgICAgJ2RhdGEnOltdLFxuICAgICAgICAnZW5kJzpbXSxcbiAgICAgICAgJ2Vycm9yJzpbXVxuICAgIH07XG4gICAgLy8gdGhlIHByZXZpb3VzIHdvcmtlciwgaWYgYW55XG4gICAgdGhpcy5wcmV2aW91cyA9IG51bGw7XG59XG5cbkdlbmVyaWNXb3JrZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIFB1c2ggYSBjaHVuayB0byB0aGUgbmV4dCB3b3JrZXJzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaHVuayB0aGUgY2h1bmsgdG8gcHVzaFxuICAgICAqL1xuICAgIHB1c2ggOiBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGF0YVwiLCBjaHVuayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmQgdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBlbmRlZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZW5kIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIik7XG4gICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgICAgIHRoaXMuaXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRW5kIHRoZSBzdHJlYW0gd2l0aCBhbiBlcnJvci5cbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBlIHRoZSBlcnJvciB3aGljaCBjYXVzZWQgdGhlIHByZW1hdHVyZSBlbmQuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciB3aXRoIGFuIGVycm9yLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZXJyb3IgOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNGaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGUpO1xuXG4gICAgICAgICAgICAvLyBpbiB0aGUgd29ya2VycyBjaGFpbiBleHBsb2RlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjaGFpbixcbiAgICAgICAgICAgIC8vIHRoZSBlcnJvciBldmVudCB3aWxsIGdvIGRvd253YXJkIGJ1dCB3ZSBhbHNvIG5lZWQgdG8gbm90aWZ5XG4gICAgICAgICAgICAvLyB3b3JrZXJzIHVwd2FyZCB0aGF0IHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yLlxuICAgICAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXMuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWRkIGEgY2FsbGJhY2sgb24gYW4gZXZlbnQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IChkYXRhLCBlbmQsIGVycm9yKVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIHRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZFxuICAgICAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSBjdXJyZW50IG9iamVjdCBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgb24gOiBmdW5jdGlvbiAobmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW25hbWVdLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENsZWFuIGFueSByZWZlcmVuY2VzIHdoZW4gYSB3b3JrZXIgaXMgZW5kaW5nLlxuICAgICAqL1xuICAgIGNsZWFuVXAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtSW5mbyA9IHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSB0aGlzLmV4dHJhU3RyZWFtSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBhbiBldmVudC4gVGhpcyB3aWxsIGNhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aXRoIHRoZSBwcm92aWRlZCBhcmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IChkYXRhLCBlbmQsIGVycm9yKVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmcgdGhlIGFyZ3VtZW50IHRvIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGguXG4gICAgICovXG4gICAgZW1pdCA6IGZ1bmN0aW9uIChuYW1lLCBhcmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1tuYW1lXSkge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXVtpXS5jYWxsKHRoaXMsIGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoYWluIGEgd29ya2VyIHdpdGggYW4gb3RoZXIuXG4gICAgICogQHBhcmFtIHtXb3JrZXJ9IG5leHQgdGhlIHdvcmtlciByZWNlaXZpbmcgZXZlbnRzIGZyb20gdGhlIGN1cnJlbnQgb25lLlxuICAgICAqIEByZXR1cm4ge3dvcmtlcn0gdGhlIG5leHQgd29ya2VyIGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICBwaXBlIDogZnVuY3Rpb24gKG5leHQpIHtcbiAgICAgICAgcmV0dXJuIG5leHQucmVnaXN0ZXJQcmV2aW91cyh0aGlzKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFNhbWUgYXMgYHBpcGVgIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICogVXNpbmcgYW4gQVBJIHdpdGggYHBpcGUobmV4dClgIGlzIHZlcnkgZWFzeS5cbiAgICAgKiBJbXBsZW1lbnRpbmcgdGhlIEFQSSB3aXRoIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBuZXh0IG9uZSByZWdpc3RlcmluZ1xuICAgICAqIGEgc291cmNlIGlzIGVhc2llciwgc2VlIHRoZSBaaXBGaWxlV29ya2VyLlxuICAgICAqIEBwYXJhbSB7V29ya2VyfSBwcmV2aW91cyB0aGUgcHJldmlvdXMgd29ya2VyLCBzZW5kaW5nIGV2ZW50cyB0byB0aGlzIG9uZVxuICAgICAqIEByZXR1cm4ge1dvcmtlcn0gdGhlIGN1cnJlbnQgd29ya2VyIGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICByZWdpc3RlclByZXZpb3VzIDogZnVuY3Rpb24gKHByZXZpb3VzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIiArIHRoaXMgKyBcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNoYXJpbmcgdGhlIHN0cmVhbUluZm8uLi5cbiAgICAgICAgdGhpcy5zdHJlYW1JbmZvID0gcHJldmlvdXMuc3RyZWFtSW5mbztcbiAgICAgICAgLy8gLi4uIGFuZCBhZGRpbmcgb3VyIG93biBiaXRzXG4gICAgICAgIHRoaXMubWVyZ2VTdHJlYW1JbmZvKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXMgPSAgcHJldmlvdXM7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgcHJldmlvdXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0NodW5rKGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZpb3VzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmVuZCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcHJldmlvdXMub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBzdHJlYW0gc28gaXQgZG9lc24ndCBzZW5kIGV2ZW50cyBhbnltb3JlLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIHBhdXNlZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcGF1c2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG5cbiAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVzdW1lIGEgcGF1c2VkIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCByZXN1bWVkIHRoZSB3b3JrZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZiB0cnVlLCB0aGUgd29ya2VyIHRyaWVkIHRvIHJlc3VtZSBidXQgZmFpbGVkXG4gICAgICAgIHZhciB3aXRoRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5nZW5lcmF0ZWRFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5lcnJvcih0aGlzLmdlbmVyYXRlZEVycm9yKTtcbiAgICAgICAgICAgIHdpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5yZXN1bWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhd2l0aEVycm9yO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmx1c2ggYW55IHJlbWFpbmluZyBieXRlcyBhcyB0aGUgc3RyZWFtIGlzIGVuZGluZy5cbiAgICAgKi9cbiAgICBmbHVzaCA6IGZ1bmN0aW9uICgpIHt9LFxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYSBjaHVuay4gVGhpcyBpcyB1c3VhbGx5IHRoZSBtZXRob2Qgb3ZlcnJpZGRlbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHByb2Nlc3MuXG4gICAgICovXG4gICAgcHJvY2Vzc0NodW5rIDogZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGtleS92YWx1ZSB0byBiZSBhZGRlZCBpbiB0aGUgd29ya2VycyBjaGFpbiBzdHJlYW1JbmZvIG9uY2UgYWN0aXZhdGVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSB0byB1c2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgdGhlIGFzc29jaWF0ZWQgdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgd2l0aFN0cmVhbUluZm8gOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmV4dHJhU3RyZWFtSW5mb1trZXldID0gdmFsdWU7XG4gICAgICAgIHRoaXMubWVyZ2VTdHJlYW1JbmZvKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogTWVyZ2UgdGhpcyB3b3JrZXIncyBzdHJlYW1JbmZvIGludG8gdGhlIGNoYWluJ3Mgc3RyZWFtSW5mby5cbiAgICAgKi9cbiAgICBtZXJnZVN0cmVhbUluZm8gOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuZXh0cmFTdHJlYW1JbmZvKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZXh0cmFTdHJlYW1JbmZvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RyZWFtSW5mb1trZXldID0gdGhpcy5leHRyYVN0cmVhbUluZm9ba2V5XTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2NrIHRoZSBzdHJlYW0gdG8gcHJldmVudCBmdXJ0aGVyIHVwZGF0ZXMgb24gdGhlIHdvcmtlcnMgY2hhaW4uXG4gICAgICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYWxsIGNhbGxzIHRvIHBpcGUgd2lsbCBmYWlsLlxuICAgICAqL1xuICAgIGxvY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBzdHJlYW0gJ1wiICsgdGhpcyArIFwiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNMb2NrZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5sb2NrKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBQcmV0dHkgcHJpbnQgdGhlIHdvcmtlcnMgY2hhaW4uXG4gICAgICovXG4gICAgdG9TdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtZSA9IFwiV29ya2VyIFwiICsgdGhpcy5uYW1lO1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMgKyBcIiAtPiBcIiArIG1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1lO1xuICAgICAgICB9XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBHZW5lcmljV29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIENvbnZlcnRXb3JrZXIgPSByZXF1aXJlKCcuL0NvbnZlcnRXb3JrZXInKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi4vYmFzZTY0Jyk7XG52YXIgTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciA9IHJlcXVpcmUoJy4uL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi4vZXh0ZXJuYWxcIik7XG5cbi8qKlxuICogQXBwbHkgdGhlIGZpbmFsIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBkYXRhLiBJZiB0aGUgdXNlciB3YW50cyBhIEJsb2IgZm9yXG4gKiBleGFtcGxlLCBpdCdzIGVhc2llciB0byB3b3JrIHdpdGggYW4gVThpbnRBcnJheSBhbmQgZmluYWxseSBkbyB0aGVcbiAqIEFycmF5QnVmZmVyL0Jsb2IgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBmaW5hbCB0eXBlXG4gKiBAcGFyYW0ge1N0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcn0gY29udGVudCB0aGUgY29udGVudCB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLlxuICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ8QnVmZmVyfEJsb2J9IHRoZSBjb250ZW50IGluIHRoZSByaWdodCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVppcE91dHB1dCh0eXBlLCBjb250ZW50LCBtaW1lVHlwZSkge1xuICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJibG9iXCIgOlxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLm5ld0Jsb2IodXRpbHMudHJhbnNmb3JtVG8oXCJhcnJheWJ1ZmZlclwiLCBjb250ZW50KSwgbWltZVR5cGUpO1xuICAgICAgICBjYXNlIFwiYmFzZTY0XCIgOlxuICAgICAgICAgICAgcmV0dXJuIGJhc2U2NC5lbmNvZGUoY29udGVudCk7XG4gICAgICAgIGRlZmF1bHQgOlxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKHR5cGUsIGNvbnRlbnQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSBhbiBhcnJheSBvZiBkYXRhIG9mIHRoZSBnaXZlbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIGRhdGEgaW4gdGhlIGdpdmVuIGFycmF5LlxuICogQHBhcmFtIHtBcnJheX0gZGF0YUFycmF5IHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIGNodW5rcyB0byBjb25jYXRlbmF0ZVxuICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgY29uY2F0ZW5hdGVkIGRhdGFcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFza2VkIHR5cGUgaXMgdW5zdXBwb3J0ZWRcbiAqL1xuZnVuY3Rpb24gY29uY2F0ICh0eXBlLCBkYXRhQXJyYXkpIHtcbiAgICB2YXIgaSwgaW5kZXggPSAwLCByZXMgPSBudWxsLCB0b3RhbExlbmd0aCA9IDA7XG4gICAgZm9yKGkgPSAwOyBpIDwgZGF0YUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoICs9IGRhdGFBcnJheVtpXS5sZW5ndGg7XG4gICAgfVxuICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBkYXRhQXJyYXkuam9pbihcIlwiKTtcbiAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBkYXRhQXJyYXkpO1xuICAgICAgICBjYXNlIFwidWludDhhcnJheVwiOlxuICAgICAgICAgICAgcmVzID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGF0YUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzLnNldChkYXRhQXJyYXlbaV0sIGluZGV4KTtcbiAgICAgICAgICAgICAgICBpbmRleCArPSBkYXRhQXJyYXlbaV0ubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgY2FzZSBcIm5vZGVidWZmZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGRhdGFBcnJheSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb25jYXQgOiB1bnN1cHBvcnRlZCB0eXBlICdcIiAgKyB0eXBlICsgXCInXCIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBMaXN0ZW4gYSBTdHJlYW1IZWxwZXIsIGFjY3VtdWxhdGUgaXRzIGNvbnRlbnQgYW5kIGNvbmNhdGVuYXRlIGl0IGludG8gYVxuICogY29tcGxldGUgYmxvY2suXG4gKiBAcGFyYW0ge1N0cmVhbUhlbHBlcn0gaGVscGVyIHRoZSBoZWxwZXIgdG8gdXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2FsbGJhY2sgYSBjYWxsYmFjayBjYWxsZWQgb24gZWFjaCB1cGRhdGUuIENhbGxlZFxuICogd2l0aCBvbmUgYXJnIDpcbiAqIC0gdGhlIG1ldGFkYXRhIGxpbmtlZCB0byB0aGUgdXBkYXRlIHJlY2VpdmVkLlxuICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIGZvciB0aGUgYWNjdW11bGF0aW9uLlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlKGhlbHBlciwgdXBkYXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICAgIHZhciBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgdmFyIGNodW5rVHlwZSA9IGhlbHBlci5faW50ZXJuYWxUeXBlLFxuICAgICAgICAgICAgcmVzdWx0VHlwZSA9IGhlbHBlci5fb3V0cHV0VHlwZSxcbiAgICAgICAgICAgIG1pbWVUeXBlID0gaGVscGVyLl9taW1lVHlwZTtcbiAgICAgICAgaGVscGVyXG4gICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhLCBtZXRhKSB7XG4gICAgICAgICAgICBkYXRhQXJyYXkucHVzaChkYXRhKTtcbiAgICAgICAgICAgIGlmKHVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2sobWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGRhdGFBcnJheSA9IFtdO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm1aaXBPdXRwdXQocmVzdWx0VHlwZSwgY29uY2F0KGNodW5rVHlwZSwgZGF0YUFycmF5KSwgbWltZVR5cGUpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEFuIGhlbHBlciB0byBlYXNpbHkgdXNlIHdvcmtlcnMgb3V0c2lkZSBvZiBKU1ppcC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtXb3JrZXJ9IHdvcmtlciB0aGUgd29ya2VyIHRvIHdyYXBcbiAqIEBwYXJhbSB7U3RyaW5nfSBvdXRwdXRUeXBlIHRoZSB0eXBlIG9mIGRhdGEgZXhwZWN0ZWQgYnkgdGhlIHVzZVxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVUeXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIGlmIGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIFN0cmVhbUhlbHBlcih3b3JrZXIsIG91dHB1dFR5cGUsIG1pbWVUeXBlKSB7XG4gICAgdmFyIGludGVybmFsVHlwZSA9IG91dHB1dFR5cGU7XG4gICAgc3dpdGNoKG91dHB1dFR5cGUpIHtcbiAgICAgICAgY2FzZSBcImJsb2JcIjpcbiAgICAgICAgY2FzZSBcImFycmF5YnVmZmVyXCI6XG4gICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSBcInVpbnQ4YXJyYXlcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiYXNlNjRcIjpcbiAgICAgICAgICAgIGludGVybmFsVHlwZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIC8vIHRoZSB0eXBlIHVzZWQgaW50ZXJuYWxseVxuICAgICAgICB0aGlzLl9pbnRlcm5hbFR5cGUgPSBpbnRlcm5hbFR5cGU7XG4gICAgICAgIC8vIHRoZSB0eXBlIHVzZWQgdG8gb3V0cHV0IHJlc3VsdHNcbiAgICAgICAgdGhpcy5fb3V0cHV0VHlwZSA9IG91dHB1dFR5cGU7XG4gICAgICAgIC8vIHRoZSBtaW1lIHR5cGVcbiAgICAgICAgdGhpcy5fbWltZVR5cGUgPSBtaW1lVHlwZTtcbiAgICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KGludGVybmFsVHlwZSk7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IHdvcmtlci5waXBlKG5ldyBDb252ZXJ0V29ya2VyKGludGVybmFsVHlwZSkpO1xuICAgICAgICAvLyB0aGUgbGFzdCB3b3JrZXJzIGNhbiBiZSByZXdpcmVkIHdpdGhvdXQgaXNzdWVzIGJ1dCB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIHByZXZlbnQgYW55IHVwZGF0ZXMgb24gcHJldmlvdXMgd29ya2Vycy5cbiAgICAgICAgd29ya2VyLmxvY2soKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbmV3IEdlbmVyaWNXb3JrZXIoXCJlcnJvclwiKTtcbiAgICAgICAgdGhpcy5fd29ya2VyLmVycm9yKGUpO1xuICAgIH1cbn1cblxuU3RyZWFtSGVscGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gYSBTdHJlYW1IZWxwZXIsIGFjY3VtdWxhdGUgaXRzIGNvbnRlbnQgYW5kIGNvbmNhdGVuYXRlIGl0IGludG8gYVxuICAgICAqIGNvbXBsZXRlIGJsb2NrLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNiIHRoZSB1cGRhdGUgY2FsbGJhY2suXG4gICAgICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIGZvciB0aGUgYWNjdW11bGF0aW9uLlxuICAgICAqL1xuICAgIGFjY3VtdWxhdGUgOiBmdW5jdGlvbiAodXBkYXRlQ2IpIHtcbiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGUodGhpcywgdXBkYXRlQ2IpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGlzdGVuZXIgb24gYW4gZXZlbnQgdHJpZ2dlcmVkIG9uIGEgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldnQgdGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGxpc3RlbmVyXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgY3VycmVudCBoZWxwZXIuXG4gICAgICovXG4gICAgb24gOiBmdW5jdGlvbiAoZXZ0LCBmbikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYoZXZ0ID09PSBcImRhdGFcIikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLm9uKGV2dCwgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICAgICAgZm4uY2FsbChzZWxmLCBjaHVuay5kYXRhLCBjaHVuay5tZXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLm9uKGV2dCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHV0aWxzLmRlbGF5KGZuLCBhcmd1bWVudHMsIHNlbGYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIGZsb3cgb2YgY2h1bmtzLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIHJlc3VtZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdXRpbHMuZGVsYXkodGhpcy5fd29ya2VyLnJlc3VtZSwgW10sIHRoaXMuX3dvcmtlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIGZsb3cgb2YgY2h1bmtzLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIHBhdXNlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl93b3JrZXIucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBub2RlanMgc3RyZWFtIGZvciB0aGlzIGhlbHBlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4ge05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXJ9IHRoZSBub2RlanMgc3RyZWFtLlxuICAgICAqL1xuICAgIHRvTm9kZWpzU3RyZWFtIDogZnVuY3Rpb24gKHVwZGF0ZUNiKSB7XG4gICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChcIm5vZGVzdHJlYW1cIik7XG4gICAgICAgIGlmICh0aGlzLl9vdXRwdXRUeXBlICE9PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgLy8gYW4gb2JqZWN0IHN0cmVhbSBjb250YWluaW5nIGJsb2IvYXJyYXlidWZmZXIvdWludDhhcnJheS9zdHJpbmdcbiAgICAgICAgICAgIC8vIGlzIHN0cmFuZ2UgYW5kIEkgZG9uJ3Qga25vdyBpZiBpdCB3b3VsZCBiZSB1c2VmdWwuXG4gICAgICAgICAgICAvLyBJIHlvdSBmaW5kIHRoaXMgY29tbWVudCBhbmQgaGF2ZSBhIGdvb2QgdXNlY2FzZSwgcGxlYXNlIG9wZW4gYVxuICAgICAgICAgICAgLy8gYnVnIHJlcG9ydCAhXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5fb3V0cHV0VHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBtZXRob2RcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIodGhpcywge1xuICAgICAgICAgICAgb2JqZWN0TW9kZSA6IHRoaXMuX291dHB1dFR5cGUgIT09IFwibm9kZWJ1ZmZlclwiXG4gICAgICAgIH0sIHVwZGF0ZUNiKTtcbiAgICB9XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtSGVscGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmJhc2U2NCA9IHRydWU7XG5leHBvcnRzLmFycmF5ID0gdHJ1ZTtcbmV4cG9ydHMuc3RyaW5nID0gdHJ1ZTtcbmV4cG9ydHMuYXJyYXlidWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG5leHBvcnRzLm5vZGVidWZmZXIgPSB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiO1xuLy8gY29udGFpbnMgdHJ1ZSBpZiBKU1ppcCBjYW4gcmVhZC9nZW5lcmF0ZSBVaW50OEFycmF5LCBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnRzLnVpbnQ4YXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gXCJ1bmRlZmluZWRcIjtcblxuaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGV4cG9ydHMuYmxvYiA9IGZhbHNlO1xufVxuZWxzZSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICB0cnkge1xuICAgICAgICBleHBvcnRzLmJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xuICAgICAgICAgICAgdHlwZTogXCJhcHBsaWNhdGlvbi96aXBcIlxuICAgICAgICB9KS5zaXplID09PSAwO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIEJ1aWxkZXIgPSB3aW5kb3cuQmxvYkJ1aWxkZXIgfHwgd2luZG93LldlYktpdEJsb2JCdWlsZGVyIHx8IHdpbmRvdy5Nb3pCbG9iQnVpbGRlciB8fCB3aW5kb3cuTVNCbG9iQnVpbGRlcjtcbiAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlcik7XG4gICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBidWlsZGVyLmdldEJsb2IoJ2FwcGxpY2F0aW9uL3ppcCcpLnNpemUgPT09IDA7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuYmxvYiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnRzLm5vZGVzdHJlYW0gPSAhIXJlcXVpcmUoXCIuL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyXCIpLnByb3RvdHlwZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvbWUgZnJvbSBwYWtvLCBmcm9tIHBha28vbGliL3V0aWxzL3N0cmluZ3NcbiAqIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha28gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9wYWtvL1xuICovXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxudmFyIF91dGY4bGVuID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpPTA7IGk8MjU2OyBpKyspIHtcbiAgX3V0ZjhsZW5baV0gPSAoaSA+PSAyNTIgPyA2IDogaSA+PSAyNDggPyA1IDogaSA+PSAyNDAgPyA0IDogaSA+PSAyMjQgPyAzIDogaSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdPV91dGY4bGVuWzI1NF09MTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG4vLyBjb252ZXJ0IHN0cmluZyB0byBhcnJheSAodHlwZWQsIHdoZW4gcG9zc2libGUpXG52YXIgc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAgIC8vIGNvdW50IGJpbmFyeSBzaXplXG4gICAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1Zl9sZW4gKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XG4gICAgfVxuXG4gICAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICBidWYgPSBuZXcgVWludDhBcnJheShidWZfbGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBidWYgPSBuZXcgQXJyYXkoYnVmX2xlbik7XG4gICAgfVxuXG4gICAgLy8gY29udmVydFxuICAgIGZvciAoaT0wLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7XG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MrMSA8IHN0cl9sZW4pKSB7XG4gICAgICAgICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKzEpO1xuICAgICAgICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICAgICAgICAgIG1fcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSBjO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xufTtcblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbnZhciB1dGY4Ym9yZGVyID0gZnVuY3Rpb24oYnVmLCBtYXgpIHtcbiAgICB2YXIgcG9zO1xuXG4gICAgbWF4ID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG4gICAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gICAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gICAgcG9zID0gbWF4LTE7XG4gICAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDB4QzApID09PSAweDgwKSB7IHBvcy0tOyB9XG5cbiAgICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gICAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gICAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gICAgLy8gcmV0dXJuIG1heCB0b28uXG4gICAgaWYgKHBvcyA9PT0gMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xudmFyIGJ1ZjJzdHJpbmcgPSBmdW5jdGlvbiAoYnVmKSB7XG4gICAgdmFyIHN0ciwgaSwgb3V0LCBjLCBjX2xlbjtcbiAgICB2YXIgbGVuID0gYnVmLmxlbmd0aDtcblxuICAgIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgICAvLyAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSB0aGFuIFVpbnQxNkFycmF5LlxuICAgIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4qMik7XG5cbiAgICBmb3IgKG91dD0wLCBpPTA7IGk8bGVuOykge1xuICAgICAgICBjID0gYnVmW2krK107XG4gICAgICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICAgICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgY19sZW4gPSBfdXRmOGxlbltjXTtcbiAgICAgICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuLTE7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAgICAgLy8gam9pbiB0aGUgcmVzdFxuICAgICAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgICAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgICAgICAgY19sZW4tLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRlcm1pbmF0ZWQgYnkgZW5kIG9mIHN0cmluZz9cbiAgICAgICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyAtPSAweDEwMDAwO1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkODAwIHwgKChjID4+IDEwKSAmIDB4M2ZmKTtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZGMwMCB8IChjICYgMHgzZmYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2hyaW5rQnVmKHV0ZjE2YnVmLCBvdXQpXG4gICAgaWYgKHV0ZjE2YnVmLmxlbmd0aCAhPT0gb3V0KSB7XG4gICAgICAgIGlmKHV0ZjE2YnVmLnN1YmFycmF5KSB7XG4gICAgICAgICAgICB1dGYxNmJ1ZiA9IHV0ZjE2YnVmLnN1YmFycmF5KDAsIG91dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1dGYxNmJ1Zi5sZW5ndGggPSBvdXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGYxNmJ1Zik7XG4gICAgcmV0dXJuIHV0aWxzLmFwcGx5RnJvbUNoYXJDb2RlKHV0ZjE2YnVmKTtcbn07XG5cblxuLy8gVGhhdCdzIGFsbCBmb3IgdGhlIHBha28gZnVuY3Rpb25zLlxuXG5cbi8qKlxuICogVHJhbnNmb3JtIGEgamF2YXNjcmlwdCBzdHJpbmcgaW50byBhbiBhcnJheSAodHlwZWQgaWYgcG9zc2libGUpIG9mIGJ5dGVzLFxuICogVVRGLTggZW5jb2RlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm4ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgVVRGLTggZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydHMudXRmOGVuY29kZSA9IGZ1bmN0aW9uIHV0ZjhlbmNvZGUoc3RyKSB7XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKHN0ciwgXCJ1dGYtOFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nMmJ1ZihzdHIpO1xufTtcblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGJ5dGVzIGFycmF5IChvciBhIHJlcHJlc2VudGF0aW9uKSByZXByZXNlbnRpbmcgYW4gVVRGLTggZW5jb2RlZFxuICogc3RyaW5nIGludG8gYSBqYXZhc2NyaXB0IHN0cmluZy5cbiAqIEBwYXJhbSB7QXJyYXl8VWludDhBcnJheXxCdWZmZXJ9IGJ1ZiB0aGUgZGF0YSBkZSBkZWNvZGVcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGRlY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhkZWNvZGUgPSBmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ1Zikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwibm9kZWJ1ZmZlclwiLCBidWYpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgYnVmID0gdXRpbHMudHJhbnNmb3JtVG8oc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCIsIGJ1Zik7XG5cbiAgICByZXR1cm4gYnVmMnN0cmluZyhidWYpO1xufTtcblxuLyoqXG4gKiBBIHdvcmtlciB0byBkZWNvZGUgdXRmOCBlbmNvZGVkIGJpbmFyeSBjaHVua3MgaW50byBzdHJpbmcgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFV0ZjhEZWNvZGVXb3JrZXIoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwidXRmLTggZGVjb2RlXCIpO1xuICAgIC8vIHRoZSBsYXN0IGJ5dGVzIGlmIGEgY2h1bmsgZGlkbid0IGVuZCB3aXRoIGEgY29tcGxldGUgY29kZXBvaW50LlxuICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xufVxudXRpbHMuaW5oZXJpdHMoVXRmOERlY29kZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5VdGY4RGVjb2RlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcblxuICAgIHZhciBkYXRhID0gdXRpbHMudHJhbnNmb3JtVG8oc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCIsIGNodW5rLmRhdGEpO1xuXG4gICAgLy8gMXN0IHN0ZXAsIHJlLXVzZSB3aGF0J3MgbGVmdCBvZiB0aGUgcHJldmlvdXMgY2h1bmtcbiAgICBpZiAodGhpcy5sZWZ0T3ZlciAmJiB0aGlzLmxlZnRPdmVyLmxlbmd0aCkge1xuICAgICAgICBpZihzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c0RhdGEgPSBkYXRhO1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KHByZXZpb3VzRGF0YS5sZW5ndGggKyB0aGlzLmxlZnRPdmVyLmxlbmd0aCk7XG4gICAgICAgICAgICBkYXRhLnNldCh0aGlzLmxlZnRPdmVyLCAwKTtcbiAgICAgICAgICAgIGRhdGEuc2V0KHByZXZpb3VzRGF0YSwgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMubGVmdE92ZXIuY29uY2F0KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBuZXh0Qm91bmRhcnkgPSB1dGY4Ym9yZGVyKGRhdGEpO1xuICAgIHZhciB1c2FibGVEYXRhID0gZGF0YTtcbiAgICBpZiAobmV4dEJvdW5kYXJ5ICE9PSBkYXRhLmxlbmd0aCkge1xuICAgICAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgICAgICB1c2FibGVEYXRhID0gZGF0YS5zdWJhcnJheSgwLCBuZXh0Qm91bmRhcnkpO1xuICAgICAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IGRhdGEuc3ViYXJyYXkobmV4dEJvdW5kYXJ5LCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1c2FibGVEYXRhID0gZGF0YS5zbGljZSgwLCBuZXh0Qm91bmRhcnkpO1xuICAgICAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IGRhdGEuc2xpY2UobmV4dEJvdW5kYXJ5LCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZGVjb2RlKHVzYWJsZURhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuZmx1c2hcbiAqL1xuVXRmOERlY29kZVdvcmtlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYodGhpcy5sZWZ0T3ZlciAmJiB0aGlzLmxlZnRPdmVyLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnB1c2goe1xuICAgICAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh0aGlzLmxlZnRPdmVyKSxcbiAgICAgICAgICAgIG1ldGEgOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IG51bGw7XG4gICAgfVxufTtcbmV4cG9ydHMuVXRmOERlY29kZVdvcmtlciA9IFV0ZjhEZWNvZGVXb3JrZXI7XG5cbi8qKlxuICogQSB3b3JrZXIgdG8gZW5kY29kZSBzdHJpbmcgY2h1bmtzIGludG8gdXRmOCBlbmNvZGVkIGJpbmFyeSBjaHVua3MuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVXRmOEVuY29kZVdvcmtlcigpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJ1dGYtOCBlbmNvZGVcIik7XG59XG51dGlscy5pbmhlcml0cyhVdGY4RW5jb2RlV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cblV0ZjhFbmNvZGVXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMucHVzaCh7XG4gICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhlbmNvZGUoY2h1bmsuZGF0YSksXG4gICAgICAgIG1ldGEgOiBjaHVuay5tZXRhXG4gICAgfSk7XG59O1xuZXhwb3J0cy5VdGY4RW5jb2RlV29ya2VyID0gVXRmOEVuY29kZVdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZSgnLi9ub2RlanNVdGlscycpO1xudmFyIGFzYXAgPSByZXF1aXJlKCdhc2FwJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcblxuXG4vKipcbiAqIENvbnZlcnQgYSBzdHJpbmcgdGhhdCBwYXNzIGFzIGEgXCJiaW5hcnkgc3RyaW5nXCI6IGl0IHNob3VsZCByZXByZXNlbnQgYSBieXRlXG4gKiBhcnJheSBidXQgbWF5IGhhdmUgPiAyNTUgY2hhciBjb2Rlcy4gQmUgc3VyZSB0byB0YWtlIG9ubHkgdGhlIGZpcnN0IGJ5dGVcbiAqIGFuZCByZXR1cm5zIHRoZSBieXRlIGFycmF5LlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4ge0FycmF5fFVpbnQ4QXJyYXl9IHRoZSBzdHJpbmcgaW4gYSBiaW5hcnkgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBzdHJpbmcyYmluYXJ5KHN0cikge1xuICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBuZXcgQXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIHJlc3VsdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGJsb2Igd2l0aCB0aGUgZ2l2ZW4gY29udGVudCBhbmQgdGhlIGdpdmVuIHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcn0gcGFydCB0aGUgY29udGVudCB0byBwdXQgaW4gdGhlIGJsb2IuIERPIE5PVCB1c2VcbiAqIGFuIFVpbnQ4QXJyYXkgYmVjYXVzZSB0aGUgc3RvY2sgYnJvd3NlciBvZiBhbmRyb2lkIDQgd29uJ3QgYWNjZXB0IGl0IChpdFxuICogd2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIFwiW29iamVjdCBVaW50OEFycmF5XVwiKS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGJsb2IuXG4gKiBAcmV0dXJuIHtCbG9ifSB0aGUgY3JlYXRlZCBibG9iLlxuICovXG5leHBvcnRzLm5ld0Jsb2IgPSBmdW5jdGlvbihwYXJ0LCB0eXBlKSB7XG4gICAgZXhwb3J0cy5jaGVja1N1cHBvcnQoXCJibG9iXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQmxvYiBjb25zdHJ1Y3RvclxuICAgICAgICByZXR1cm4gbmV3IEJsb2IoW3BhcnRdLCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBkZXByZWNhdGVkLCBicm93c2VyIG9ubHksIG9sZCB3YXlcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwYXJ0KTtcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICAgICAgLy8gd2VsbCwgZnVjayA/IVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogY2FuJ3QgY29uc3RydWN0IHRoZSBCbG9iLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59O1xuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgdGhlIGlucHV0LlxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgc2FtZSBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogRmlsbCBpbiBhbiBhcnJheSB3aXRoIGEgc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byBmaWxsIGluICh3aWxsIGJlIG11dGF0ZWQpLlxuICogQHJldHVybiB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IHRoZSB1cGRhdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIGFycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgYXJyYXlbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4RkY7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBBbiBoZWxwZXIgZm9yIHRoZSBmdW5jdGlvbiBhcnJheUxpa2VUb1N0cmluZy5cbiAqIFRoaXMgY29udGFpbnMgc3RhdGljIGluZm9ybWF0aW9ucyBhbmQgZnVuY3Rpb25zIHRoYXRcbiAqIGNhbiBiZSBvcHRpbWl6ZWQgYnkgdGhlIGJyb3dzZXIgSklUIGNvbXBpbGVyLlxuICovXG52YXIgYXJyYXlUb1N0cmluZ0hlbHBlciA9IHtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gYW4gYXJyYXkgb2YgaW50IGludG8gYSBzdHJpbmcsIGNodW5rIGJ5IGNodW5rLlxuICAgICAqIFNlZSB0aGUgcGVyZm9ybWFuY2VzIG5vdGVzIG9uIGFycmF5TGlrZVRvU3RyaW5nLlxuICAgICAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gY2h1bmsgdGhlIGNodW5rIHNpemUuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0aW5nIHN0cmluZy5cbiAgICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjaHVuayBpcyB0b28gYmlnIGZvciB0aGUgc3RhY2suXG4gICAgICovXG4gICAgc3RyaW5naWZ5QnlDaHVuazogZnVuY3Rpb24oYXJyYXksIHR5cGUsIGNodW5rKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXSwgayA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgLy8gc2hvcnRjdXRcbiAgICAgICAgaWYgKGxlbiA8PSBjaHVuaykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJhcnJheVwiIHx8IHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zbGljZShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5LnN1YmFycmF5KGssIE1hdGgubWluKGsgKyBjaHVuaywgbGVuKSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGsgKz0gY2h1bms7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2FsbCBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIGV2ZXJ5IGl0ZW0gaW4gdGhlIGFycmF5LlxuICAgICAqIFRoaXMgaXMgdGhlIG5haXZlIGltcGxlbWVudGF0aW9uLCB3aGljaCBnZW5lcmF0ZSBBIExPVCBvZiBpbnRlcm1lZGlhdGUgc3RyaW5nLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBldmVyeXRoaW5nIGVsc2UgZmFpbC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBzdHJpbmdpZnlCeUNoYXI6IGZ1bmN0aW9uKGFycmF5KXtcbiAgICAgICAgdmFyIHJlc3VsdFN0ciA9IFwiXCI7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRTdHI7XG4gICAgfSxcbiAgICBhcHBseUNhbkJlVXNlZCA6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBVaW50OEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICB1aW50OGFycmF5IDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnQudWludDhhcnJheSAmJiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKS5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpLFxuICAgICAgICAvKipcbiAgICAgICAgICogdHJ1ZSBpZiB0aGUgYnJvd3NlciBhY2NlcHRzIHRvIHVzZSBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIG5vZGVqcyBCdWZmZXIuXG4gICAgICAgICAqL1xuICAgICAgICBub2RlYnVmZmVyIDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcigxKSkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgIH1cbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgc3RyaW5nLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcoYXJyYXkpIHtcbiAgICAvLyBQZXJmb3JtYW5jZXMgbm90ZXMgOlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSkgaXMgdGhlIGZhc3Rlc3QsIHNlZVxuICAgIC8vIHNlZSBodHRwOi8vanNwZXJmLmNvbS9jb252ZXJ0aW5nLWEtdWludDhhcnJheS10by1hLXN0cmluZy8yXG4gICAgLy8gYnV0IHRoZSBzdGFjayBpcyBsaW1pdGVkIChhbmQgd2UgY2FuIGdldCBodWdlIGFycmF5cyAhKS5cbiAgICAvL1xuICAgIC8vIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTsgZ2VuZXJhdGUgdG9vIG1hbnkgc3RyaW5ncyAhXG4gICAgLy9cbiAgICAvLyBUaGlzIGNvZGUgaXMgaW5zcGlyZWQgYnkgaHR0cDovL2pzcGVyZi5jb20vYXJyYXlidWZmZXItdG8tc3RyaW5nLWFwcGx5LXBlcmZvcm1hbmNlLzJcbiAgICAvLyBUT0RPIDogd2Ugbm93IGhhdmUgd29ya2VycyB0aGF0IHNwbGl0IHRoZSB3b3JrLiBEbyB3ZSBzdGlsbCBuZWVkIHRoYXQgP1xuICAgIHZhciBjaHVuayA9IDY1NTM2LFxuICAgICAgICB0eXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoYXJyYXkpLFxuICAgICAgICBjYW5Vc2VBcHBseSA9IHRydWU7XG4gICAgaWYgKHR5cGUgPT09IFwidWludDhhcnJheVwiKSB7XG4gICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC51aW50OGFycmF5O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgY2FuVXNlQXBwbHkgPSBhcnJheVRvU3RyaW5nSGVscGVyLmFwcGx5Q2FuQmVVc2VkLm5vZGVidWZmZXI7XG4gICAgfVxuXG4gICAgaWYgKGNhblVzZUFwcGx5KSB7XG4gICAgICAgIHdoaWxlIChjaHVuayA+IDEpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9TdHJpbmdIZWxwZXIuc3RyaW5naWZ5QnlDaHVuayhhcnJheSwgdHlwZSwgY2h1bmspO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNodW5rID0gTWF0aC5mbG9vcihjaHVuayAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm8gYXBwbHkgb3IgY2h1bmsgZXJyb3IgOiBzbG93IGFuZCBwYWluZnVsIGFsZ29yaXRobVxuICAgIC8vIGRlZmF1bHQgYnJvd3NlciBvbiBhbmRyb2lkIDQuKlxuICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2hhcihhcnJheSk7XG59XG5cbmV4cG9ydHMuYXBwbHlGcm9tQ2hhckNvZGUgPSBhcnJheUxpa2VUb1N0cmluZztcblxuXG4vKipcbiAqIENvcHkgdGhlIGRhdGEgZnJvbSBhbiBhcnJheS1saWtlIHRvIGFuIG90aGVyIGFycmF5LWxpa2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheUZyb20gdGhlIG9yaWdpbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5VG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoaWNoIHdpbGwgYmUgbXV0YXRlZC5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBkZXN0aW5hdGlvbiBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlVG9BcnJheUxpa2UoYXJyYXlGcm9tLCBhcnJheVRvKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyYXlUb1tpXSA9IGFycmF5RnJvbVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5VG87XG59XG5cbi8vIGEgbWF0cml4IGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRvIHRyYW5zZm9ybSBldmVyeXRoaW5nIGludG8gZXZlcnl0aGluZy5cbnZhciB0cmFuc2Zvcm0gPSB7fTtcblxuLy8gc3RyaW5nIHRvID9cbnRyYW5zZm9ybVtcInN0cmluZ1wiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBpZGVudGl0eSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtW1wic3RyaW5nXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBub2RlanNVdGlscy5uZXdCdWZmZXIoaW5wdXQubGVuZ3RoKSk7XG4gICAgfVxufTtcblxuLy8gYXJyYXkgdG8gP1xudHJhbnNmb3JtW1wiYXJyYXlcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBpZGVudGl0eSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKS5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0KTtcbiAgICB9XG59O1xuXG4vLyBhcnJheWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJhcnJheWJ1ZmZlclwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9TdHJpbmcobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKG5ldyBVaW50OEFycmF5KGlucHV0KSwgbmV3IEFycmF5KGlucHV0LmJ5dGVMZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogaWRlbnRpdHksXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihuZXcgVWludDhBcnJheShpbnB1dCkpO1xuICAgIH1cbn07XG5cbi8vIHVpbnQ4YXJyYXkgdG8gP1xudHJhbnNmb3JtW1widWludDhhcnJheVwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBhcnJheUxpa2VUb1N0cmluZyxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGlkZW50aXR5LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0KTtcbiAgICB9XG59O1xuXG4vLyBub2RlYnVmZmVyIHRvID9cbnRyYW5zZm9ybVtcIm5vZGVidWZmZXJcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVtcIm5vZGVidWZmZXJcIl1bXCJ1aW50OGFycmF5XCJdKGlucHV0KS5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBpZGVudGl0eVxufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gaW5wdXQgaW50byBhbnkgdHlwZS5cbiAqIFRoZSBzdXBwb3J0ZWQgb3V0cHV0IHR5cGUgYXJlIDogc3RyaW5nLCBhcnJheSwgdWludDhhcnJheSwgYXJyYXlidWZmZXIsIG5vZGVidWZmZXIuXG4gKiBJZiBubyBvdXRwdXQgdHlwZSBpcyBzcGVjaWZpZWQsIHRoZSB1bm1vZGlmaWVkIGlucHV0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0VHlwZSB0aGUgb3V0cHV0IHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gaW5wdXQgdGhlIGlucHV0IHRvIGNvbnZlcnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHR5cGUuXG4gKi9cbmV4cG9ydHMudHJhbnNmb3JtVG8gPSBmdW5jdGlvbihvdXRwdXRUeXBlLCBpbnB1dCkge1xuICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkLCBudWxsLCBldGNcbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvbid0IGhhcm0uXG4gICAgICAgIGlucHV0ID0gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFvdXRwdXRUeXBlKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgZXhwb3J0cy5jaGVja1N1cHBvcnQob3V0cHV0VHlwZSk7XG4gICAgdmFyIGlucHV0VHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGlucHV0KTtcbiAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtW2lucHV0VHlwZV1bb3V0cHV0VHlwZV0oaW5wdXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgaW5wdXQuXG4gKiBUaGUgdHlwZSB3aWxsIGJlIGluIGEgZm9ybWF0IHZhbGlkIGZvciBKU1ppcC51dGlscy50cmFuc2Zvcm1UbyA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dCB0byBpZGVudGlmeS5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIChsb3dlcmNhc2UpIHR5cGUgb2YgdGhlIGlucHV0LlxuICovXG5leHBvcnRzLmdldFR5cGVPZiA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09IFwiW29iamVjdCBBcnJheV1cIikge1xuICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyICYmIG5vZGVqc1V0aWxzLmlzQnVmZmVyKGlucHV0KSkge1xuICAgICAgICByZXR1cm4gXCJub2RlYnVmZmVyXCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgaW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBcInVpbnQ4YXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQuYXJyYXlidWZmZXIgJiYgaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gXCJhcnJheWJ1ZmZlclwiO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCB0eXBlLlxuICovXG5leHBvcnRzLmNoZWNrU3VwcG9ydCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICB2YXIgc3VwcG9ydGVkID0gc3VwcG9ydFt0eXBlLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmICghc3VwcG9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0eXBlICsgXCIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtXCIpO1xuICAgIH1cbn07XG5cbmV4cG9ydHMuTUFYX1ZBTFVFXzE2QklUUyA9IDY1NTM1O1xuZXhwb3J0cy5NQVhfVkFMVUVfMzJCSVRTID0gLTE7IC8vIHdlbGwsIFwiXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlwiIGlzIHBhcnNlZCBhcyAtMVxuXG4vKipcbiAqIFByZXR0aWZ5IGEgc3RyaW5nIHJlYWQgYXMgYmluYXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHByZXR0aWZ5LlxuICogQHJldHVybiB7c3RyaW5nfSBhIHByZXR0eSBzdHJpbmcuXG4gKi9cbmV4cG9ydHMucHJldHR5ID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgdmFyIHJlcyA9ICcnLFxuICAgICAgICBjb2RlLCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCAoc3RyIHx8IFwiXCIpLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgcmVzICs9ICdcXFxceCcgKyAoY29kZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIGNvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIERlZmVyIHRoZSBjYWxsIG9mIGEgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gY2FsbCBhc3luY2hyb25vdXNseS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgdGhlIGFyZ3VtZW50cyB0byBnaXZlIHRvIHRoZSBjYWxsYmFjay5cbiAqL1xuZXhwb3J0cy5kZWxheSA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBhcmdzLCBzZWxmKSB7XG4gICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KHNlbGYgfHwgbnVsbCwgYXJncyB8fCBbXSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEV4dGVuZHMgYSBwcm90b3R5cGUgd2l0aCBhbiBvdGhlciwgd2l0aG91dCBjYWxsaW5nIGEgY29uc3RydWN0b3Igd2l0aFxuICogc2lkZSBlZmZlY3RzLiBJbnNwaXJlZCBieSBub2RlanMnIGB1dGlscy5pbmhlcml0c2BcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0b3IgdGhlIGNvbnN0cnVjdG9yIHRvIGF1Z21lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ3RvciB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHRvIHVzZVxuICovXG5leHBvcnRzLmluaGVyaXRzID0gZnVuY3Rpb24gKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIHZhciBPYmogPSBmdW5jdGlvbigpIHt9O1xuICAgIE9iai5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IE9iaigpO1xufTtcblxuLyoqXG4gKiBNZXJnZSB0aGUgb2JqZWN0cyBwYXNzZWQgYXMgcGFyYW1ldGVycyBpbnRvIGEgbmV3IG9uZS5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gdmFyX2FyZ3MgQWxsIG9iamVjdHMgdG8gbWVyZ2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IGEgbmV3IG9iamVjdCB3aXRoIHRoZSBkYXRhIG9mIHRoZSBvdGhlcnMuXG4gKi9cbmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9LCBpLCBhdHRyO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgLy8gYXJndW1lbnRzIGlzIG5vdCBlbnVtZXJhYmxlIGluIHNvbWUgYnJvd3NlcnNcbiAgICAgICAgZm9yIChhdHRyIGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXS5oYXNPd25Qcm9wZXJ0eShhdHRyKSAmJiB0eXBlb2YgcmVzdWx0W2F0dHJdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2F0dHJdID0gYXJndW1lbnRzW2ldW2F0dHJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhcmJpdHJhcnkgY29udGVudCBpbnRvIGEgUHJvbWlzZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGEgbmFtZSBmb3IgdGhlIGNvbnRlbnQgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YSB0aGUgY29udGVudCB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtCb29sZWFufSBpc0JpbmFyeSB0cnVlIGlmIHRoZSBjb250ZW50IGlzIG5vdCBhbiB1bmljb2RlIHN0cmluZ1xuICogQHBhcmFtIHtCb29sZWFufSBpc09wdGltaXplZEJpbmFyeVN0cmluZyB0cnVlIGlmIHRoZSBzdHJpbmcgY29udGVudCBvbmx5IGhhcyBvbmUgYnl0ZSBwZXIgY2hhcmFjdGVyLlxuICogQHBhcmFtIHtCb29sZWFufSBpc0Jhc2U2NCB0cnVlIGlmIHRoZSBzdHJpbmcgY29udGVudCBpcyBlbmNvZGVkIHdpdGggYmFzZTY0LlxuICogQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIGluIGEgZm9ybWF0IHVzYWJsZSBieSBKU1ppcC5cbiAqL1xuZXhwb3J0cy5wcmVwYXJlQ29udGVudCA9IGZ1bmN0aW9uKG5hbWUsIGlucHV0RGF0YSwgaXNCaW5hcnksIGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nLCBpc0Jhc2U2NCkge1xuXG4gICAgdmFyIHByb21pc2UgPSBudWxsO1xuICAgIGlmIChzdXBwb3J0LmJsb2IgJiYgaW5wdXREYXRhIGluc3RhbmNlb2YgQmxvYiAmJiB0eXBlb2YgRmlsZVJlYWRlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBwcm9taXNlID0gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlLnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGlucHV0RGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIGRhdGEgaXMgYWxyZWFkeSBhIHByb21pc2UsIHRoaXMgZmxhdHRlbiBpdC5cbiAgICAgICAgcHJvbWlzZSA9IGV4dGVybmFsLlByb21pc2UucmVzb2x2ZShpbnB1dERhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgZGF0YVR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihkYXRhKTtcblxuICAgICAgICBpZiAoIWRhdGFUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yKFwiVGhlIGRhdGEgb2YgJ1wiICsgbmFtZSArIFwiJyBpcyBpbiBhbiB1bnN1cHBvcnRlZCBmb3JtYXQgIVwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzcGVjaWFsIGNhc2UgOiBpdCdzIHdheSBlYXNpZXIgdG8gd29yayB3aXRoIFVpbnQ4QXJyYXkgdGhhbiB3aXRoIEFycmF5QnVmZmVyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJhcnJheWJ1ZmZlclwiKSB7XG4gICAgICAgICAgICBkYXRhID0gZXhwb3J0cy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmIChpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBiYXNlNjQuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZWRCaW5hcnlTdHJpbmcgPT09IHRydWUgbWVhbnMgdGhhdCB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGZpbHRlcmVkIHdpdGggYSAweEZGIG1hc2tcbiAgICAgICAgICAgICAgICBpZiAoaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHN0cmluZywgbm90IGluIGEgYmFzZTY0IGZvcm1hdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQmUgc3VyZSB0aGF0IHRoaXMgaXMgYSBjb3JyZWN0IFwiYmluYXJ5IHN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdHJpbmcyYmluYXJ5KGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVhZGVyRm9yID0gcmVxdWlyZSgnLi9yZWFkZXIvcmVhZGVyRm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgc2lnID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcbnZhciBaaXBFbnRyeSA9IHJlcXVpcmUoJy4vemlwRW50cnknKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuLy8gIGNsYXNzIFppcEVudHJpZXMge3t7XG4vKipcbiAqIEFsbCB0aGUgZW50cmllcyBpbiB0aGUgemlwIGZpbGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkT3B0aW9ucyBPcHRpb25zIGZvciBsb2FkaW5nIHRoZSBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIFppcEVudHJpZXMobG9hZE9wdGlvbnMpIHtcbiAgICB0aGlzLmZpbGVzID0gW107XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cmllcy5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgcmVhZGVyIGlzIG9uIHRoZSBzcGVmaWNpZWQgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBpdCBpcyBhbiBvdGhlciBzaWduYXR1cmUuXG4gICAgICovXG4gICAgY2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKGV4cGVjdGVkU2lnbmF0dXJlKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKGV4cGVjdGVkU2lnbmF0dXJlKSkge1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIuaW5kZXggLT0gNDtcbiAgICAgICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWcgOiB1bmV4cGVjdGVkIHNpZ25hdHVyZSBcIiArIFwiKFwiICsgdXRpbHMucHJldHR5KHNpZ25hdHVyZSkgKyBcIiwgZXhwZWN0ZWQgXCIgKyB1dGlscy5wcmV0dHkoZXhwZWN0ZWRTaWduYXR1cmUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc2lnbmF0dXJlIGlzIGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXNrZWRJbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkU2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgdG8gZXhwZWN0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHNpZ25hdHVyZSBpcyBoZXJlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNTaWduYXR1cmU6IGZ1bmN0aW9uKGFza2VkSW5kZXgsIGV4cGVjdGVkU2lnbmF0dXJlKSB7XG4gICAgICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoYXNrZWRJbmRleCk7XG4gICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gc2lnbmF0dXJlID09PSBleHBlY3RlZFNpZ25hdHVyZTtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoY3VycmVudEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEJsb2NrRW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNrTnVtYmVyID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIHRoaXMuemlwQ29tbWVudExlbmd0aCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIC8vIHdhcm5pbmcgOiB0aGUgZW5jb2RpbmcgZGVwZW5kcyBvZiB0aGUgc3lzdGVtIGxvY2FsZVxuICAgICAgICAvLyBPbiBhIGxpbnV4IG1hY2hpbmUgd2l0aCBMQU5HPWVuX1VTLnV0ZjgsIHRoaXMgZmllbGQgaXMgdXRmOCBlbmNvZGVkLlxuICAgICAgICAvLyBPbiBhIHdpbmRvd3MgbWFjaGluZSwgdGhpcyBmaWVsZCBpcyBlbmNvZGVkIHdpdGggdGhlIGxvY2FsaXplZCB3aW5kb3dzIGNvZGUgcGFnZS5cbiAgICAgICAgdmFyIHppcENvbW1lbnQgPSB0aGlzLnJlYWRlci5yZWFkRGF0YSh0aGlzLnppcENvbW1lbnRMZW5ndGgpO1xuICAgICAgICB2YXIgZGVjb2RlUGFyYW1UeXBlID0gc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG4gICAgICAgIC8vIFRvIGdldCBjb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggdGhlIGdlbmVyYXRpb24gcGFydCwgd2Ugd2lsbCBhc3N1bWUgdGhhdFxuICAgICAgICAvLyB0aGlzIGlzIHV0ZjggZW5jb2RlZCB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIGRlY29kZUNvbnRlbnQgPSB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHppcENvbW1lbnQpO1xuICAgICAgICB0aGlzLnppcENvbW1lbnQgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGRlY29kZUNvbnRlbnQpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICogTm90IG1lcmdlZCB3aXRoIHRoZSBtZXRob2QgcmVhZEVuZE9mQ2VudHJhbCA6XG4gICAgICogVGhlIGVuZCBvZiBjZW50cmFsIGNhbiBjb2V4aXN0IHdpdGggaXRzIFppcDY0IGJyb3RoZXIsXG4gICAgICogSSBkb24ndCB3YW50IHRvIHJlYWQgdGhlIHdyb25nIG51bWJlciBvZiBieXRlcyAhXG4gICAgICovXG4gICAgcmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMucmVhZGVyLnNraXAoNCk7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk1hZGVCeSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoMik7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcblxuICAgICAgICB0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGEgPSB7fTtcbiAgICAgICAgdmFyIGV4dHJhRGF0YVNpemUgPSB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSAtIDQ0LFxuICAgICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgICAgZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgZXh0cmFEYXRhU2l6ZSkge1xuICAgICAgICAgICAgZXh0cmFGaWVsZElkID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlID0gdGhpcy5yZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGFbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFppcCA2NCBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yLlxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza1dpdGhaaXA2NENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuZGlza3NDb3VudCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIGlmICh0aGlzLmRpc2tzQ291bnQgPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdWx0aS12b2x1bWVzIHppcCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgbG9jYWwgZmlsZXMsIGJhc2VkIG9uIHRoZSBvZmZzZXQgcmVhZCBpbiB0aGUgY2VudHJhbCBwYXJ0LlxuICAgICAqL1xuICAgIHJlYWRMb2NhbEZpbGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGksIGZpbGU7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tpXTtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGZpbGUubG9jYWxIZWFkZXJPZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuTE9DQUxfRklMRV9IRUFERVIpO1xuICAgICAgICAgICAgZmlsZS5yZWFkTG9jYWxQYXJ0KHRoaXMucmVhZGVyKTtcbiAgICAgICAgICAgIGZpbGUuaGFuZGxlVVRGOCgpO1xuICAgICAgICAgICAgZmlsZS5wcm9jZXNzQXR0cmlidXRlcygpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbERpcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmaWxlO1xuXG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMuY2VudHJhbERpck9mZnNldCk7XG4gICAgICAgIHdoaWxlICh0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoc2lnLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgICAgICAgICBmaWxlID0gbmV3IFppcEVudHJ5KHtcbiAgICAgICAgICAgICAgICB6aXA2NDogdGhpcy56aXA2NFxuICAgICAgICAgICAgfSwgdGhpcy5sb2FkT3B0aW9ucyk7XG4gICAgICAgICAgICBmaWxlLnJlYWRDZW50cmFsUGFydCh0aGlzLnJlYWRlcik7XG4gICAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZW50cmFsRGlyUmVjb3JkcyAhPT0gdGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICE9PSAwICYmIHRoaXMuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0ZWQgc29tZSByZWNvcmRzIGJ1dCBjb3VsZG4ndCBmaW5kIEFOWS5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlYWxseSBzdXNwaWNpb3VzLCBhcyBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgXCIgKyB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICsgXCIgcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290IFwiICsgdGhpcy5maWxlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBzb21lIHJlY29yZHMgYnV0IG5vdCBhbGwuXG4gICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGlzIHdyb25nIGJ1dCB3ZSBnb3Qgc29tZXRoaW5nIGZvciB0aGUgdXNlcjogbm8gZXJyb3IgaGVyZS5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJleHBlY3RlZFwiLCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzLCBcInJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdFwiLCB0aGlzLmZpbGVzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkRW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRlbnQgaXMgYSB0cnVuY2F0ZWQgemlwIG9yIGNvbXBsZXRlIGdhcmJhZ2UuXG4gICAgICAgICAgICAvLyBBIFwiTE9DQUxfRklMRV9IRUFERVJcIiBpcyBub3QgcmVxdWlyZWQgYXQgdGhlIGJlZ2lubmluZyAoYXV0b1xuICAgICAgICAgICAgLy8gZXh0cmFjdGlibGUgemlwIGZvciBleGFtcGxlKSBidXQgaXQgY2FuIGdpdmUgYSBnb29kIGhpbnQuXG4gICAgICAgICAgICAvLyBJZiBhbiBhamF4IHJlcXVlc3Qgd2FzIHVzZWQgd2l0aG91dCByZXNwb25zZVR5cGUsIHdlIHdpbGwgYWxzb1xuICAgICAgICAgICAgLy8gZ2V0IHVucmVhZGFibGUgZGF0YS5cbiAgICAgICAgICAgIHZhciBpc0dhcmJhZ2UgPSAhdGhpcy5pc1NpZ25hdHVyZSgwLCBzaWcuTE9DQUxfRklMRV9IRUFERVIpO1xuXG4gICAgICAgICAgICBpZiAoaXNHYXJiYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgOiBpcyB0aGlzIGEgemlwIGZpbGUgPyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSWYgaXQgaXMsIHNlZSBodHRwOi8vc3R1ay5naXRodWIuaW8vanN6aXAvZG9jdW1lbnRhdGlvbi9ob3d0by9yZWFkX3ppcC5odG1sXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChvZmZzZXQpO1xuICAgICAgICB2YXIgZW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICB0aGlzLnJlYWRCbG9ja0VuZE9mQ2VudHJhbCgpO1xuXG5cbiAgICAgICAgLyogZXh0cmFjdCBmcm9tIHRoZSB6aXAgc3BlYyA6XG4gICAgICAgICAgICA0KSAgSWYgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgIHJlY29yZCBpcyB0b28gc21hbGwgdG8gaG9sZCByZXF1aXJlZCBkYXRhLCB0aGUgZmllbGRcbiAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2V0IHRvIC0xICgweEZGRkYgb3IgMHhGRkZGRkZGRikgYW5kIHRoZVxuICAgICAgICAgICAgICAgIFpJUDY0IGZvcm1hdCByZWNvcmQgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAgICAgICAgICA1KSAgVGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgYW5kIHRoZVxuICAgICAgICAgICAgICAgIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIHJlY29yZCBtdXN0XG4gICAgICAgICAgICAgICAgcmVzaWRlIG9uIHRoZSBzYW1lIGRpc2sgd2hlbiBzcGxpdHRpbmcgb3Igc3Bhbm5pbmdcbiAgICAgICAgICAgICAgICBhbiBhcmNoaXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlciA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHMgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUyB8fCB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuemlwNjQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgV2FybmluZyA6IHRoZSB6aXA2NCBleHRlbnNpb24gaXMgc3VwcG9ydGVkLCBidXQgT05MWSBpZiB0aGUgNjRiaXRzIGludGVnZXIgcmVhZCBmcm9tXG4gICAgICAgICAgICB0aGUgemlwIGZpbGUgY2FuIGZpdCBpbnRvIGEgMzJiaXRzIGludGVnZXIuIFRoaXMgY2Fubm90IGJlIHNvbHZlZCA6IEphdmFzY3JpcHQgcmVwcmVzZW50c1xuICAgICAgICAgICAgYWxsIG51bWJlcnMgYXMgNjQtYml0IGRvdWJsZSBwcmVjaXNpb24gSUVFRSA3NTQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy5cbiAgICAgICAgICAgIFNvLCB3ZSBoYXZlIDUzYml0cyBmb3IgaW50ZWdlcnMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyB0cmVhdCBldmVyeXRoaW5nIGFzIDMyYml0cy5cbiAgICAgICAgICAgIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9CaXR3aXNlX09wZXJhdG9yc1xuICAgICAgICAgICAgYW5kIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTI2Mi5wZGYgc2VjdGlvbiA4LjVcbiAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIHNob3VsZCBsb29rIGZvciBhIHppcDY0IEVPQ0QgbG9jYXRvclxuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChvZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcigpO1xuXG4gICAgICAgICAgICAvLyBub3cgdGhlIHppcDY0IEVPQ0QgcmVjb3JkXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTaWduYXR1cmUodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyLCBzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIlpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBub3Qgd2hlcmUgZXhwZWN0ZWQuXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgKyB0aGlzLmNlbnRyYWxEaXJTaXplO1xuICAgICAgICBpZiAodGhpcy56aXA2NCkge1xuICAgICAgICAgICAgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgKz0gMjA7IC8vIGVuZCBvZiBjZW50cmFsIGRpciA2NCBsb2NhdG9yXG4gICAgICAgICAgICBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldCArPSAxMiAvKiBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGxlYWRpbmcgMTIgYnl0ZXMgKi8gKyB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleHRyYUJ5dGVzID0gZW5kT2ZDZW50cmFsRGlyT2Zmc2V0IC0gZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQ7XG5cbiAgICAgICAgaWYgKGV4dHJhQnl0ZXMgPiAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oZXh0cmFCeXRlcywgXCJleHRyYSBieXRlcyBhdCBiZWdpbm5pbmcgb3Igd2l0aGluIHppcGZpbGVcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NpZ25hdHVyZShlbmRPZkNlbnRyYWxEaXJPZmZzZXQsIHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBvZmZzZXRzIHNlZW0gd3JvbmcsIGJ1dCB3ZSBoYXZlIHNvbWV0aGluZyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC5cbiAgICAgICAgICAgICAgICAvLyBTb+KApiB3ZSBrZWVwIGl0LlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgb2Zmc2V0IGlzIHdyb25nLCB1cGRhdGUgdGhlIFwiemVyb1wiIG9mIHRoZSByZWFkZXJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgZGF0YSBoYXMgYmVlbiBwcmVwZW5kZWQgKGNyeCBmaWxlcyBmb3IgZXhhbXBsZSlcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRlci56ZXJvID0gZXh0cmFCeXRlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChleHRyYUJ5dGVzIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcDogbWlzc2luZyBcIiArIE1hdGguYWJzKGV4dHJhQnl0ZXMpICsgXCIgYnl0ZXMuXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBwcmVwYXJlUmVhZGVyOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyRm9yKGRhdGEpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCBhIHppcCBmaWxlIGFuZCBjcmVhdGUgWmlwRW50cmllcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgYmluYXJ5IHN0cmluZyByZXByZXNlbnRpbmcgYSB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZVJlYWRlcihkYXRhKTtcbiAgICAgICAgdGhpcy5yZWFkRW5kT2ZDZW50cmFsKCk7XG4gICAgICAgIHRoaXMucmVhZENlbnRyYWxEaXIoKTtcbiAgICAgICAgdGhpcy5yZWFkTG9jYWxGaWxlcygpO1xuICAgIH1cbn07XG4vLyB9fX0gZW5kIG9mIFppcEVudHJpZXNcbm1vZHVsZS5leHBvcnRzID0gWmlwRW50cmllcztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWFkZXJGb3IgPSByZXF1aXJlKCcuL3JlYWRlci9yZWFkZXJGb3InKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7XG52YXIgY3JjMzJmbiA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgY29tcHJlc3Npb25zID0gcmVxdWlyZSgnLi9jb21wcmVzc2lvbnMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG5cbnZhciBNQURFX0JZX0RPUyA9IDB4MDA7XG52YXIgTUFERV9CWV9VTklYID0gMHgwMztcblxuLyoqXG4gKiBGaW5kIGEgY29tcHJlc3Npb24gcmVnaXN0ZXJlZCBpbiBKU1ppcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wcmVzc2lvbk1ldGhvZCB0aGUgbWV0aG9kIG1hZ2ljIHRvIGZpbmQuXG4gKiBAcmV0dXJuIHtPYmplY3R8bnVsbH0gdGhlIEpTWmlwIGNvbXByZXNzaW9uIG9iamVjdCwgbnVsbCBpZiBub25lIGZvdW5kLlxuICovXG52YXIgZmluZENvbXByZXNzaW9uID0gZnVuY3Rpb24oY29tcHJlc3Npb25NZXRob2QpIHtcbiAgICBmb3IgKHZhciBtZXRob2QgaW4gY29tcHJlc3Npb25zKSB7XG4gICAgICAgIGlmICghY29tcHJlc3Npb25zLmhhc093blByb3BlcnR5KG1ldGhvZCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wcmVzc2lvbnNbbWV0aG9kXS5tYWdpYyA9PT0gY29tcHJlc3Npb25NZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2lvbnNbbWV0aG9kXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8vIGNsYXNzIFppcEVudHJ5IHt7e1xuLyoqXG4gKiBBbiBlbnRyeSBpbiB0aGUgemlwIGZpbGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIGN1cnJlbnQgZmlsZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkT3B0aW9ucyBPcHRpb25zIGZvciBsb2FkaW5nIHRoZSBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIFppcEVudHJ5KG9wdGlvbnMsIGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmxvYWRPcHRpb25zID0gbG9hZE9wdGlvbnM7XG59XG5aaXBFbnRyeS5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2F5IGlmIHRoZSBmaWxlIGlzIGVuY3J5cHRlZC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlIGlzIGVuY3J5cHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzRW5jcnlwdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gYml0IDEgaXMgc2V0XG4gICAgICAgIHJldHVybiAodGhpcy5iaXRGbGFnICYgMHgwMDAxKSA9PT0gMHgwMDAxO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogc2F5IGlmIHRoZSBmaWxlIGhhcyB1dGYtOCBmaWxlbmFtZS9jb21tZW50LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbGVuYW1lL2NvbW1lbnQgaXMgaW4gdXRmLTgsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICB1c2VVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gYml0IDExIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDgwMCkgPT09IDB4MDgwMDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGxvY2FsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHJlYWRMb2NhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB2YXIgY29tcHJlc3Npb24sIGxvY2FsRXh0cmFGaWVsZHNMZW5ndGg7XG5cbiAgICAgICAgLy8gd2UgYWxyZWFkeSBrbm93IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY2VudHJhbCBkaXIgIVxuICAgICAgICAvLyBJZiB0aGUgY2VudHJhbCBkaXIgZGF0YSBhcmUgZmFsc2UsIHdlIGFyZSBkb29tZWQuXG4gICAgICAgIC8vIE9uIHRoZSBicmlnaHQgc2lkZSwgdGhlIGxvY2FsIHBhcnQgaXMgc2NhcnkgIDogemlwNjQsIGRhdGEgZGVzY3JpcHRvcnMsIGJvdGgsIGV0Yy5cbiAgICAgICAgLy8gVGhlIGxlc3MgZGF0YSB3ZSBnZXQgaGVyZSwgdGhlIG1vcmUgcmVsaWFibGUgdGhpcyBzaG91bGQgYmUuXG4gICAgICAgIC8vIExldCdzIHNraXAgdGhlIHdob2xlIGhlYWRlciBhbmQgZGFzaCB0byB0aGUgZGF0YSAhXG4gICAgICAgIHJlYWRlci5za2lwKDIyKTtcbiAgICAgICAgLy8gaW4gc29tZSB6aXAgY3JlYXRlZCBvbiB3aW5kb3dzLCB0aGUgZmlsZW5hbWUgc3RvcmVkIGluIHRoZSBjZW50cmFsIGRpciBjb250YWlucyBcXCBpbnN0ZWFkIG9mIC8uXG4gICAgICAgIC8vIFN0cmFuZ2VseSwgdGhlIGZpbGVuYW1lIGhlcmUgaXMgT0suXG4gICAgICAgIC8vIEkgd291bGQgbG92ZSB0byB0cmVhdCB0aGVzZSB6aXAgZmlsZXMgYXMgY29ycnVwdGVkIChzZWUgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvRkFRLmh0bWwjYmFja3NsYXNoZXNcbiAgICAgICAgLy8gb3IgQVBQTk9URSM0LjQuMTcuMSwgXCJBbGwgc2xhc2hlcyBNVVNUIGJlIGZvcndhcmQgc2xhc2hlcyAnLydcIikgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZiBiYWQgemlwIGdlbmVyYXRvcnMuLi5cbiAgICAgICAgLy8gU2VhcmNoIFwidW56aXAgbWlzbWF0Y2hpbmcgXCJsb2NhbFwiIGZpbGVuYW1lIGNvbnRpbnVpbmcgd2l0aCBcImNlbnRyYWxcIiBmaWxlbmFtZSB2ZXJzaW9uXCIgb25cbiAgICAgICAgLy8gdGhlIGludGVybmV0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBJIHRoaW5rIEkgc2VlIHRoZSBsb2dpYyBoZXJlIDogdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGlzIHVzZWQgdG8gZGlzcGxheVxuICAgICAgICAvLyBjb250ZW50IGFuZCB0aGUgbG9jYWwgZGlyZWN0b3J5IGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgZmlsZXMuIE1peGluZyAvIGFuZCBcXFxuICAgICAgICAvLyBtYXkgYmUgdXNlZCB0byBkaXNwbGF5IFxcIHRvIHdpbmRvd3MgdXNlcnMgYW5kIHVzZSAvIHdoZW4gZXh0cmFjdGluZyB0aGUgZmlsZXMuXG4gICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoaXMgbGVhZCBhbHNvIHRvIHNvbWUgaXNzdWVzIDogaHR0cDovL3NlY2xpc3RzLm9yZy9mdWxsZGlzY2xvc3VyZS8yMDA5L1NlcC8zOTRcbiAgICAgICAgdGhpcy5maWxlTmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7IC8vIGNhbid0IGJlIHN1cmUgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBjZW50cmFsIGRpclxuICAgICAgICAvLyB0aGUgZmlsZU5hbWUgaXMgc3RvcmVkIGFzIGJpbmFyeSBkYXRhLCB0aGUgaGFuZGxlVVRGOCBtZXRob2Qgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIGVuY29kaW5nLlxuICAgICAgICB0aGlzLmZpbGVOYW1lID0gcmVhZGVyLnJlYWREYXRhKHRoaXMuZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICByZWFkZXIuc2tpcChsb2NhbEV4dHJhRmllbGRzTGVuZ3RoKTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2VkU2l6ZSA9PT0gLTEgfHwgdGhpcy51bmNvbXByZXNzZWRTaXplID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIG9yIGNvcnJ1cHRlZCB6aXAgOiBkaWRuJ3QgZ2V0IGVub3VnaCBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkgXCIgKyBcIihjb21wcmVzc2VkU2l6ZSA9PT0gLTEgfHwgdW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcHJlc3Npb24gPSBmaW5kQ29tcHJlc3Npb24odGhpcy5jb21wcmVzc2lvbk1ldGhvZCk7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PT0gbnVsbCkgeyAvLyBubyBjb21wcmVzc2lvbiBmb3VuZFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNvbXByZXNzaW9uIFwiICsgdXRpbHMucHJldHR5KHRoaXMuY29tcHJlc3Npb25NZXRob2QpICsgXCIgdW5rbm93biAoaW5uZXIgZmlsZSA6IFwiICsgdXRpbHMudHJhbnNmb3JtVG8oXCJzdHJpbmdcIiwgdGhpcy5maWxlTmFtZSkgKyBcIilcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWNvbXByZXNzZWQgPSBuZXcgQ29tcHJlc3NlZE9iamVjdCh0aGlzLmNvbXByZXNzZWRTaXplLCB0aGlzLnVuY29tcHJlc3NlZFNpemUsIHRoaXMuY3JjMzIsIGNvbXByZXNzaW9uLCByZWFkZXIucmVhZERhdGEodGhpcy5jb21wcmVzc2VkU2l6ZSkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHJlYWRDZW50cmFsUGFydDogZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgICAgIHRoaXMudmVyc2lvbk1hZGVCeSA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICByZWFkZXIuc2tpcCgyKTtcbiAgICAgICAgLy8gdGhpcy52ZXJzaW9uTmVlZGVkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuYml0RmxhZyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW9uTWV0aG9kID0gcmVhZGVyLnJlYWRTdHJpbmcoMik7XG4gICAgICAgIHRoaXMuZGF0ZSA9IHJlYWRlci5yZWFkRGF0ZSgpO1xuICAgICAgICB0aGlzLmNyYzMyID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHZhciBmaWxlTmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dHJhRmllbGRzTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZmlsZUNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5kaXNrTnVtYmVyU3RhcnQgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoNCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNFbmNyeXB0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jcnlwdGVkIHppcCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdpbGwgYmUgcmVhZCBpbiB0aGUgbG9jYWwgcGFydCwgc2VlIHRoZSBjb21tZW50cyB0aGVyZVxuICAgICAgICByZWFkZXIuc2tpcChmaWxlTmFtZUxlbmd0aCk7XG4gICAgICAgIHRoaXMucmVhZEV4dHJhRmllbGRzKHJlYWRlcik7XG4gICAgICAgIHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQocmVhZGVyKTtcbiAgICAgICAgdGhpcy5maWxlQ29tbWVudCA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVDb21tZW50TGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyBhbmQgZ2V0IHRoZSB1bml4L2RvcyBwZXJtaXNzaW9ucy5cbiAgICAgKi9cbiAgICBwcm9jZXNzQXR0cmlidXRlczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuZG9zUGVybWlzc2lvbnMgPSBudWxsO1xuICAgICAgICB2YXIgbWFkZUJ5ID0gdGhpcy52ZXJzaW9uTWFkZUJ5ID4+IDg7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgRE9TIGRpcmVjdG9yeSBmbGFnIHNldC5cbiAgICAgICAgLy8gV2UgbG9vayBmb3IgaXQgaW4gdGhlIERPUyBhbmQgVU5JWCBwZXJtaXNzaW9uc1xuICAgICAgICAvLyBidXQgc29tZSB1bmtub3duIHBsYXRmb3JtIGNvdWxkIHNldCBpdCBhcyBhIGNvbXBhdGliaWxpdHkgZmxhZy5cbiAgICAgICAgdGhpcy5kaXIgPSB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgJiAweDAwMTAgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgaWYobWFkZUJ5ID09PSBNQURFX0JZX0RPUykge1xuICAgICAgICAgICAgLy8gZmlyc3QgNiBiaXRzICgwIHRvIDUpXG4gICAgICAgICAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgzRjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9VTklYKSB7XG4gICAgICAgICAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9ICh0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPj4gMTYpICYgMHhGRkZGO1xuICAgICAgICAgICAgLy8gdGhlIG9jdGFsIHBlcm1pc3Npb25zIGFyZSBpbiAodGhpcy51bml4UGVybWlzc2lvbnMgJiAweDAxRkYpLnRvU3RyaW5nKDgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmFpbCBzYWZlIDogaWYgdGhlIG5hbWUgZW5kcyB3aXRoIGEgLyBpdCBwcm9iYWJseSBtZWFucyBhIGZvbGRlclxuICAgICAgICBpZiAoIXRoaXMuZGlyICYmIHRoaXMuZmlsZU5hbWVTdHIuc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICAgICAgICAgIHRoaXMuZGlyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSB0aGUgWklQNjQgZXh0cmEgZmllbGQgYW5kIG1lcmdlIHRoZSBpbmZvIGluIHRoZSBjdXJyZW50IFppcEVudHJ5LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHBhcnNlWklQNjRFeHRyYUZpZWxkOiBmdW5jdGlvbihyZWFkZXIpIHtcblxuICAgICAgICBpZiAoIXRoaXMuZXh0cmFGaWVsZHNbMHgwMDAxXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2hvdWxkIGJlIHNvbWV0aGluZywgcHJlcGFyaW5nIHRoZSBleHRyYSByZWFkZXJcbiAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHRoaXMuZXh0cmFGaWVsZHNbMHgwMDAxXS52YWx1ZSk7XG5cbiAgICAgICAgLy8gSSByZWFsbHkgaG9wZSB0aGF0IHRoZXNlIDY0Yml0cyBpbnRlZ2VyIGNhbiBmaXQgaW4gMzIgYml0cyBpbnRlZ2VyLCBiZWNhdXNlIGpzXG4gICAgICAgIC8vIHdvbid0IGxldCB1cyBoYXZlIG1vcmUuXG4gICAgICAgIGlmICh0aGlzLnVuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaXNrTnVtYmVyU3RhcnQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gZXh0cmFSZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkRXh0cmFGaWVsZHM6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZGVyLmluZGV4ICsgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhRmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLmV4dHJhRmllbGRzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAocmVhZGVyLmluZGV4IDwgZW5kKSB7XG4gICAgICAgICAgICBleHRyYUZpZWxkSWQgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHJlYWRlci5yZWFkRGF0YShleHRyYUZpZWxkTGVuZ3RoKTtcblxuICAgICAgICAgICAgdGhpcy5leHRyYUZpZWxkc1tleHRyYUZpZWxkSWRdID0ge1xuICAgICAgICAgICAgICAgIGlkOiBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBleHRyYUZpZWxkVmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFwcGx5IGFuIFVURjggdHJhbnNmb3JtYXRpb24gaWYgbmVlZGVkLlxuICAgICAqL1xuICAgIGhhbmRsZVVURjg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGVjb2RlUGFyYW1UeXBlID0gc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG4gICAgICAgIGlmICh0aGlzLnVzZVVURjgoKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHV0ZjgudXRmOGRlY29kZSh0aGlzLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdXBhdGggPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGgoKTtcbiAgICAgICAgICAgIGlmICh1cGF0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1cGF0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2VcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWVCeXRlQXJyYXkgPSAgdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB0aGlzLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShmaWxlTmFtZUJ5dGVBcnJheSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB1Y29tbWVudCA9IHRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudCgpO1xuICAgICAgICAgICAgaWYgKHVjb21tZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudFN0ciA9IHVjb21tZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBU0NJSSB0ZXh0IG9yIHVuc3VwcG9ydGVkIGNvZGUgcGFnZVxuICAgICAgICAgICAgICAgIHZhciBjb21tZW50Qnl0ZUFycmF5ID0gIHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgdGhpcy5maWxlQ29tbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudFN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoY29tbWVudEJ5dGVBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgdW5pY29kZSBwYXRoIGRlY2xhcmVkIGluIHRoZSBleHRyYSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgcGF0aCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1cGF0aEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDcwNzVdO1xuICAgICAgICBpZiAodXBhdGhGaWVsZCkge1xuICAgICAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHVwYXRoRmllbGQudmFsdWUpO1xuXG4gICAgICAgICAgICAvLyB3cm9uZyB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoZXh0cmFSZWFkZXIucmVhZEludCgxKSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgY3JjIG9mIHRoZSBmaWxlbmFtZSBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGNyYzMyZm4odGhpcy5maWxlTmFtZSkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1cGF0aEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgdW5pY29kZSBjb21tZW50IGRlY2xhcmVkIGluIHRoZSBleHRyYSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgY29tbWVudCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1Y29tbWVudEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDYzNzVdO1xuICAgICAgICBpZiAodWNvbW1lbnRGaWVsZCkge1xuICAgICAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHVjb21tZW50RmllbGQudmFsdWUpO1xuXG4gICAgICAgICAgICAvLyB3cm9uZyB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoZXh0cmFSZWFkZXIucmVhZEludCgxKSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgY3JjIG9mIHRoZSBjb21tZW50IGNoYW5nZWQsIHRoaXMgZmllbGQgaXMgb3V0IG9mIGRhdGUuXG4gICAgICAgICAgICBpZiAoY3JjMzJmbih0aGlzLmZpbGVDb21tZW50KSAhPT0gZXh0cmFSZWFkZXIucmVhZEludCg0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXRmOC51dGY4ZGVjb2RlKGV4dHJhUmVhZGVyLnJlYWREYXRhKHVjb21tZW50RmllbGQubGVuZ3RoIC0gNSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJ5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3RyZWFtSGVscGVyID0gcmVxdWlyZSgnLi9zdHJlYW0vU3RyZWFtSGVscGVyJyk7XG52YXIgRGF0YVdvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFXb3JrZXInKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogQSBzaW1wbGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIG9mIHRoZSBmaWxlXG4gKi9cbnZhciBaaXBPYmplY3QgPSBmdW5jdGlvbihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRpciA9IG9wdGlvbnMuZGlyO1xuICAgIHRoaXMuZGF0ZSA9IG9wdGlvbnMuZGF0ZTtcbiAgICB0aGlzLmNvbW1lbnQgPSBvcHRpb25zLmNvbW1lbnQ7XG4gICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBvcHRpb25zLnVuaXhQZXJtaXNzaW9ucztcbiAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gb3B0aW9ucy5kb3NQZXJtaXNzaW9ucztcblxuICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgIHRoaXMuX2RhdGFCaW5hcnkgPSBvcHRpb25zLmJpbmFyeTtcbiAgICAvLyBrZWVwIG9ubHkgdGhlIGNvbXByZXNzaW9uXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb21wcmVzc2lvbiA6IG9wdGlvbnMuY29tcHJlc3Npb24sXG4gICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG9wdGlvbnMuY29tcHJlc3Npb25PcHRpb25zXG4gICAgfTtcbn07XG5cblppcE9iamVjdC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIGludGVybmFsIHN0cmVhbSBmb3IgdGhlIGNvbnRlbnQgb2YgdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcmV0dXJuIFN0cmVhbUhlbHBlciB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIGludGVybmFsU3RyZWFtOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgb3V0cHV0VHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIGFza1VuaWNvZGVTdHJpbmcgPSBvdXRwdXRUeXBlID09PSBcInN0cmluZ1wiIHx8IG91dHB1dFR5cGUgPT09IFwidGV4dFwiO1xuICAgICAgICBpZiAob3V0cHV0VHlwZSA9PT0gXCJiaW5hcnlzdHJpbmdcIiB8fCBvdXRwdXRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtcblxuICAgICAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gIXRoaXMuX2RhdGFCaW5hcnk7XG5cbiAgICAgICAgaWYgKGlzVW5pY29kZVN0cmluZyAmJiAhYXNrVW5pY29kZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5pY29kZVN0cmluZyAmJiBhc2tVbmljb2RlU3RyaW5nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RGVjb2RlV29ya2VyKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIocmVzdWx0LCBvdXRwdXRUeXBlLCBcIlwiKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgY29udGVudCBpbiB0aGUgYXNrZWQgdHlwZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVXBkYXRlIGEgZnVuY3Rpb24gdG8gY2FsbCBvbiBlYWNoIGludGVybmFsIHVwZGF0ZS5cbiAgICAgKiBAcmV0dXJuIFByb21pc2UgdGhlIHByb21pc2Ugb2YgdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBhc3luYzogZnVuY3Rpb24gKHR5cGUsIG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3RyZWFtKHR5cGUpLmFjY3VtdWxhdGUob25VcGRhdGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSBjb250ZW50IGFzIGEgbm9kZWpzIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiBlYWNoIGNodW5rLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVXBkYXRlIGEgZnVuY3Rpb24gdG8gY2FsbCBvbiBlYWNoIGludGVybmFsIHVwZGF0ZS5cbiAgICAgKiBAcmV0dXJuIFN0cmVhbSB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIG5vZGVTdHJlYW06IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbSh0eXBlIHx8IFwibm9kZWJ1ZmZlclwiKS50b05vZGVqc1N0cmVhbShvblVwZGF0ZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHdvcmtlciBmb3IgdGhlIGNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0IHRvIHVzZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb25PcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNvbXByZXNzaW5nLlxuICAgICAqIEByZXR1cm4gV29ya2VyIHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgLy8gX2NvbXByZXNzV29ya2VyOiBmdW5jdGlvbiAoY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIC8vICAgICBpZiAoXG4gICAgLy8gICAgICAgICB0aGlzLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCAmJlxuICAgIC8vICAgICAgICAgdGhpcy5fZGF0YS5jb21wcmVzc2lvbi5tYWdpYyA9PT0gY29tcHJlc3Npb24ubWFnaWNcbiAgICAvLyAgICAgKSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXRDb21wcmVzc2VkV29ya2VyKCk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO1xuICAgIC8vICAgICAgICAgaWYoIXRoaXMuX2RhdGFCaW5hcnkpIHtcbiAgICAvLyAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RW5jb2RlV29ya2VyKCkpO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgcmV0dXJuIENvbXByZXNzZWRPYmplY3QuY3JlYXRlV29ya2VyRnJvbShyZXN1bHQsIGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB3b3JrZXIgZm9yIHRoZSBkZWNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4gV29ya2VyIHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgX2RlY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29udGVudFdvcmtlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVdvcmtlcih0aGlzLl9kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciByZW1vdmVkTWV0aG9kcyA9IFtcImFzVGV4dFwiLCBcImFzQmluYXJ5XCIsIFwiYXNOb2RlQnVmZmVyXCIsIFwiYXNVaW50OEFycmF5XCIsIFwiYXNBcnJheUJ1ZmZlclwiXTtcbnZhciByZW1vdmVkRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG59O1xuXG5mb3IodmFyIGkgPSAwOyBpIDwgcmVtb3ZlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICBaaXBPYmplY3QucHJvdG90eXBlW3JlbW92ZWRNZXRob2RzW2ldXSA9IHJlbW92ZWRGbjtcbn1cbm1vZHVsZS5leHBvcnRzID0gWmlwT2JqZWN0O1xuIiwiLy8gVG9wIGxldmVsIGZpbGUgaXMganVzdCBhIG1peGluIG9mIHN1Ym1vZHVsZXMgJiBjb25zdGFudHNcbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiAgICA9IHJlcXVpcmUoJy4vbGliL3V0aWxzL2NvbW1vbicpLmFzc2lnbjtcblxudmFyIGRlZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2RlZmxhdGUnKTtcbnZhciBpbmZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9pbmZsYXRlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9saWIvemxpYi9jb25zdGFudHMnKTtcblxudmFyIHBha28gPSB7fTtcblxuYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFrbztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9kZWZsYXRlID0gcmVxdWlyZSgnLi96bGliL2RlZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xuXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG5cbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTtcblxudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyoqXG4gKiBjbGFzcyBEZWZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbZGVmbGF0ZV1dLFxuICogW1tkZWZsYXRlUmF3XV0gYW5kIFtbZ3ppcF1dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogRGVmbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbRGVmbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGRlZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0RlZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IGNvbXByZXNzZWQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tEZWZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tEZWZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogYXJyYXkgZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlKHN0cm0sIF9tb2RlKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IFpfRklOSVNIIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5vbkRhdGEoc3RyaW5ncy5idWYyYmluc3RyaW5nKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IFpfU1RSRUFNX0VORCk7XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBaX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBaX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKFpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG52YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96bGliL2d6aGVhZGVyJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0luZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG4gIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyO1xuICB2YXIgZGljdDtcblxuICAvLyBGbGFnIHRvIHByb3Blcmx5IHByb2Nlc3MgWl9CVUZfRVJST1Igb24gdGVzdGluZyBpbmZsYXRlIGNhbGxcbiAgLy8gd2hlbiB3ZSBjaGVjayB0aGF0IGFsbCBvdXRwdXQgZGF0YSB3YXMgZmx1c2hlZC5cbiAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gYy5aX0ZJTklTSCA6IGMuWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gT25seSBiaW5hcnkgc3RyaW5ncyBjYW4gYmUgZGVjb21wcmVzc2VkIG9uIHByYWN0aWNlXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3MuYmluc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgYy5aX05PX0ZMVVNIKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7XG4gICAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgICBpZiAodHlwZW9mIGRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYoZGljdGlvbmFyeSk7XG4gICAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGljdCA9IGRpY3Rpb25hcnk7XG4gICAgICB9XG5cbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7XG4gICAgICBzdGF0dXMgPSBjLlpfT0s7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkpIHtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7XG4gICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7XG5cbiAgICAgICAgICAvLyBtb3ZlIHRhaWxcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHsgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsgfVxuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnNcbiAgICAvLyBhcmUgZmx1c2hlZC4gVGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdoZW4gYXZhaWxfb3V0ID0gMCAtIHJ1biBvbmUgbW9yZVxuICAgIC8vIGluZmxhdGUgcGFzcy4gQnV0IGlmIG91dHB1dCBkYXRhIG5vdCBleGlzdHMsIGluZmxhdGUgcmV0dXJuIFpfQlVGX0VSUk9SLlxuICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LlxuICAgIC8vXG4gICAgLy8gTk9URS4gRGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkcyBzdWNoXG4gICAgLy8gbG9naWMuXG4gICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3VwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdsdWUgJiBjb252ZXJ0IGhlcmUsIHVudGlsIHdlIHRlYWNoIHBha28gdG8gc2VuZFxuICAgICAgLy8gdXRmOCBhbGxpZ25lZCBzdHJpbmdzIHRvIG9uRGF0YVxuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGlucHV0ID0gcGFrby5kZWZsYXRlKFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgb3V0cHV0O1xuICpcbiAqIHRyeSB7XG4gKiAgIG91dHB1dCA9IHBha28uaW5mbGF0ZShpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnIpXG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgeyB0aHJvdyBpbmZsYXRvci5tc2c7IH1cblxuICByZXR1cm4gaW5mbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7XG5leHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBUWVBFRF9PSyA9ICAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsIi8vIFN0cmluZyBlbmNvZGUvZGVjb2RlIGhlbHBlcnNcbid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbi8vIFF1aWNrIGNoZWNrIGlmIHdlIGNhbiB1c2UgZmFzdCBhcnJheSB0byBiaW4gc3RyaW5nIGNvbnZlcnNpb25cbi8vXG4vLyAtIGFwcGx5KEFycmF5KSBjYW4gZmFpbCBvbiBBbmRyb2lkIDIuMlxuLy8gLSBhcHBseShVaW50OEFycmF5KSBjYW4gZmFpbCBvbiBpT1MgNS4xIFNhZmFyeVxuLy9cbnZhciBTVFJfQVBQTFlfT0sgPSB0cnVlO1xudmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlO1xuXG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsgMCBdKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX09LID0gZmFsc2U7IH1cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfVUlBX09LID0gZmFsc2U7IH1cblxuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyB1dGlscy5CdWY4KDI1Nik7XG5mb3IgKHZhciBxID0gMDsgcSA8IDI1NjsgcSsrKSB7XG4gIF91dGY4bGVuW3FdID0gKHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcylcbmZ1bmN0aW9uIGJ1ZjJiaW5zdHJpbmcoYnVmLCBsZW4pIHtcbiAgLy8gdXNlIGZhbGxiYWNrIGZvciBiaWcgYXJyYXlzIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93XG4gIGlmIChsZW4gPCA2NTUzNykge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIEZ1Y2t1cCAtIHZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgdnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGRvZXNuJ3Qgd29ydGggdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbmEgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykge1xuICAgIGMgPSBuO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICBjID0gKChjICYgMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHQgPSBjcmNUYWJsZSxcbiAgICAgIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICAgIGlmIChzLmd6aGVhZC5leHRyYSAmJiBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmKTtcbiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLndfYml0cyAtIDgpIDw8IDQpKSA8PCA4O1xuICAgICAgdmFyIGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICAgIGlmIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH1cbiAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7XG5cbiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqL1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSAxOyAvLyBhZGxlcjMyKDBMLCBaX05VTEwsIDApO1xuICAgIH1cbiAgfVxuXG4vLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuXG4gICAgICB3aGlsZSAocy5nemluZGV4IDwgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmZmZikpIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMHhmZik7XG4gICAgICAgIHMuZ3ppbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGVcbiAqIHNlcXVlbmNlIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzO1xuICB2YXIgc3RyLCBuO1xuICB2YXIgd3JhcDtcbiAgdmFyIGF2YWlsO1xuICB2YXIgbmV4dDtcbiAgdmFyIGlucHV0O1xuICB2YXIgdG1wRGljdDtcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICB3cmFwID0gcy53cmFwO1xuXG4gIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqL1xuICBpZiAod3JhcCA9PT0gMSkge1xuICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgdG1wRGljdCA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplKTtcbiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBzdHIgPSBzLnN0cnN0YXJ0O1xuICAgIG4gPSBzLmxvb2thaGVhZCAtIChNSU5fTUFUQ0ggLSAxKTtcbiAgICBkbyB7XG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcblxuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgc3RyKys7XG4gICAgfSB3aGlsZSAoLS1uKTtcbiAgICBzLnN0cnN0YXJ0ID0gc3RyO1xuICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTtcbiAgICBmaWxsX3dpbmRvdyhzKTtcbiAgfVxuICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsO1xuICBzLndyYXAgPSB3cmFwO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7XG5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0ID0gZGVmbGF0ZVJlc2V0O1xuZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIEdaaGVhZGVyKCkge1xuICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovXG4gIHRoaXMudGV4dCAgICAgICA9IDA7XG4gIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovXG4gIHRoaXMudGltZSAgICAgICA9IDA7XG4gIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMueGZsYWdzICAgICA9IDA7XG4gIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi9cbiAgdGhpcy5vcyAgICAgICAgID0gMDtcbiAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqL1xuICB0aGlzLmV4dHJhICAgICAgPSBudWxsO1xuICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi9cbiAgdGhpcy5leHRyYV9sZW4gID0gMDsgLy8gQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgaXQgaW4gSlMsXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBmb3IgZmV3IGNvZGUgbW9kaWZpY2F0aW9uc1xuXG4gIC8vXG4gIC8vIFNldHVwIGxpbWl0cyBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnlcbiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1NTM2IGJ5dGVzXG4gIC8vXG5cbiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5leHRyYV9tYXggID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqL1xuICB0aGlzLm5hbWUgICAgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLm5hbWVfbWF4ICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqL1xuICB0aGlzLmNvbW1lbnQgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwO1xuICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqL1xuICB0aGlzLmhjcmMgICAgICAgPSAwO1xuICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMuZG9uZSAgICAgICA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIF9pbjsgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaW5wdXQgKi9cbiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqL1xuICB2YXIgX291dDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGJlZzsgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqL1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgdmFyIGRtYXg7ICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqL1xuLy8jZW5kaWZcbiAgdmFyIHdzaXplOyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB2YXIgd2hhdmU7ICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIC8vIFVzZSBgc193aW5kb3dgIGluc3RlYWQgYHdpbmRvd2AsIGF2b2lkIGNvbmZsaWN0IHdpdGggaW5zdHJ1bWVudGF0aW9uIHRvb2xzXG4gIHZhciBzX3dpbmRvdzsgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5iaXRzICovXG4gIHZhciBsY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmxlbmNvZGUgKi9cbiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi9cbiAgdmFyIGxtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqL1xuICB2YXIgZG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi9cbiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgb3A7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi9cbiAgdmFyIGRpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuXG5cbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcblxuICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqL1xuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIC8vaGVyZSA9IHN0YXRlLmhlcmU7XG4gIF9pbiA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBsYXN0ID0gX2luICsgKHN0cm0uYXZhaWxfaW4gLSA1KTtcbiAgX291dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBiZWcgPSBfb3V0IC0gKHN0YXJ0IC0gc3RybS5hdmFpbF9vdXQpO1xuICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGRtYXggPSBzdGF0ZS5kbWF4O1xuLy8jZW5kaWZcbiAgd3NpemUgPSBzdGF0ZS53c2l6ZTtcbiAgd2hhdmUgPSBzdGF0ZS53aGF2ZTtcbiAgd25leHQgPSBzdGF0ZS53bmV4dDtcbiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqL1xuICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgY29udGludWUgZG9sZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgY2FzZSBIRUFEOlxuICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG5cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqL1xuICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICgoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbiAgICAgIGxlbiA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDg7XG4gICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRkxBR1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4ZTAwMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQudGV4dCA9ICgoaG9sZCA+PiA4KSAmIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRJTUU6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTtcbiAgICAgICAgLy89PT1cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgT1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IEVYTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRVhMRU46XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYVFJBOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBsZW4gPSBzdGF0ZS5oZWFkLmV4dHJhX2xlbiAtIHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW5kIHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBBcnJheShzdGF0ZS5oZWFkLmV4dHJhX2xlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTkFNRTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBIQ1JDOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERJQ1RJRDpcbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElDVDpcbiAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUWVBFOlxuICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRURPOlxuICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgYml0cyAtPSAxO1xuICAgICAgLy8tLS0vL1xuXG4gICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICBiaXRzIC09IDI7XG4gICAgICAvLy0tLS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIFNUT1JFRDpcbiAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgIC8vLS0tLy9cbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPUFlfOlxuICAgICAgc3RhdGUubW9kZSA9IENPUFk7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZOlxuICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgIHV0aWxzLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxcblwiKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVEFCTEU6XG4gICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5ubGVuID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMjU3O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgYml0cyAtPSA0O1xuICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICB9XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgc3RhdGUubGVuYml0cyA9IDc7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPREVMRU5TOlxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTl86XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOOlxuICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgLy8tLS1cblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVORVhUOlxuICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBESVNUOlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVEVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTUFUQ0g6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICB9XG4gICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgIGRvIHtcbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIExJVDpcbiAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGxlZnQtLTtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICBicmVhaztcbiAgICBjYXNlIENIRUNLOlxuICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIC8vIFVzZSAnfCcgaW5zZGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgaWYgKF9vdXQpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICB9XG4gICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5HVEg6XG4gICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS50b3RhbCAmIDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBET05FOlxuICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgQkFEOlxuICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgTUVNOlxuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIGNhc2UgU1lOQzpcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkge1xuICAgICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEUoc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpO1xuICB9XG4gIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUjtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG5cbiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovXG4gIHN0YXRlLmhlYWQgPSBoZWFkO1xuICBoZWFkLmRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgc3RhdGU7XG4gIHZhciBkaWN0aWQ7XG4gIHZhciByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIC8qID09IFpfTlVMTCAqLyB8fCAhc3RybS5zdGF0ZSAvKiA9PSBaX05VTEwgKi8pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovXG4gIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7XG4gICAgZGljdGlkID0gMTsgLyogYWRsZXIzMigwLCBudWxsLCAwKSovXG4gICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gIH1cbiAgc3RhdGUuaGF2ZWRpY3QgPSAxO1xuICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0O1xuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7XG5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kO1xuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjtcbmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIGkrKztcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG52YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cbi8vIEZyb20genV0aWwuaFxuXG52YXIgU1RPUkVEX0JMT0NLID0gMDtcbnZhciBTVEFUSUNfVFJFRVMgPSAxO1xudmFyIERZTl9UUkVFUyAgICA9IDI7XG4vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqL1xuXG52YXIgTUlOX01BVENIICAgID0gMztcbnZhciBNQVhfTUFUQ0ggICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTICAgICAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyAgID0gMjU2O1xuLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqL1xuXG52YXIgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCAgID0gMTc7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfMTFfMTM4ID0gMTg7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xudmFyIGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddO1xuXG52YXIgYmxfb3JkZXIgPVxuICBbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zZGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlICA9IG5ldyBBcnJheSgoTF9DT0RFUyArIDIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIIC0gTUlOX01BVENIICsgMSk7XG56ZXJvKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7XG56ZXJvKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgICAgID0gbmV3IEFycmF5KERfQ09ERVMpO1xuemVybyhiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxudmFyIHN0YXRpY19sX2Rlc2M7XG52YXIgc3RhdGljX2RfZGVzYztcbnZhciBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlclxuICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKVxuICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNVxuICovXG5mdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsIGxlbikge1xuICB2YXIgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC5cbiAqL1xuZnVuY3Rpb24gYmlfZmx1c2gocykge1xuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGhcbiAqIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kXG4gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZVxuICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLlxuICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpc1xuICogICAgIG5vdCBudWxsLlxuICovXG5mdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICAgICAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdLyouRGFkKi8gKiAyICsgMV0vKi5MZW4qLyArIDE7XG4gICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7XG4gICAgICBiaXRzID0gbWF4X2xlbmd0aDtcbiAgICAgIG92ZXJmbG93Kys7XG4gICAgfVxuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0vKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7IHJldHVybjsgfVxuXG4gIC8vIFRyYWNlKChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNlKChzdGRlcnIsXCJjb2RlICVkIGJpdHMgJWQtPiVkXFxuXCIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7XG4gICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpXG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG57XG4gIHZhciBuZXh0X2NvZGUgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0vKi5MZW4qLztcbiAgICBpZiAobGVuID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi9cbiAgICB0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuLCA1KTtcbiAgfVxuXG4gIC8vIE5vdyBkYXRhIHJlYWR5IGFuZCB3ZSBjYW4gaW5pdCBzdGF0aWMgdHJlZXNcbiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2RfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCAgICAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHsgcy5keW5fZHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdLyouRnJlcSovID0gMTtcbiAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDtcbiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gYmlfd2luZHVwKHMpXG57XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG57XG4gIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4vLyAgd2hpbGUgKGxlbi0tKSB7XG4vLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspO1xuLy8gIH1cbiAgdXRpbHMuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovXG4gIHdoaWxlIChqIDw9IHMuaGVhcF9sZW4pIHtcbiAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqL1xuICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJlxuICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBqKys7XG4gICAgfVxuICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovXG4gICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgeyBicmVhazsgfVxuXG4gICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi9cbiAgICBzLmhlYXBba10gPSBzLmhlYXBbal07XG4gICAgayA9IGo7XG5cbiAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovXG4gICAgaiA8PD0gMTtcbiAgfVxuICBzLmhlYXBba10gPSB2O1xufVxuXG5cbi8vIGlubGluZWQgbWFudWFsbHlcbi8vIHZhciBTTUFMTEVTVCA9IDE7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xue1xuICB2YXIgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuICB2YXIgY29kZTsgICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IDE7XG4gICAgcy5kZXB0aFtub2RlXSA9IDA7XG4gICAgcy5vcHRfbGVuLS07XG5cbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXS8qLkxlbiovO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEvKmludCAvMiovKTsgbiA+PSAxOyBuLS0pIHsgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsgfVxuXG4gIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d29cbiAgICogZnJlcXVlbnQgbm9kZXMuXG4gICAqL1xuICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IHMuaGVhcFtzLmhlYXBfbGVuLS1dO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdLyouRGFkKi8gPSB0cmVlW20gKiAyICsgMV0vKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IG5vZGUrKztcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cbiAgdHJlZVsobWF4X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHtcbiAgICBpZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMgLSAyNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0vKi5MZW4qLywgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApKSB7XG4gICAgICByZXR1cm4gWl9CSU5BUlk7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdLyouRnJlcSovICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0vKi5GcmVxKi8gIT09IDAgfHxcbiAgICAgIHMuZHluX2x0cmVlWzEzICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICByZXR1cm4gWl9URVhUO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQ7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWTtcbn1cblxuXG52YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gX3RyX2luaXQocylcbntcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLCBzdGF0aWNfZF9kZXNjKTtcbiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpO1xuXG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovXG4gIGluaXRfYmxvY2socyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgc3RvcmVkIGJsb2NrXG4gKi9cbmZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpY1xuICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLlxuICovXG5mdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7XG4gICAgICBzLnN0cm0uZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTtcbiAgICB9XG5cbiAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcblxuICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZlxuICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuXG4gICAgICovXG5cbiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleFxuICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICAgICAqL1xuICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTtcblxuICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi9cbiAgICBvcHRfbGVuYiA9IChzLm9wdF9sZW4gKyAzICsgNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzO1xuXG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgXCIsXG4gICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbixcbiAgICAvLyAgICAgICAgcy0+bGFzdF9saXQpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdICAgICA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0vKi5GcmVxKi8rKztcbiAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4vLyNpZmRlZiBUUlVOQ0FURV9CTE9DS1xuLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbi8vICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqL1xuLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbi8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuLy9cbi8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbi8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbi8vICAgIH1cbi8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbi8vICAgIC8vICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsXG4vLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuLy8gICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgIH1cbi8vICB9XG4vLyNlbmRpZlxuXG4gIHJldHVybiAocy5sYXN0X2xpdCA9PT0gcy5saXRfYnVmc2l6ZSAtIDEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBsaWdodHdlaWdodCBCdWZmZXIgc2hpbSBmb3IgcGJmIGJyb3dzZXIgYnVpbGRcbi8vIGJhc2VkIG9uIGNvZGUgZnJvbSBnaXRodWIuY29tL2Zlcm9zcy9idWZmZXIgKE1JVC1saWNlbnNlZClcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXI7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG52YXIgQnVmZmVyTWV0aG9kcztcblxuZnVuY3Rpb24gQnVmZmVyKGxlbmd0aCkge1xuICAgIHZhciBhcnI7XG4gICAgaWYgKGxlbmd0aCAmJiBsZW5ndGgubGVuZ3RoKSB7XG4gICAgICAgIGFyciA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCB8fCAwKTtcbiAgICBpZiAoYXJyKSBidWYuc2V0KGFycik7XG5cbiAgICBidWYucmVhZFVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkVUludDMyTEU7XG4gICAgYnVmLndyaXRlVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG4gICAgYnVmLnJlYWRJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRTtcbiAgICBidWYud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEU7XG4gICAgYnVmLnJlYWRGbG9hdExFID0gQnVmZmVyTWV0aG9kcy5yZWFkRmxvYXRMRTtcbiAgICBidWYud3JpdGVGbG9hdExFID0gQnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEU7XG4gICAgYnVmLnJlYWREb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZERvdWJsZUxFO1xuICAgIGJ1Zi53cml0ZURvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy53cml0ZURvdWJsZUxFO1xuICAgIGJ1Zi50b1N0cmluZyA9IEJ1ZmZlck1ldGhvZHMudG9TdHJpbmc7XG4gICAgYnVmLndyaXRlID0gQnVmZmVyTWV0aG9kcy53cml0ZTtcbiAgICBidWYuc2xpY2UgPSBCdWZmZXJNZXRob2RzLnNsaWNlO1xuICAgIGJ1Zi5jb3B5ID0gQnVmZmVyTWV0aG9kcy5jb3B5O1xuXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudmFyIGxhc3RTdHIsIGxhc3RTdHJFbmNvZGVkO1xuXG5CdWZmZXJNZXRob2RzID0ge1xuICAgIHJlYWRVSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG4gICAgfSxcblxuICAgIHdyaXRlVUludDMyTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7XG4gICAgICAgIHRoaXNbcG9zXSA9IHZhbDtcbiAgICAgICAgdGhpc1twb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgICAgICB0aGlzW3BvcyArIDJdID0gKHZhbCA+Pj4gMTYpO1xuICAgICAgICB0aGlzW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xuICAgIH0sXG5cbiAgICByZWFkSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSA8PCAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdExFOiAgZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgcmVhZERvdWJsZUxFOiBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHdyaXRlRmxvYXRMRTogIGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgd3JpdGVEb3VibGVMRTogZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgc3RyID0gJycsXG4gICAgICAgICAgICB0bXAgPSAnJztcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBlbmQgfHwgdGhpcy5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB0aGlzW2ldO1xuICAgICAgICAgICAgaWYgKGNoIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG1wICs9ICclJyArIGNoLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKTtcblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH0sXG5cbiAgICB3cml0ZTogZnVuY3Rpb24oc3RyLCBwb3MpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gc3RyID09PSBsYXN0U3RyID8gbGFzdFN0ckVuY29kZWQgOiBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1twb3MgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH0sXG5cbiAgICBjb3B5OiBmdW5jdGlvbihidWYsIHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZbcG9zICsgaV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgbGFzdFN0ciA9IHN0cjtcbiAgICBsYXN0U3RyRW5jb2RlZCA9IGVuY29kZVN0cmluZyhzdHIpO1xuICAgIHJldHVybiBsYXN0U3RyRW5jb2RlZC5sZW5ndGg7XG59O1xuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbihidWYpIHtcbiAgICByZXR1cm4gISEoYnVmICYmIGJ1Zi5faXNCdWZmZXIpO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHN0cikge1xuICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoLFxuICAgICAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG5cbiAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweERDMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gbGVuZ3RoKSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICBlbHNlIGxlYWQgPSBjO1xuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWFkKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIGJ5dGVzLnB1c2goYyk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkgYnl0ZXMucHVzaChjID4+IDB4NiB8IDB4QzAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDEwMDAwKSBieXRlcy5wdXNoKGMgPj4gMHhDIHwgMHhFMCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBieXRlcy5wdXNoKGMgPj4gMHgxMiB8IDB4RjAsIGMgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBCdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9ICFCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IG5ldyBCdWZmZXIoYnVmIHx8IDApIDogYnVmO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyLFxuICAgIFBPV18yXzYzID0gTWF0aC5wb3coMiwgNjMpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZERvdWJsZUxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYiwgYjAsIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgYjAgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMCA8IDB4ODApIHJldHVybiBiMDsgICAgICAgICAgICAgICAgIGIwID0gYjAgJiAweDdmO1xuICAgICAgICBiMSA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIxIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgPDwgNzsgICAgICAgYjEgPSAoYjEgJiAweDdmKSA8PCA3O1xuICAgICAgICBiMiA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIyIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgfCBiMiA8PCAxNDsgYjIgPSAoYjIgJiAweDdmKSA8PCAxNDtcbiAgICAgICAgYjMgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMyA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgfCBiMyA8PCAyMTtcblxuICAgICAgICB2YWwgPSBiMCB8IGIxIHwgYjIgfCAoYjMgJiAweDdmKSA8PCAyMTtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDA7ICAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4NDAwMDAwMDAwMDA7ICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MjAwMDAwMDAwMDAwMDsgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDAwMDAwMDAwOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwMDAwMDAwMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKTtcblxuICAgICAgICBpZiAodmFsIDwgUE9XXzJfNjMpIHJldHVybiB2YWw7XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zIC0gMjtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3Bvc10gPT09IDB4ZmYpIHBvcy0tO1xuICAgICAgICBpZiAocG9zIDwgc3RhcnRQb3MpIHBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zIC0gc3RhcnRQb3MgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBiID0gfnRoaXMuYnVmW3N0YXJ0UG9zICsgaV0gJiAweDdmO1xuICAgICAgICAgICAgdmFsICs9IGkgPCA0ID8gYiA8PCBpICogNyA6IGIgKiBNYXRoLnBvdygyLCBpICogNyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLXZhbCAtIDE7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLmNvcHkoYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWw7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgzZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMik7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgxZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygzKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweGZmZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAyMSkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICAgICAgd2hpbGUgKHZhbCA+PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKHZhbCAmIDB4ZmYpIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YWwgLz0gMHg4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsIHwgMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyAtIHBvcyA+IDEwKSB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgICB9LFxuXG4gICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICAgIH0sXG5cbiAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGJ5dGVzKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGJ5dGVzKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUoc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0TEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHRoaXMuYnVmW3RoaXMucG9zKytdID0gYnVmZmVyW2ldO1xuICAgIH0sXG5cbiAgICB3cml0ZU1lc3NhZ2U6IGZ1bmN0aW9uKHRhZywgZm4sIG9iaikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhciB2YXJpbnRMZW4gPVxuICAgICAgICAgICAgbGVuIDw9IDB4N2YgPyAxIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDNmZmYgPyAyIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDMgOlxuICAgICAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDQgOiBNYXRoLmNlaWwoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgICAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgICAgIGlmICh2YXJpbnRMZW4gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2ModmFyaW50TGVuIC0gMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHRoaXMuYnVmW2kgKyB2YXJpbnRMZW4gLSAxXSA9IHRoaXMuYnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkVmFyaW50LCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRTVmFyaW50OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRmxvYXQsIGFycik7ICAgIH0sXG4gICAgd3JpdGVQYWNrZWREb3VibGU6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkMzIsIGFycik7IH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDY0OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbmZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG59XG5cblBvaW50LnByb3RvdHlwZSA9IHtcbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpOyB9LFxuXG4gICAgYWRkOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQocCk7ICAgICB9LFxuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyAgICAgfSxcbiAgICBtdWx0OiAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHQoayk7ICAgIH0sXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7ICAgICB9LFxuICAgIHJvdGF0ZTogIGZ1bmN0aW9uKGEpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGEpOyAgfSxcbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcbiAgICBwZXJwOiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpOyB9LFxuICAgIHJvdW5kOiAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpOyB9LFxuXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICBlcXVhbHM6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PT0gcC54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IHAueTtcbiAgICB9LFxuXG4gICAgZGlzdDogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihwKSk7XG4gICAgfSxcblxuICAgIGRpc3RTcXI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdmFyIGR4ID0gcC54IC0gdGhpcy54LFxuICAgICAgICAgICAgZHkgPSBwLnkgLSB0aGlzLnk7XG4gICAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICB9LFxuXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlVG86IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55IC0gYi55LCB0aGlzLnggLSBiLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLy8gRmluZCB0aGUgYW5nbGUgb2YgdGhlIHR3byB2ZWN0b3JzLCBzb2x2aW5nIHRoZSBmb3JtdWxhIGZvciB0aGUgY3Jvc3MgcHJvZHVjdCBhIHggYiA9IHxhfHxifHNpbijOuCkgZm9yIM64LlxuICAgIGFuZ2xlV2l0aFNlcDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMihcbiAgICAgICAgICAgIHRoaXMueCAqIHkgLSB0aGlzLnkgKiB4LFxuICAgICAgICAgICAgdGhpcy54ICogeCArIHRoaXMueSAqIHkpO1xuICAgIH0sXG5cbiAgICBfbWF0TXVsdDogZnVuY3Rpb24obSkge1xuICAgICAgICB2YXIgeCA9IG1bMF0gKiB0aGlzLnggKyBtWzFdICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IG1bMl0gKiB0aGlzLnggKyBtWzNdICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2FkZDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKz0gcC54O1xuICAgICAgICB0aGlzLnkgKz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3N1YjogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLT0gcC54O1xuICAgICAgICB0aGlzLnkgLT0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54ICo9IGs7XG4gICAgICAgIHRoaXMueSAqPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdjogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggLz0gaztcbiAgICAgICAgdGhpcy55IC89IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2Rpdih0aGlzLm1hZygpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9wZXJwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMueDtcbiAgICAgICAgdGhpcy54ID0gLXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlOiBmdW5jdGlvbihhbmdsZSkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IGNvcyAqIHRoaXMueCAtIHNpbiAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBzaW4gKiB0aGlzLnggKyBjb3MgKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm91bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLnJvdW5kKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQodGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuLy8gY29uc3RydWN0cyBQb2ludCBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeVxuUG9pbnQuY29udmVydCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBQb2ludCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IG5leHRUaWNrO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzLm5leHRUaWNrO1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncywgaTtcbiAgc3dpdGNoIChsZW4pIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZm4pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxKTtcbiAgICB9KTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1R3bygpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMik7XG4gICAgfSk7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfSk7XG4gIGRlZmF1bHQ6XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gYSBkdXBsZXggc3RyZWFtIGlzIGp1c3QgYSBzdHJlYW0gdGhhdCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZS5cbi8vIFNpbmNlIEpTIGRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLCB0aGlzIGNsYXNzXG4vLyBwcm90b3R5cGFsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fcmVhZGFibGUnKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xuXG51dGlsLmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG52YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbmZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xufVxuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwcm9jZXNzTmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn0iLCIvLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG4gIH0gY2F0Y2ggKF8pIHt9IGZpbmFsbHkge1xuICAgIGlmICghU3RyZWFtKSBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gIH1cbn0pKCk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHVuZGVmaW5lZDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmluZ0RlY29kZXI7XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB3aGVuIHBpcGluZywgd2Ugb25seSBjYXJlIGFib3V0ICdyZWFkYWJsZScgZXZlbnRzIHRoYXQgaGFwcGVuXG4gIC8vIGFmdGVyIHJlYWQoKWluZyBhbGwgdGhlIGJ5dGVzIGFuZCBub3QgZ2V0dGluZyBhbnkgcHVzaGJhY2suXG4gIHRoaXMucmFuT3V0ID0gZmFsc2U7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2tpcEFkZDtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICBza2lwQWRkID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgY2h1bmsubGVuZ3RoID09PSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gRG9uJ3QgYWRkIHRvIHRoZSBidWZmZXIgaWYgd2UndmUgZGVjb2RlZCB0byBhbiBlbXB0eSBzdHJpbmcgY2h1bmsgYW5kXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gb2JqZWN0IG1vZGVcbiAgICAgIGlmICghc2tpcEFkZCkge1xuICAgICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIG4gPT09IDAgPyAwIDogMTtcblxuICBpZiAobiA9PT0gbnVsbCB8fCBpc05hTihuKSkge1xuICAgIC8vIG9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmJ1ZmZlci5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuXG4gIC8vIGRvbid0IGhhdmUgdGhhdCBtdWNoLiAgcmV0dXJuIG51bGwsIHVubGVzcyB3ZSd2ZSBlbmRlZC5cbiAgaWYgKG4gPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfVxuXG4gIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gIGlmIChkb1JlYWQgJiYgIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKTtcblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYykgcHJvY2Vzc05leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7ZWxzZSBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgZGVidWcoJ2VtaXQgcmVhZGFibGUnKTtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO2Vsc2UgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3NOZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlc1swXSA9PT0gZGVzdCAmJiBzcmMubGlzdGVuZXJDb3VudCgnZGF0YScpID09PSAxICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cbiAgLy8gVGhpcyBpcyBhIGJydXRhbGx5IHVnbHkgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlclxuICAvLyBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLlxuICBpZiAoIWRlc3QuX2V2ZW50cyB8fCAhZGVzdC5fZXZlbnRzLmVycm9yKSBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO2Vsc2UgaWYgKGlzQXJyYXkoZGVzdC5fZXZlbnRzLmVycm9yKSkgZGVzdC5fZXZlbnRzLmVycm9yLnVuc2hpZnQob25lcnJvcik7ZWxzZSBkZXN0Ll9ldmVudHMuZXJyb3IgPSBbb25lcnJvciwgZGVzdC5fZXZlbnRzLmVycm9yXTtcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuOyBfaSsrKSB7XG4gICAgICBkZXN0c1tfaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgfXJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGkgPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGkgPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICAvLyBJZiBsaXN0ZW5pbmcgdG8gZGF0YSwgYW5kIGl0IGhhcyBub3QgZXhwbGljaXRseSBiZWVuIHBhdXNlZCxcbiAgLy8gdGhlbiBjYWxsIHJlc3VtZSB0byBzdGFydCB0aGUgZmxvdyBvZiBkYXRhIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChldiA9PT0gJ2RhdGEnICYmIGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgaWYgKGV2ID09PSAncmVhZGFibGUnICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBwcm9jZXNzTmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcywgc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgY2h1bmsgPSBzdHJlYW0ucmVhZCgpO1xuICAgIH0gd2hpbGUgKG51bGwgIT09IGNodW5rICYmIHN0YXRlLmZsb3dpbmcpO1xuICB9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uIChldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICBpZiAobGVuZ3RoID09PSAwKSByZXQgPSBudWxsO2Vsc2UgaWYgKG9iamVjdE1vZGUpIHJldCA9IGxpc3Quc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IGxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgYXJyYXkuXG4gICAgaWYgKHN0cmluZ01vZGUpIHJldCA9IGxpc3Quam9pbignJyk7ZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldCA9IGxpc3RbMF07ZWxzZSByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCA9ICcnO2Vsc2UgcmV0ID0gbmV3IEJ1ZmZlcihuKTtcblxuICAgICAgdmFyIGMgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGwgJiYgYyA8IG47IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgICAgdmFyIGNweSA9IE1hdGgubWluKG4gLSBjLCBidWYubGVuZ3RoKTtcblxuICAgICAgICBpZiAoc3RyaW5nTW9kZSkgcmV0ICs9IGJ1Zi5zbGljZSgwLCBjcHkpO2Vsc2UgYnVmLmNvcHkocmV0LCBjLCAwLCBjcHkpO1xuXG4gICAgICAgIGlmIChjcHkgPCBidWYubGVuZ3RoKSBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7ZWxzZSBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignZW5kUmVhZGFibGUgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufSIsIi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RhdGUoc3RyZWFtKSB7XG4gIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRoaXMud3JpdGVlbmNvZGluZyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKSBzdHJlYW0ucHVzaChkYXRhKTtcblxuICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUodGhpcyk7XG5cbiAgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyKSB7XG4gICAgICBkb25lKHN0cmVhbSwgZXIpO1xuICAgIH0pO2Vsc2UgZG9uZShzdHJlYW0pO1xuICB9KTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAod3MubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIvLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYXN5bmNXcml0ZSA9ICFwcm9jZXNzLmJyb3dzZXIgJiYgWyd2MC4xMCcsICd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsIDUpKSA+IC0xID8gc2V0SW1tZWRpYXRlIDogcHJvY2Vzc05leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG4gIH0gY2F0Y2ggKF8pIHt9IGZpbmFsbHkge1xuICAgIGlmICghU3RyZWFtKSBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gIH1cbn0pKCk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudXRpbC5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gY3JlYXRlIHRoZSB0d28gb2JqZWN0cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGNvcmtlZCByZXF1ZXN0c1xuICAvLyB0aGV5IGFyZSBub3QgYSBsaW5rZWQgbGlzdCwgYXMgbm8gbmV3IGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGVyZVxuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVHZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLiBOb3QgcmVhZGFibGUuJykpO1xufTtcblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG59XG5cbi8vIElmIHdlIGdldCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBidWZmZXIsIHN0cmluZywgbnVsbCwgb3IgdW5kZWZpbmVkLFxuLy8gYW5kIHdlJ3JlIG5vdCBpbiBvYmplY3RNb2RlLCB0aGVuIHRoYXQncyBhbiBlcnJvci5cbi8vIE90aGVyd2lzZSBzdHJlYW0gY2h1bmtzIGFyZSBhbGwgY29uc2lkZXJlZCB0byBiZSBvZiBsZW5ndGg9MSwgYW5kIHRoZVxuLy8gd2F0ZXJtYXJrcyBkZXRlcm1pbmUgaG93IG1hbnkgb2JqZWN0cyB0byBrZWVwIGluIHRoZSBidWZmZXIsIHJhdGhlciB0aGFuXG4vLyBob3cgbWFueSBieXRlcyBvciBjaGFyYWN0ZXJzLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgdmFyIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwcm9jZXNzTmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmICh2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG5cbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG5ldyBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuICBpZiAoc3luYykgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7ZWxzZSBjYihlcik7XG5cbiAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgIGFzeW5jV3JpdGUoYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG5cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZCkgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbn07XG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmVuZGluZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUud3JpdGluZztcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCkge1xuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuICBpZiAobmVlZCkge1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcHJvY2Vzc05leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcblxuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICB2YXIgZW50cnkgPSBfdGhpcy5lbnRyeTtcbiAgICBfdGhpcy5lbnRyeSA9IG51bGw7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgICAgY2IoZXJyKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBfdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gX3RoaXM7XG4gICAgfVxuICB9O1xufSIsInZhciBTdHJlYW0gPSAoZnVuY3Rpb24gKCl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7IC8vIGhhY2sgdG8gZml4IGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBpc3N1ZSB3aGVuIHVzZWQgd2l0aCBicm93c2VyaWZ5XG4gIH0gY2F0Y2goXyl7fVxufSgpKTtcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbmV4cG9ydHMuU3RyZWFtID0gU3RyZWFtIHx8IGV4cG9ydHM7XG5leHBvcnRzLlJlYWRhYmxlID0gZXhwb3J0cztcbmV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG5leHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG5leHBvcnRzLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG5leHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnZhciBpc0J1ZmZlckVuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmdcbiAgfHwgZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAgICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgIGNhc2UgJ2hleCc6IGNhc2UgJ3V0ZjgnOiBjYXNlICd1dGYtOCc6IGNhc2UgJ2FzY2lpJzogY2FzZSAnYmluYXJ5JzogY2FzZSAnYmFzZTY0JzogY2FzZSAndWNzMic6IGNhc2UgJ3Vjcy0yJzogY2FzZSAndXRmMTZsZSc6IGNhc2UgJ3V0Zi0xNmxlJzogY2FzZSAncmF3JzogcmV0dXJuIHRydWU7XG4gICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgICB9XG5cblxuZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgaWYgKGVuY29kaW5nICYmICFpc0J1ZmZlckVuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgfVxufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuIENFU1UtOCBpcyBoYW5kbGVkIGFzIHBhcnQgb2YgdGhlIFVURi04IGVuY29kaW5nLlxuLy9cbi8vIEBUT0RPIEhhbmRsaW5nIGFsbCBlbmNvZGluZ3MgaW5zaWRlIGEgc2luZ2xlIG9iamVjdCBtYWtlcyBpdCB2ZXJ5IGRpZmZpY3VsdFxuLy8gdG8gcmVhc29uIGFib3V0IHRoaXMgY29kZSwgc28gaXQgc2hvdWxkIGJlIHNwbGl0IHVwIGluIHRoZSBmdXR1cmUuXG4vLyBAVE9ETyBUaGVyZSBzaG91bGQgYmUgYSB1dGY4LXN0cmljdCBlbmNvZGluZyB0aGF0IHJlamVjdHMgaW52YWxpZCBVVEYtOCBjb2RlXG4vLyBwb2ludHMgYXMgdXNlZCBieSBDRVNVLTguXG52YXIgU3RyaW5nRGVjb2RlciA9IGV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSAoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCAnJyk7XG4gIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKTtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICAvLyBDRVNVLTggcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDMtYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIC8vIFVURi0xNiByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMi1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMjtcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIC8vIEJhc2UtNjQgc3RvcmVzIDMgYnl0ZXMgaW4gNCBjaGFycywgYW5kIHBhZHMgdGhlIHJlbWFpbmRlci5cbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHBhc3NUaHJvdWdoV3JpdGU7XG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbm91Z2ggc3BhY2UgdG8gc3RvcmUgYWxsIGJ5dGVzIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4gVVRGLTggbmVlZHMgNFxuICAvLyBieXRlcywgYnV0IENFU1UtOCBtYXkgcmVxdWlyZSB1cCB0byA2ICgzIGJ5dGVzIHBlciBzdXJyb2dhdGUpLlxuICB0aGlzLmNoYXJCdWZmZXIgPSBuZXcgQnVmZmVyKDYpO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhclJlY2VpdmVkID0gMDtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIGV4cGVjdGVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJMZW5ndGggPSAwO1xufTtcblxuXG4vLyB3cml0ZSBkZWNvZGVzIHRoZSBnaXZlbiBidWZmZXIgYW5kIHJldHVybnMgaXQgYXMgSlMgc3RyaW5nIHRoYXQgaXNcbi8vIGd1YXJhbnRlZWQgdG8gbm90IGNvbnRhaW4gYW55IHBhcnRpYWwgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLiBBbnkgcGFydGlhbFxuLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBidWZmZXJlZCB1cCwgYW5kIHdpbGwgYmVcbi8vIHJldHVybmVkIHdoZW4gY2FsbGluZyB3cml0ZSBhZ2FpbiB3aXRoIHRoZSByZW1haW5pbmcgYnl0ZXMuXG4vL1xuLy8gTm90ZTogQ29udmVydGluZyBhIEJ1ZmZlciBjb250YWluaW5nIGFuIG9ycGhhbiBzdXJyb2dhdGUgdG8gYSBTdHJpbmdcbi8vIGN1cnJlbnRseSB3b3JrcywgYnV0IGNvbnZlcnRpbmcgYSBTdHJpbmcgdG8gYSBCdWZmZXIgKHZpYSBgbmV3IEJ1ZmZlcmAsIG9yXG4vLyBCdWZmZXIjd3JpdGUpIHdpbGwgcmVwbGFjZSBpbmNvbXBsZXRlIHN1cnJvZ2F0ZXMgd2l0aCB0aGUgdW5pY29kZVxuLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyLiBTZWUgaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8xMjExNzMwMDkvIC5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIHZhciBjaGFyU3RyID0gJyc7XG4gIC8vIGlmIG91ciBsYXN0IHdyaXRlIGVuZGVkIHdpdGggYW4gaW5jb21wbGV0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyXG4gIHdoaWxlICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgcmVtYWluaW5nIGJ5dGVzIHRoaXMgYnVmZmVyIGhhcyB0byBvZmZlciBmb3IgdGhpcyBjaGFyXG4gICAgdmFyIGF2YWlsYWJsZSA9IChidWZmZXIubGVuZ3RoID49IHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkKSA/XG4gICAgICAgIHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkIDpcbiAgICAgICAgYnVmZmVyLmxlbmd0aDtcblxuICAgIC8vIGFkZCB0aGUgbmV3IGJ5dGVzIHRvIHRoZSBjaGFyIGJ1ZmZlclxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgdGhpcy5jaGFyUmVjZWl2ZWQsIDAsIGF2YWlsYWJsZSk7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gYXZhaWxhYmxlO1xuXG4gICAgaWYgKHRoaXMuY2hhclJlY2VpdmVkIDwgdGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgICAvLyBzdGlsbCBub3QgZW5vdWdoIGNoYXJzIGluIHRoaXMgYnVmZmVyPyB3YWl0IGZvciBtb3JlIC4uLlxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBieXRlcyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlclxuICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShhdmFpbGFibGUsIGJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgdGhhdCB3YXMgc3BsaXRcbiAgICBjaGFyU3RyID0gdGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsIHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gICAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGNoYXJTdHIubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCArPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgICBjaGFyU3RyID0gJyc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSB0aGlzLmNoYXJMZW5ndGggPSAwO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgYnl0ZXMgaW4gdGhpcyBidWZmZXIsIGp1c3QgZW1pdCBvdXIgY2hhclxuICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hhclN0cjtcbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgYW5kIHNldCBjaGFyTGVuZ3RoIC8gY2hhclJlY2VpdmVkXG4gIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKTtcblxuICB2YXIgZW5kID0gYnVmZmVyLmxlbmd0aDtcbiAgaWYgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGJ1ZmZlciB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgYnl0ZXMgd2UgZ290XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQsIGVuZCk7XG4gICAgZW5kIC09IHRoaXMuY2hhclJlY2VpdmVkO1xuICB9XG5cbiAgY2hhclN0ciArPSBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgZW5kKTtcblxuICB2YXIgZW5kID0gY2hhclN0ci5sZW5ndGggLSAxO1xuICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoZW5kKTtcbiAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgIHRoaXMuY2hhckxlbmd0aCArPSBzaXplO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IHNpemU7XG4gICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTtcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIDAsIHNpemUpO1xuICAgIHJldHVybiBjaGFyU3RyLnN1YnN0cmluZygwLCBlbmQpO1xuICB9XG5cbiAgLy8gb3IganVzdCBlbWl0IHRoZSBjaGFyU3RyXG4gIHJldHVybiBjaGFyU3RyO1xufTtcblxuLy8gZGV0ZWN0SW5jb21wbGV0ZUNoYXIgZGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlIFVURi04IGNoYXJhY3RlciBhdFxuLy8gdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gYnVmZmVyLiBJZiBzbywgaXQgc2V0cyB0aGlzLmNoYXJMZW5ndGggdG8gdGhlIGJ5dGVcbi8vIGxlbmd0aCB0aGF0IGNoYXJhY3RlciwgYW5kIHNldHMgdGhpcy5jaGFyUmVjZWl2ZWQgdG8gdGhlIG51bWJlciBvZiBieXRlc1xuLy8gdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGNoYXJhY3Rlci5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmRldGVjdEluY29tcGxldGVDaGFyID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIC8vIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZSBoYXZlIHRvIGNoZWNrIGF0IHRoZSBlbmQgb2YgdGhpcyBidWZmZXJcbiAgdmFyIGkgPSAoYnVmZmVyLmxlbmd0aCA+PSAzKSA/IDMgOiBidWZmZXIubGVuZ3RoO1xuXG4gIC8vIEZpZ3VyZSBvdXQgaWYgb25lIG9mIHRoZSBsYXN0IGkgYnl0ZXMgb2Ygb3VyIGJ1ZmZlciBhbm5vdW5jZXMgYW5cbiAgLy8gaW5jb21wbGV0ZSBjaGFyLlxuICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgIHZhciBjID0gYnVmZmVyW2J1ZmZlci5sZW5ndGggLSBpXTtcblxuICAgIC8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi04I0Rlc2NyaXB0aW9uXG5cbiAgICAvLyAxMTBYWFhYWFxuICAgIGlmIChpID09IDEgJiYgYyA+PiA1ID09IDB4MDYpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDI7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyAxMTEwWFhYWFxuICAgIGlmIChpIDw9IDIgJiYgYyA+PiA0ID09IDB4MEUpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDM7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyAxMTExMFhYWFxuICAgIGlmIChpIDw9IDMgJiYgYyA+PiAzID09IDB4MUUpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBpO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIHZhciByZXMgPSAnJztcbiAgaWYgKGJ1ZmZlciAmJiBidWZmZXIubGVuZ3RoKVxuICAgIHJlcyA9IHRoaXMud3JpdGUoYnVmZmVyKTtcblxuICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQpIHtcbiAgICB2YXIgY3IgPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgICB2YXIgYnVmID0gdGhpcy5jaGFyQnVmZmVyO1xuICAgIHZhciBlbmMgPSB0aGlzLmVuY29kaW5nO1xuICAgIHJlcyArPSBidWYuc2xpY2UoMCwgY3IpLnRvU3RyaW5nKGVuYyk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gcGFzc1Rocm91Z2hXcml0ZShidWZmZXIpIHtcbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMjtcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAyIDogMDtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDM7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMyA6IDA7XG59XG4iLCIvKiFcbiAqIHN0cmlwLWNvbW1lbnRzIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9zdHJpcC1jb21tZW50cz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljJztcblxudmFyIHJlQmxvY2sgPSAnXFxcXC9cXFxcKic7XG52YXIgcmVCbG9ja0lnbm9yZSA9ICdcXFxcL1xcXFwqKD8hXFxcXCo/XFxcXCEpJztcbnZhciByZUJsb2NrRW5kID0gJygufFtcXFxcclxcXFxuXXxcXFxcbikqP1xcXFwqXFxcXC9cXFxcbj9cXFxcbj8nO1xudmFyIHJlTGluZSA9IC8oXnxbXlxcU1xcbl0pKD86XFwvXFwvKShbXFxzXFxTXSs/KSQvZ207XG52YXIgcmVMaW5lSWdub3JlID0gLyhefFteXFxTXFxuXSkoPzpcXC9cXC9bXiFdKShbXFxzXFxTXSs/KSQvZ207XG5cblxuLyoqXG4gKiBTdHJpcCBhbGwgY29tbWVudHNcbiAqXG4gKiB7JT0gZG9jcyhcInN0cmlwXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudHMgb3Igc3RyaW5nIHRvIHN0cmlwLlxuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBvcHRpb25zIGFyZSBwYXNzZWQgdG8gYC5ibG9ja2AsIGFuZCBgLmxpbmVgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBjb21tZW50cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIHN0cmlwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgcmV0dXJuIHN0ciA/IHN0cmlwLmJsb2NrKHN0cmlwLmxpbmUoc3RyLCBvcHRzKSwgb3B0cykgOiAnJztcbn07XG5cblxuLyoqXG4gKiBTdHJpcCBvbmx5IGJsb2NrIGNvbW1lbnRzLCBvcHRpb25hbGx5IGxlYXZpbmcgcHJvdGVjdGVkIGNvbW1lbnRzXG4gKiAoZS5nLiBgLyohYCkgaW50YWN0LlxuICpcbiAqIHslPSBkb2NzKFwiYmxvY2tcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50IG9yIHN0cmluZyB0byBzdHJpcCB0b1xuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBpZiBgc2FmZTp0cnVlYCwgc3RyaXAgb25seSBjb21tZW50cyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGAvKiFgIG9yIGAvKiohYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgYmxvY2sgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnN0cmlwLmJsb2NrID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKHJlQmxvY2sgKyByZUJsb2NrRW5kLCAnZ20nKTtcbiAgaWYob3B0cy5zYWZlKSB7XG4gICAgcmUgPSBuZXcgUmVnRXhwKHJlQmxvY2tJZ25vcmUgKyByZUJsb2NrRW5kLCAnZ20nKTtcbiAgfVxuICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UocmUsICcnKSA6ICcnO1xufTtcblxuXG4vKipcbiAqIFN0cmlwIG9ubHkgbGluZSBjb21tZW50c1xuICpcbiAqIHslPSBkb2NzKFwibGluZVwiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnQgb3Igc3RyaW5nIHRvIHN0cmlwIHRvXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBgb3B0c2AgIGlmIGBzYWZlOnRydWVgLCBzdHJpcCBhbGwgdGhhdCBub3Qgc3RhcnRzIHdpdGggYC8vIWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGxpbmUgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnN0cmlwLmxpbmUgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciByZSA9IHJlTGluZTtcbiAgaWYob3B0cy5zYWZlKSB7XG4gICAgcmUgPSByZUxpbmVJZ25vcmU7XG4gIH1cbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKHJlLCAnJykgOiAnJztcbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdG9wb2pzb24vdG9wb2pzb24tY2xpZW50IFZlcnNpb24gMi4xLjAuIENvcHlyaWdodCAyMDE2IE1pa2UgQm9zdG9jay5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC50b3BvanNvbiA9IGdsb2JhbC50b3BvanNvbiB8fCB7fSkpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxudmFyIHJldmVyc2UgPSBmdW5jdGlvbihhcnJheSwgbikge1xuICB2YXIgdCwgaiA9IGFycmF5Lmxlbmd0aCwgaSA9IGogLSBuO1xuICB3aGlsZSAoaSA8IC0taikgdCA9IGFycmF5W2ldLCBhcnJheVtpKytdID0gYXJyYXlbal0sIGFycmF5W2pdID0gdDtcbn07XG5cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59O1xuXG52YXIgdHJhbnNmb3JtID0gZnVuY3Rpb24odG9wb2xvZ3kpIHtcbiAgaWYgKCh0cmFuc2Zvcm0gPSB0b3BvbG9neS50cmFuc2Zvcm0pID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgdmFyIHRyYW5zZm9ybSxcbiAgICAgIHgwLFxuICAgICAgeTAsXG4gICAgICBreCA9IHRyYW5zZm9ybS5zY2FsZVswXSxcbiAgICAgIGt5ID0gdHJhbnNmb3JtLnNjYWxlWzFdLFxuICAgICAgZHggPSB0cmFuc2Zvcm0udHJhbnNsYXRlWzBdLFxuICAgICAgZHkgPSB0cmFuc2Zvcm0udHJhbnNsYXRlWzFdO1xuICByZXR1cm4gZnVuY3Rpb24ocG9pbnQsIGkpIHtcbiAgICBpZiAoIWkpIHgwID0geTAgPSAwO1xuICAgIHBvaW50WzBdID0gKHgwICs9IHBvaW50WzBdKSAqIGt4ICsgZHg7XG4gICAgcG9pbnRbMV0gPSAoeTAgKz0gcG9pbnRbMV0pICoga3kgKyBkeTtcbiAgICByZXR1cm4gcG9pbnQ7XG4gIH07XG59O1xuXG52YXIgZmVhdHVyZSA9IGZ1bmN0aW9uKHRvcG9sb2d5LCBvKSB7XG4gIHJldHVybiBvLnR5cGUgPT09IFwiR2VvbWV0cnlDb2xsZWN0aW9uXCJcbiAgICAgID8ge3R5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIiwgZmVhdHVyZXM6IG8uZ2VvbWV0cmllcy5tYXAoZnVuY3Rpb24obykgeyByZXR1cm4gZmVhdHVyZSQxKHRvcG9sb2d5LCBvKTsgfSl9XG4gICAgICA6IGZlYXR1cmUkMSh0b3BvbG9neSwgbyk7XG59O1xuXG5mdW5jdGlvbiBmZWF0dXJlJDEodG9wb2xvZ3ksIG8pIHtcbiAgdmFyIGlkID0gby5pZCxcbiAgICAgIGJib3ggPSBvLmJib3gsXG4gICAgICBwcm9wZXJ0aWVzID0gby5wcm9wZXJ0aWVzID09IG51bGwgPyB7fSA6IG8ucHJvcGVydGllcyxcbiAgICAgIGdlb21ldHJ5ID0gb2JqZWN0KHRvcG9sb2d5LCBvKTtcbiAgcmV0dXJuIGlkID09IG51bGwgJiYgYmJveCA9PSBudWxsID8ge3R5cGU6IFwiRmVhdHVyZVwiLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9XG4gICAgICA6IGJib3ggPT0gbnVsbCA/IHt0eXBlOiBcIkZlYXR1cmVcIiwgaWQ6IGlkLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9XG4gICAgICA6IHt0eXBlOiBcIkZlYXR1cmVcIiwgaWQ6IGlkLCBiYm94OiBiYm94LCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9O1xufVxuXG5mdW5jdGlvbiBvYmplY3QodG9wb2xvZ3ksIG8pIHtcbiAgdmFyIHRyYW5zZm9ybVBvaW50ID0gdHJhbnNmb3JtKHRvcG9sb2d5KSxcbiAgICAgIGFyY3MgPSB0b3BvbG9neS5hcmNzO1xuXG4gIGZ1bmN0aW9uIGFyYyhpLCBwb2ludHMpIHtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCkgcG9pbnRzLnBvcCgpO1xuICAgIGZvciAodmFyIGEgPSBhcmNzW2kgPCAwID8gfmkgOiBpXSwgayA9IDAsIG4gPSBhLmxlbmd0aDsgayA8IG47ICsraykge1xuICAgICAgcG9pbnRzLnB1c2godHJhbnNmb3JtUG9pbnQoYVtrXS5zbGljZSgpLCBrKSk7XG4gICAgfVxuICAgIGlmIChpIDwgMCkgcmV2ZXJzZShwb2ludHMsIG4pO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9pbnQocCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm1Qb2ludChwLnNsaWNlKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGluZShhcmNzKSB7XG4gICAgdmFyIHBvaW50cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJjcy5sZW5ndGg7IGkgPCBuOyArK2kpIGFyYyhhcmNzW2ldLCBwb2ludHMpO1xuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMikgcG9pbnRzLnB1c2gocG9pbnRzWzBdLnNsaWNlKCkpO1xuICAgIHJldHVybiBwb2ludHM7XG4gIH1cblxuICBmdW5jdGlvbiByaW5nKGFyY3MpIHtcbiAgICB2YXIgcG9pbnRzID0gbGluZShhcmNzKTtcbiAgICB3aGlsZSAocG9pbnRzLmxlbmd0aCA8IDQpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9seWdvbihhcmNzKSB7XG4gICAgcmV0dXJuIGFyY3MubWFwKHJpbmcpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VvbWV0cnkobykge1xuICAgIHZhciB0eXBlID0gby50eXBlLCBjb29yZGluYXRlcztcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJHZW9tZXRyeUNvbGxlY3Rpb25cIjogcmV0dXJuIHt0eXBlOiB0eXBlLCBnZW9tZXRyaWVzOiBvLmdlb21ldHJpZXMubWFwKGdlb21ldHJ5KX07XG4gICAgICBjYXNlIFwiUG9pbnRcIjogY29vcmRpbmF0ZXMgPSBwb2ludChvLmNvb3JkaW5hdGVzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOiBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKHBvaW50KTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTGluZVN0cmluZ1wiOiBjb29yZGluYXRlcyA9IGxpbmUoby5hcmNzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6IGNvb3JkaW5hdGVzID0gby5hcmNzLm1hcChsaW5lKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiUG9seWdvblwiOiBjb29yZGluYXRlcyA9IHBvbHlnb24oby5hcmNzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6IGNvb3JkaW5hdGVzID0gby5hcmNzLm1hcChwb2x5Z29uKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHt0eXBlOiB0eXBlLCBjb29yZGluYXRlczogY29vcmRpbmF0ZXN9O1xuICB9XG5cbiAgcmV0dXJuIGdlb21ldHJ5KG8pO1xufVxuXG4vLyBleHBvcnQge2RlZmF1bHQgYXMgYmJveH0gZnJvbSBcIi4vc3JjL2Jib3hcIjtcblxuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG1lc2gsIG1lc2hBcmNzfSBmcm9tIFwiLi9zcmMvbWVzaFwiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG1lcmdlLCBtZXJnZUFyY3N9IGZyb20gXCIuL3NyYy9tZXJnZVwiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG5laWdoYm9yc30gZnJvbSBcIi4vc3JjL25laWdoYm9yc1wiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIHF1YW50aXplfSBmcm9tIFwiLi9zcmMvcXVhbnRpemVcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc2Zvcm19IGZyb20gXCIuL3NyYy90cmFuc2Zvcm1cIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyB1bnRyYW5zZm9ybX0gZnJvbSBcIi4vc3JjL3VudHJhbnNmb3JtXCI7XG5cbmV4cG9ydHMuZmVhdHVyZSA9IGZlYXR1cmU7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwibW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVsYXllci5qcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlbGF5ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlKHBiZiwgZW5kKSB7XG4gICAgdGhpcy5sYXllcnMgPSBwYmYucmVhZEZpZWxkcyhyZWFkVGlsZSwge30sIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaWxlKHRhZywgbGF5ZXJzLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIHZhciBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyk7XG4gICAgICAgIGlmIChsYXllci5sZW5ndGgpIGxheWVyc1tsYXllci5uYW1lXSA9IGxheWVyO1xuICAgIH1cbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5faWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAyKSByZWFkVGFnKHBiZiwgZmVhdHVyZSk7XG4gICAgZWxzZSBpZiAodGFnID09IDMpIGZlYXR1cmUudHlwZSA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDQpIGZlYXR1cmUuX2dlb21ldHJ5ID0gcGJmLnBvcztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZyhwYmYsIGZlYXR1cmUpIHtcbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIga2V5ID0gZmVhdHVyZS5fa2V5c1twYmYucmVhZFZhcmludCgpXSxcbiAgICAgICAgICAgIHZhbHVlID0gZmVhdHVyZS5fdmFsdWVzW3BiZi5yZWFkVmFyaW50KCldO1xuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbn1cblxuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMgPSBbJ1Vua25vd24nLCAnUG9pbnQnLCAnTGluZVN0cmluZycsICdQb2x5Z29uJ107XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBsaW5lcyA9IFtdLFxuICAgICAgICBsaW5lO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXG4gICAgICAgICAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lLnB1c2gobmV3IFBvaW50KHgsIHkpKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuICAgICAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uY2xvbmUoKSk7IC8vIGNsb3NlUG9seWdvblxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB4MSA9IEluZmluaXR5LFxuICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgeTEgPSBJbmZpbml0eSxcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIGlmICh4IDwgeDEpIHgxID0geDtcbiAgICAgICAgICAgIGlmICh4ID4geDIpIHgyID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcbiAgICAgICAgICAgIGlmICh5ID4geTIpIHkyID0geTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmV4dGVudCAqIE1hdGgucG93KDIsIHopLFxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcbiAgICAgICAgeTAgPSB0aGlzLmV4dGVudCAqIHksXG4gICAgICAgIGNvb3JkcyA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBjb29yZHNbaV07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHAgPSBsaW5lW2pdLCB5MiA9IDE4MCAtIChwLnkgKyB5MCkgKiAzNjAgLyBzaXplO1xuICAgICAgICAgICAgbGluZVtqXSA9IFtcbiAgICAgICAgICAgICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcbiAgICAgICAgICAgICAgICAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTBcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXVswXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgICAgICB0eXBlID0gJ011bHRpUG9pbnQnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnICYmIGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIocGJmLCBlbmQpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnZlcnNpb24gPSAxO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gW107XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyKHRhZywgbGF5ZXIsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDEpIGxheWVyLm5hbWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgbGF5ZXIuZXh0ZW50ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIuX2tleXMucHVzaChwYmYucmVhZFN0cmluZygpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGxheWVyLl92YWx1ZXMucHVzaChyZWFkVmFsdWVNZXNzYWdlKHBiZikpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVNZXNzYWdlKHBiZikge1xuICAgIHZhciB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBiZi5yZWFkVmFyaW50KCkgPj4gMztcblxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxuICAgICAgICAgICAgdGFnID09PSAyID8gcGJmLnJlYWRGbG9hdCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMyA/IHBiZi5yZWFkRG91YmxlKCkgOlxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNSA/IHBiZi5yZWFkVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA2ID8gcGJmLnJlYWRTVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcblZlY3RvclRpbGVMYXllci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICB0aGlzLl9wYmYucG9zID0gdGhpcy5fZmVhdHVyZXNbaV07XG5cbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JUaWxlRmVhdHVyZSh0aGlzLl9wYmYsIGVuZCwgdGhpcy5leHRlbnQsIHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcyk7XG59O1xuIiwiLy8gR2VvbWV0cnkgYnVpbGRpbmcgZnVuY3Rpb25zXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBjb25zdCB0aWxlX2JvdW5kcyA9IFtcbiAgICB7IHg6IDAsIHk6IDB9LFxuICAgIHsgeDogR2VvLnRpbGVfc2NhbGUsIHk6IC1HZW8udGlsZV9zY2FsZSB9IC8vIFRPRE86IGNvcnJlY3QgZm9yIGZsaXBwZWQgeS1heGlzP1xuXTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRfdXZzID0gWzAsIDAsIDEsIDFdO1xuXG4vLyBUZXN0cyBpZiBhIGxpbmUgc2VnbWVudCAoZnJvbSBwb2ludCBBIHRvIEIpIGlzIG91dHNpZGUgdGhlIHRpbGUgYm91bmRzXG4vLyAod2l0aGluIGEgY2VydGFpbiB0b2xlcmFuY2UgdG8gYWNjb3VudCBmb3IgZ2VvbWV0cnkgbmVhcmx5IG9uIHRpbGUgZWRnZXMpXG5leHBvcnQgZnVuY3Rpb24gb3V0c2lkZVRpbGUgKF9hLCBfYiwgdG9sZXJhbmNlKSB7XG4gICAgbGV0IHRpbGVfbWluID0gdGlsZV9ib3VuZHNbMF07XG4gICAgbGV0IHRpbGVfbWF4ID0gdGlsZV9ib3VuZHNbMV07XG5cbiAgICAvLyBUT0RPOiBmaXggZmxpcHBlZCBZIGNvb3JkcyBoZXJlLCBjb25mdXNpbmcgd2l0aCAnbWF4JyByZWZlcmVuY2VcbiAgICBpZiAoKF9hWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UgJiYgX2JbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UgJiYgX2JbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UgJiYgX2JbMV0gPj0gdGlsZV9taW4ueSAtIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2UgJiYgX2JbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb29yZE91dHNpZGVUaWxlIChjb29yZCwgdG9sZXJhbmNlKSB7XG4gICAgdG9sZXJhbmNlID0gdG9sZXJhbmNlIHx8IDA7XG4gICAgbGV0IHRpbGVfbWluID0gdGlsZV9ib3VuZHNbMF07XG4gICAgbGV0IHRpbGVfbWF4ID0gdGlsZV9ib3VuZHNbMV07XG5cbiAgICByZXR1cm4gY29vcmRbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZTtcbn1cbiIsIi8vIFBvaW50IGJ1aWxkZXJzXG5pbXBvcnQgeyBkZWZhdWx0X3V2cyB9IGZyb20gJy4vY29tbW9uJztcblxuLy8gQnVpbGQgYSBiaWxsYm9hcmQgc3ByaXRlIHF1YWQgY2VudGVyZWQgb24gYSBwb2ludC4gU3ByaXRlcyBhcmUgaW50ZW5kZWQgdG8gYmUgZHJhd24gaW4gc2NyZWVuc3BhY2UsIGFuZCBoYXZlXG4vLyBwcm9wZXJ0aWVzIGZvciB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgYW5kIGEgc2NhbGUgZmFjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgdGhlIHNjcmVlbnNwYWNlIHNpemVcbi8vIG9mIGEgc3ByaXRlIGJldHdlZW4gdHdvIHpvb20gbGV2ZWxzLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUXVhZHNGb3JQb2ludHMgKHBvaW50cywgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7IHRleGNvb3JkX2luZGV4LCBwb3NpdGlvbl9pbmRleCwgc2hhcGVfaW5kZXgsIG9mZnNldF9pbmRleCB9LFxuICAgIHsgcXVhZCwgcXVhZF9ub3JtYWxpemUsIG9mZnNldCwgYW5nbGUsIHNoYXBlX3csIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSkge1xuICAgIHF1YWRfbm9ybWFsaXplID0gcXVhZF9ub3JtYWxpemUgfHwgMTtcbiAgICBsZXQgdzIgPSBxdWFkWzBdIC8gMiAqIHF1YWRfbm9ybWFsaXplO1xuICAgIGxldCBoMiA9IHF1YWRbMV0gLyAyICogcXVhZF9ub3JtYWxpemU7XG4gICAgbGV0IHNjYWxpbmcgPSBbXG4gICAgICAgIFstdzIsIC1oMl0sXG4gICAgICAgIFt3MiwgLWgyXSxcbiAgICAgICAgW3cyLCBoMl0sXG4gICAgICAgIFstdzIsIGgyXVxuICAgIF07XG5cbiAgICBsZXQgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIGxldCBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIGxldCB0ZXhjb29yZHM7XG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuXG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgICAgIHRleGNvb3JkcyA9IFtcbiAgICAgICAgICAgIFttaW5fdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1heF92XSxcbiAgICAgICAgICAgIFttaW5fdSwgbWF4X3ZdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgbGV0IG51bV9wb2ludHMgPSBwb2ludHMubGVuZ3RoO1xuICAgIGZvciAobGV0IHA9MDsgcCA8IG51bV9wb2ludHM7IHArKykge1xuICAgICAgICBsZXQgcG9pbnQgPSBwb2ludHNbcF07XG5cbiAgICAgICAgZm9yIChsZXQgcG9zPTA7IHBvcyA8IDQ7IHBvcysrKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGV4Y29vcmRzXG4gICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleGNvb3Jkc1twb3NdWzBdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gdGV4Y29vcmRzW3Bvc11bMV0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtwb3NpdGlvbl9pbmRleCArIDBdID0gcG9pbnRbMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbcG9zaXRpb25faW5kZXggKyAxXSA9IHBvaW50WzFdO1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAwXSA9IHNjYWxpbmdbcG9zXVswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDFdID0gc2NhbGluZ1twb3NdWzFdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMl0gPSBhbmdsZTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDNdID0gc2hhcGVfdztcblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW29mZnNldF9pbmRleCArIDBdID0gb2Zmc2V0WzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW29mZnNldF9pbmRleCArIDFdID0gb2Zmc2V0WzFdO1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMyk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgZWxlbWVudF9vZmZzZXQgKz0gNDtcbiAgICB9XG59XG4iLCIvLyBQb2x5Z29uIGJ1aWxkZXJzXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgeyBkZWZhdWx0X3V2cywgb3V0c2lkZVRpbGUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmltcG9ydCBlYXJjdXQgZnJvbSAnZWFyY3V0JztcblxuY29uc3QgdXBfdmVjMyA9IFswLCAwLCAxXTtcblxuLy8gVGVzc2VsYXRlIGEgZmxhdCAyRCBwb2x5Z29uXG4vLyB4ICYgeSBjb29yZGluYXRlcyB3aWxsIGJlIHNldCBhcyBmaXJzdCB0d28gZWxlbWVudHMgb2YgcHJvdmlkZWQgdmVydGV4X3RlbXBsYXRlXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2x5Z29ucyAoXG4gICAgcG9seWdvbnMsXG4gICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7IHRleGNvb3JkX2luZGV4LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pIHtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgfVxuXG4gICAgdmFyIG51bV9wb2x5Z29ucyA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBwPTA7IHAgPCBudW1fcG9seWdvbnM7IHArKykge1xuICAgICAgICB2YXIgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICAgICAgdmFyIHBvbHlnb24gPSBwb2x5Z29uc1twXTtcblxuICAgICAgICAvLyBGaW5kIHBvbHlnb24gZXh0ZW50cyB0byBjYWxjdWxhdGUgVVZzLCBmaXQgdGhlbSB0byB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveFxuICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBbbWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3ldID0gR2VvLmZpbmRCb3VuZGluZ0JveChwb2x5Z29uKTtcbiAgICAgICAgICAgIHZhciBzcGFuX3ggPSBtYXhfeCAtIG1pbl94O1xuICAgICAgICAgICAgdmFyIHNwYW5feSA9IG1heF95IC0gbWluX3k7XG4gICAgICAgICAgICB2YXIgc2NhbGVfdSA9IChtYXhfdSAtIG1pbl91KSAvIHNwYW5feDtcbiAgICAgICAgICAgIHZhciBzY2FsZV92ID0gKG1heF92IC0gbWluX3YpIC8gc3Bhbl95O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcmluZ19pbmRleCA9IDA7IHJpbmdfaW5kZXggPCBwb2x5Z29uLmxlbmd0aDsgcmluZ19pbmRleCsrKXtcbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggZGF0YVxuICAgICAgICAgICAgdmFyIHBvbHlnb25fcmluZyA9IHBvbHlnb25bcmluZ19pbmRleF07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25fcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSBwb2x5Z29uX3JpbmdbaV07XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzBdID0gdmVydGV4WzBdO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHZlcnRleFsxXTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBVVnNcbiAgICAgICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSAoKHZlcnRleFswXSAtIG1pbl94KSAqIHNjYWxlX3UgKyBtaW5fdSkgKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gKCh2ZXJ0ZXhbMV0gLSBtaW5feSkgKiBzY2FsZV92ICsgbWluX3YpICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRyaWFuZ3VsYXRlUG9seWdvbihlYXJjdXQuZmxhdHRlbihwb2x5Z29uKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIGluZGljZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUZXNzZWxhdGUgYW5kIGV4dHJ1ZGUgYSBmbGF0IDJEIHBvbHlnb24gaW50byBhIHNpbXBsZSAzRCBtb2RlbCB3aXRoIGZpeGVkIGhlaWdodCBhbmQgYWRkIHRvIEdMIHZlcnRleCBidWZmZXJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4dHJ1ZGVkUG9seWdvbnMgKFxuICAgIHBvbHlnb25zLFxuICAgIHosIGhlaWdodCwgbWluX2hlaWdodCxcbiAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIG5vcm1hbF9pbmRleCxcbiAgICBub3JtYWxfbm9ybWFsaXplLFxuICAgIHtcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplLFxuICAgICAgICB3aW5kaW5nXG4gICAgfSkge1xuXG4gICAgLy8gVG9wXG4gICAgdmFyIG1pbl96ID0geiArIChtaW5faGVpZ2h0IHx8IDApO1xuICAgIHZhciBtYXhfeiA9IHogKyBoZWlnaHQ7XG4gICAgdmVydGV4X3RlbXBsYXRlWzJdID0gbWF4X3o7XG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSwgeyB0ZXhjb29yZF9pbmRleCwgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KTtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgdmFyIGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgLy8gV2FsbHNcbiAgICAvLyBGaXQgVVZzIHRvIHdhbGwgcXVhZFxuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcbiAgICAgICAgdmFyIFttaW5fdSwgbWluX3YsIG1heF91LCBtYXhfdl0gPSB0ZXhjb29yZF9zY2FsZSB8fCBkZWZhdWx0X3V2cztcbiAgICAgICAgdmFyIHRleGNvb3JkcyA9IFtcbiAgICAgICAgICAgIFttaW5fdSwgbWF4X3ZdLFxuICAgICAgICAgICAgW21pbl91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWF4X3ZdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgdmFyIG51bV9wb2x5Z29ucyA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBwPTA7IHAgPCBudW1fcG9seWdvbnM7IHArKykge1xuICAgICAgICB2YXIgcG9seWdvbiA9IHBvbHlnb25zW3BdO1xuXG4gICAgICAgIGZvciAodmFyIHE9MDsgcSA8IHBvbHlnb24ubGVuZ3RoOyBxKyspIHtcbiAgICAgICAgICAgIHZhciBjb250b3VyID0gcG9seWdvbltxXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgdz0wOyB3IDwgY29udG91ci5sZW5ndGggLSAxOyB3KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29udG91clt3XSwgY29udG91clt3KzFdLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZG9uJ3QgZXh0cnVkZSB0aWxlIGVkZ2VzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gV2FsbCBvcmRlciBpcyBkZXBlbmRlbnQgb24gd2luZGluZyBvcmRlciwgc28gdGhhdCBub3JtYWxzIGZhY2Ugb3V0d2FyZFxuICAgICAgICAgICAgICAgIGxldCB3MCwgdzE7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRpbmcgPT09ICdDQ1cnKSB7XG4gICAgICAgICAgICAgICAgICAgIHcwID0gdztcbiAgICAgICAgICAgICAgICAgICAgdzEgPSB3KzE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3MCA9IHcrMTtcbiAgICAgICAgICAgICAgICAgICAgdzEgPSB3O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFR3byB0cmlhbmdsZXMgZm9yIHRoZSBxdWFkIGZvcm1lZCBieSBlYWNoIHZlcnRleCBwYWlyLCBnb2luZyBmcm9tIGJvdHRvbSB0byB0b3AgaGVpZ2h0XG4gICAgICAgICAgICAgICAgdmFyIHdhbGxfdmVydGljZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cxXVswXSwgY29udG91clt3MV1bMV0sIG1heF96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzFdWzBdLCBjb250b3VyW3cxXVsxXSwgbWluX3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzBdWzFdLCBtaW5fel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cwXVswXSwgY29udG91clt3MF1bMV0sIG1heF96XVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjIHRoZSBub3JtYWwgb2YgdGhlIHdhbGwgZnJvbSB1cCB2ZWN0b3IgYW5kIG9uZSBzZWdtZW50IG9mIHRoZSB3YWxsIHRyaWFuZ2xlc1xuICAgICAgICAgICAgICAgIGxldCB3YWxsX3ZlYyA9IFZlY3Rvci5ub3JtYWxpemUoW2NvbnRvdXJbdzFdWzBdIC0gY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzFdWzFdIC0gY29udG91clt3MF1bMV0sIDBdKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsID0gVmVjdG9yLmNyb3NzKHVwX3ZlYzMsIHdhbGxfdmVjKTtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB2ZXJ0ZXggdGVtcGxhdGUgd2l0aCBjdXJyZW50IHN1cmZhY2Ugbm9ybWFsXG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDBdID0gbm9ybWFsWzBdICogbm9ybWFsX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMV0gPSBub3JtYWxbMV0gKiBub3JtYWxfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAyXSA9IG5vcm1hbFsyXSAqIG5vcm1hbF9ub3JtYWxpemU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciB3dj0wOyB3diA8IHdhbGxfdmVydGljZXMubGVuZ3RoOyB3disrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHdhbGxfdmVydGljZXNbd3ZdWzBdO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB3YWxsX3ZlcnRpY2VzW3d2XVsxXTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzJdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMl07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleGNvb3Jkc1t3dl1bMF0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleGNvb3Jkc1t3dl1bMV0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMyk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnRfb2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFRyaWFuZ3VsYXRpb24gdXNpbmcgZWFyY3V0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2VhcmN1dFxuZXhwb3J0IGZ1bmN0aW9uIHRyaWFuZ3VsYXRlUG9seWdvbiAoZGF0YSkge1xuICAgIHJldHVybiBlYXJjdXQoZGF0YS52ZXJ0aWNlcywgZGF0YS5ob2xlcywgZGF0YS5kaW1lbnNpb25zKTtcbn1cbiIsIi8vIEdlb21ldHJ5IGJ1aWxkaW5nIGZ1bmN0aW9uc1xuXG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQge291dHNpZGVUaWxlLCBpc0Nvb3JkT3V0c2lkZVRpbGV9IGZyb20gJy4vY29tbW9uJztcblxuY29uc3QgemVyb192ZWMyID0gWzAsIDBdO1xuXG4vLyBCdWlsZCB0ZXNzZWxsYXRlZCB0cmlhbmdsZXMgZm9yIGEgcG9seWxpbmVcbmNvbnN0IENBUF9UWVBFID0ge1xuICAgIGJ1dHQ6IDAsXG4gICAgc3F1YXJlOiAxLFxuICAgIHJvdW5kOiAyXG59O1xuXG5jb25zdCBKT0lOX1RZUEUgPSB7XG4gICAgbWl0ZXI6IDAsXG4gICAgYmV2ZWw6IDEsXG4gICAgcm91bmQ6IDJcbn07XG5cbmNvbnN0IERFRkFVTFQgPSB7XG4gICAgTUlURVJfTElNSVQ6IDMsXG4gICAgVEVYQ09PUkRfTk9STUFMSVpFOiAxLFxuICAgIFRFWENPT1JEX1JBVElPOiAxLFxuICAgIE1JTl9GQU5fV0lEVEg6IDUgICAgICAgIC8vIFdpZHRoIG9mIGxpbmUgaW4gdGlsZSB1bml0cyB0byBwbGFjZSAxIHRyaWFuZ2xlIHBlciBmYW5cbn07XG5cbi8vIFNjYWxpbmcgZmFjdG9yIHRvIGFkZCBwcmVjaXNpb24gdG8gbGluZSB0ZXh0dXJlIFYgY29vcmRpbmF0ZSBwYWNrZWQgYXMgbm9ybWFsaXplZCBzaG9ydFxuY29uc3Qgdl9zY2FsZV9hZGp1c3QgPSBHZW8udGlsZV9zY2FsZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9seWxpbmVzIChsaW5lcywgd2lkdGgsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAge1xuICAgICAgICBjbG9zZWRfcG9seWdvbixcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfd2lkdGgsXG4gICAgICAgIHRleGNvb3JkX3JhdGlvLFxuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUsXG4gICAgICAgIHNjYWxpbmdfaW5kZXgsXG4gICAgICAgIHNjYWxpbmdfbm9ybWFsaXplLFxuICAgICAgICBqb2luLCBjYXAsXG4gICAgICAgIG1pdGVyX2xpbWl0XG4gICAgfSkge1xuXG4gICAgdmFyIGNhcF90eXBlID0gY2FwID8gQ0FQX1RZUEVbY2FwXSA6IENBUF9UWVBFLmJ1dHQ7XG4gICAgdmFyIGpvaW5fdHlwZSA9IGpvaW4gPyBKT0lOX1RZUEVbam9pbl0gOiBKT0lOX1RZUEUubWl0ZXI7XG5cbiAgICAvLyBDb25maWd1cmUgbWl0ZXIgbGltaXRcbiAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgbWl0ZXJfbGltaXQgPSBtaXRlcl9saW1pdCB8fCBERUZBVUxULk1JVEVSX0xJTUlUOyAvLyBkZWZhdWx0IG1pdGVyIGxpbWl0XG4gICAgICAgIHZhciBtaXRlcl9sZW5fc3EgPSBtaXRlcl9saW1pdCAqIG1pdGVyX2xpbWl0O1xuICAgIH1cblxuICAgIC8vIFRleHR1cmUgVmFyaWFibGVzXG4gICAgdmFyIHZfc2NhbGU7XG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCBERUZBVUxULlRFWENPT1JEX05PUk1BTElaRTtcbiAgICAgICAgdGV4Y29vcmRfcmF0aW8gPSB0ZXhjb29yZF9yYXRpbyB8fCBERUZBVUxULlRFWENPT1JEX1JBVElPO1xuICAgICAgICB2X3NjYWxlID0gMSAvICh0ZXhjb29yZF93aWR0aCAqIHRleGNvb3JkX3JhdGlvICogdl9zY2FsZV9hZGp1c3QpOyAvLyBzY2FsZXMgbGluZSB0ZXh0dXJlIGFzIGEgcmF0aW8gb2YgdGhlIGxpbmUncyB3aWR0aFxuICAgIH1cblxuICAgIC8vIFZhbHVlcyB0aGF0IGFyZSBjb25zdGFudCBmb3IgZWFjaCBsaW5lIGFuZCBhcmUgcGFzc2VkIHRvIGhlbHBlciBmdW5jdGlvbnNcbiAgICB2YXIgY29udGV4dCA9IHtcbiAgICAgICAgY2xvc2VkX3BvbHlnb24sXG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICBtaXRlcl9sZW5fc3EsXG4gICAgICAgIGpvaW5fdHlwZSxcbiAgICAgICAgY2FwX3R5cGUsXG4gICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgIGhhbGZfd2lkdGg6IHdpZHRoIC8gMixcbiAgICAgICAgc2NhbGluZ19pbmRleCxcbiAgICAgICAgc2NhbGluZ19ub3JtYWxpemUsXG4gICAgICAgIHZfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF93aWR0aCxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplXG4gICAgfTtcblxuICAgIC8vIEJ1ZmZlciBmb3IgZXh0cmEgbGluZXMgdG8gcHJvY2Vzc1xuICAgIHZhciBleHRyYV9saW5lcyA9IFtdO1xuXG4gICAgLy8gUHJvY2VzcyBsaW5lc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgYnVpbGRQb2x5bGluZShsaW5lc1tpbmRleF0sIGNvbnRleHQsIGV4dHJhX2xpbmVzKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGV4dHJhIGxpbmVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4dHJhX2xpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBidWlsZFBvbHlsaW5lKGV4dHJhX2xpbmVzW2luZGV4XSwgY29udGV4dCwgZXh0cmFfbGluZXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQb2x5bGluZShsaW5lLCBjb250ZXh0LCBleHRyYV9saW5lcyl7XG4gICAgLy8gU2tpcCBpZiBsaW5lIGlzIG5vdCB2YWxpZFxuICAgIGlmIChsaW5lLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB7am9pbl90eXBlLCBjYXBfdHlwZSwgY2xvc2VkX3BvbHlnb24sIHJlbW92ZV90aWxlX2VkZ2VzLCB0aWxlX2VkZ2VfdG9sZXJhbmNlLCB2X3NjYWxlLCBtaXRlcl9sZW5fc3F9ID0gY29udGV4dDtcblxuICAgIC8vIExvb3AgYmFja3dhcmRzIHRocm91Z2ggbGluZSB0byBhIHRpbGUgYm91bmRhcnkgaWYgZm91bmRcbiAgICBpZiAoY2xvc2VkX3BvbHlnb24gJiYgam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgdmFyIGJvdW5kYXJ5SW5kZXggPSBnZXRUaWxlQm91bmRhcnlJbmRleChsaW5lKTtcbiAgICAgICAgaWYgKGJvdW5kYXJ5SW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgbGluZSB0aGF0IGlzIGEgY3ljbGljIHBlcm11dGF0aW9uIG9mIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgdmFyIHBlcm11dGVkTGluZSA9IHBlcm11dGVMaW5lKGxpbmUsIGJvdW5kYXJ5SW5kZXgpO1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChwZXJtdXRlZExpbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvb3JkQ3VyciwgY29vcmROZXh0LCBub3JtUHJldiwgbm9ybU5leHQ7XG4gICAgdmFyIHYgPSAwOyAvLyBUZXh0dXJlIHYtY29vcmRpbmF0ZVxuXG4gICAgdmFyIGluZGV4X3N0YXJ0ID0gMDtcbiAgICB2YXIgaW5kZXhfZW5kID0gbGluZS5sZW5ndGggLSAxO1xuICAgIHZhciBpZ25vcmVkX2luZGljZXNfY291bnQgPSAwO1xuXG4gICAgLy8gRklSU1QgUE9JTlRcbiAgICAvLyBsb29wIHRocm91Z2ggYmVnaW5uaW5nIHBvaW50cyBpZiBkdXBsaWNhdGVzXG4gICAgY29vcmRDdXJyID0gbGluZVtpbmRleF9zdGFydF07XG4gICAgY29vcmROZXh0ID0gbGluZVtpbmRleF9zdGFydCArIDFdO1xuICAgIHdoaWxlIChWZWN0b3IuaXNFcXVhbChjb29yZEN1cnIsIGNvb3JkTmV4dCkpIHtcbiAgICAgICAgaW5kZXhfc3RhcnQrKztcbiAgICAgICAgY29vcmRDdXJyID0gY29vcmROZXh0O1xuICAgICAgICBjb29yZE5leHQgPSBsaW5lW2luZGV4X3N0YXJ0ICsgMV07XG4gICAgICAgIGlnbm9yZWRfaW5kaWNlc19jb3VudCsrO1xuICAgICAgICBpZiAoaW5kZXhfc3RhcnQgPT09IGxpbmUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGVuZGluZyBwb2ludHMgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXNcbiAgICB3aGlsZSAoVmVjdG9yLmlzRXF1YWwobGluZVtpbmRleF9lbmRdLCBsaW5lW2luZGV4X2VuZCAtIDFdKSkge1xuICAgICAgICBpbmRleF9lbmQtLTtcbiAgICAgICAgaWdub3JlZF9pbmRpY2VzX2NvdW50Kys7XG4gICAgICAgIGlmIChpbmRleF9lbmQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCA8IDIgKyBpZ25vcmVkX2luZGljZXNfY291bnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGNvb3JkTmV4dCkpO1xuXG4gICAgLy8gU2tpcCB0aWxlIGJvdW5kYXJ5IGxpbmVzIGFuZCBhcHBlbmQgYSBuZXcgbGluZSBpZiBuZWVkZWRcbiAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29vcmRDdXJyLCBjb29yZE5leHQsIHRpbGVfZWRnZV90b2xlcmFuY2UpKSB7XG4gICAgICAgIHZhciBub25Cb3VuZGFyeVNlZ21lbnQgPSBnZXROZXh0Tm9uQm91bmRhcnlTZWdtZW50KGxpbmUsIGluZGV4X3N0YXJ0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKTtcbiAgICAgICAgaWYgKG5vbkJvdW5kYXJ5U2VnbWVudCkge1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChub25Cb3VuZGFyeVNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VkX3BvbHlnb24pe1xuICAgICAgICAvLyBCZWdpbiB0aGUgcG9seWdvbiB3aXRoIGEgam9pbiAoY29ubmVjdGluZyB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMpXG4gICAgICAgIG5vcm1QcmV2ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChsaW5lW2luZGV4X2VuZCAtIDFdLCBjb29yZEN1cnIpKTtcbiAgICAgICAgc3RhcnRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgbGluZSBiZWdpbnMgYXQgZWRnZSwgZG9uJ3QgYWRkIGEgY2FwXG4gICAgICAgIGlmICghaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIGFkZENhcChjb29yZEN1cnIsIHYsIG5vcm1OZXh0LCBjYXBfdHlwZSwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoY2FwX3R5cGUgIT09IENBUF9UWVBFLmJ1dHQpIHtcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIHZfc2NhbGUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGZpcnN0IHBhaXIgb2YgcG9pbnRzIGZvciB0aGUgbGluZSBzdHJpcFxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gSU5URVJNRURJQVJZIFBPSU5UU1xuICAgIHYgKz0gdl9zY2FsZSAqIFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1Yihjb29yZE5leHQsIGNvb3JkQ3VycikpO1xuICAgIGZvciAodmFyIGkgPSBpbmRleF9zdGFydCArIDE7IGkgPCBpbmRleF9lbmQ7IGkrKykge1xuICAgICAgICB2YXIgY3VyckluZGV4ID0gaTtcbiAgICAgICAgdmFyIG5leHRJbmRleCA9IGkgKyAxO1xuICAgICAgICBjb29yZEN1cnIgPSBsaW5lW2N1cnJJbmRleF07XG4gICAgICAgIGNvb3JkTmV4dCA9IGxpbmVbbmV4dEluZGV4XTtcblxuICAgICAgICAvLyBTa2lwIHJlZHVuZGFudCB2ZXJ0aWNlc1xuICAgICAgICBpZiAoVmVjdG9yLmlzRXF1YWwoY29vcmRDdXJyLCBjb29yZE5leHQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlIGJvdW5kYXJpZXNcbiAgICAgICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvb3JkQ3VyciwgY29vcmROZXh0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIHZhciBub25Cb3VuZGFyeUxpbmVzID0gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudChsaW5lLCBjdXJySW5kZXggKyAxLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKTtcbiAgICAgICAgICAgIGlmIChub25Cb3VuZGFyeUxpbmVzKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChub25Cb3VuZGFyeUxpbmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1QcmV2ID0gbm9ybU5leHQ7XG4gICAgICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGNvb3JkTmV4dCkpO1xuXG4gICAgICAgIC8vIEFkZCBqb2luXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkTWl0ZXIodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIG1pdGVyX2xlbl9zcSwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkSm9pbihqb2luX3R5cGUsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICB2ICs9IHZfc2NhbGUgKiBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoY29vcmROZXh0LCBjb29yZEN1cnIpKTtcbiAgICB9XG5cbiAgICAvLyBMQVNUIFBPSU5UXG4gICAgY29vcmRDdXJyID0gY29vcmROZXh0O1xuICAgIG5vcm1QcmV2ID0gbm9ybU5leHQ7XG5cbiAgICBpZiAoY2xvc2VkX3BvbHlnb24pIHtcbiAgICAgICAgLy8gQ2xvc2UgdGhlIHBvbHlnb24gd2l0aCBhIG1pdGVyIGpvaW50IG9yIGJ1dHQgY2FwIGlmIG9uIGEgdGlsZSBib3VuZGFyeVxuICAgICAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBsaW5lWzFdKSk7XG4gICAgICAgIGVuZFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgdiwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBGaW5pc2ggdGhlIGxpbmUgc3RyaXBcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIElmIGxpbmUgZW5kcyBhdCBlZGdlLCBkb24ndCBhZGQgYSBjYXBcbiAgICAgICAgaWYgKCFpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgYWRkQ2FwKGNvb3JkQ3Vyciwgdiwgbm9ybVByZXYsIGNhcF90eXBlLCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVCb3VuZGFyeUluZGV4KGxpbmUpe1xuICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUobGluZVswXSkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgYmFja0luZGV4ID0gMDsgYmFja0luZGV4IDwgbGluZS5sZW5ndGg7IGJhY2tJbmRleCsrKSB7XG4gICAgICAgIHZhciBjb29yZEN1cnIgPSBsaW5lW2xpbmUubGVuZ3RoIC0gMSAtIGJhY2tJbmRleF07XG4gICAgICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoIC0gMSAtIGJhY2tJbmRleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xufVxuXG4vLyBJdGVyYXRlIHRocm91Z2ggbGluZSBmcm9tIHN0YXJ0SW5kZXggdG8gZmluZCBhIHNlZ21lbnQgbm90IG9uIGEgdGlsZSBib3VuZGFyeSwgaWYgYW55LlxuZnVuY3Rpb24gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudCAobGluZSwgc3RhcnRJbmRleCwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGVuZEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICB3aGlsZSAobGluZVtlbmRJbmRleCArIDFdICYmIG91dHNpZGVUaWxlKGxpbmVbZW5kSW5kZXhdLCBsaW5lW2VuZEluZGV4ICsgMV0sIHRvbGVyYW5jZSkpIHtcbiAgICAgICAgZW5kSW5kZXgrKztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIGxpbmUgc2VnbWVudCByZW1haW5pbmcgdGhhdCBpcyB3aXRoaW4gdGhlIHRpbGUsIHB1c2ggaXQgdG8gdGhlIGxpbmVzIGFycmF5XG4gICAgcmV0dXJuIChsaW5lLmxlbmd0aCAtIGVuZEluZGV4ID49IDIpID8gbGluZS5zbGljZShlbmRJbmRleCkgOiBmYWxzZTtcbn1cblxuLy8gQmVnaW4gYSBwb2x5Z29uIHdpdGggYSBqb2luIGNvbm5lY3RpbmcgdG8gdGhlIGxhc3Qgc2VnbWVudCAoaWYgdmFsaWQgam9pbi10eXBlIHNwZWNpZmllZClcbmZ1bmN0aW9uIHN0YXJ0UG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCBjb250ZXh0KXtcbiAgICAvLyBJZiBwb2x5Z29uIHN0YXJ0cyBvbiBhIHRpbGUgYm91bmRhcnksIGRvbid0IGFkZCBhIGpvaW5cbiAgICBpZiAoam9pbl90eXBlID09PSB1bmRlZmluZWQgfHwgaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCAwXSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgMF0sIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgcG9seWdvbiBzdGFydHMgd2l0aGluIGEgdGlsZSwgYWRkIGEgam9pblxuICAgICAgICB2YXIgdiA9IDA7XG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkTWl0ZXIodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGNvbnRleHQubWl0ZXJfbGVuX3NxLCB0cnVlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEVuZCBhIHBvbHlnb24gYXBwcm9wcmlhdGVseVxuZnVuY3Rpb24gZW5kUG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCB2LCBjb250ZXh0KSB7XG4gICAgLy8gSWYgcG9seWdvbiBlbmRzIG9uIGEgdGlsZSBib3VuZGFyeSwgZG9uJ3QgYWRkIGEgam9pblxuICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJZiBwb2x5Z29uIGVuZHMgd2l0aGluIGEgdGlsZSwgYWRkIE1pdGVyIG9yIG5vIGpvaW50IChqb2luIGFkZGVkIG9uIHN0YXJ0UG9seWdvbilcbiAgICAgICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIgJiYgVmVjdG9yLmxlbmd0aFNxKG1pdGVyVmVjKSA+IGNvbnRleHQubWl0ZXJfbGVuX3NxKSB7XG4gICAgICAgICAgICBqb2luX3R5cGUgPSBKT0lOX1RZUEUuYmV2ZWw7IC8vIHN3aXRjaCB0byBiZXZlbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5hZGQobm9ybVByZXYsIG5vcm1OZXh0KSk7XG4gICAgdmFyIHNjYWxlID0gMiAvICgxICsgTWF0aC5hYnMoVmVjdG9yLmRvdChub3JtUHJldiwgbWl0ZXJWZWMpKSk7XG4gICAgcmV0dXJuIFZlY3Rvci5tdWx0KG1pdGVyVmVjLCBzY2FsZSAqIHNjYWxlKTtcbn1cblxuLy8gQWRkIGEgbWl0ZXIgdmVjdG9yIG9yIGEgam9pbiBpZiB0aGUgbWl0ZXIgaXMgdG9vIHNoYXJwXG5mdW5jdGlvbiBhZGRNaXRlciAodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIG1pdGVyX2xlbl9zcSwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuXG4gICAgLy8gIE1pdGVyIGxpbWl0OiBpZiBtaXRlciBqb2luIGlzIHRvbyBzaGFycCwgY29udmVydCB0byBiZXZlbCBpbnN0ZWFkXG4gICAgaWYgKFZlY3Rvci5sZW5ndGhTcShtaXRlclZlYykgPiBtaXRlcl9sZW5fc3EpIHtcbiAgICAgICAgYWRkSm9pbihKT0lOX1RZUEUubWl0ZXIsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBpc0JlZ2lubmluZywgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEFkZCBhIGJldmVsIG9yIHJvdW5kIGpvaW5cbmZ1bmN0aW9uIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuICAgIHZhciBpc0Nsb2Nrd2lzZSA9IChub3JtTmV4dFswXSAqIG5vcm1QcmV2WzFdIC0gbm9ybU5leHRbMV0gKiBub3JtUHJldlswXSA+IDApO1xuXG4gICAgaWYgKGlzQ2xvY2t3aXNlKXtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUuYmV2ZWwpIHtcbiAgICAgICAgICAgIGFkZEJldmVsKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBWZWN0b3IubmVnKG5vcm1QcmV2KSwgbWl0ZXJWZWMsIFZlY3Rvci5uZWcobm9ybU5leHQpLFxuICAgICAgICAgICAgICAgIFswLCB2XSwgWzEsIHZdLCBbMCwgdl0sXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5yb3VuZCkge1xuICAgICAgICAgICAgYWRkRmFuKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBWZWN0b3IubmVnKG5vcm1QcmV2KSwgbWl0ZXJWZWMsIFZlY3Rvci5uZWcobm9ybU5leHQpLFxuICAgICAgICAgICAgICAgIFswLCB2XSwgWzEsIHZdLCBbMCwgdl0sXG4gICAgICAgICAgICAgICAgZmFsc2UsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5iZXZlbCkge1xuICAgICAgICAgICAgYWRkQmV2ZWwoY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIG5vcm1QcmV2LCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgbm9ybU5leHQsXG4gICAgICAgICAgICAgICAgWzEsIHZdLCBbMCwgdl0sIFsxLCB2XSxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLnJvdW5kKSB7XG4gICAgICAgICAgICBhZGRGYW4oY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIG5vcm1QcmV2LCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgbm9ybU5leHQsXG4gICAgICAgICAgICAgICAgWzEsIHZdLCBbMCwgdl0sIFsxLCB2XSxcbiAgICAgICAgICAgICAgICBmYWxzZSwgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICB9XG59XG5cbi8vIEFkZCBpbmRpY2VzIHRvIHZlcnRleF9lbGVtZW50c1xuZnVuY3Rpb24gaW5kZXhQYWlycyhudW1fcGFpcnMsIGNvbnRleHQpe1xuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICB2YXIgbnVtX3ZlcnRpY2VzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG4gICAgdmFyIG9mZnNldCA9IG51bV92ZXJ0aWNlcyAtIDIgKiBudW1fcGFpcnMgLSAyO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fcGFpcnM7IGkrKyl7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMyk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoY29vcmRpbmF0ZSwgbm9ybWFsLCB1diwgY29udGV4dCkge1xuICAgIHZhciB2ZXJ0ZXhfdGVtcGxhdGUgPSBjb250ZXh0LnZlcnRleF90ZW1wbGF0ZTtcbiAgICB2YXIgdmVydGV4X2RhdGEgPSBjb250ZXh0LnZlcnRleF9kYXRhO1xuXG4gICAgYnVpbGRWZXJ0ZXhUZW1wbGF0ZSh2ZXJ0ZXhfdGVtcGxhdGUsIGNvb3JkaW5hdGUsIHV2LCBub3JtYWwsIGNvbnRleHQpO1xuICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xufVxuXG5mdW5jdGlvbiBidWlsZFZlcnRleFRlbXBsYXRlICh2ZXJ0ZXhfdGVtcGxhdGUsIHZlcnRleCwgdGV4dHVyZV9jb29yZCwgc2NhbGUsIGNvbnRleHQpIHtcbiAgICAvLyBzZXQgdmVydGV4IHBvc2l0aW9uXG4gICAgdmVydGV4X3RlbXBsYXRlWzBdID0gdmVydGV4WzBdO1xuICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHZlcnRleFsxXTtcblxuICAgIC8vIHNldCBVVnNcbiAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAmJiB0ZXh0dXJlX2Nvb3JkKSB7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnRleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXh0dXJlX2Nvb3JkWzBdICogY29udGV4dC50ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnRleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXh0dXJlX2Nvb3JkWzFdICogY29udGV4dC50ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgfVxuXG4gICAgLy8gc2V0IFNjYWxpbmcgdmVydGV4IChYLCBZIG5vcm1hbCBkaXJlY3Rpb24gKyBaIGhhbGZfd2lkdGggYXMgYXR0cmlidXRlKVxuICAgIGlmIChjb250ZXh0LnNjYWxpbmdfaW5kZXgpIHtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDBdID0gc2NhbGVbMF0gKiBjb250ZXh0LnNjYWxpbmdfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMV0gPSBzY2FsZVsxXSAqIGNvbnRleHQuc2NhbGluZ19ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAyXSA9IGNvbnRleHQuaGFsZl93aWR0aDtcbiAgICB9XG59XG5cbi8vICBUZXNzYWxhdGUgYSBGQU4gZ2VvbWV0cnkgYmV0d2VlbiBwb2ludHMgQSAgICAgICBCXG4vLyAgdXNpbmcgdGhlaXIgbm9ybWFscyBmcm9tIGEgY2VudGVyICAgICAgICBcXCAuIC4gL1xuLy8gIGFuZCBpbnRlcnBvbGF0aW5nIHRoZWlyIFVWcyAgICAgICAgICAgICAgIFxcIHAgL1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXC4vXG5mdW5jdGlvbiBhZGRGYW4gKGNvb3JkLCBuQSwgbkMsIG5CLCB1dkEsIHV2QywgdXZCLCBpc0NhcCwgY29udGV4dCkge1xuICAgIHZhciBjcm9zcyA9IG5BWzBdICogbkJbMV0gLSBuQVsxXSAqIG5CWzBdO1xuICAgIHZhciBkb3QgPSBWZWN0b3IuZG90KG5BLCBuQik7XG5cbiAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGNyb3NzLCBkb3QpO1xuICAgIHdoaWxlIChhbmdsZSA+PSBNYXRoLlBJKSB7XG4gICAgICAgIGFuZ2xlIC09IDIqTWF0aC5QSTtcbiAgICB9XG5cbiAgICB2YXIgbnVtVHJpYW5nbGVzID0gdHJpYW5nbGVzUGVyQXJjKGFuZ2xlLCBjb250ZXh0LmhhbGZfd2lkdGgpO1xuICAgIGlmIChudW1UcmlhbmdsZXMgPCAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGl2b3RJbmRleCA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGFkZFZlcnRleChjb29yZCwgbkMsIHV2QywgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQSwgdXZBLCBjb250ZXh0KTtcblxuICAgIHZhciBibGFkZSA9IG5BO1xuXG4gICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgdXZDdXJyO1xuICAgICAgICBpZiAoaXNDYXApe1xuICAgICAgICAgICAgdXZDdXJyID0gW107XG4gICAgICAgICAgICB2YXIgYWZmaW5lX3V2Q3VyciA9IFZlY3Rvci5zdWIodXZBLCB1dkMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXZDdXJyID0gVmVjdG9yLnNldCh1dkEpO1xuICAgICAgICAgICAgdmFyIHV2X2RlbHRhID0gVmVjdG9yLmRpdihWZWN0b3Iuc3ViKHV2QiwgdXZBKSwgbnVtVHJpYW5nbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhbmdsZV9zdGVwID0gYW5nbGUgLyBudW1UcmlhbmdsZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UcmlhbmdsZXM7IGkrKykge1xuICAgICAgICBibGFkZSA9IFZlY3Rvci5yb3QoYmxhZGUsIGFuZ2xlX3N0ZXApO1xuXG4gICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChpc0NhcCl7XG4gICAgICAgICAgICAgICAgLy8gVVYgdGV4dHVyZXMgZ28gXCJ0aHJvdWdoXCIgdGhlIGNhcFxuICAgICAgICAgICAgICAgIGFmZmluZV91dkN1cnIgPSBWZWN0b3Iucm90KGFmZmluZV91dkN1cnIsIGFuZ2xlX3N0ZXApO1xuICAgICAgICAgICAgICAgIHV2Q3VyclswXSA9IGFmZmluZV91dkN1cnJbMF0gKyB1dkNbMF07XG4gICAgICAgICAgICAgICAgdXZDdXJyWzFdID0gYWZmaW5lX3V2Q3VyclsxXSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGUgKyB1dkNbMV07IC8vIHNjYWxlIHRoZSB2LWNvb3JkaW5hdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVWIHRleHR1cmVzIGdvIFwiYXJvdW5kXCIgdGhlIGpvaW5cbiAgICAgICAgICAgICAgICB1dkN1cnIgPSBWZWN0b3IuYWRkKHV2Q3VyciwgdXZfZGVsdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBibGFkZSwgdXZDdXJyLCBjb250ZXh0KTtcblxuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgaSArICgoY3Jvc3MgPiAwKSA/IDIgOiAxKSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXgpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgaSArICgoY3Jvc3MgPiAwKSA/IDEgOiAyKSk7XG4gICAgfVxufVxuXG4vLyAgYWRkQmV2ZWwgICAgQSAtLS0tLSBCXG4vLyAgICAgICAgICAgICAvIFxcICAgICAvIFxcXG4vLyAgICAgICAgICAgLyAgIC9cXCAgIC9cXCAgXFxcbi8vICAgICAgICAgICAgICAvICBcXCAvICBcXCAgXFxcbi8vICAgICAgICAgICAgICAgIC8gQyBcXFxuZnVuY3Rpb24gYWRkQmV2ZWwgKGNvb3JkLCBuQSwgbkMsIG5CLCB1QSwgdUMsIHVCLCBjb250ZXh0KSB7XG4gICAgdmFyIHBpdm90SW5kZXggPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIGFkZFZlcnRleChjb29yZCwgbkMsIHVDLCBjb250ZXh0KTtcbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5BLCB1QSwgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQiwgdUIsIGNvbnRleHQpO1xuXG4gICAgdmFyIG9yaWVudGF0aW9uID0gbkFbMF0gKiBuQlsxXSAtIG5BWzFdICogbkJbMF0gPiAwO1xuXG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgaWYgKG9yaWVudGF0aW9uKSB7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAyKTtcbiAgICB9XG59XG5cbi8vICBGdW5jdGlvbiB0byBhZGQgdGhlIHZlcnRleCBuZWVkIGZvciBsaW5lIGNhcHMsXG4vLyAgYmVjYXVzZSByZS11c2UgdGhlIGJ1ZmZlcnMgbmVlZHMgdG8gYmUgYXQgdGhlIGVuZFxuZnVuY3Rpb24gYWRkQ2FwIChjb29yZCwgdiwgbm9ybWFsLCB0eXBlLCBpc0JlZ2lubmluZywgY29udGV4dCkge1xuICAgIHZhciBuZWdfbm9ybWFsID0gVmVjdG9yLm5lZyhub3JtYWwpO1xuXG4gICAgc3dpdGNoICh0eXBlKXtcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5zcXVhcmU6XG4gICAgICAgICAgICB2YXIgdGFuZ2VudDtcbiAgICAgICAgICAgIGlmIChpc0JlZ2lubmluZyl7XG4gICAgICAgICAgICAgICAgdGFuZ2VudCA9IFtub3JtYWxbMV0sIC1ub3JtYWxbMF1dO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5vcm1hbCwgdGFuZ2VudCksIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5lZ19ub3JtYWwsIHRhbmdlbnQpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxlbmd0aCBvZiBzcXVhcmUgY2FwIHRvIHRleHR1cmUgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbm9ybWFsLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbmVnX25vcm1hbCwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbmdlbnQgPSBbLW5vcm1hbFsxXSwgbm9ybWFsWzBdXTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbm9ybWFsLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbmVnX25vcm1hbCwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBsZW5ndGggb2Ygc3F1YXJlIGNhcCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobm9ybWFsLCB0YW5nZW50KSwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobmVnX25vcm1hbCwgdGFuZ2VudCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5yb3VuZDpcbiAgICAgICAgICAgIHZhciBuQSwgbkIsIHV2QSwgdXZCLCB1dkM7XG4gICAgICAgICAgICBpZiAoaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgICAgICBuQSA9IG5vcm1hbDtcbiAgICAgICAgICAgICAgICBuQiA9IG5lZ19ub3JtYWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuICAgICAgICAgICAgICAgICAgICB1dkEgPSBbMSwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QiA9IFswLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZDID0gWzAuNSwgdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbkEgPSBuZWdfbm9ybWFsO1xuICAgICAgICAgICAgICAgIG5CID0gbm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgIHV2QSA9IFswLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZCID0gWzEsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkMgPSBbMC41LCB2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFkZEZhbihjb29yZCxcbiAgICAgICAgICAgICAgICBuQSwgemVyb192ZWMyLCBuQixcbiAgICAgICAgICAgICAgICB1dkEsIHV2QywgdXZCLFxuICAgICAgICAgICAgICAgIHRydWUsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENBUF9UWVBFLmJ1dHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG4vLyBGb3IgSUUgTWF0aC5sb2cyIHN1cHBvcnRcbmxldCBsb2cyID0gTWF0aC5sb2cyIHx8IGZ1bmN0aW9uKHgpeyByZXR1cm4gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzJFOyB9O1xuXG4vLyBDYWxjdWxhdGUgbnVtYmVyIG9mIHRyaWFuZ2xlcyBmb3IgYSBmYW4gZ2l2ZW4gYW4gYW5nbGUgYW5kIGxpbmUgd2lkdGhcbmZ1bmN0aW9uIHRyaWFuZ2xlc1BlckFyYyAoYW5nbGUsIHdpZHRoKSB7XG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgICBhbmdsZSA9IC1hbmdsZTtcbiAgICB9XG5cbiAgICB2YXIgbnVtVHJpYW5nbGVzID0gKHdpZHRoID4gMiAqIERFRkFVTFQuTUlOX0ZBTl9XSURUSCkgPyBsb2cyKHdpZHRoIC8gREVGQVVMVC5NSU5fRkFOX1dJRFRIKSA6IDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbChhbmdsZSAvIE1hdGguUEkgKiBudW1UcmlhbmdsZXMpO1xufVxuXG4vLyBDeWNsaWNhbGx5IHBlcm11dGUgY2xvc2VkIGxpbmUgc3RhcnRpbmcgYXQgYW4gaW5kZXhcbmZ1bmN0aW9uIHBlcm11dGVMaW5lKGxpbmUsIHN0YXJ0SW5kZXgpe1xuICAgIHZhciBuZXdMaW5lID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIGluZGV4ID0gKGkgKyBzdGFydEluZGV4KSAlIGxpbmUubGVuZ3RoO1xuICAgICAgICAvLyBza2lwIHRoZSBmaXJzdCAocmVwZWF0ZWQpIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgbmV3TGluZS5wdXNoKGxpbmVbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXdMaW5lLnB1c2gobmV3TGluZVswXSk7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG59IiwiaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQge21hdDQsIG1hdDMsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuLy8gQWJzdHJhY3QgYmFzZSBjbGFzc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGNhbWVyYSBieSB0eXBlIG5hbWUsIGZhY3Rvcnktc3R5bGVcbiAgICBzdGF0aWMgY3JlYXRlKG5hbWUsIHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdpc29tZXRyaWMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXNvbWV0cmljQ2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgICAgICBjYXNlICdmbGF0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsYXRDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgICAgIGNhc2UgJ3BlcnNwZWN0aXZlJzpcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUoKSB7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uY2UgcGVyIGZyYW1lIHBlciBwcm9ncmFtIChlLmcuIGZvciBtYWluIHJlbmRlciBwYXNzLCB0aGVuIGZvciBlYWNoIGFkZGl0aW9uYWwgcGFzcyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGV0Yy4pXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICB9XG5cbiAgICAvLyBTeW5jIGNhbWVyYSBwb3NpdGlvbi96b29tIHRvIHNjZW5lIHZpZXdcbiAgICB1cGRhdGVWaWV3ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gfHwgdGhpcy56b29tKSB7XG4gICAgICAgICAgICB2YXIgdmlldyA9IHt9O1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2aWV3ID0geyBsbmc6IHRoaXMucG9zaXRpb25bMF0sIGxhdDogdGhpcy5wb3NpdGlvblsxXSwgem9vbTogdGhpcy5wb3NpdGlvblsyXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuem9vbSkge1xuICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmlldy5zZXRWaWV3KHZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IG1vZGVsLXZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlc1xuICAgIHNldHVwTWF0cmljZXMgKG1hdHJpY2VzLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIE1vZGVsIHZpZXcgbWF0cml4IC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB2aWV3IHNwYWNlIChtZXRlcnMsIHJlbGF0aXZlIHRvIGNhbWVyYSlcbiAgICAgICAgbWF0NC5tdWx0aXBseShtYXRyaWNlcy5tb2RlbF92aWV3MzIsIHRoaXMudmlld19tYXRyaXgsIG1hdHJpY2VzLm1vZGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9tb2RlbFZpZXcnLCBtYXRyaWNlcy5tb2RlbF92aWV3MzIpO1xuXG4gICAgICAgIC8vIE5vcm1hbCBtYXRyaWNlcyAtIHRyYW5zZm9ybXMgc3VyZmFjZSBub3JtYWxzIGludG8gdmlldyBzcGFjZVxuICAgICAgICBtYXQzLm5vcm1hbEZyb21NYXQ0KG1hdHJpY2VzLm5vcm1hbDMyLCBtYXRyaWNlcy5tb2RlbF92aWV3MzIpO1xuICAgICAgICBtYXQzLmludmVydChtYXRyaWNlcy5pbnZlcnNlX25vcm1hbDMyLCBtYXRyaWNlcy5ub3JtYWwzMik7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4M2Z2JywgJ3Vfbm9ybWFsTWF0cml4JywgbWF0cmljZXMubm9ybWFsMzIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDNmdicsICd1X2ludmVyc2VOb3JtYWxNYXRyaXgnLCBtYXRyaWNlcy5pbnZlcnNlX25vcm1hbDMyKTtcbiAgICB9XG5cbn1cblxuLyoqXG4gICAgUGVyc3BlY3RpdmUgbWF0cml4IHByb2plY3Rpb25cblxuICAgIFRoaXMgaXMgYSBzcGVjaWFsaXplZCBwZXJzcGVjdGl2ZSBjYW1lcmEgdGhhdCwgZ2l2ZW4gYSBkZXNpcmVkIGNhbWVyYSBmb2NhbCBsZW5ndGggKHdoaWNoIGNhbiBhbHNvIHZhcnkgYnkgem9vbSBsZXZlbCksXG4gICAgY29uc3RyYWlucyB0aGUgY2FtZXJhIGhlaWdodCBhYm92ZSB0aGUgZ3JvdW5kIHBsYW5lIHN1Y2ggdGhhdCB0aGUgZGlzcGxheWVkIGdyb3VuZCBhcmVhIG9mIHRoZSBtYXAgbWF0Y2hlcyB0aGF0IG9mXG4gICAgYSB0cmFkaXRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwLiBUaGlzIG1lYW5zIHlvdSBjYW4gc2V0IHRoZSBjYW1lcmEgbG9jYXRpb24gYnkgW2xhdCwgbG5nLCB6b29tXSBhcyB5b3Ugd291bGQgYSB0eXBpY2FsXG4gICAgd2ViIG1lcmNhdG9yIG1hcCwgdGhlbiBhZGp1c3QgdGhlIGZvY2FsIGxlbmd0aCBhcyBuZWVkZWQuXG5cbiAgICBWYW5pc2hpbmcgcG9pbnQgY2FuIGFsc28gYmUgYWRqdXN0ZWQgdG8gYWNoaWV2ZSBkaWZmZXJlbnQgXCJ2aWV3aW5nIGFuZ2xlc1wiLCBlLmcuIGluc3RlYWQgb2YgbG9va2luZyBzdHJhaWdodCBkb3duIGludG9cbiAgICB0aGUgY2VudGVyIG9mIHRoZSB2aWV3cG9ydCwgdGhlIGNhbWVyYSBhcHBlYXJzIHRvIGJlIHRpbHRlZCBhdCBhbiBhbmdsZS4gRm9yIGV4YW1wbGU6XG5cbiAgICBbMCwgMF0gPSBsb29raW5nIHRvd2FyZHMgY2VudGVyIG9mIHZpZXdwb3J0XG4gICAgWy0yNTAsIC0yNTBdID0gbG9va2luZyAyNTAgcGl4ZWxzIGZyb20gdGhlIHZpZXdwb3J0IGNlbnRlciB0byB0aGUgbG93ZXItbGVmdCBjb3JuZXJcbiAgICBbNDAwLCAwXSA9IGxvb2tpbmcgNDAwIHBpeGVscyB0byB0aGUgcmlnaHQgb2YgdGhlIHZpZXdwb3J0IGNlbnRlclxuKi9cbmNsYXNzIFBlcnNwZWN0aXZlQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3BlcnNwZWN0aXZlJztcblxuICAgICAgICAvLyBhIHNpbmdsZSBzY2FsYXIsIG9yIHBhaXJzIG9mIHN0b3BzIG1hcHBpbmcgem9vbSBsZXZlbHMsIGUuZy4gW3pvb20sIGZvY2FsIGxlbmd0aF1cbiAgICAgICAgdGhpcy5mb2NhbF9sZW5ndGggPSBvcHRpb25zLmZvY2FsX2xlbmd0aDtcbiAgICAgICAgdGhpcy5mb3YgPSBvcHRpb25zLmZvdjtcbiAgICAgICAgaWYgKCF0aGlzLmZvY2FsX2xlbmd0aCAmJiAhdGhpcy5mb3YpIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgZm9jYWwgbGVuZ3RoIHJhbmdlcyBieSB6b29tXG4gICAgICAgICAgICB0aGlzLmZvY2FsX2xlbmd0aCA9IFtbMTYsIDJdLCBbMTcsIDIuNV0sIFsxOCwgM10sIFsxOSwgNF0sIFsyMCwgNl1dO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnQgPSBvcHRpb25zLnZhbmlzaGluZ19wb2ludCB8fCBbMCwgMF07IC8vIFt4LCB5XVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludCA9IHRoaXMudmFuaXNoaW5nX3BvaW50Lm1hcChwYXJzZUZsb2F0KTsgLy8gd2UgaW1wbGljaXRseSBvbmx5IHN1cHBvcnQgcHggdW5pdHMgaGVyZVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3ID0gW107XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdfbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcblxuICAgICAgICAvLyAnY2FtZXJhJyBpcyB0aGUgbmFtZSBvZiB0aGUgc2hhZGVyIGJsb2NrLCBlLmcuIGRldGVybWluZXMgd2hlcmUgaW4gdGhlIHNoYWRlciB0aGlzIGNvZGUgaXMgaW5qZWN0ZWRcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2soJ2NhbWVyYScsIGBcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb247XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzMgdV9leWU7XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzIgdV92YW5pc2hpbmdfcG9pbnQ7XG5cbiAgICAgICAgICAgIHZvaWQgY2FtZXJhUHJvamVjdGlvbiAoaW5vdXQgdmVjNCBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdV9wcm9qZWN0aW9uICogcG9zaXRpb247XG4gICAgICAgICAgICB9YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbnN0cmFpbnMgdGhlIGNhbWVyYSBzbyB0aGF0IHRoZSB2aWV3YWJsZSBhcmVhIG1hdGNoZXMgZ2l2ZW4gdGhlIHZpZXdwb3J0IGhlaWdodFxuICAgIC8vIChpbiB3b3JsZCBzcGFjZSwgZS5nLiBtZXRlcnMpLCBnaXZlbiBlaXRoZXIgYSBjYW1lcmEgZm9jYWwgbGVuZ3RoIG9yIGZpZWxkLW9mLXZpZXdcbiAgICAvLyAoZm9jYWwgbGVuZ3RoIGlzIHVzZWQgaWYgYm90aCBhcmUgcGFzc2VkKS5cbiAgICBjb25zdHJhaW5DYW1lcmEoeyB2aWV3X2hlaWdodCwgaGVpZ2h0LCBmb2NhbF9sZW5ndGgsIGZvdiB9KSB7XG4gICAgICAgIC8vIFNvbHZlIGZvciBjYW1lcmEgaGVpZ2h0XG4gICAgICAgIGlmICghaGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGZvY2FsIGxlbmd0aCwgY2FsY3VsYXRlIEZPVlxuICAgICAgICAgICAgaWYgKGZvY2FsX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvdiA9IE1hdGguYXRhbigxIC8gZm9jYWxfbGVuZ3RoKSAqIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBoYXZlIEZPViwgY2FsY3VsYXRlIGZvY2FsIGxlbmd0aFxuICAgICAgICAgICAgZWxzZSBpZiAoZm92KSB7XG4gICAgICAgICAgICAgICAgZm92ID0gZm92ICogTWF0aC5QSSAvIDE4MDsgLy8gY29udmVydCBGT1YgZGVncmVlcyB0byByYWRpYW5zXG4gICAgICAgICAgICAgICAgZm9jYWxfbGVuZ3RoID0gMSAvIE1hdGgudGFuKGZvdiAvIDIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXN0YW5jZSB0aGF0IGNhbWVyYSBzaG91bGQgYmUgZnJvbSBncm91bmQgc3VjaCB0aGF0IGl0IGZpdHMgdGhlIGZpZWxkIG9mIHZpZXcgZXhwZWN0ZWRcbiAgICAgICAgICAgIC8vIGZvciBhIGNvbnZlbnRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwgYW5kIGNhbWVyYSBmb2NhbCBsZW5ndGhcbiAgICAgICAgICAgIGhlaWdodCA9IHZpZXdfaGVpZ2h0IC8gMiAqIGZvY2FsX2xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb2x2ZSBmb3IgY2FtZXJhIGZvY2FsIGxlbmd0aCAvIGZpZWxkLW9mLXZpZXdcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb2NhbF9sZW5ndGggPSAyICogaGVpZ2h0IC8gdmlld19oZWlnaHQ7XG4gICAgICAgICAgICBmb3YgPSBNYXRoLmF0YW4oMSAvIGZvY2FsX2xlbmd0aCkgKiAyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgdmlld19oZWlnaHQsIGhlaWdodCwgZm9jYWxfbGVuZ3RoLCBmb3YgfTtcbiAgICB9XG5cbiAgICB1cGRhdGVNYXRyaWNlcygpIHtcbiAgICAgICAgLy8gVE9ETzogb25seSByZS1jYWxjdWxhdGUgdGhlc2UgdmFycyB3aGVuIG5lY2Vzc2FyeVxuXG4gICAgICAgIC8vIEhlaWdodCBvZiB0aGUgdmlld3BvcnQgaW4gbWV0ZXJzIGF0IGN1cnJlbnQgem9vbVxuICAgICAgICB2YXIgdmlld3BvcnRfaGVpZ2h0ID0gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCAqIHRoaXMudmlldy5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIC8vIENvbXB1dGUgY2FtZXJhIHByb3BlcnRpZXMgdG8gZml0IGRlc2lyZWQgdmlld1xuICAgICAgICB2YXIgeyBoZWlnaHQsIGZvdiB9ID0gdGhpcy5jb25zdHJhaW5DYW1lcmEoe1xuICAgICAgICAgICAgdmlld19oZWlnaHQ6IHZpZXdwb3J0X2hlaWdodCxcbiAgICAgICAgICAgIGZvY2FsX2xlbmd0aDogVXRpbHMuaW50ZXJwb2xhdGUodGhpcy52aWV3Lnpvb20sIHRoaXMuZm9jYWxfbGVuZ3RoKSxcbiAgICAgICAgICAgIGZvdjogVXRpbHMuaW50ZXJwb2xhdGUodGhpcy52aWV3Lnpvb20sIHRoaXMuZm92KVxuICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVmlldyBtYXRyaXhcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW3RoaXMudmlldy5jZW50ZXIubWV0ZXJzLngsIHRoaXMudmlldy5jZW50ZXIubWV0ZXJzLnksIGhlaWdodF07XG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gcG9zaXRpb247XG5cbiAgICAgICAgLy8gbWF0NC5sb29rQXQodGhpcy52aWV3X21hdHJpeCxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcyguLi5wb3NpdGlvbiksXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCBoZWlnaHQgLSAxKSxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKSk7XG4gICAgICAgIC8vIEV4Y2x1ZGUgY2FtZXJhIGhlaWdodCBmcm9tIHZpZXcgbWF0cml4XG4gICAgICAgIG1hdDQubG9va0F0KHRoaXMudmlld19tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCAwKSxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIC0xKSxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKSk7XG5cbiAgICAgICAgLy8gUHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgbWF0NC5wZXJzcGVjdGl2ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCBmb3YsIHRoaXMudmlldy5hc3BlY3QsIDEsIGhlaWdodCAqIDIpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdmFuaXNoaW5nIHBvaW50IGZyb20gcGl4ZWxzIHRvIHZpZXdwb3J0IHNwYWNlXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gPSB0aGlzLnZhbmlzaGluZ19wb2ludFswXSAvIHRoaXMudmlldy5zaXplLmNzcy53aWR0aDtcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSA9IHRoaXMudmFuaXNoaW5nX3BvaW50WzFdIC8gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodDtcblxuICAgICAgICAvLyBBZGp1c3QgcHJvamVjdGlvbiBtYXRyaXggdG8gaW5jbHVkZSB2YW5pc2hpbmcgcG9pbnQgc2tld1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzhdID0gLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gKiAyOyAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB4XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOV0gPSAtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSAqIDI7IC8vIHogY29sdW1uIG9mIHkgcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHlcblxuICAgICAgICAvLyBUcmFuc2xhdGUgZ2VvbWV0cnkgaW50byB0aGUgZGlzdGFuY2Ugc28gdGhhdCBjYW1lcmEgaXMgYXBwcm9wcmlhdGUgaGVpZ2h0IGFib3ZlIGdyb3VuZFxuICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGFkanVzdCB4eSB0byBjb21wZW5zYXRlIGZvciBhbnkgdmFuaXNoaW5nIHBvaW50IHNrZXcsIGUuZy4gbW92ZSBnZW9tZXRyeSBzbyB0aGF0IHRoZSBkaXNwbGF5ZWQgZ1xuICAgICAgICAvLyBwbGFuZSBvZiB0aGUgbWFwIG1hdGNoZXMgdGhhdCBleHBlY3RlZCBieSBhIHRyYWRpdGlvbmFsIHdlYiBtZXJjYXRvciBtYXAgYXQgdGhpcyBbbGF0LCBsbmcsIHpvb21dLlxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0X2hlaWdodC8yICogdGhpcy52aWV3LmFzcGVjdCAqICgtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSAqIDIpLFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0X2hlaWdodC8yICogKC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdICogMiksXG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluY2x1ZGUgY2FtZXJhIGhlaWdodCBpbiBwcm9qZWN0aW9uIG1hdHJpeFxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LCB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgLWhlaWdodCkpO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X3Byb2plY3Rpb24nLCB0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZicsICd1X2V5ZScsIFswLCAwLCB0aGlzLnBvc2l0aW9uX21ldGVyc1syXV0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3ZhbmlzaGluZ19wb2ludCcsIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXcpO1xuICAgIH1cblxufVxuXG4vLyBJc29tZXRyaWMtc3R5bGUgcHJvamVjdGlvblxuLy8gTm90ZTogdGhpcyBpcyBhY3R1YWxseSBhbiBcImF4b25vbWV0cmljXCIgcHJvamVjdGlvbiwgYnV0IEknbSB1c2luZyB0aGUgY29sbG9xdWlhbCB0ZXJtIGlzb21ldHJpYyBiZWNhdXNlIGl0IGlzIG1vcmUgcmVjb2duaXphYmxlLlxuLy8gQW4gaXNvbWV0cmljIHByb2plY3Rpb24gaXMgYSBzcGVjaWZpYyBzdWJzZXQgb2YgYXhvbm9tZXRyaWMgcHJvamVjdGlvbnMuXG4vLyAnYXhpcycgZGV0ZXJtaW5lcyB0aGUgeHkgc2tldyBhcHBsaWVkIHRvIGEgdmVydGV4IGJhc2VkIG9uIGl0cyB6IGNvb3JkaW5hdGUsIGUuZy4gWzAsIDFdIGF4aXMgY2F1c2VzIGJ1aWxkaW5ncyB0byBiZSBkcmF3blxuLy8gc3RyYWlnaHQgdXB3YXJkcyBvbiBzY3JlZW4gYXQgdGhlaXIgdHJ1ZSBoZWlnaHQsIFswLCAuNV0gd291bGQgZHJhdyB0aGVtIHVwIGF0IGhhbGYtaGVpZ2h0LCBbMSwgMF0gd291bGQgYmUgc2lkZXdheXMsIGV0Yy5cbmNsYXNzIElzb21ldHJpY0NhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdpc29tZXRyaWMnO1xuICAgICAgICB0aGlzLmF4aXMgPSBvcHRpb25zLmF4aXMgfHwgeyB4OiAwLCB5OiAxIH07XG4gICAgICAgIGlmICh0aGlzLmF4aXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aGlzLmF4aXMgPSB7IHg6IHRoaXMuYXhpc1swXSwgeTogdGhpcy5heGlzWzFdIH07IC8vIGFsbG93IGF4aXMgdG8gYWxzbyBiZSBwYXNzZWQgYXMgMi1lbGVtIGFycmF5XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IG51bGw7XG4gICAgICAgIHRoaXMudmlld3BvcnRfaGVpZ2h0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLnZpZXdfbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcblxuICAgICAgICAvLyAnY2FtZXJhJyBpcyB0aGUgbmFtZSBvZiB0aGUgc2hhZGVyIGJsb2NrLCBlLmcuIGRldGVybWluZXMgd2hlcmUgaW4gdGhlIHNoYWRlciB0aGlzIGNvZGUgaXMgaW5qZWN0ZWRcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2soJ2NhbWVyYScsIGBcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb247XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzMgdV9leWU7XG4gICAgICAgICAgICB1bmlmb3JtIHZlYzIgdV92YW5pc2hpbmdfcG9pbnQ7XG5cbiAgICAgICAgICAgIHZvaWQgY2FtZXJhUHJvamVjdGlvbiAoaW5vdXQgdmVjNCBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdV9wcm9qZWN0aW9uICogcG9zaXRpb247XG4gICAgICAgICAgICAgICAgLy8gcG9zaXRpb24ueHkgKz0gcG9zaXRpb24ueiAqIHVfaXNvbWV0cmljX2F4aXM7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIHogZm9yIGRlcHRoIGJ1ZmZlciBzbyB1cCBpcyBuZWdhdGl2ZSxcbiAgICAgICAgICAgICAgICAvLyBhbmQgc2NhbGUgZG93biB2YWx1ZXMgc28gb2JqZWN0cyBoaWdoZXIgdGhhbiBvbmUgc2NyZWVuIGhlaWdodCB3aWxsIG5vdCBnZXQgY2xpcHBlZFxuICAgICAgICAgICAgICAgIC8vIHB1bGwgZm9yd2FyZCBzbGlnaHRseSB0byBhdm9pZCBnb2luZyBwYXN0IGZhciBjbGlwcGluZyBwbGFuZVxuICAgICAgICAgICAgICAgIHBvc2l0aW9uLnogPSAtcG9zaXRpb24ueiAvIDEwMC4gKyAxLiAtIDAuMDAxO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuXG4gICAgICAgIHRoaXMudmlld3BvcnRfaGVpZ2h0ID0gdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCAqIHRoaXMudmlldy5tZXRlcnNfcGVyX3BpeGVsO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBbdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueCwgdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueSwgdGhpcy52aWV3cG9ydF9oZWlnaHRdO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IHBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFZpZXdcbiAgICAgICAgbWF0NC5pZGVudGl0eSh0aGlzLnZpZXdfbWF0cml4KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy52aWV3X21hdHJpeCwgdGhpcy52aWV3X21hdHJpeCwgdmVjMy5mcm9tVmFsdWVzKC1wb3NpdGlvblswXSwgLXBvc2l0aW9uWzFdLCAwKSk7XG5cbiAgICAgICAgLy8gUHJvamVjdGlvblxuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuXG4gICAgICAgIC8vIGFwcGx5IGlzb21ldHJpYyBza2V3XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOF0gPSB0aGlzLmF4aXMueCAvIHRoaXMudmlldy5hc3BlY3Q7IC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHhcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs5XSA9IHRoaXMuYXhpcy55OyAgICAgICAgICAgICAgICAgICAgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeVxuXG4gICAgICAgIC8vIGNvbnZlcnQgbWV0ZXJzIHRvIHZpZXdwb3J0XG4gICAgICAgIG1hdDQuc2NhbGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLngsXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy55LFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfcHJvamVjdGlvbicsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3VfZXllJywgWzAsIDAsIHRoaXMudmlld3BvcnRfaGVpZ2h0XSk7XG4gICAgICAgIC8vIHByb2dyYW0udW5pZm9ybSgnM2YnLCAndV9leWUnLCB0aGlzLnZpZXdwb3J0X2hlaWdodCAqIHRoaXMuYXhpcy54LCB0aGlzLnZpZXdwb3J0X2hlaWdodCAqIHRoaXMuYXhpcy55LCB0aGlzLnZpZXdwb3J0X2hlaWdodCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMmZ2JywgJ3VfdmFuaXNoaW5nX3BvaW50JywgWzAsIDBdKTtcbiAgICB9XG5cbn1cblxuLy8gRmxhdCBwcm9qZWN0aW9uIChlLmcuIGp1c3QgdG9wLWRvd24sIG5vIHBlcnNwZWN0aXZlKSAtIGEgZGVnZW5lcmF0ZSBpc29tZXRyaWMgY2FtZXJhXG5jbGFzcyBGbGF0Q2FtZXJhIGV4dGVuZHMgSXNvbWV0cmljQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2ZsYXQnO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgLy8gQXhpcyBpcyBmaXhlZCB0byAoMCwgMCkgZm9yIGZsYXQgY2FtZXJhXG4gICAgICAgIHRoaXMuYXhpcy54ID0gMDtcbiAgICAgICAgdGhpcy5heGlzLnkgPSAwO1xuXG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgIH1cblxufVxuIiwiLy8gTWlzY2VsbGFuZW91cyBnZW8gZnVuY3Rpb25zXG5cbnZhciBHZW87XG5leHBvcnQgZGVmYXVsdCBHZW8gPSB7fTtcblxuLy8gUHJvamVjdGlvbiBjb25zdGFudHNcbkdlby5kZWZhdWx0X3NvdXJjZV9tYXhfem9vbSA9IDE4O1xuR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSA9IDIwO1xuR2VvLnRpbGVfc2l6ZSA9IDI1Njtcbkdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzID0gMjAwMzc1MDguMzQyNzg5MjQ0O1xuR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzID0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgKiAyO1xuR2VvLm1pbl96b29tX21ldGVyc19wZXJfcGl4ZWwgPSBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBHZW8udGlsZV9zaXplOyAvLyBtaW4gem9vbSBkcmF3cyB3b3JsZCBhcyAyIHRpbGVzIHdpZGVcblxubGV0IG1ldGVyc19wZXJfcGl4ZWwgPSBbXTtcbkdlby5tZXRlcnNQZXJQaXhlbCA9IGZ1bmN0aW9uICh6KSB7XG4gICAgbWV0ZXJzX3Blcl9waXhlbFt6XSA9IG1ldGVyc19wZXJfcGl4ZWxbel0gfHwgR2VvLm1pbl96b29tX21ldGVyc19wZXJfcGl4ZWwgLyBNYXRoLnBvdygyLCB6KTtcbiAgICByZXR1cm4gbWV0ZXJzX3Blcl9waXhlbFt6XTtcbn07XG5cbmxldCBtZXRlcnNfcGVyX3RpbGUgPSBbXTtcbkdlby5tZXRlcnNQZXJUaWxlID0gZnVuY3Rpb24gKHopIHtcbiAgICBtZXRlcnNfcGVyX3RpbGVbel0gPSBtZXRlcnNfcGVyX3RpbGVbel0gfHwgR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgeik7XG4gICAgcmV0dXJuIG1ldGVyc19wZXJfdGlsZVt6XTtcbn07XG5cbi8vIENvbnZlcnNpb24gZnVuY3Rpb25zIGJhc2VkIG9uIGFuIGRlZmluZWQgdGlsZSBzY2FsZVxuR2VvLnRpbGVfc2NhbGUgPSA0MDk2OyAvLyBjb29yZGluYXRlcyBhcmUgbG9jYWxseSBzY2FsZWQgdG8gdGhlIHJhbmdlIFswLCB0aWxlX3NjYWxlXVxuR2VvLnVuaXRzX3Blcl9waXhlbCA9IEdlby50aWxlX3NjYWxlIC8gR2VvLnRpbGVfc2l6ZTtcbkdlby5oZWlnaHRfc2NhbGUgPSAxNjsgIC8vIHByb3ZpZGVzIHN1Yi1tZXRlciBwcmVjaXNpb24gZm9yIGhlaWdodCB2YWx1ZXMgKDE2dGhzIG9mIGEgbWV0ZXJzKVxuXG5sZXQgdW5pdHNfcGVyX21ldGVyID0gW107XG5HZW8udW5pdHNQZXJNZXRlciA9IGZ1bmN0aW9uICh6KSB7XG4gICAgdW5pdHNfcGVyX21ldGVyW3pdID0gdW5pdHNfcGVyX21ldGVyW3pdIHx8IEdlby50aWxlX3NjYWxlIC8gKEdlby50aWxlX3NpemUgKiBHZW8ubWV0ZXJzUGVyUGl4ZWwoeikpO1xuICAgIHJldHVybiB1bml0c19wZXJfbWV0ZXJbel07XG59O1xuXG4vLyBDb252ZXJ0IHRpbGUgbG9jYXRpb24gdG8gbWVyY2F0b3IgbWV0ZXJzIC0gbXVsdGlwbHkgYnkgcGl4ZWxzIHBlciB0aWxlLCB0aGVuIGJ5IG1ldGVycyBwZXIgcGl4ZWwsIGFkanVzdCBmb3IgbWFwIG9yaWdpblxuR2VvLm1ldGVyc0ZvclRpbGUgPSBmdW5jdGlvbiAodGlsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRpbGUueCAqIEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHRpbGUueikgLSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyxcbiAgICAgICAgeTogLSh0aWxlLnkgKiBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB0aWxlLnopIC0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpXG4gICAgfTtcbn07XG5cbi8qKlxuICAgR2l2ZW4gYSBwb2ludCBpbiBtZXJjYXRvciBtZXRlcnMgYW5kIGEgem9vbSBsZXZlbCwgcmV0dXJuIHRoZSB0aWxlIFgvWS9aIHRoYXQgdGhlIHBvaW50IGxpZXMgaW5cbiovXG5HZW8udGlsZUZvck1ldGVycyA9IGZ1bmN0aW9uIChbeCwgeV0sIHpvb20pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBNYXRoLmZsb29yKCh4ICsgR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpIC8gKEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHpvb20pKSksXG4gICAgICAgIHk6IE1hdGguZmxvb3IoKC15ICsgR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMpIC8gKEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHpvb20pKSksXG4gICAgICAgIHo6IHpvb21cbiAgICB9O1xufTtcblxuLy8gV3JhcCBhIHRpbGUgdG8gcG9zaXRpdmUgI3MgZm9yIHpvb21cbi8vIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYXhlcyB0byB3cmFwXG5HZW8ud3JhcFRpbGUgPSBmdW5jdGlvbih7IHgsIHksIHogfSwgbWFzayA9IHsgeDogdHJ1ZSwgeTogZmFsc2UgfSkge1xuICAgIHZhciBtID0gKDEgPDwgeikgLSAxO1xuICAgIGlmIChtYXNrLngpIHtcbiAgICAgICAgeCA9IHggJiBtO1xuICAgIH1cbiAgICBpZiAobWFzay55KSB7XG4gICAgICAgIHkgPSB5ICYgbTtcbiAgICB9XG4gICAgcmV0dXJuIHsgeCwgeSwgeiB9O1xufTtcblxuLyoqXG4gICBDb252ZXJ0IG1lcmNhdG9yIG1ldGVycyB0byBsYXQtbG5nXG4qL1xuR2VvLm1ldGVyc1RvTGF0TG5nID0gZnVuY3Rpb24gKFt4LCB5XSkge1xuXG4gICAgeCAvPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcbiAgICB5IC89IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuXG4gICAgeSA9ICgyICogTWF0aC5hdGFuKE1hdGguZXhwKHkgKiBNYXRoLlBJKSkgLSAoTWF0aC5QSSAvIDIpKSAvIE1hdGguUEk7XG5cbiAgICB4ICo9IDE4MDtcbiAgICB5ICo9IDE4MDtcblxuICAgIHJldHVybiBbeCwgeV07XG59O1xuXG4vKipcbiAgQ29udmVydCBsYXQtbG5nIHRvIG1lcmNhdG9yIG1ldGVyc1xuKi9cbkdlby5sYXRMbmdUb01ldGVycyA9IGZ1bmN0aW9uKFt4LCB5XSkge1xuXG4gICAgLy8gTGF0aXR1ZGVcbiAgICB5ID0gTWF0aC5sb2coTWF0aC50YW4oeSpNYXRoLlBJLzM2MCArIE1hdGguUEkvNCkpIC8gTWF0aC5QSTtcbiAgICB5ICo9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuXG4gICAgLy8gTG9uZ2l0dWRlXG4gICAgeCAqPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyAvIDE4MDtcblxuICAgIHJldHVybiBbeCwgeV07XG59O1xuXG5HZW8ud3JhcExuZyA9IGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA+IDE4MCB8fCB4IDwgLTE4MCkge1xuICAgICAgICB4ID0gKCh4ICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgfVxuICAgIHJldHVybiB4O1xufTtcblxuLy8gUnVuIGFuIGluLXBsYWNlIHRyYW5zZm9ybSBmdW5jdGlvbiBvbiBlYWNoIGNvb29yZGluYXRlIGluIGEgR2VvSlNPTiBnZW9tZXRyeVxuR2VvLnRyYW5zZm9ybUdlb21ldHJ5ID0gZnVuY3Rpb24gKGdlb21ldHJ5LCB0cmFuc2Zvcm0pIHtcbiAgICBpZiAoZ2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47IC8vIHNraXAgaWYgbWlzc2luZyBnZW9tZXRyeSAodmFsaWQgR2VvSlNPTilcbiAgICB9XG5cbiAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICB0cmFuc2Zvcm0oZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2goY29vcmRpbmF0ZXMgPT4gY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaChwb2x5Z29uID0+IHtcbiAgICAgICAgICAgIHBvbHlnb24uZm9yRWFjaChjb29yZGluYXRlcyA9PiBjb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVE9ETzogc3VwcG9ydCBHZW9tZXRyeUNvbGxlY3Rpb25cbn07XG5cbkdlby5ib3hJbnRlcnNlY3QgPSBmdW5jdGlvbiAoYjEsIGIyKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICAgIGIyLnN3LnggPiBiMS5uZS54IHx8XG4gICAgICAgIGIyLm5lLnggPCBiMS5zdy54IHx8XG4gICAgICAgIGIyLnN3LnkgPiBiMS5uZS55IHx8XG4gICAgICAgIGIyLm5lLnkgPCBiMS5zdy55XG4gICAgKTtcbn07XG5cbi8vIEZpbmRzIHRoZSBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IGZvciBhIHBvbHlnb25cbkdlby5maW5kQm91bmRpbmdCb3ggPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIHZhciBtaW5feCA9IEluZmluaXR5LFxuICAgICAgICBtYXhfeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbWluX3kgPSBJbmZpbml0eSxcbiAgICAgICAgbWF4X3kgPSAtSW5maW5pdHk7XG5cbiAgICAvLyBPbmx5IG5lZWQgdG8gZXhhbWluZSBvdXRlciByaW5nIChwb2x5Z29uWzBdKVxuICAgIHZhciBudW1fY29vcmRzID0gcG9seWdvblswXS5sZW5ndGg7XG4gICAgZm9yICh2YXIgYz0wOyBjIDwgbnVtX2Nvb3JkczsgYysrKSB7XG4gICAgICAgIHZhciBjb29yZCA9IHBvbHlnb25bMF1bY107XG5cbiAgICAgICAgaWYgKGNvb3JkWzBdIDwgbWluX3gpIHtcbiAgICAgICAgICAgIG1pbl94ID0gY29vcmRbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzFdIDwgbWluX3kpIHtcbiAgICAgICAgICAgIG1pbl95ID0gY29vcmRbMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzBdID4gbWF4X3gpIHtcbiAgICAgICAgICAgIG1heF94ID0gY29vcmRbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb3JkWzFdID4gbWF4X3kpIHtcbiAgICAgICAgICAgIG1heF95ID0gY29vcmRbMV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21pbl94LCBtaW5feSwgbWF4X3gsIG1heF95XTtcbn07XG5cbi8vIENvbnZlcnQgZ2VvbWV0cnkgdHlwZSB0byBvbmUgb2Y6ICdwb2ludCcsICdsaW5lJywgJ3BvbHlnb24nXG5HZW8uZ2VvbWV0cnlUeXBlID0gZnVuY3Rpb24odHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgcmV0dXJuICdwb2x5Z29uJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAnbGluZSc7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICByZXR1cm4gJ3BvaW50JztcbiAgICB9XG59O1xuXG5HZW8uY2VudHJvaWQgPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0L2Jsb2IvYzEwZjQwNWExMTIxNDJiMTk3ODU5NjdjZTBlMTQyMTMyYTYwOTVhZC9zcmMvbGF5ZXIvdmVjdG9yL1BvbHlnb24uanMjTDU3XG4gICAgbGV0IHggPSAwLCB5ID0gMCwgYXJlYSA9IDA7XG4gICAgbGV0IHJpbmcgPSBwb2x5Z29uWzBdOyAvLyBvbmx5IHVzZSBmaXJzdCByaW5nIGZvciBub3dcbiAgICBsZXQgbGVuID0gcmluZy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IGxlbiAtIDE7IGkgPCBsZW47IGogPSBpLCBpKyspIHtcbiAgICAgICAgbGV0IHAwID0gcmluZ1tpXTtcbiAgICAgICAgbGV0IHAxID0gcmluZ1tqXTtcbiAgICAgICAgbGV0IGYgPSBwMFsxXSAqIHAxWzBdIC0gcDFbMV0gKiBwMFswXTtcblxuICAgICAgICB4ICs9IChwMFswXSArIHAxWzBdKSAqIGY7XG4gICAgICAgIHkgKz0gKHAwWzFdICsgcDFbMV0pICogZjtcbiAgICAgICAgYXJlYSArPSBmICogMztcbiAgICB9XG5cbiAgICByZXR1cm4gW3ggLyBhcmVhLCB5IC8gYXJlYV07XG59O1xuXG5HZW8ubXVsdGlDZW50cm9pZCA9IGZ1bmN0aW9uIChwb2x5Z29ucykge1xuICAgIGxldCBuID0gcG9seWdvbnMubGVuZ3RoO1xuICAgIGxldCBjZW50cm9pZCA9IFswLCAwXTtcblxuICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIGxldCBjID0gR2VvLmNlbnRyb2lkKHBvbHlnb25zW3BdKTtcbiAgICAgICAgY2VudHJvaWRbMF0gKz0gY1swXTtcbiAgICAgICAgY2VudHJvaWRbMV0gKz0gY1sxXTtcbiAgICB9XG5cbiAgICBjZW50cm9pZFswXSAvPSBuO1xuICAgIGNlbnRyb2lkWzFdIC89IG47XG5cbiAgICByZXR1cm4gY2VudHJvaWQ7XG59O1xuXG5HZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IG4gPSByaW5nLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykge1xuICAgICAgICBsZXQgcDAgPSByaW5nW2ldO1xuICAgICAgICBsZXQgcDEgPSByaW5nW2krMV07XG5cbiAgICAgICAgYXJlYSArPSBwMFswXSAqIHAxWzFdIC0gcDFbMF0gKiBwMFsxXTtcbiAgICB9XG5cbiAgICBhcmVhICs9IHJpbmdbbiAtIDFdWzBdICogcmluZ1swXVsxXSAtIHJpbmdbMF1bMF0gKiByaW5nW24gLSAxXVsxXTtcbiAgICByZXR1cm4gYXJlYTtcbn07XG5cbkdlby5wb2x5Z29uUmluZ0FyZWEgPSBmdW5jdGlvbiAocmluZykge1xuICAgIHJldHVybiBNYXRoLmFicyhHZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtKHJpbmcpKSAvIDI7XG59O1xuXG4vLyBUT0RPOiBzdWJ0cmFjdCBpbm5lciByaW5nc1xuR2VvLnBvbHlnb25BcmVhID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICByZXR1cm4gR2VvLnBvbHlnb25SaW5nQXJlYShwb2x5Z29uWzBdKTtcbn07XG5cbkdlby5tdWx0aVBvbHlnb25BcmVhID0gZnVuY3Rpb24gKHBvbHlnb25zKSB7XG4gICAgbGV0IGFyZWEgPSAwO1xuXG4gICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgYXJlYSArPSBHZW8ucG9seWdvbkFyZWEocG9seWdvbnNbcF0pO1xuICAgIH1cblxuICAgIHJldHVybiBhcmVhO1xufTtcblxuR2VvLnJpbmdXaW5kaW5nID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICBsZXQgYXJlYSA9IEdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0ocmluZyk7XG4gICAgaWYgKGFyZWEgPiAwKSB7XG4gICAgICAgIHJldHVybiAnQ1cnO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmVhIDwgMCkge1xuICAgICAgICByZXR1cm4gJ0NDVyc7XG4gICAgfVxuICAgIC8vIHJldHVybiB1bmRlZmluZWQgb24gemVybyBhcmVhIHBvbHlnb25cbn07XG4iLCIvLyBXZWJHTCBjb25zdGFudHMgLSBuZWVkIHRvIGltcG9ydCB0aGVzZSBzZXBhcmF0ZWx5IHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgaW4gdGhlIHdlYiB3b3JrZXJcblxudmFyIGdsO1xuZXhwb3J0IGRlZmF1bHQgZ2wgPSB7fTtcblxuLyogRGF0YVR5cGUgKi9cbmdsLkJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMDtcbmdsLlVOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICA9IDB4MTQwMTtcbmdsLlNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMjtcbmdsLlVOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICA9IDB4MTQwMztcbmdsLklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNDtcbmdsLlVOU0lHTkVEX0lOVCAgICAgICAgICAgICAgICAgICA9IDB4MTQwNTtcbmdsLkZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjtcbiIsIi8vIFdlYkdMIGNvbnRleHQgd3JhcHBlclxuXG52YXIgQ29udGV4dDtcbmV4cG9ydCBkZWZhdWx0IENvbnRleHQgPSB7fTtcblxubGV0IGNvbnRleHRfaWQgPSAwO1xuXG4vLyBTZXR1cCBhIFdlYkdMIGNvbnRleHRcbi8vIElmIG5vIGNhbnZhcyBlbGVtZW50IGlzIHByb3ZpZGVkLCBvbmUgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGJvZHlcbkNvbnRleHQuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uIGdldENvbnRleHQgKGNhbnZhcywgb3B0aW9ucylcbntcbiAgICB2YXIgZnVsbHNjcmVlbiA9IGZhbHNlO1xuICAgIGlmIChjYW52YXMgPT0gbnVsbCkge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgY2FudmFzLnN0eWxlLnRvcCA9IDA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcbiAgICAgICAgY2FudmFzLnN0eWxlLnpJbmRleCA9IC0xO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgICAgIGZ1bGxzY3JlZW4gPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdGlvbnMpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBvcHRpb25zKTtcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGNyZWF0ZSBXZWJHTCBjb250ZXh0LlwiKTtcbiAgICB9XG4gICAgZ2wuX3RhbmdyYW1faWQgPSBjb250ZXh0X2lkKys7XG5cbiAgICBpZiAoIWZ1bGxzY3JlZW4pIHtcbiAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLndpZHRoKSwgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUuaGVpZ2h0KSwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQsIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIENvbnRleHQucmVzaXplKGdsLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnbDtcbn07XG5cbkNvbnRleHQucmVzaXplID0gZnVuY3Rpb24gKGdsLCB3aWR0aCwgaGVpZ2h0LCBkZXZpY2VfcGl4ZWxfcmF0aW8pXG57XG4gICAgZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgZ2wuY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgIGdsLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgIGdsLmNhbnZhcy53aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiBkZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIGdsLmNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIGRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICBnbC52aWV3cG9ydCgwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQpO1xufTtcbiIsIi8vIFdlYkdMIGV4dGVuc2lvbiB3cmFwcGVyXG4vLyBTdG9yZXMgZXh0ZW5zaW9ucyBieSBuYW1lIGFuZCBHTCBjb250ZXh0XG5cbi8vIGxpc3Qgb2YgZXh0ZW5zaW9uIGFycmF5cywgZm9yIGVhY2ggZW50cnksIDFzdCBlbGVtZW50IEdMIGNvbnRleHQsIDJuZCBtYXAgb2YgZXh0ZW5zaW9ucyBieSBuYW1lXG5sZXQgZXh0ZW5zaW9ucyA9IFtdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRFeHRlbnNpb24gKGdsLCBuYW1lKSB7XG4gICAgbGV0IGV4dHMgPSBleHRlbnNpb25zLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICBleHRzID0gZXh0cyAmJiBleHRzWzFdO1xuXG4gICAgaWYgKCFleHRzKSB7XG4gICAgICAgIGV4dGVuc2lvbnMucHVzaChbZ2wsIHt9XSk7XG4gICAgICAgIGV4dHMgPSBleHRlbnNpb25zW2V4dGVuc2lvbnMubGVuZ3RoLTFdWzFdO1xuICAgIH1cblxuICAgIGlmICghZXh0c1tuYW1lXSkge1xuICAgICAgICBleHRzW25hbWVdID0gZ2wuZ2V0RXh0ZW5zaW9uKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXh0c1tuYW1lXTtcbn1cbiIsInZhciBHTFNMID0ge307XG5leHBvcnQgZGVmYXVsdCBHTFNMO1xuXG4vKipcbiAgICBQYXJzZSB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCBpbmZlcnMgdHlwZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZVxuICAgIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBzZXQgdW5pZm9ybSB2YWx1ZXMgb24gYSBHTCBwcm9ncmFtLiBFYWNoIG9iamVjdCBpbiB0aGUgcmV0dXJuZWRcbiAgICBhcnJheSBoYXMgdGhlIGZvcm06XG4gICAgeyB0eXBlLCBtZXRob2QsIG5hbWUsIHZhbHVlIH1cblxuICAgIHR5cGU6IHRoZSBHTCB1bmlmb3JtIHR5cGUsIHN1Y2ggYXMgJ3ZlYzMnLCAnZmxvYXQnLCBldGMuXG4gICAgbWV0aG9kOiB0aGUgR0wgdW5pZm9ybSBzZXR0ZXIgbWV0aG9kIHRvIHVzZSwgc3VjaCBhcyAnMWYnLCAnM2Z2JywgZXRjLlxuICAgIG5hbWU6IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgR0wgdW5pZm9ybSBsb2NhdGlvbiwgZS5nLiAnYXJyYXlbMF0uZmllbGQnLCBldGMuXG4gICAgdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIEdMIHVuaWZvcm0gc2V0dGVyIGZvciB0aGF0IHR5cGUsIGUuZy4gWzEsIDIsIDNdIGZvciBhIHZlYzNcblxuICAgIFRleHR1cmVzIGhhdmUgc3BlY2lhbCBiZWhhdmlvcjogdW5pZm9ybXMgd2l0aCBzdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIHRleHR1cmVzLCBhbmRcbiAgICB0aGUgc3RyaW5nIGlzIHVzZWQgYXMgYSB1bmlxdWUgdGV4dHVyZSAna2V5JyB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgY2FsbGVyICh3aGljaCBpcyByZXNwb25zaWJsZVxuICAgIGZvciBhY3R1YWxseSBzZXR0aW5nIHRoZSB1bmlmb3JtcykuIEZvciBleGFtcGxlLCB0aGlzIGNvdWxkIGJlIHVzZWQgYXMgYSBrZXkgaW50byBhIGRpY3Rpb25hcnkgb2ZcbiAgICBrbm93biB0ZXh0dXJlIG5hbWVzLCBvciBpdCBjb3VsZCBzaW1wbHkgYmUgdXNlZCBhcyBhIFVSTCB0byBkeW5hbWljYWxseSBsb2FkIHRoZSB0ZXh0dXJlIGZyb20uXG4qL1xuR0xTTC5wYXJzZVVuaWZvcm1zID0gZnVuY3Rpb24gKHVuaWZvcm1zKSB7XG4gICAgdmFyIHBhcnNlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiB1bmlmb3Jtcykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZTsgLy8gc2F2ZSB0aGUgb3JpZ2luYWwgbmFtZVxuICAgICAgICB2YXIgdW5pZm9ybSA9IHVuaWZvcm1zW25hbWVdO1xuICAgICAgICB2YXIgdTtcblxuICAgICAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWYnLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheTogdmVjdG9yLCBhcnJheSBvZiBmbG9hdHMsIGFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybSkpIHtcbiAgICAgICAgICAgIC8vIE51bWVyaWMgdmFsdWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS5sZW5ndGggPj0gMiAmJiB1bmlmb3JtLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHVuaWZvcm0ubGVuZ3RoICsgJ2Z2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmbG9hdCBhcnJheVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaWZvcm0ubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXRbXScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbMF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHU9MDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1snICsgdSArICddJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXJyYXkgb2YgYXJyYXlzIC0gYnV0IG9ubHkgYXJyYXlzIG9mIHZlY3RvcnMgYXJlIGFsbG93ZWQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVuaWZvcm1bMF0pICYmIHR5cGVvZiB1bmlmb3JtWzBdWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1bMF0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybVswXS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGZvciAodT0wOyB1IDwgdW5pZm9ybS5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybVswXS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtW3VdLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbJyArIHUgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1bdV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IGVsc2Ugd2FybmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvb2xlYW5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRleHR1cmVcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQ7XG59O1xuXG4vKipcbiAgICBHZW5lcmF0ZSBhIEdMU0wgdmFyaWFibGUgZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciB0eXBlLCBhcnJheTtcblxuICAgIC8vIFNpbmdsZSBmbG9hdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgIH1cbiAgICAvLyBNdWx0aXBsZSBmbG9hdHMgLSB2ZWN0b3Igb3IgYXJyYXlcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBOdW1lcmljIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJiB2YWx1ZS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAndmVjJyArIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZsb2F0IGFycmF5XG4gICAgICAgICAgICBlbHNlIHsgLy9pZiAodmFsdWUubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgICAgICAgICAgICAgIGFycmF5ID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0eXBlID0gJ3NhbXBsZXIyRCc7XG4gICAgICAgICAgICBhcnJheSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCb29sZWFuXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdHlwZSA9ICdib29sJztcbiAgICB9XG4gICAgLy8gVGV4dHVyZVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHlwZSA9ICdzYW1wbGVyMkQnO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB2YXJpYWJsZSBkZWZpbml0aW9uXG4gICAgdmFyIHZhcmlhYmxlID0gJyc7XG4gICAgdmFyaWFibGUgKz0gYCR7dHlwZX0gJHtuYW1lfWA7XG4gICAgaWYgKGFycmF5KSB7XG4gICAgICAgIHZhcmlhYmxlICs9IGBbJHthcnJheX1dYDtcbiAgICB9XG4gICAgdmFyaWFibGUgKz0gJztcXG4nO1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlO1xufTtcblxuLyoqXG4gICAgR2VuZXJhdGUgYSBHTFNMIHVuaWZvcm0gZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVVbmlmb3JtID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuICd1bmlmb3JtICcgKyBHTFNMLmRlZmluZVZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcbn07XG5cbi8qKlxuICAgIENoZWNrIGZvciBhIHVuaWZvcm0gZGVmaW5pdGlvbiBvZiAnbmFtZScgaW4gdGhlIHByb3ZpZGVkIEdMU0wgc291cmNlXG4gICAgU2ltcGxlIHJlZ2V4IGNoZWNrIGZvciAndW5pZm9ybScga2V5d29yZCBhbmQgdmFyIG5hbWUsIGRvZXMgbm90IGF0dGVtcHQgdG8gcGFyc2UvZXh0cmFjdCBHTFNMXG4gICAgTk9URTogYXNzdW1lcyBjb21tZW50cyBoYXZlIGJlZW4gc3RyaXBwZWQgZnJvbSBzb3VyY2VcbiovXG5HTFNMLmlzVW5pZm9ybURlZmluZWQgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlKSB7XG4gICAgLy8gTWF0Y2gsIGluIG9yZGVyOlxuICAgIC8vIC0gdGhlIGtleXdvcmQgJ3VuaWZvcm0nXG4gICAgLy8gLSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIHRoYXQgaXMgYW55dGhpbmcgZXhjZXB0IGEgc2VtaWNvbG9uLCA7XG4gICAgLy8gLSBvcHRpb25hbGx5LCBhbnl0aGluZyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMsIHsgLi4uIH0gKGFuIGlubGluZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBjYW4gZ28gaGVyZSlcbiAgICAvLyAtIG9wdGlvbmFsbHksIGFueSAjIG9mIGNoYXJhY3RlcnMgdGhhdCBpcyBub3QgYSBzZW1pY29sb24sIDtcbiAgICAvLyAtIHRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtXG5cbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCd1bmlmb3JtW147XSsoPzp7W1xcXFxzXFxcXFNdKn0pP1teO10qXFxcXGInICsgbmFtZSArICdcXFxcYicsICdnJyk7XG4gICAgaWYgKHNvdXJjZS5tYXRjaChyZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICAgIENoZWNrIHRoYXQgYSBzeW1ib2wgaXMgcmVmZXJlbmNlZCBpbiB0aGUgR0xTTCBzb3VyY2VcbiAgICBOT1RFOiBhc3N1bWVzIGNvbW1lbnRzIGhhdmUgYmVlbiBzdHJpcHBlZCBmcm9tIHNvdXJjZVxuKi9cbkdMU0wuaXNTeW1ib2xSZWZlcmVuY2VkID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1xcXFxiJyArIG5hbWUgKyAnXFxcXGInLCAnZycpO1xuICAgIGlmIChzb3VyY2Uuc2VhcmNoKHJlKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAgICBFeHBhbmQgYSBzaW5nbGUgdmFsdWUgb3IgMi1lbGVtZW50IGFycmF5IGludG8gYSAzLWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGxhc3QgKCB6IClcbiAgICBjb29yZGluYXRlIGRlZmF1bHRpbmcgdG8gMSAod2l0aCBvcHRpb24gdG8gc3BlY2lmeSkuIEFsc28gcnVucyBwYXJzZUZsb2F0IHRvIHRyeSB0byBtYWludGFpblxuICAgIGRhdGEgaW50ZWdyaXR5LiBSZXR1cm5zIG51bGwgaWYgaW5wdXQgY291bGRuJ3QgYmUgcGFyc2VkLlxuKi9cbkdMU0wuZXhwYW5kVmVjMyA9IGZ1bmN0aW9uICh2LCB6ID0gMSkge1xuICAgIGxldCB4O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgeCA9IFsuLi52LCB6XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgeCA9IFt2LCB2LCB2XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgaWYgKHggJiYgeC5ldmVyeShuID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obikpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbn07XG5cbi8qKlxuICAgIEV4cGFuZCBhIHNpbmdsZSB2YWx1ZSBvciAzLWVsZW1lbnQgYXJyYXkgaW50byBhIDQtZWxlbWVudCBhcnJheSwgd2l0aCB0aGUgbGFzdCAoZS5nLiB3IG9yIGEpXG4gICAgY29vcmRpbmF0ZSBkZWZhdWx0aW5nIHRvIDEgKHdpdGggb3B0aW9uIHRvIHNwZWNpZnkpLiBBbHNvIHJ1bnMgcGFyc2VGbG9hdCB0byB0cnkgdG8gbWFpbnRhaW5cbiAgICBkYXRhIGludGVncml0eS4gUmV0dXJucyBudWxsIGlmIGlucHV0IGNvdWxkbid0IGJlIHBhcnNlZC5cbiovXG5HTFNMLmV4cGFuZFZlYzQgPSBmdW5jdGlvbiAodiwgdyA9IDEpIHtcbiAgICBsZXQgeDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBpZiAodi5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIHggPSBbLi4udiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHggPSBbdiwgdiwgdiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGlmICh4ICYmIHguZXZlcnkobiA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG4pKSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59O1xuXG5cbiIsIlxuZXhwb3J0IGNsYXNzIFJlbmRlclN0YXRlIHtcblx0Y29uc3RydWN0b3IgKHZhbHVlLCBzZXR1cCkge1xuICAgICAgICBzZXR1cCh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwO1xuICAgIH1cblxuICAgIHNldCAodmFsdWUpIHtcbiAgICBcdC8vIGlmIHRoZSBzdGF0ZXMgYXJlIGRpZmZlcmVudCwgY2FsbCB0aGUgR0wgY29udGV4dCBmb3IgYSBzdGF0ZSBjaGFuZ2VcbiAgICBcdGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XG4gICAgXHRcdHRoaXMuc2V0dXAodmFsdWUpO1xuICAgIFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgXHR9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJTdGF0ZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IgKGdsKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7fTtcblxuICAgICAgICAvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlID0gZ2wuQkFDSztcblxuICAgICAgICAvLyBCbGVuZGluZ1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3QgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyY19hbHBoYSA9IGdsLk9ORTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3RfYWxwaGEgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXG4gICAgICAgIC8vIERlcHRoIHRlc3Qvd3JpdGVcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5kZXB0aF93cml0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuZGVwdGhfdGVzdCA9IHRydWU7XG4gICAgICAgIGdsLmRlcHRoRnVuYyhnbC5MRVNTKTsgLy8gZGVwdGggZnVuY3Rpb24gb25seSBuZWVkcyB0byBiZSBzZXQgb25jZVxuXG4gICAgXHQvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuY3VsbGluZyA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgY3VsbDogdGhpcy5kZWZhdWx0cy5jdWxsaW5nLCBmYWNlOiB0aGlzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSB9LFxuICAgIFx0XHQodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuY3VsbCkge1xuICAgIFx0XHRcdFx0Z2wuZW5hYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgICAgICBcdFx0Z2wuY3VsbEZhY2UodmFsdWUuZmFjZSk7XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIEJsZW5kaW5nIG1vZGVcbiAgICAgICAgdGhpcy5ibGVuZGluZyA9IG5ldyBSZW5kZXJTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYmxlbmQ6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmcsXG4gICAgICAgICAgICAgICAgc3JjOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyYyxcbiAgICAgICAgICAgICAgICBkc3Q6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0LFxuICAgICAgICAgICAgICAgIHNyY19hbHBoYTogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmNfYWxwaGEsXG4gICAgICAgICAgICAgICAgZHN0X2FscGhhOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdF9hbHBoYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5ibGVuZCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5CTEVORCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnNyY19hbHBoYSAmJiB2YWx1ZS5kc3RfYWxwaGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKHZhbHVlLnNyYywgdmFsdWUuZHN0LCB2YWx1ZS5zcmNfYWxwaGEsIHZhbHVlLmRzdF9hbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmModmFsdWUuc3JjLCB2YWx1ZS5kc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gRGVwdGggd3JpdGVcbiAgICAgICAgdGhpcy5kZXB0aF93cml0ZSA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfd3JpdGU6IHRoaXMuZGVmYXVsdHMuZGVwdGhfd3JpdGUgfSxcbiAgICBcdFx0KHZhbHVlKSA9PiB7XG4gICAgICAgIFx0XHRnbC5kZXB0aE1hc2sodmFsdWUuZGVwdGhfd3JpdGUpO1xuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBEZXB0aCB0ZXN0XG4gICAgICAgIHRoaXMuZGVwdGhfdGVzdCA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfdGVzdDogdGhpcy5kZWZhdWx0cy5kZXB0aF90ZXN0IH0sXG4gICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuZGVwdGhfdGVzdCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgICAgICAgICAgXHRcdGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgfVxuXG59XG4iLCIvLyBHTCBwcm9ncmFtIHdyYXBwZXIgdG8gY2FjaGUgdW5pZm9ybSBsb2NhdGlvbnMvdmFsdWVzLCBkbyBjb21waWxlLXRpbWUgcHJlLXByb2Nlc3Npbmdcbi8vIChpbmplY3RpbmcgI2RlZmluZXMgYW5kICNwcmFnbWEgYmxvY2tzIGludG8gc2hhZGVycyksIGV0Yy5cblxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbHNsJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgZ2V0RXh0ZW5zaW9uIGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5cbmltcG9ydCBzdHJpcCBmcm9tICdzdHJpcC1jb21tZW50cyc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlU2hhZGVyRXJyb3JzIH0gZnJvbSAnZ2wtc2hhZGVyLWVycm9ycyc7XG5cbi8vIFJlZ2V4IHBhdHRlcm5zXG5jb25zdCByZV9wcmFnbWEgPSAvXlxccyojcHJhZ21hLiokL2dtOyAgIC8vIGZvciByZW1vdmluZyB1bnVzZWQgcHJhZ21hcyBhZnRlciBzaGFkZXIgYmxvY2sgaW5qZWN0aW9uXG5jb25zdCByZV9jb250aW51ZV9saW5lID0gL1xcXFxcXHMqXFxuL21nOyAgIC8vIGZvciByZW1vdmluZyBiYWNrc2xhc2ggbGluZSBjb250aW51YXRpb25zXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYWRlclByb2dyYW0ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHZlcnRleF9zb3VyY2UsIGZyYWdtZW50X3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8ga2V5L3ZhbHVlcyBpbnNlcnRlZCBhcyAjZGVmaW5lcyBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuZGVmaW5lc3x8e30pO1xuXG4gICAgICAgIC8vIGtleS92YWx1ZXMgZm9yIGJsb2NrcyB0aGF0IGNhbiBiZSBpbmplY3RlZCBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuYmxvY2tzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5ibG9ja3N8fHt9KTtcbiAgICAgICAgdGhpcy5ibG9ja19zY29wZXMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmJsb2NrX3Njb3Blc3x8e30pO1xuXG4gICAgICAgIC8vIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byBhY3RpdmF0ZVxuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBvcHRpb25zLmV4dGVuc2lvbnMgfHwgW107XG5cbiAgICAgICAgLy8gSlMtb2JqZWN0IHVuaWZvcm1zIHRoYXQgYXJlIGV4cGVjdGVkIGJ5IHRoaXMgcHJvZ3JhbVxuICAgICAgICAvLyBJZiB0aGV5IGFyZSBub3QgZm91bmQgaW4gdGhlIGV4aXN0aW5nIHNoYWRlciBzb3VyY2UsIHRoZWlyIHR5cGVzIHdpbGwgYmUgaW5mZXJyZWQgYW5kIGRlZmluaXRpb25zXG4gICAgICAgIC8vIGZvciBlYWNoIHdpbGwgYmUgaW5qZWN0ZWQuXG4gICAgICAgIHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcblxuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307IC8vIHByb2dyYW0gbG9jYXRpb25zIG9mIHVuaWZvcm1zLCBsYXppbHkgYWRkZWQgYXMgZWFjaCB1bmlmb3JtIGlzIHNldFxuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTsgLy8gcHJvZ3JhbSBsb2NhdGlvbnMgb2YgdmVydGV4IGF0dHJpYnV0ZXMsIGxhemlseSBhZGRlZCBhcyBlYWNoIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZFxuXG4gICAgICAgIHRoaXMudmVydGV4X3NvdXJjZSA9IHZlcnRleF9zb3VyY2U7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRfc291cmNlID0gZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTaGFkZXJQcm9ncmFtLmlkKys7XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTsgLy8gY2FuIHByb3ZpZGUgYSBwcm9ncmFtIG5hbWUgKHVzZWZ1bCBmb3IgZGVidWdnaW5nKVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICAgICAgdGhpcy5nbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTtcbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZ3JhbSB3cmFwcGVyIHdpdGggc2ltcGxlIHN0YXRlIGNhY2hlXG4gICAgdXNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChTaGFkZXJQcm9ncmFtLmN1cnJlbnQgIT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIFNoYWRlclByb2dyYW0uY3VycmVudCA9IHRoaXM7XG4gICAgfVxuXG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYFNoYWRlclByb2dyYW0uY29tcGlsZSgpOiBza2lwcGluZyBmb3IgJHt0aGlzLmlkfSAoJHt0aGlzLm5hbWV9KSBiZWNhdXNlIGFscmVhZHkgY29tcGlsaW5nYCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcblxuICAgICAgICAvLyBDb3B5IHNvdXJjZXMgZnJvbSBwcmUtbW9kaWZpZWQgdGVtcGxhdGVcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy52ZXJ0ZXhfc291cmNlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBleHRlbnNpb24gYXZhaWxhYmlsaXR5XG4gICAgICAgIGxldCBleHRlbnNpb25zID0gdGhpcy5jaGVja0V4dGVuc2lvbnMoKTtcblxuICAgICAgICAvLyBNYWtlIGxpc3Qgb2YgZGVmaW5lcyB0byBiZSBpbmplY3RlZCBsYXRlclxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG5cbiAgICAgICAgLy8gSW5qZWN0IHVzZXItZGVmaW5lZCBibG9ja3MgKGFyYml0cmFyeSBjb2RlIHBvaW50cyBtYXRjaGluZyBuYW1lZCAjcHJhZ21hcylcbiAgICAgICAgLy8gUmVwbGFjZSBhY2NvcmRpbmcgdG8gdGhpcyBwYXR0ZXJuOlxuICAgICAgICAvLyAjcHJhZ21hIHRhbmdyYW06IFtrZXldXG4gICAgICAgIC8vIGUuZy4gI3ByYWdtYSB0YW5ncmFtOiBnbG9iYWxcblxuICAgICAgICAvLyBHYXRoZXIgYWxsIGJsb2NrIGNvZGUgc25pcHBldHNcbiAgICAgICAgdmFyIGJsb2NrcyA9IHRoaXMuYnVpbGRTaGFkZXJCbG9ja0xpc3QoKTtcbiAgICAgICAgdmFyIHJlZ2V4cDtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYmxvY2tzKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2sgPSBibG9ja3Nba2V5XTtcbiAgICAgICAgICAgIGlmICghYmxvY2sgfHwgKEFycmF5LmlzQXJyYXkoYmxvY2spICYmIGJsb2NrLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlyc3QgZmluZCBjb2RlIHJlcGxhY2UgcG9pbnRzIGluIHNoYWRlcnNcbiAgICAgICAgICAgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ15cXFxccyojcHJhZ21hXFxcXHMrdGFuZ3JhbTpcXFxccysnICsga2V5ICsgJ1xcXFxzKiQnLCAnbScpO1xuICAgICAgICAgICAgdmFyIGluamVjdF92ZXJ0ZXggPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UubWF0Y2gocmVnZXhwKTtcbiAgICAgICAgICAgIHZhciBpbmplY3RfZnJhZ21lbnQgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5tYXRjaChyZWdleHApO1xuXG4gICAgICAgICAgICAvLyBBdm9pZCBuZXR3b3JrIHJlcXVlc3QgaWYgbm90aGluZyB0byByZXBsYWNlXG4gICAgICAgICAgICBpZiAoaW5qZWN0X3ZlcnRleCA9PSBudWxsICYmIGluamVjdF9mcmFnbWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvbWJpbmUgYWxsIGJsb2NrcyBpbnRvIG9uZSBzdHJpbmdcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSAnJztcbiAgICAgICAgICAgIGJsb2NrLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIHN0YXJ0IGFuZCBlbmQgb2YgZWFjaCBibG9jayB3aXRoIG1ldGFkYXRhICh3aGljaCBjYW4gYmUgZXh0cmFjdGVkIGZyb21cbiAgICAgICAgICAgICAgICAvLyBmaW5hbCBzb3VyY2UgZm9yIGVycm9yIGhhbmRsaW5nLCBkZWJ1Z2dpbmcsIGV0Yy4pXG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBgJHt2YWwuc2NvcGV9LCAke3ZhbC5rZXl9LCAke3ZhbC5udW19YDtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gYFxcbi8vIHRhbmdyYW0tYmxvY2stc3RhcnQ6ICR7bWFya31cXG5gO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSB2YWwuc291cmNlO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSBgXFxuLy8gdGFuZ3JhbS1ibG9jay1lbmQ6ICR7bWFya31cXG5gO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEluamVjdFxuICAgICAgICAgICAgaWYgKGluamVjdF92ZXJ0ZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlZ2V4cCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmplY3RfZnJhZ21lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZWdleHAsIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBhICNkZWZpbmUgZm9yIHRoaXMgaW5qZWN0aW9uIHBvaW50XG4gICAgICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0JMT0NLXycgKyBrZXkucmVwbGFjZSgvW1xccy1dKy9nLCAnXycpLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuLXVwIGFueSAjcHJhZ21hcyB0aGF0IHdlcmVuJ3QgcmVwbGFjZWQgKHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlX3ByYWdtYSwgJycpO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVfcHJhZ21hLCAnJyk7XG5cbiAgICAgICAgLy8gRGV0ZWN0IHVuaWZvcm0gZGVmaW5pdGlvbnMsIGluamVjdCBhbnkgbWlzc2luZyBvbmVzXG4gICAgICAgIHRoaXMuZW5zdXJlVW5pZm9ybXModGhpcy5kZXBlbmRlbnRfdW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEJ1aWxkICYgaW5qZWN0IGV4dGVuc2lvbnMgJiBkZWZpbmVzXG4gICAgICAgIC8vIFRoaXMgaXMgZG9uZSAqYWZ0ZXIqIGNvZGUgaW5qZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCBkZWZpbmVzIGZvciB3aGljaCBjb2RlIHBvaW50cyB3ZXJlIGluamVjdGVkXG4gICAgICAgIGxldCBwcmVjaXNpb24gPSAnJztcbiAgICAgICAgbGV0IGhpZ2ggPSB0aGlzLmdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCh0aGlzLmdsLkZSQUdNRU5UX1NIQURFUiwgdGhpcy5nbC5ISUdIX0ZMT0FUKTtcbiAgICAgICAgaWYgKGhpZ2ggJiYgaGlnaC5wcmVjaXNpb24gPiAwKSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9GUkFHTUVOVF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPVxuICAgICAgICAgICAgcHJlY2lzaW9uICtcbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcoZGVmaW5lcykgK1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuXG4gICAgICAgIC8vIFByZWNpc2lvbiBxdWFsaWZpZXIgb25seSB2YWxpZCBpbiBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgLy8gTkI6ICcjZXh0ZW5zaW9uJyBzdGF0ZW1lbnRzIGFkZGVkIHRvIGZyYWdtZW50IHNoYWRlciBvbmx5LCBhcyBJRTExIHRocm93cyBlcnJvciB3aGVuIHRoZXkgYXBwZWFyIGluXG4gICAgICAgIC8vIHZlcnRleCBzaGFkZXIgKGV2ZW4gd2hlbiBndWFyZGVkIGJ5ICNpZmRlZiksIGFuZCBubyBXZWJHTCBleHRlbnNpb25zIHJlcXVpcmUgJyNleHRlbnNpb24nIGluIHZlcnRleCBzaGFkZXJzXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gZmFsc2U7XG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fRlJBR01FTlRfU0hBREVSJ10gPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9XG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRXh0ZW5zaW9uU3RyaW5nKGV4dGVuc2lvbnMpICtcbiAgICAgICAgICAgIHByZWNpc2lvbiArXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nKGRlZmluZXMpICtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgbXVsdGktbGluZSBiYWNrc2xhc2hlc1xuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZV9jb250aW51ZV9saW5lLCAnJyk7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZV9jb250aW51ZV9saW5lLCAnJyk7XG5cbiAgICAgICAgLy8gQ29tcGlsZSAmIHNldCB1bmlmb3JtcyB0byBjYWNoZWQgdmFsdWVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLnVwZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtLCB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UsIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cbiAgICAgICAgICAgIC8vIHNoYWRlciBlcnJvciBpbmZvXG4gICAgICAgICAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ3ZlcnRleCcgfHwgZXJyb3IudHlwZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyX2Vycm9ycyA9IGVycm9yLmVycm9ycztcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcl9lcnJvcnMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZS50eXBlID0gZXJyb3IudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgZS5ibG9jayA9IHRoaXMuYmxvY2soZXJyb3IudHlwZSwgZS5saW5lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBTaGFkZXJQcm9ncmFtLmNvbXBpbGUoKTogcHJvZ3JhbSAke3RoaXMuaWR9ICgke3RoaXMubmFtZX0pIGVycm9yOmAsIGVycm9yKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hVbmlmb3JtcygpO1xuICAgICAgICB0aGlzLnJlZnJlc2hBdHRyaWJ1dGVzKCk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBsaXN0IG9mIGRlZmluZXMgKGdsb2JhbCwgdGhlbiBwcm9ncmFtLXNwZWNpZmljKVxuICAgIGJ1aWxkRGVmaW5lTGlzdCgpIHtcbiAgICAgICAgdmFyIGQsIGRlZmluZXMgPSB7fTtcbiAgICAgICAgZm9yIChkIGluIFNoYWRlclByb2dyYW0uZGVmaW5lcykge1xuICAgICAgICAgICAgZGVmaW5lc1tkXSA9IFNoYWRlclByb2dyYW0uZGVmaW5lc1tkXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGQgaW4gdGhpcy5kZWZpbmVzKSB7XG4gICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVzO1xuICAgIH1cblxuICAgIC8vIE1ha2UgbGlzdCBvZiBzaGFkZXIgYmxvY2tzIChnbG9iYWwsIHRoZW4gcHJvZ3JhbS1zcGVjaWZpYylcbiAgICBidWlsZFNoYWRlckJsb2NrTGlzdCgpIHtcbiAgICAgICAgbGV0IGtleSwgYmxvY2tzID0ge307XG5cbiAgICAgICAgLy8gR2xvYmFsIGJsb2Nrc1xuICAgICAgICBmb3IgKGtleSBpbiBTaGFkZXJQcm9ncmFtLmJsb2Nrcykge1xuICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBbXTtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAuLi5TaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLm1hcCgoc291cmNlLCBudW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGtleSwgc291cmNlLCBudW0sIHNjb3BlOiAnU2hhZGVyUHJvZ3JhbScgfTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBbeyBrZXksIHNvdXJjZTogU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSwgbnVtOiAwLCBzY29wZTogJ1NoYWRlclByb2dyYW0nIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvZ3JhbS1zcGVjaWZpYyBibG9ja3NcbiAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5ibG9ja3MpIHtcbiAgICAgICAgICAgIGJsb2Nrc1trZXldID0gYmxvY2tzW2tleV0gfHwgW107XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYmxvY2tzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNjb3BlcyA9ICh0aGlzLmJsb2NrX3Njb3BlcyAmJiB0aGlzLmJsb2NrX3Njb3Blc1trZXldKSB8fCBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY3VyX3Njb3BlID0gbnVsbCwgbnVtID0gMDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGI9MDsgYiA8IHRoaXMuYmxvY2tzW2tleV0ubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgYmxvY2tzIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3Blc1tiXSAhPT0gY3VyX3Njb3BlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJfc2NvcGUgPSBzY29wZXNbYl07XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuYmxvY2tzW2tleV1bYl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZTogY3VyX3Njb3BlIHx8IHRoaXMubmFtZVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBudW0rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGRyZXNzIGRpc2NyZXBhbmN5IGluIGFycmF5IHZzLiBzaW5nbGUtdmFsdWUgYmxvY2tzXG4gICAgICAgICAgICAgICAgLy8gc3R5bGVzIGFzc3VtZSBhcnJheSB3aGVuIHRyYWNraW5nIGJsb2NrIHNjb3Blc1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goeyBrZXksIHNvdXJjZTogdGhpcy5ibG9ja3Nba2V5XSwgbnVtOiAwLCBzY29wZTogdGhpcy5uYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9ja3M7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IHVuaWZvcm0gZGVmaW5pdGlvbnMsIGluamVjdCBhbnkgbWlzc2luZyBvbmVzXG4gICAgZW5zdXJlVW5pZm9ybXModW5pZm9ybXMpIHtcbiAgICAgICAgaWYgKCF1bmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZzID0gc3RyaXAodGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlKTtcbiAgICAgICAgdmFyIGZzID0gc3RyaXAodGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UpO1xuICAgICAgICB2YXIgaW5qZWN0LCB2c19pbmplY3Rpb25zID0gW10sIGZzX2luamVjdGlvbnMgPSBbXTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgbWlzc2luZyB1bmlmb3JtIGRlZmluaXRpb25zXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGluamVjdCA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHZlcnRleCBzaGFkZXJcbiAgICAgICAgICAgIGlmICghR0xTTC5pc1VuaWZvcm1EZWZpbmVkKG5hbWUsIHZzKSkge1xuICAgICAgICAgICAgICAgIGlmICghaW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdCA9IEdMU0wuZGVmaW5lVW5pZm9ybShuYW1lLCB1bmlmb3Jtc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgUHJvZ3JhbSAke3RoaXMubmFtZX06ICR7bmFtZX0gbm90IGRlZmluZWQgaW4gdmVydGV4IHNoYWRlciwgaW5qZWN0aW5nOiAnJHtpbmplY3R9J2ApO1xuICAgICAgICAgICAgICAgIHZzX2luamVjdGlvbnMucHVzaChpbmplY3QpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgICAgIGlmICghR0xTTC5pc1VuaWZvcm1EZWZpbmVkKG5hbWUsIGZzKSkge1xuICAgICAgICAgICAgICAgIGlmICghaW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdCA9IEdMU0wuZGVmaW5lVW5pZm9ybShuYW1lLCB1bmlmb3Jtc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgUHJvZ3JhbSAke3RoaXMubmFtZX06ICR7bmFtZX0gbm90IGRlZmluZWQgaW4gZnJhZ21lbnQgc2hhZGVyLCBpbmplY3Rpbmc6ICcke2luamVjdH0nYCk7XG4gICAgICAgICAgICAgICAgZnNfaW5qZWN0aW9ucy5wdXNoKGluamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmplY3QgbWlzc2luZyB1bmlmb3Jtc1xuICAgICAgICAvLyBOT1RFOiB0aGVzZSBhcmUgaW5qZWN0ZWQgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBzaGFkZXJzLCBldmVuIGJlZm9yZSBhbnkgI2RlZmluZXMgb3IgI3ByYWdtYXMgYXJlIGFkZGVkXG4gICAgICAgIC8vIHRoaXMgY291bGQgY2F1c2Ugc29tZSBpc3N1ZXMgd2l0aCBjZXJ0YWluICNwcmFnbWFzLCBvciBvdGhlciBmdW5jdGlvbnMgdGhhdCBtaWdodCBleHBlY3QgI2RlZmluZXNcbiAgICAgICAgaWYgKHZzX2luamVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdnNfaW5qZWN0aW9ucy5qb2luKCdcXG4nKSArIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmc19pbmplY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gZnNfaW5qZWN0aW9ucy5qb2luKCdcXG4nKSArIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IHVuaWZvcm1zIGZyb20gYSBKUyBvYmplY3QsIHdpdGggaW5mZXJyZWQgdHlwZXNcbiAgICBzZXRVbmlmb3Jtcyh1bmlmb3JtcywgcmVzZXRfdGV4dHVyZV91bml0ID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IG9ubHkgdXBkYXRlIHVuaWZvcm1zIHdoZW4gY2hhbmdlZFxuXG4gICAgICAgIC8vIFRleHR1cmUgdW5pdHMgbXVzdCBiZSB0cmFja2VkIGFuZCBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSB0ZXh0dXJlIHNhbXBsZXIgdW5pZm9ybSBpcyBzZXQuXG4gICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSB0ZXh0dXJlIHVuaXQgaXMgcmVzZXQgdG8gMCBlYWNoIHRpbWUgc2V0VW5pZm9ybXMgaXMgY2FsbGVkLCBidXQgdGhleSBjYW5cbiAgICAgICAgLy8gYWxzbyBiZSBwcmVzZXJ2ZWQsIGZvciBleGFtcGxlIGluIGNhc2VzIHdoZXJlIG11bHRpcGxlIGNhbGxzIHRvIHNldFVuaWZvcm1zIGFyZSBleHBlY3RlZFxuICAgICAgICAvLyAoZS5nLiBwcm9ncmFtLXNwZWNpZmljIHVuaWZvcm1zIGZvbGxvd2VkIGJ5IG1lc2gtc3BlY2lmaWMgb25lcykuXG4gICAgICAgIGlmIChyZXNldF90ZXh0dXJlX3VuaXQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZV91bml0ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHVuaWZvcm0gdHlwZXMgYW5kIHZhbHVlcyBmcm9tIHRoZSBKUyBvYmplY3RcbiAgICAgICAgY29uc3QgcGFyc2VkID0gR0xTTC5wYXJzZVVuaWZvcm1zKHVuaWZvcm1zKTtcblxuICAgICAgICAvLyBTZXQgZWFjaCB1bmlmb3JtXG4gICAgICAgIGZvciAobGV0IHU9MDsgdSA8IHBhcnNlZC5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybSA9IHBhcnNlZFt1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtLnR5cGUgPT09ICdzYW1wbGVyMkQnKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHRleHR1cmVzLCB3ZSBuZWVkIHRvIHRyYWNrIHRleHR1cmUgdW5pdHMsIHNvIHdlIGhhdmUgYSBzcGVjaWFsIHNldHRlclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGV4dHVyZVVuaWZvcm0odW5pZm9ybS5uYW1lLCB1bmlmb3JtLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybSh1bmlmb3JtLm1ldGhvZCwgdW5pZm9ybS5uYW1lLCB1bmlmb3JtLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhY2hlIHNvbWUgb3IgYWxsIHVuaWZvcm0gdmFsdWVzIHNvIHRoZXkgY2FuIGJlIHJlc3RvcmVkXG4gICAgc2F2ZVVuaWZvcm1zKHN1YnNldCkge1xuICAgICAgICBsZXQgdW5pZm9ybXMgPSBzdWJzZXQgfHwgdGhpcy51bmlmb3JtcztcbiAgICAgICAgZm9yIChsZXQgdSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0pIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtLnNhdmVkX3ZhbHVlID0gdW5pZm9ybS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNhdmVkX3RleHR1cmVfdW5pdCA9IHRoaXMudGV4dHVyZV91bml0IHx8IDA7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzb21lIG9yIGFsbCB1bmlmb3JtcyB0byBzYXZlZCB2YWx1ZXNcbiAgICByZXN0b3JlVW5pZm9ybXMoc3Vic2V0KSB7XG4gICAgICAgIGxldCB1bmlmb3JtcyA9IHN1YnNldCB8fCB0aGlzLnVuaWZvcm1zO1xuICAgICAgICBmb3IgKGxldCB1IGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybSAmJiB1bmlmb3JtLnNhdmVkX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybS52YWx1ZSA9IHVuaWZvcm0uc2F2ZWRfdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dHVyZV91bml0ID0gdGhpcy5zYXZlZF90ZXh0dXJlX3VuaXQgfHwgMDtcbiAgICB9XG5cbiAgICAvLyBTZXQgYSB0ZXh0dXJlIHVuaWZvcm0sIGZpbmRzIHRleHR1cmUgYnkgbmFtZSBvciBjcmVhdGVzIGEgbmV3IG9uZVxuICAgIHNldFRleHR1cmVVbmlmb3JtKHVuaWZvcm1fbmFtZSwgdGV4dHVyZV9uYW1lKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0ZXh0dXJlX25hbWVdO1xuICAgICAgICBpZiAodGV4dHVyZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ2Fubm90IGZpbmQgdGV4dHVyZSAnJHt0ZXh0dXJlX25hbWV9J2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dHVyZS5iaW5kKHRoaXMudGV4dHVyZV91bml0KTtcbiAgICAgICAgdGhpcy51bmlmb3JtKCcxaScsIHVuaWZvcm1fbmFtZSwgdGhpcy50ZXh0dXJlX3VuaXQpO1xuICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCsrOyAvLyBUT0RPOiB0cmFjayBtYXggdGV4dHVyZSB1bml0cyBhbmQgbG9nL3Rocm93IGVycm9yc1xuICAgIH1cblxuICAgIC8vIGV4OiBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICdwb3NpdGlvbicsIFt4LCB5LCB6XSk7XG4gICAgLy8gVE9ETzogb25seSB1cGRhdGUgdW5pZm9ybXMgd2hlbiBjaGFuZ2VkXG4gICAgdW5pZm9ybShtZXRob2QsIG5hbWUsIHZhbHVlKSB7IC8vICd2YWx1ZScgaXMgYSBtZXRob2QtYXBwcm9wcmlhdGUgYXJndW1lbnRzIGxpc3RcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVuaWZvcm1zW25hbWVdID0gdGhpcy51bmlmb3Jtc1tuYW1lXSB8fCB7fTtcbiAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW25hbWVdO1xuICAgICAgICB1bmlmb3JtLm5hbWUgPSBuYW1lO1xuICAgICAgICBpZiAodW5pZm9ybS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1bmlmb3JtLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB1bmlmb3JtLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdW5pZm9ybS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGEgc2luZ2xlIHVuaWZvcm1cbiAgICB1cGRhdGVVbmlmb3JtKHVuaWZvcm0pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVuaWZvcm0gfHwgdW5pZm9ybS5sb2NhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZSgpO1xuICAgICAgICB0aGlzLmNvbW1pdFVuaWZvcm0odW5pZm9ybSk7XG4gICAgfVxuXG4gICAgLy8gQ29tbWl0cyB0aGUgdW5pZm9ybSB0byB0aGUgR1BVXG4gICAgY29tbWl0VW5pZm9ybSh1bmlmb3JtKXtcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gdW5pZm9ybS5sb2NhdGlvbjtcbiAgICAgICAgbGV0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaWZvcm0ubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlICcxaSc6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWkobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTJmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2YnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzRmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00Zihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWl2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xaXYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNpdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2l2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2Z2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0ZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTWF0cml4M2Z2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNYXRyaXg0ZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggdW5pZm9ybSBsb2NhdGlvbnMgYW5kIHNldCB0byBsYXN0IGNhY2hlZCB2YWx1ZXNcbiAgICByZWZyZXNoVW5pZm9ybXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdSBpbiB0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICB1bmlmb3JtLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCB1KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZnJlc2hBdHRyaWJ1dGVzKCkge1xuICAgICAgICAvLyB2YXIgbGVuID0gdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgdGhpcy5nbC5BQ1RJVkVfQVRUUklCVVRFUyk7XG4gICAgICAgIC8vIGZvciAodmFyIGk9MDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vICAgICB2YXIgYSA9IHRoaXMuZ2wuZ2V0QWN0aXZlQXR0cmliKHRoaXMucHJvZ3JhbSwgaSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiBhIHZlcnRleCBhdHRyaWJ1dGVcbiAgICBhdHRyaWJ1dGUobmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhdHRyaWIgPSAodGhpcy5hdHRyaWJzW25hbWVdID0gdGhpcy5hdHRyaWJzW25hbWVdIHx8IHt9KTtcbiAgICAgICAgaWYgKGF0dHJpYi5sb2NhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXR0cmliO1xuICAgICAgICB9XG5cbiAgICAgICAgYXR0cmliLm5hbWUgPSBuYW1lO1xuICAgICAgICBhdHRyaWIubG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgbmFtZSk7XG5cbiAgICAgICAgLy8gdmFyIGluZm8gPSB0aGlzLmdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLnByb2dyYW0sIGF0dHJpYi5sb2NhdGlvbik7XG4gICAgICAgIC8vIGF0dHJpYi50eXBlID0gaW5mby50eXBlO1xuICAgICAgICAvLyBhdHRyaWIuc2l6ZSA9IGluZm8uc2l6ZTtcblxuICAgICAgICByZXR1cm4gYXR0cmliO1xuICAgIH1cblxuICAgIC8vIEdldCBzaGFkZXIgc291cmNlIGFzIHN0cmluZ1xuICAgIHNvdXJjZSh0eXBlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSAndmVydGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnZnJhZ21lbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgc2hhZGVyIHNvdXJjZSBhcyBhcnJheSBvZiBsaW5lIHN0cmluZ3NcbiAgICBsaW5lcyh0eXBlKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZSh0eXBlKTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEdldCBhIHNwZWNpZmljIGxpbmUgZnJvbSBzaGFkZXIgc291cmNlXG4gICAgbGluZSh0eXBlLCBudW0pIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMubGluZXModHlwZSk7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2VbbnVtXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBpbmZvIG9uIHdoaWNoIHNoYWRlciBibG9jayAoaWYgYW55KSBhIHBhcnRpY3VsYXIgbGluZSBudW1iZXIgaW4gYSBzaGFkZXIgaXMgaW5cbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgaW5mbyBpZiBhIGJsb2NrIGlzIGZvdW5kOiB7IG5hbWUsIGxpbmUsIHNvdXJjZSB9XG4gICAgLy8gIHNjb3BlOiB3aGVyZSB0aGUgc2hhZGVyIGJsb2NrIG9yaWdpbmF0ZWQsIGVpdGhlciBhIHN0eWxlIG5hbWUsIG9yIGdsb2JhbCBzdWNoIGFzIFNoYWRlclByb2dyYW1cbiAgICAvLyAgbmFtZTogc2hhZGVyIGJsb2NrIG5hbWUgKGUuZy4gJ2NvbG9yJywgJ3Bvc2l0aW9uJywgJ2dsb2JhbCcpXG4gICAgLy8gIG51bTogdGhlIGJsb2NrIG51bWJlciAqd2l0aGluKiBsb2NhbCBzY29wZSAoZS5nLiBpZiBhIHN0eWxlIGhhcyBtdWx0aXBsZSAnY29sb3InIGJsb2NrcylcbiAgICAvLyAgbGluZTogbGluZSBudW1iZXIgKndpdGhpbiogdGhlIHNoYWRlciBibG9jayAobm90IHRoZSB3aG9sZSBzaGFkZXIgcHJvZ3JhbSksIHVzZWZ1bCBmb3IgZXJyb3IgaGlnaGxpZ2h0aW5nXG4gICAgLy8gIHNvdXJjZTogdGhlIGNvZGUgZm9yIHRoZSBsaW5lXG4gICAgLy8gTk9URTogdGhpcyBkb2VzIGEgYnJ1dGVmb3JjZSBsb29wIG92ZXIgdGhlIHNoYWRlciBzb3VyY2UgYW5kIGxvb2tzIGZvciBzaGFkZXIgYmxvY2sgc3RhcnQvZW5kIG1hcmtlcnNcbiAgICAvLyBXZSBjb3VsZCB0cmFjayBsaW5lIHJhbmdlcyBmb3Igc2hhZGVyIGJsb2NrcyBhcyB0aGV5IGFyZSBpbnNlcnRlZCwgYnV0IGFzIHRoaXMgY29kZSBpcyBvbmx5IHVzZWQgZm9yXG4gICAgLy8gZXJyb3IgaGFuZGxpbmcgb24gY29tcGlsYXRpb24gZmFpbHVyZSwgaXQgd2FzIHNpbXBsZXIgdG8ga2VlcCBpdCBzZXBhcmF0ZSB0aGFuIHRvIGJ1cmRlbiB0aGUgY29yZVxuICAgIC8vIGNvbXBpbGF0aW9uIHBhdGguXG4gICAgYmxvY2sodHlwZSwgbnVtKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMubGluZXModHlwZSk7XG4gICAgICAgIGxldCBibG9jaztcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtICYmIGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IGxpbmUubWF0Y2goL1xcL1xcLyB0YW5ncmFtLWJsb2NrLXN0YXJ0OiAoW0EtWmEtejAtOV8tXSspLCAoW0EtWmEtejAtOV8tXSspLCAoXFxkKykvKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBjdXJyZW50IGJsb2NrXG4gICAgICAgICAgICAgICAgYmxvY2sgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgIG51bTogbWF0Y2hbM11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBsaW5lLm1hdGNoKC9cXC9cXC8gdGFuZ3JhbS1ibG9jay1lbmQ6IChbQS1aYS16MC05Xy1dKyksIChbQS1aYS16MC05Xy1dKyksIChcXGQrKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbnVsbDsgLy8gY2xlYXIgY3VycmVudCBibG9ja1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIGxpbmUgIyBhbmQgY29udGVudFxuICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5pdCB0byAtMSBzbyB0aGF0IGxpbmUgMCBpcyBmaXJzdCBhY3R1YWwgbGluZSBvZiBibG9jayBjb2RlLCBhZnRlciBjb21tZW50IG1hcmtlclxuICAgICAgICAgICAgICAgIGJsb2NrLmxpbmUgPSAoYmxvY2subGluZSA9PSBudWxsKSA/IC0xIDogYmxvY2subGluZSArIDE7XG4gICAgICAgICAgICAgICAgYmxvY2suc291cmNlID0gbGluZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBsaXN0IG9mIGF2YWlsYWJsZSBleHRlbnNpb25zIGZyb20gdGhvc2UgcmVxdWVzdGVkXG4gICAgLy8gU2V0cyBpbnRlcm5hbCAjZGVmaW5lcyBpbmRpY2F0aW5nIGF2YWlsYWJpbGl0eSBvZiBlYWNoIHJlcXVlc3RlZCBleHRlbnNpb25cbiAgICBjaGVja0V4dGVuc2lvbnMoKSB7XG4gICAgICAgIGxldCBleHRzID0gW107XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbih0aGlzLmdsLCBuYW1lKTtcbiAgICAgICAgICAgIGxldCBkZWYgPSBgVEFOR1JBTV9FWFRFTlNJT05fJHtuYW1lfWA7XG5cbiAgICAgICAgICAgIHRoaXMuZGVmaW5lc1tkZWZdID0gKGV4dCAhPSBudWxsKTtcblxuICAgICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgICAgIGV4dHMucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ291bGQgbm90IGVuYWJsZSBleHRlbnNpb24gJyR7bmFtZX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXh0cztcbiAgICB9XG5cbn1cblxuXG4vLyBTdGF0aWMgbWV0aG9kcyBhbmQgc3RhdGVcblNoYWRlclByb2dyYW0uaWQgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ24gZWFjaCBwcm9ncmFtIGEgdW5pcXVlIGlkXG5TaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSBudWxsOyAgICAgICAgICAgLy8gY3VycmVudGx5IGJvdW5kIHByb2dyYW1cblxuLy8gR2xvYmFsIGNvbmZpZyBhcHBsaWVkIHRvIGFsbCBwcm9ncmFtcyAoZHVwbGljYXRlIHByb3BlcnRpZXMgZm9yIGEgc3BlY2lmaWMgcHJvZ3JhbSB3aWxsIHRha2UgcHJlY2VkZW5jZSlcblNoYWRlclByb2dyYW0uZGVmaW5lcyA9IHt9O1xuU2hhZGVyUHJvZ3JhbS5ibG9ja3MgPSB7fTtcblxuLy8gUmVzZXQgcHJvZ3JhbSBhbmQgc2hhZGVyIGNhY2hlc1xuU2hhZGVyUHJvZ3JhbS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZSA9IHt9OyAgLy8gR0wgcHJvZ3JhbSBvYmplY3RzIGJ5IGV4YWN0IHZlcnRleCArIGZyYWdtZW50IHNoYWRlciBzb3VyY2VcbiAgICBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlID0ge307ICAgLy8gR0wgc2hhZGVyIG9iamVjdHMgYnkgZXhhY3Qgc291cmNlXG59O1xuU2hhZGVyUHJvZ3JhbS5yZXNldCgpO1xuXG4vLyBUdXJuIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgaW50byBzaW5nbGUgc3RyaW5nIG9mICNkZWZpbmUgc3RhdGVtZW50c1xuU2hhZGVyUHJvZ3JhbS5idWlsZERlZmluZVN0cmluZyA9IGZ1bmN0aW9uIChkZWZpbmVzKSB7XG4gICAgdmFyIGRlZmluZV9zdHIgPSBcIlwiO1xuICAgIGZvciAodmFyIGQgaW4gZGVmaW5lcykge1xuICAgICAgICBpZiAoZGVmaW5lc1tkXSA9PSBudWxsIHx8IGRlZmluZXNbZF0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lc1tkXSA9PT0gJ2Jvb2xlYW4nICYmIGRlZmluZXNbZF0gPT09IHRydWUpIHsgLy8gYm9vbGVhbnMgYXJlIHNpbXBsZSBkZWZpbmVzIHdpdGggbm8gdmFsdWVcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZXNbZF0gPT09ICdudW1iZXInICYmIE1hdGguZmxvb3IoZGVmaW5lc1tkXSkgPT09IGRlZmluZXNbZF0pIHsgLy8gaW50IHRvIGZsb2F0IGNvbnZlcnNpb24gdG8gc2F0aXNmeSBHTFNMIGZsb2F0c1xuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCIgXCIgKyBkZWZpbmVzW2RdLnRvRml4ZWQoMSkgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBhbnkgb3RoZXIgZmxvYXQgb3Igc3RyaW5nIHZhbHVlXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIiBcIiArIGRlZmluZXNbZF0gKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVfc3RyO1xufTtcblxuLy8gVHVybiBhIGxpc3Qgb2YgZXh0ZW5zaW9uIG5hbWVzIGludG8gc2luZ2xlIHN0cmluZyBvZiAjZXh0ZW5zaW9uIHN0YXRlbWVudHNcblNoYWRlclByb2dyYW0uYnVpbGRFeHRlbnNpb25TdHJpbmcgPSBmdW5jdGlvbiAoZXh0ZW5zaW9ucykge1xuICAgIGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IFtdO1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGV4dGVuc2lvbnMuZm9yRWFjaChleHQgPT4ge1xuICAgICAgICBzdHIgKz0gYCNpZmRlZiBHTF8ke2V4dH1cXG4jZXh0ZW5zaW9uIEdMXyR7ZXh0fSA6IGVuYWJsZVxcbiNlbmRpZlxcbmA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn07XG5cblNoYWRlclByb2dyYW0uYWRkQmxvY2sgPSBmdW5jdGlvbiAoa2V5LCAuLi5ibG9ja3MpIHtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldID0gU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSB8fCBbXTtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLnB1c2goLi4uYmxvY2tzKTtcbn07XG5cbi8vIFJlbW92ZSBhbGwgZ2xvYmFsIHNoYWRlciBibG9ja3MgZm9yIGEgZ2l2ZW4ga2V5XG5TaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrID0gZnVuY3Rpb24gKGtleSkge1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gPSBbXTtcbn07XG5cblNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrID0gZnVuY3Rpb24gKGtleSwgLi4uYmxvY2tzKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayhrZXkpO1xuICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soa2V5LCAuLi5ibG9ja3MpO1xufTtcblxuLy8gQ29tcGlsZSAmIGxpbmsgYSBXZWJHTCBwcm9ncmFtIGZyb20gcHJvdmlkZWQgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlc1xuLy8gdXBkYXRlIGEgcHJvZ3JhbSBpZiBvbmUgaXMgcGFzc2VkIGluLiBDcmVhdGUgb25lIGlmIG5vdC4gQWxlcnQgYW5kIGRvbid0IHVwZGF0ZSBhbnl0aGluZyBpZiB0aGUgc2hhZGVycyBkb24ndCBjb21waWxlLlxuU2hhZGVyUHJvZ3JhbS51cGRhdGVQcm9ncmFtID0gZnVuY3Rpb24gKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSwgZnJhZ21lbnRfc2hhZGVyX3NvdXJjZSkge1xuICAgIC8vIFByb2dyYW0gd2l0aCB0aGlzIGV4YWN0IHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZXMgYWxyZWFkeSBjYWNoZWQ/XG4gICAgbGV0IGtleSA9IGdsLl90YW5ncmFtX2lkICsgJzo6JyArIHZlcnRleF9zaGFkZXJfc291cmNlICsgJzo6JyArIGZyYWdtZW50X3NoYWRlcl9zb3VyY2U7XG4gICAgaWYgKFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV0pIHtcbiAgICAgICAgbG9nKCd0cmFjZScsICdSZXVzaW5nIGlkZW50aWNhbCBzb3VyY2UgR0wgcHJvZ3JhbSBvYmplY3QnKTtcbiAgICAgICAgcmV0dXJuIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHZlcnRleF9zaGFkZXIgPSBTaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlcihnbCwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB2YXIgZnJhZ21lbnRfc2hhZGVyID0gU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIoZ2wsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UsIGdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgfVxuICAgIGNhdGNoKGVycikge1xuICAgICAgICBsb2coJ2Vycm9yJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICBpZiAocHJvZ3JhbSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBvbGRfc2hhZGVycyA9IGdsLmdldEF0dGFjaGVkU2hhZGVycyhwcm9ncmFtKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG9sZF9zaGFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBnbC5kZXRhY2hTaGFkZXIocHJvZ3JhbSwgb2xkX3NoYWRlcnNbaV0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcbiAgICB9XG5cbiAgICBpZiAodmVydGV4X3NoYWRlciA9PSBudWxsIHx8IGZyYWdtZW50X3NoYWRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyKTtcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTtcblxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgLy8gVE9ETzogcmVmZXJlbmNlIGNvdW50IGFuZCBkZWxldGUgc2hhZGVyIG9iamVjdHMgd2hlbiBubyBwcm9ncmFtcyByZWZlcmVuY2UgdGhlbVxuXG4gICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXZWJHTCBwcm9ncmFtIGVycm9yOlxuICAgICAgICAgICAgVkFMSURBVEVfU1RBVFVTOiAke2dsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTKX1cbiAgICAgICAgICAgIEVSUk9SOiAke2dsLmdldEVycm9yKCl9XG4gICAgICAgICAgICAtLS0gVmVydGV4IFNoYWRlciAtLS1cbiAgICAgICAgICAgICR7dmVydGV4X3NoYWRlcl9zb3VyY2V9XG4gICAgICAgICAgICAtLS0gRnJhZ21lbnQgU2hhZGVyIC0tLVxuICAgICAgICAgICAgJHtmcmFnbWVudF9zaGFkZXJfc291cmNlfWApO1xuXG4gICAgICAgIGxldCBlcnJvciA9IHsgdHlwZTogJ3Byb2dyYW0nLCBtZXNzYWdlIH07XG4gICAgICAgIGxvZygnZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc19ieV9zb3VyY2Vba2V5XSA9IHByb2dyYW07IC8vIGNhY2hlIGJ5IGV4YWN0IHNvdXJjZVxuICAgIHJldHVybiBwcm9ncmFtO1xufTtcblxuLy8gQ29tcGlsZSBhIHZlcnRleCBvciBmcmFnbWVudCBzaGFkZXIgZnJvbSBwcm92aWRlZCBzb3VyY2VcblNoYWRlclByb2dyYW0uY3JlYXRlU2hhZGVyID0gZnVuY3Rpb24gKGdsLCBzb3VyY2UsIHN0eXBlKSB7XG4gICAgLy8gUHJvZ3JhbSB3aXRoIGlkZW50aWNhbCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzIGFscmVhZHkgY2FjaGVkP1xuICAgIGxldCBrZXkgPSBnbC5fdGFuZ3JhbV9pZCArICc6OicgKyBzb3VyY2U7XG4gICAgaWYgKFNoYWRlclByb2dyYW0uc2hhZGVyc19ieV9zb3VyY2Vba2V5XSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgJ1JldXNpbmcgaWRlbnRpY2FsIHNvdXJjZSBHTCBzaGFkZXIgb2JqZWN0Jyk7XG4gICAgICAgIHJldHVybiBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV07XG4gICAgfVxuXG4gICAgbGV0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihzdHlwZSk7XG5cbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcblxuICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgICAgIGxldCB0eXBlID0gKHN0eXBlID09PSBnbC5WRVJURVhfU0hBREVSID8gJ3ZlcnRleCcgOiAnZnJhZ21lbnQnKTtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcik7XG4gICAgICAgIGxldCBlcnJvcnMgPSBwYXJzZVNoYWRlckVycm9ycyhtZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMgfTtcbiAgICB9XG5cbiAgICBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV0gPSBzaGFkZXI7IC8vIGNhY2hlIGJ5IGV4YWN0IHNvdXJjZVxuICAgIHJldHVybiBzaGFkZXI7XG59O1xuIiwiLy8gVGV4dHVyZSBtYW5hZ2VtZW50XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4uL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG4vLyBHTCB0ZXh0dXJlIHdyYXBwZXIgb2JqZWN0IGZvciBrZWVwaW5nIHRyYWNrIG9mIGEgZ2xvYmFsIHNldCBvZiB0ZXh0dXJlcywga2V5ZWQgYnkgYSB1bmlxdWUgdXNlci1kZWZpbmVkIG5hbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHR1cmUge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIG5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQgPSAwO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlX3R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDsgICAgLy8gYSBQcm9taXNlIG9iamVjdCB0byB0cmFjayB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGlzIHRleHR1cmVcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsgICAgLy8gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhcyBleHBlY3RlZFxuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nO1xuICAgICAgICB0aGlzLnNwcml0ZXMgPSBvcHRpb25zLnNwcml0ZXM7XG4gICAgICAgIHRoaXMudGV4Y29vcmRzID0ge307ICAgIC8vIHNwcml0ZSBVVnMgKFswLCAxXSByYW5nZSlcbiAgICAgICAgdGhpcy5zaXplcyA9IHt9OyAgICAgICAgLy8gc3ByaXRlIHNpemVzIChwaXhlbCBzaXplKVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gYSAxLXBpeGVsIGJsYWNrIHRleHR1cmUgc28gd2UgY2FuIHNhZmVseSByZW5kZXIgd2hpbGUgd2Ugd2FpdCBmb3IgYW4gaW1hZ2UgdG8gbG9hZFxuICAgICAgICAvLyBTZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MjIyNDcvd2ViZ2wtd2FpdC1mb3ItdGV4dHVyZS10by1sb2FkXG4gICAgICAgIHRoaXMuc2V0RGF0YSgxLCAxLCBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMjU1XSksIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG5cbiAgICAgICAgLy8gRGVzdHJveSBwcmV2aW91cyB0ZXh0dXJlIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSkge1xuICAgICAgICAgICAgLy8gUHJlc2VydmUgcHJldmlvdXMgcmV0YWluIGNvdW50XG4gICAgICAgICAgICB0aGlzLnJldGFpbl9jb3VudCA9IFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5yZXRhaW5fY291bnQ7XG4gICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0ucmV0YWluX2NvdW50ID0gMDsgLy8gYWxsb3cgdG8gYmUgZnJlZWRcbiAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0ZXh0dXJlIGluc3RhbmNlIGFuZCBkZWZpbml0aW9uXG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZV9jb25maWdzW3RoaXMubmFtZV0gPSBPYmplY3QuYXNzaWduKHsgbmFtZSB9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWQob3B0aW9ucyk7XG4gICAgICAgIGxvZygndHJhY2UnLCBgY3JlYXRpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGEgc2luZ2xlIHRleHR1cmUgaW5zdGFuY2VcbiAgICBkZXN0cm95KHsgZm9yY2UgfSA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGRlc3Ryb3lpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YTtcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXTtcbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICBsb2coJ3RyYWNlJywgYGRlc3Ryb3lpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXRhaW4gKCkge1xuICAgICAgICB0aGlzLnJldGFpbl9jb3VudCsrO1xuICAgIH1cblxuICAgIHJlbGVhc2UgKCkge1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiByZWxlYXNpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJldGFpbl9jb3VudC0tO1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKHVuaXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYWN0aXZlVW5pdCAhPT0gdW5pdCkge1xuICAgICAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRTAgKyB1bml0KTtcbiAgICAgICAgICAgIFRleHR1cmUuYWN0aXZlVW5pdCA9IHVuaXQ7XG4gICAgICAgICAgICBUZXh0dXJlLmJvdW5kVGV4dHVyZSA9IG51bGw7IC8vIHRleHR1cmUgbXVzdCBiZSByZS1ib3VuZCB3aGVuIHVuaXQgY2hhbmdlc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYm91bmRUZXh0dXJlICE9PSB0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgICAgVGV4dHVyZS5ib3VuZFRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ3VybCc7XG4gICAgICAgICAgICB0aGlzLnNldFVybChvcHRpb25zLnVybCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ2VsZW1lbnQnO1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KG9wdGlvbnMuZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAnZGF0YSc7XG4gICAgICAgICAgICB0aGlzLnNldERhdGEob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQsIG9wdGlvbnMuZGF0YSwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPVxuICAgICAgICAgICAgKHRoaXMubG9hZGluZyAmJiB0aGlzLmxvYWRpbmcudGhlbigoKSA9PiB7IHRoaXMuY2FsY3VsYXRlU3ByaXRlcygpOyByZXR1cm4gdGhpczsgfSkpIHx8XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIGZyb20gYW4gdXJsXG4gICAgc2V0VXJsKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cmwgPSB1cmw7IC8vIHNhdmUgVVJMIHJlZmVyZW5jZSAod2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIGVsZW1lbnQgaXMgbG9hZGVkIGJlbG93KVxuICAgICAgICB0aGlzLnNvdXJjZSA9IHRoaXMudXJsO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ3VybCc7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KGltYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgcmVzb2x2ZSBvbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgZnJvbSAke3RoaXMuc291cmNlfWAsIGVycm9yOiBlLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTYWZhcmkgaGFzIGEgYnVnIGxvYWRpbmcgZGF0YS1VUkwgaW1hZ2VzIHdpdGggQ09SUyBlbmFibGVkLCBzbyBpdCBtdXN0IGJlIGRpc2FibGVkIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzk3OFxuICAgICAgICAgICAgaWYgKCEoVXRpbHMuaXNTYWZhcmkoKSAmJiB0aGlzLnNvdXJjZS5zbGljZSgwLCA1KSA9PT0gJ2RhdGE6JykpIHtcbiAgICAgICAgICAgICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB0aGlzLnNvdXJjZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIHRvIGEgcmF3IGltYWdlIGJ1ZmZlclxuICAgIHNldERhdGEod2lkdGgsIGhlaWdodCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2RhdGEnO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcmVndWxhciBhcnJheSB0byB0eXBlZCBhcnJheVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGhlIHRleHR1cmUgdG8gdHJhY2sgYSBlbGVtZW50IChjYW52YXMvaW1hZ2UpXG4gICAgc2V0RWxlbWVudChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBlbCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgLy8gYSBzdHJpbmcgZWxlbWVudCBpcyBpbnRlcnBldGVkIGFzIGEgQ1NTIHNlbGVjdG9yXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fFxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2VsZW1lbnQnO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgdGhlICdlbGVtZW50JyBwYXJhbWV0ZXIgKFxcYGVsZW1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZWwpfVxcYCkgbXVzdCBiZSBhIENTUyBgO1xuICAgICAgICAgICAgbXNnICs9IGBzZWxlY3RvciBzdHJpbmcsIG9yIGEgPGNhbnZhcz4sIDxpbWFnZT4gb3IgPHZpZGVvPiBvYmplY3RgO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6ICR7bXNnfWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBiZWNhdXNlICR7bXNnfWAsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBVcGxvYWRzIGN1cnJlbnQgaW1hZ2Ugb3IgYnVmZmVyIHRvIHRoZSBHUFUgKGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSBhbmltYXRlZCB0ZXh0dXJlcyBvbiB0aGUgZmx5KVxuICAgIHVwZGF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgICAgdGhpcy5nbC5waXhlbFN0b3JlaSh0aGlzLmdsLlVOUEFDS19GTElQX1lfV0VCR0wsIChvcHRpb25zLlVOUEFDS19GTElQX1lfV0VCR0wgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlKSk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIG9wdGlvbnMuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIHx8IGZhbHNlKTtcblxuICAgICAgICAvLyBJbWFnZSBvciBDYW52YXMgZWxlbWVudFxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCB0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHxcbiAgICAgICAgICAgICh0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgdGhpcy5zb3VyY2UuY29tcGxldGUpKSB7XG5cbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnNvdXJjZS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zb3VyY2UuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhdyBpbWFnZSBidWZmZXJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb3VyY2VfdHlwZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmVzIGFwcHJvcHJpYXRlIGZpbHRlcmluZyBtb2RlXG4gICAgc2V0RmlsdGVyaW5nKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuZmlsdGVyaW5nID0gb3B0aW9ucy5maWx0ZXJpbmcgfHwgJ2xpbmVhcic7XG5cbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgLy8gRm9yIHBvd2VyLW9mLTIgdGV4dHVyZXMsIHRoZSBmb2xsb3dpbmcgcHJlc2V0cyBhcmUgYXZhaWxhYmxlOlxuICAgICAgICAvLyBtaXBtYXA6IGxpbmVhciBibGVuZCBmcm9tIG5lYXJlc3QgbWlwXG4gICAgICAgIC8vIGxpbmVhcjogbGluZWFyIGJsZW5kIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMpXG4gICAgICAgIC8vIG5lYXJlc3Q6IG5lYXJlc3QgcGl4ZWwgZnJvbSBvcmlnaW5hbCBpbWFnZSAobm8gbWlwcywgJ2Jsb2NreScgbG9vaylcbiAgICAgICAgaWYgKFV0aWxzLmlzUG93ZXJPZjIodGhpcy53aWR0aCkgJiYgVXRpbHMuaXNQb3dlck9mMih0aGlzLmhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IHRydWU7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBvcHRpb25zLlRFWFRVUkVfV1JBUF9TIHx8IChvcHRpb25zLnJlcGVhdCAmJiBnbC5SRVBFQVQpIHx8IGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgb3B0aW9ucy5URVhUVVJFX1dSQVBfVCB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbWlwbWFwJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ21pcG1hcCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSKTsgLy8gVE9ETzogdXNlIHRyaWxpbmVhciBmaWx0ZXJpbmcgYnkgZGVmdWFsdCBpbnN0ZWFkP1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5maWx0ZXJpbmcgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbGluZWFyJztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2ViR0wgaGFzIHN0cmljdCByZXF1aXJlbWVudHMgb24gbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXM6XG4gICAgICAgICAgICAvLyBObyBtaXBtYXBzIGFuZCBtdXN0IGNsYW1wIHRvIGVkZ2VcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IGZhbHNlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIGRlZmF1bHQgdG8gbGluZWFyIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3VwZGF0ZScsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFByZS1jYWxjIHNwcml0ZSByZWdpb25zIGZvciBhIHRleHR1cmUgc3ByaXRlIGluIFVWIFswLCAxXSBzcGFjZVxuICAgIGNhbGN1bGF0ZVNwcml0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwcml0ZSA9IHRoaXMuc3ByaXRlc1tzXTtcblxuICAgICAgICAgICAgICAgIC8vIE1hcCBbMCwgMF0gdG8gWzEsIDFdIGNvb3JkcyB0byB0aGUgYXBwcm9wcmlhdGUgc3ByaXRlIHN1Yi1hcmVhIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgdGhpcy50ZXhjb29yZHNbc10gPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVswXSwgc3ByaXRlWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXSxcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAvLyBQaXhlbCBzaXplIG9mIHNwcml0ZVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZXNbc10gPSBbc3ByaXRlWzJdLCBzcHJpdGVbM11dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljL2NsYXNzIG1ldGhvZHMgYW5kIHN0YXRlXG5cblRleHR1cmUuY3JlYXRlID0gZnVuY3Rpb24gKGdsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0dXJlKGdsLCBuYW1lLCBvcHRpb25zKTtcbn07XG5cblRleHR1cmUucmV0YWluID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVGV4dHVyZS50ZXh0dXJlc1tuYW1lXSkge1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW25hbWVdLnJldGFpbigpO1xuICAgIH1cbn07XG5cblRleHR1cmUucmVsZWFzZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZWxlYXNlKCk7XG4gICAgfVxufTtcblxuLy8gRGVzdHJveSBhbGwgdGV4dHVyZSBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gR0wgY29udGV4dFxuVGV4dHVyZS5kZXN0cm95ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgdmFyIHRleHR1cmVzID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RdO1xuICAgICAgICBpZiAodGV4dHVyZS5nbCA9PT0gZ2wpIHtcbiAgICAgICAgICAgIHRleHR1cmUuZGVzdHJveSh7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG4vLyBHZXQgc3ByaXRlIHBpeGVsIHNpemUgYW5kIFVWc1xuVGV4dHVyZS5nZXRTcHJpdGVJbmZvID0gZnVuY3Rpb24gKHRleG5hbWUsIHNwcml0ZSkge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0ZXhuYW1lXTtcbiAgICByZXR1cm4gdGV4dHVyZSAmJiB7IHNpemU6IHRleHR1cmUuc2l6ZXNbc3ByaXRlXSwgdGV4Y29vcmRzOiB0ZXh0dXJlLnRleGNvb3Jkc1tzcHJpdGVdIH07XG59O1xuXG4vLyBSZS1zY2FsZSBVVnMgZnJvbSBbMCwgMV0gcmFuZ2UgdG8gYSBzbWFsbGVyIGFyZWEgd2l0aGluIHRoZSBpbWFnZVxuVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUgPSBmdW5jdGlvbiAoYXJlYV9vcmlnaW4sIGFyZWFfc2l6ZSwgdGV4X3NpemUpIHtcbiAgICB2YXIgYXJlYV9vcmlnaW5feSA9IHRleF9zaXplWzFdIC0gYXJlYV9vcmlnaW5bMV0gLSBhcmVhX3NpemVbMV07XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBhcmVhX29yaWdpblswXSAvIHRleF9zaXplWzBdLFxuICAgICAgICBhcmVhX29yaWdpbl95IC8gdGV4X3NpemVbMV0sXG4gICAgICAgIChhcmVhX3NpemVbMF0gKyBhcmVhX29yaWdpblswXSkgLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgKGFyZWFfc2l6ZVsxXSArIGFyZWFfb3JpZ2luX3kpIC8gdGV4X3NpemVbMV1cbiAgICBdO1xufTtcblxuLy8gQ3JlYXRlIGEgc2V0IG9mIHRleHR1cmVzIGtleWVkIGluIGFuIG9iamVjdFxuLy8gT3B0aW9uYWxseSBsb2FkIGVhY2ggaWYgaXQgaGFzIGEgVVJMIHNwZWNpZmllZFxuVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKGdsLCB0ZXh0dXJlcykge1xuICAgIGxldCBsb2FkaW5nID0gW107XG4gICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgIGZvciAobGV0IHRleG5hbWUgaW4gdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSB0ZXh0dXJlc1t0ZXhuYW1lXTtcblxuICAgICAgICAgICAgLy8gSWYgdGV4dHVyZSBhbHJlYWR5IGV4aXN0cyBhbmQgZGVmaW5pdGlvbiBoYXNuJ3QgY2hhbmdlZCwgbm8gbmVlZCB0byByZS1jcmVhdGVcbiAgICAgICAgICAgIC8vIE5vdGU6IHRvIGF2b2lkIGZsaWNrZXIgd2hlbiBvdGhlciB0ZXh0dXJlcy9zY2VuZSBpdGVtcyBjaGFuZ2VcbiAgICAgICAgICAgIGlmICghVGV4dHVyZS5jaGFuZ2VkKHRleG5hbWUsIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLmNyZWF0ZShnbCwgdGV4bmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIGxvYWRpbmcucHVzaCh0ZXh0dXJlLmxvYWRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbChsb2FkaW5nKTtcbn07XG5cbi8vIENyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlICgxeDEgcGl4ZWwpIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlclxuLy8gKGZvciBleGFtcGxlIHRvIHByZXZlbnQgR0wgZnJvbSBjb21wbGFpbmluZyBhYm91dCB1bmJvdW5kIHRleHR1cmVzKVxuVGV4dHVyZS5kZWZhdWx0ID0gJ19fZGVmYXVsdCc7XG5UZXh0dXJlLmNyZWF0ZURlZmF1bHQgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGUoZ2wsIFRleHR1cmUuZGVmYXVsdCk7XG59O1xuXG4vLyBJbmRpY2F0ZSBpZiBhIHRleHR1cmUgZGVmaW5pdGlvbiB3b3VsZCBiZSBhIGNoYW5nZSBmcm9tIHRoZSBjdXJyZW50IGNhY2hlXG5UZXh0dXJlLmNoYW5nZWQgPSBmdW5jdGlvbiAobmFtZSwgY29uZmlnKSB7XG4gICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW25hbWVdO1xuICAgIGlmICh0ZXh0dXJlKSB7IC8vIGNhY2hlZCB0ZXh0dXJlXG4gICAgICAgIC8vIGNhbnZhcy9pbWFnZS1iYXNlZCB0ZXh0dXJlcyBhcmUgY29uc2lkZXJlZCBkeW5hbWljIGFuZCBhbHdheXMgcmVmcmVzaFxuICAgICAgICBpZiAodGV4dHVyZS5jb25maWdfdHlwZSA9PT0gJ2VsZW1lbnQnIHx8IGNvbmZpZy5lbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29tcGFyZSBkZWZpbml0aW9uc1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3NbbmFtZV0pID09PVxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmFzc2lnbih7IG5hbWUgfSwgY29uZmlnKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEdldCBtZXRhZGF0YSBmb3IgYSB0ZXh0dXJlIGJ5IG5hbWVcbi8vIFJldHVybnMgdmlhIHByb21pc2UsIGluIGNhc2UgdGV4dHVyZSBpcyBzdGlsbCBsb2FkaW5nXG4vLyBDYW4gYmUgY2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBzeW5jIHRleHR1cmUgaW5mbyB0byB3b3JrZXJcblRleHR1cmUuZ2V0SW5mbyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgLy8gR2V0IGluZm8gZm9yIGFsbCB0ZXh0dXJlcyBieSBkZWZhdWx0XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBPYmplY3Qua2V5cyhUZXh0dXJlLnRleHR1cmVzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbXVsdGlwbGUgdGV4dHVyZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmFtZS5tYXAobiA9PiBUZXh0dXJlLmdldEluZm8obikpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2luZ2xlIHRleHR1cmVcbiAgICB2YXIgdGV4ID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4KSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoaXMgdGV4dHVyZSB0byBmaW5pc2ggbG9hZGluZywgb3IgcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgIHZhciBsb2FkaW5nID0gdGV4LmxvYWRpbmcgfHwgUHJvbWlzZS5yZXNvbHZlKHRleCk7XG4gICAgICAgIHJldHVybiBsb2FkaW5nLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmV0dXJuIGEgc3Vic2V0IG9mIHRleHR1cmUgaW5mb1xuICAgICAgICAgICAgLy8gKGNvbXBhdGlibGUgdy9zdHJ1Y3R1cmVkIGNsb25pbmcsIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGEgd29ya2VyKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0ZXgubmFtZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGV4LndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGV4LmhlaWdodCxcbiAgICAgICAgICAgICAgICBzcHJpdGVzOiB0ZXguc3ByaXRlcyxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZHM6IHRleC50ZXhjb29yZHMsXG4gICAgICAgICAgICAgICAgc2l6ZXM6IHRleC5zaXplcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IHRleC5maWx0ZXJpbmcsXG4gICAgICAgICAgICAgICAgcG93ZXJfb2ZfMjogdGV4LnBvd2VyX29mXzIsXG4gICAgICAgICAgICAgICAgdmFsaWQ6IHRleC52YWxpZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBObyB0ZXh0dXJlIGZvdW5kXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxufTtcblxuLy8gU3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG4vLyBDYWxsZWQgZnJvbSB3b3JrZXIsIGdldHMgaW5mbyBvbiBvbmUgb3IgbW9yZSB0ZXh0dXJlcyBpbmZvIGZyb20gbWFpbiB0aHJlYWQgdmlhIHJlbW90ZSBjYWxsLCB0aGVuIHN0b3JlcyBpdFxuLy8gbG9jYWxseSBpbiB3b3JrZXIuICd0ZXh0dXJlcycgY2FuIGJlIGFuIGFycmF5IG9mIHRleHR1cmUgbmFtZXMgdG8gc3luYywgb3IgaWYgbnVsbCwgYWxsIHRleHR1cmVzIGFyZSBzeW5jZWQuXG5UZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyID0gZnVuY3Rpb24gKG5hbWVzKSB7XG4gICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVGV4dHVyZS5nZXRJbmZvJywgbmFtZXMpLlxuICAgICAgICB0aGVuKHRleHR1cmVzID0+IHtcbiAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godGV4ID0+IHtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RleC5uYW1lXSA9IHRleDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFRleHR1cmUudGV4dHVyZXM7XG4gICAgICAgIH0pO1xufTtcblxuLy8gUmVwb3J0IG1heCB0ZXh0dXJlIHNpemUgZm9yIGEgR0wgY29udGV4dFxuVGV4dHVyZS5nZXRNYXhUZXh0dXJlU2l6ZSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHJldHVybiBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG59O1xuXG4vLyBHbG9iYWwgc2V0IG9mIHRleHR1cmVzLCBieSBuYW1lXG5UZXh0dXJlLnRleHR1cmVzID0ge307XG5UZXh0dXJlLnRleHR1cmVfY29uZmlncyA9IHt9O1xuVGV4dHVyZS5ib3VuZFRleHR1cmUgPSBudWxsO1xuVGV4dHVyZS5hY3RpdmVVbml0ID0gbnVsbDtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVGV4dHVyZScsIFRleHR1cmUpO1xuc3Vic2NyaWJlTWl4aW4oVGV4dHVyZSk7XG4iLCIvLyBDcmVhdGVzIGEgVmVydGV4IEFycmF5IE9iamVjdCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSwgb3IgZmFsbHMgYmFjayBvbiBzdGFuZGFyZCBhdHRyaWJ1dGUgY2FsbHNcblxuaW1wb3J0IGdldEV4dGVuc2lvbiBmcm9tICcuL2V4dGVuc2lvbnMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgICBkaXNhYmxlZDogZmFsc2UsIC8vIHNldCB0byB0cnVlIHRvIGRpc2FibGUgVkFPcyBldmVuIGlmIGV4dGVuc2lvbiBpcyBhdmFpbGFibGVcbiAgICBib3VuZF92YW86IFtdLCAgIC8vIGN1cnJlbnRseSBib3VuZCBWQU8sIGJ5IEdMIGNvbnRleHRcblxuICAgIGluaXQgKGdsKSB7XG4gICAgICAgIGxldCBleHQ7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ2luZm8nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIE5PVCBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBmb3JjZSBkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZSAoZ2wsIHNldHVwLCB0ZWFyZG93bikge1xuICAgICAgICBsZXQgdmFvID0ge307XG4gICAgICAgIHZhby5zZXR1cCA9IHNldHVwO1xuICAgICAgICB2YW8udGVhcmRvd24gPSB0ZWFyZG93bjtcblxuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YW8uX3ZhbyA9IGV4dC5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpO1xuICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YW8uc2V0dXAodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbztcbiAgICB9LFxuXG4gICAgZ2V0Q3VycmVudEJpbmRpbmcgKGdsKSB7XG4gICAgICAgIGxldCBib3VuZCA9IHRoaXMuYm91bmRfdmFvLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICAgICAgcmV0dXJuIGJvdW5kICYmIGJvdW5kWzFdO1xuICAgIH0sXG5cbiAgICBzZXRDdXJyZW50QmluZGluZyAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgYm91bmRfdmFvID0gdGhpcy5ib3VuZF92YW87XG4gICAgICAgIGxldCBiaW5kaW5nID0gYm91bmRfdmFvLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgYm91bmRfdmFvLnB1c2goW2dsLCB2YW9dKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJpbmRpbmdbMV0gPSB2YW87XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmluZCAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKHZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEJpbmRpbmcoZ2wsIHZhbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YW8uc2V0dXAoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJvdW5kX3ZhbyA9IHRoaXMuZ2V0Q3VycmVudEJpbmRpbmcoZ2wpO1xuICAgICAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJvdW5kX3ZhbyAhPSBudWxsICYmIHR5cGVvZiBib3VuZF92YW8udGVhcmRvd24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBib3VuZF92YW8udGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEJpbmRpbmcoZ2wsIG51bGwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiB2YW8gIT0gbnVsbCAmJiB2YW8uX3ZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHQuZGVsZXRlVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgdmFvLl92YW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlc3Ryb3kgaXMgYSBuby1vcCBpZiBWQU8gZXh0ZW5zaW9uIGlzbid0IGF2YWlsYWJsZVxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgZm9yIHByaW1pdGl2ZXNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vdmFvJztcblxuLy8gQSBzaW5nbGUgbWVzaC9WQk8sIGRlc2NyaWJlZCBieSBhIHZlcnRleCBsYXlvdXQsIHRoYXQgY2FuIGJlIGRyYXduIHdpdGggb25lIG9yIG1vcmUgcHJvZ3JhbXNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZCT01lc2ggIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB2ZXJ0ZXhfZGF0YSwgZWxlbWVudF9kYXRhLCB2ZXJ0ZXhfbGF5b3V0LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZGF0YSA9IHZlcnRleF9kYXRhOyAvLyB0eXBlZCBhcnJheVxuICAgICAgICB0aGlzLmVsZW1lbnRfZGF0YSA9IGVsZW1lbnRfZGF0YTsgLy8gdHlwZWQgYXJyYXlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5kcmF3X21vZGUgPSBvcHRpb25zLmRyYXdfbW9kZSB8fCB0aGlzLmdsLlRSSUFOR0xFUztcbiAgICAgICAgdGhpcy5kYXRhX3VzYWdlID0gb3B0aW9ucy5kYXRhX3VzYWdlIHx8IHRoaXMuZ2wuU1RBVElDX0RSQVc7XG4gICAgICAgIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5ID0gMzsgLy8gVE9ETzogc3VwcG9ydCBsaW5lcywgc3RyaXAsIGZhbiwgZXRjLlxuICAgICAgICB0aGlzLnVuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcbiAgICAgICAgdGhpcy5yZXRhaW4gPSBvcHRpb25zLnJldGFpbiB8fCBmYWxzZTsgLy8gd2hldGhlciB0byByZXRhaW4gbWVzaCBkYXRhIGluIENQVSBhZnRlciB1cGxvYWRpbmcgdG8gR1BVXG4gICAgICAgIHRoaXMuY3JlYXRlZF9hdCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IG9wdGlvbnMuZmFkZV9pbl90aW1lIHx8IDA7IC8vIG9wdGlvbmFsIHRpbWUgdG8gZmFkZSBpbiBtZXNoXG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQgPSB0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZhb3MgPSB7fTsgLy8gbWFwIG9mIFZlcnRleEFycmF5T2JqZWN0cywga2V5ZWQgYnkgcHJvZ3JhbVxuXG4gICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9kYXRhKXtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2NvdW50ID0gdGhpcy5lbGVtZW50X2RhdGEubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMuZWxlbWVudF9jb3VudCAvIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5O1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X3R5cGUgPSAodGhpcy5lbGVtZW50X2RhdGEuY29uc3RydWN0b3IgPT09IFVpbnQxNkFycmF5KSA/IHRoaXMuZ2wuVU5TSUdORURfU0hPUlQ6IHRoaXMuZ2wuVU5TSUdORURfSU5UO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2RhdGEsIHRoaXMuZGF0YV91c2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5X2NvdW50ID0gdGhpcy52ZXJ0ZXhfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5yZXRhaW4pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciwgYnkgZGVmYXVsdCB3aXRoIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtLCBvciBvdGhlcndpc2Ugd2l0aCBvcHRpb25hbGx5IHByb3ZpZGVkIG9uZVxuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBtZXNoIHJlcXVlc3RzIGEgcmVuZGVyIG9uIG5leHQgZnJhbWUgKGUuZy4gZm9yIGZhZGUgYW5pbWF0aW9ucylcbiAgICByZW5kZXIob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb2dyYW0gPSBvcHRpb25zLnByb2dyYW0gfHwgU2hhZGVyUHJvZ3JhbS5jdXJyZW50O1xuICAgICAgICBwcm9ncmFtLnVzZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNhdmVVbmlmb3Jtcyh0aGlzLnVuaWZvcm1zKTtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybXModGhpcy51bmlmb3JtcywgZmFsc2UpOyAvLyBkb24ndCByZXNldCB0ZXh0dXJlIHVuaXRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aXNpYmxlX3RpbWUgPSAoK25ldyBEYXRlKCkgLSB0aGlzLmNyZWF0ZWRfYXQpIC8gMTAwMDtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3Zpc2libGVfdGltZScsIHZpc2libGVfdGltZSk7XG5cbiAgICAgICAgdGhpcy5iaW5kKHByb2dyYW0pO1xuXG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KXtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKHRoaXMuZHJhd19tb2RlLCB0aGlzLmVsZW1lbnRfY291bnQsIHRoaXMuZWxlbWVudF90eXBlLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmRyYXdfbW9kZSwgMCwgdGhpcy52ZXJ0ZXhfY291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCBudWxsKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5yZXN0b3JlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IG5leHQgcmVuZGVyIGlmIG1lc2ggaXMgZmFkaW5nIGluXG4gICAgICAgIHJldHVybiAodmlzaWJsZV90aW1lIDwgdGhpcy5mYWRlX2luX3RpbWUpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgYnVmZmVycyBhbmQgdmVydGV4IGF0dHJpYnV0ZXMgdG8gcHJlcGFyZSBmb3IgcmVuZGVyaW5nXG4gICAgYmluZChwcm9ncmFtKSB7XG4gICAgICAgIC8vIEJpbmQgVkFPIGZvciB0aGlzIHByb2dhbSwgb3IgY3JlYXRlIG9uZVxuICAgICAgICBsZXQgdmFvID0gdGhpcy52YW9zW3Byb2dyYW0uaWRdO1xuICAgICAgICBpZiAodmFvKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5iaW5kKHRoaXMuZ2wsIHZhbyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhb3NbcHJvZ3JhbS5pZF0gPSBWZXJ0ZXhBcnJheU9iamVjdC5jcmVhdGUodGhpcy5nbCwgKGZvcmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmVsZW1lbnRfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0LmVuYWJsZSh0aGlzLmdsLCBwcm9ncmFtLCBmb3JjZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCB2IGluIHRoaXMudmFvcykge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuZGVzdHJveSh0aGlzLmdsLCB0aGlzLnZhb3Nbdl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdWQk9NZXNoLmRlc3Ryb3k6IGRlbGV0ZSBidWZmZXInICsgKHRoaXMudmVydGV4X2RhdGEgPyBgIG9mIHNpemUgJHt0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGh9YCA6ICcnKSk7XG5cbiAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50X2J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50X2RhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFZlcnRleEVsZW1lbnRzIGZyb20gJy4vdmVydGV4X2VsZW1lbnRzJztcblxuLy8gTWFwcyBHTCB0eXBlcyB0byBKUyBhcnJheSB0eXBlc1xubGV0IGFycmF5X3R5cGVzID0ge1xuICAgIFtnbC5GTE9BVF06IEZsb2F0MzJBcnJheSxcbiAgICBbZ2wuQllURV06IEludDhBcnJheSxcbiAgICBbZ2wuVU5TSUdORURfQllURV06IFVpbnQ4QXJyYXksXG4gICAgW2dsLklOVF06IEludDMyQXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0lOVF06IFVpbnQzMkFycmF5LFxuICAgIFtnbC5TSE9SVF06IEludDE2QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX1NIT1JUXTogVWludDE2QXJyYXlcbn07XG5cbi8vIEFuIGludGVybWVkaWFyeSBvYmplY3QgdGhhdCBob2xkcyB2ZXJ0ZXggZGF0YSBpbiB0eXBlZCBhcnJheXMsIGFjY29yZGluZyB0byBhIGdpdmVuIHZlcnRleCBsYXlvdXRcbi8vIFVzZWQgdG8gY29uc3RydWN0IGEgbWVzaC9WQk8gZm9yIHJlbmRlcmluZ1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RGF0YSB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmVydGV4X2xheW91dCwgeyBwcmVhbGxvYyA9IDUwMCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZWxlbWVudHMgPSBuZXcgVmVydGV4RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoVmVydGV4RGF0YS5hcnJheV9wb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IFZlcnRleERhdGEuYXJyYXlfcG9vbC5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5ieXRlX2xlbmd0aCAvIHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUpO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiByZXVzZWQgYnVmZmVyIG9mIGJ5dGVzICR7dGhpcy5ieXRlX2xlbmd0aH0sICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gcHJlYWxsb2M7IC8vICMgb2YgdmVydGljZXMgdG8gYWxsb2NhdGVcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgICAvLyBieXRlIG9mZnNldCBpbnRvIGN1cnJlbnRseSBhbGxvY2F0ZWQgYnVmZmVyXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHRoaXMudmVydGV4X2xheW91dC5jb21wb25lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbLi4udGhpcy52ZXJ0ZXhfbGF5b3V0LmNvbXBvbmVudHNbY11dKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVhbGxvY19jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICB9XG5cbiAgICAvLyAoUmUtKWFsbG9jYXRlIHR5cGVkIHZpZXdzIGludG8gdGhlIG1haW4gYnVmZmVyIC0gb25seSBjcmVhdGUgdGhlIHR5cGVzIHdlIG5lZWQgZm9yIHRoaXMgbGF5b3V0XG4gICAgc2V0QnVmZmVyVmlld3MgKCkge1xuICAgICAgICB0aGlzLnZpZXdzID0ge307XG4gICAgICAgIHRoaXMudmlld3NbZ2wuVU5TSUdORURfQllURV0gPSB0aGlzLnZlcnRleF9idWZmZXI7XG4gICAgICAgIGZvciAobGV0IGE9MDsgYSA8IHRoaXMudmVydGV4X2xheW91dC5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWIgPSB0aGlzLnZlcnRleF9sYXlvdXQuYXR0cmlic1thXTtcblxuICAgICAgICAgICAgLy8gTmVlZCB2aWV3IGZvciB0aGlzIHR5cGU/XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3c1thdHRyaWIudHlwZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBhcnJheV90eXBlID0gYXJyYXlfdHlwZXNbYXR0cmliLnR5cGVdO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3NbYXR0cmliLnR5cGVdID0gbmV3IGFycmF5X3R5cGUodGhpcy52ZXJ0ZXhfYnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGJ1ZmZlciBwb2ludGVyc1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXSA9IHRoaXMudmlld3NbY29tcG9uZW50WzBdXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGFsbG9jYXRlZCBidWZmZXIgc2l6ZSwgZXhwYW5kL3JlYWxsb2MgYnVmZmVyIGlmIG5lZWRlZFxuICAgIGNoZWNrQnVmZmVyU2l6ZSAoKSB7XG4gICAgICAgIGlmICgodGhpcy5vZmZzZXQgKyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKSA+IHRoaXMuYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5zaXplICogMS41KTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSAtPSB0aGlzLnNpemUgJSA0O1xuICAgICAgICAgICAgdGhpcy5ieXRlX2xlbmd0aCA9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUgKiB0aGlzLnNpemU7XG4gICAgICAgICAgICB2YXIgbmV3X3ZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ5dGVfbGVuZ3RoKTtcbiAgICAgICAgICAgIG5ld192aWV3LnNldCh0aGlzLnZlcnRleF9idWZmZXIpOyAvLyBjb3B5IGV4aXN0aW5nIGRhdGEgdG8gbmV3IGJ1ZmZlclxuICAgICAgICAgICAgVmVydGV4RGF0YS5hcnJheV9wb29sLnB1c2godGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gc2F2ZSBwcmV2aW91cyBidWZmZXIgZm9yIHVzZSBieSBuZXh0IHRpbGVcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ld192aWV3O1xuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXJWaWV3cygpO1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jX2NvdW50Kys7XG4gICAgICAgICAgICAvLyBsb2coJ2luZm8nLCBgVmVydGV4RGF0YTogZXhwYW5kZWQgdmVydGV4IGJsb2NrIHRvICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgdmVydGV4LCBjb3BpZWQgZnJvbSBhIHBsYWluIEpTIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAvLyBOb3RlOiB1c2VzIHByZS1jYWxjdWxhdGVkIGluZm8gYWJvdXQgZWFjaCBhdHRyaWJ1dGUsIGluY2x1ZGluZyBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIHR5cGVkIGFycmF5XG4gICAgLy8gdmlldyBhbmQgb2Zmc2V0IGludG8gaXQuIFRoaXMgd2FzIHRoZSBmYXN0ZXN0IG1ldGhvZCBwcm9maWxlZCBzbyBmYXIgZm9yIGZpbGxpbmcgYSBtaXhlZC10eXBlXG4gICAgLy8gdmVydGV4IGxheW91dCAodGhvdWdoIHN0aWxsIHNsb3dlciB0aGFuIHRoZSBwcmV2aW91cyBtZXRob2QgdGhhdCBvbmx5IHN1cHBvcnRlZCBGbG9hdDMyQXJyYXkgYXR0cmlidXRlcykuXG4gICAgYWRkVmVydGV4ICh2ZXJ0ZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0J1ZmZlclNpemUoKTtcbiAgICAgICAgdmFyIGk9MDtcblxuICAgICAgICB2YXIgY2xlbiA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGM9MDsgYyA8IGNsZW47IGMrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXVsodGhpcy5vZmZzZXQgPj4gY29tcG9uZW50WzJdKSArIGNvbXBvbmVudFszXV0gPSB2ZXJ0ZXhbaSsrXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGU7XG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gRmluYWxpemUgdmVydGV4IGJ1ZmZlciBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyBhIG1lc2hcbiAgICBlbmQgKCkge1xuICAgICAgICAvLyBDbGlwIHRoZSBidWZmZXIgdG8gc2l6ZSB1c2VkIGZvciB0aGlzIFZCT1xuICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSB0aGlzLnZlcnRleF9idWZmZXIuc3ViYXJyYXkoMCwgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfZWxlbWVudHMuZW5kKCk7XG5cbiAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiAke3RoaXMuc2l6ZX0gdmVydGljZXMgdG90YWwsIHJlYWxsb2MgY291bnQgJHt0aGlzLnJlYWxsb2NfY291bnR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG5cblZlcnRleERhdGEuYXJyYXlfcG9vbCA9IFtdOyAvLyBwb29sIG9mIGN1cnJlbnRseSBhdmFpbGFibGUgKHByZXZpb3VzbHkgdXNlZCkgYnVmZmVycyAodWludDgpXG4iLCJpbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5sZXQgTUFYX1ZBTFVFID0gTWF0aC5wb3coMiwgMTYpIC0gMTtcbmxldCBVaW50MzJfZmxhZyA9IGZhbHNlO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhFbGVtZW50cyB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgIHRoaXMuaGFzX292ZXJmbG93biA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoICh2YWx1ZSkge1xuICAgICAgICAvLyBJZiB2YWx1ZXMgaGF2ZSBvdmVyZmxvd24gYW5kIG5vIFVpbnQzMiBvcHRpb24gaXMgYXZhaWxhYmxlLCBkbyBub3QgcHVzaCB2YWx1ZXNcbiAgICAgICAgaWYgKHRoaXMuaGFzX292ZXJmbG93biAmJiAhVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgb3ZlcmZsb3cgaWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIFVpbnQxNiBtYXhcbiAgICAgICAgaWYgKHZhbHVlID4gTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFVaW50MzJfZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVuZCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFycmF5Lmxlbmd0aCl7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gY3JlYXRlQnVmZmVyKHRoaXMuYXJyYXksIHRoaXMuaGFzX292ZXJmbG93bik7XG4gICAgICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcgPSBmdW5jdGlvbihmbGFnKSB7XG4gICAgVWludDMyX2ZsYWcgPSBmbGFnO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGFycmF5LCBvdmVyZmxvd24pIHtcbiAgICB2YXIgdHlwZWRBcnJheSA9IChvdmVyZmxvd24gJiYgVWludDMyX2ZsYWcpID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheTtcbiAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkoYXJyYXkpO1xufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdWZXJ0ZXhFbGVtZW50cycsIFZlcnRleEVsZW1lbnRzKTtcbiIsImltcG9ydCBnbCBmcm9tICcuL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4RGF0YSBmcm9tICcuL3ZlcnRleF9kYXRhJztcblxuLy8gRGVzY3JpYmVzIGEgdmVydGV4IGxheW91dCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggbWFueSBkaWZmZXJlbnQgR0wgcHJvZ3JhbXMuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhMYXlvdXQge1xuICAgIC8vIEF0dHJpYnMgYXJlIGFuIGFycmF5LCBpbiBsYXlvdXQgb3JkZXIsIG9mOiBuYW1lLCBzaXplLCB0eXBlLCBub3JtYWxpemVkXG4gICAgLy8gZXg6IHsgbmFtZTogJ3Bvc2l0aW9uJywgc2l6ZTogMywgdHlwZTogZ2wuRkxPQVQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH1cbiAgICBjb25zdHJ1Y3RvciAoYXR0cmlicykge1xuICAgICAgICB0aGlzLmF0dHJpYnMgPSBhdHRyaWJzOyAvLyBhcnJheSBvZiBhdHRyaWJ1dGVzLCBzcGVjaWZpZWQgYXMgc3RhbmRhcmQgR0wgYXR0cmliIG9wdGlvbnNcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107ICAgLy8gbGlzdCBvZiB0eXBlIGFuZCBvZmZzZXQgaW5mbyBhYm91dCBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnRcbiAgICAgICAgdGhpcy5pbmRleCA9IHt9OyAgICAgICAgLy8gbGluZWFyIGJ1ZmZlciBpbmRleCBvZiBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnQsIGUuZy4gdGhpcy5pbmRleC5wb3NpdGlvbi54XG5cbiAgICAgICAgLy8gQ2FsYyB2ZXJ0ZXggc3RyaWRlXG4gICAgICAgIHRoaXMuc3RyaWRlID0gMDtcblxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBhPTA7IGEgPCB0aGlzLmF0dHJpYnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWIgPSB0aGlzLmF0dHJpYnNbYV07XG4gICAgICAgICAgICBhdHRyaWIub2Zmc2V0ID0gdGhpcy5zdHJpZGU7XG4gICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplID0gYXR0cmliLnNpemU7XG4gICAgICAgICAgICB2YXIgc2hpZnQgPSAwO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLklOVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlVOU0lHTkVEX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSA0O1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZ2wuU0hPUlQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5VTlNJR05FRF9TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSAyO1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSA0LWJ5dGUgYWxpZ25tZW50IG9uIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIHRoaXMuc3RyaWRlICs9IGF0dHJpYi5ieXRlX3NpemU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJpZGUgJiAzKSB7IC8vIHBhZCB0byBtdWx0aXBsZSBvZiA0IGJ5dGVzXG4gICAgICAgICAgICAgICAgdGhpcy5zdHJpZGUgKz0gNCAtICh0aGlzLnN0cmlkZSAmIDMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgaW5mbyB0byBsaXN0IG9mIGF0dHJpYnV0ZSBjb21wb25lbnRzXG4gICAgICAgICAgICAvLyBVc2VkIHRvIGJ1aWxkIHRoZSB2ZXJ0ZXggZGF0YSwgcHJvdmlkZXMgcG9pbnRlcnMgYW5kIG9mZnNldHMgaW50byBlYWNoIHR5cGVkIGFycmF5IHZpZXdcbiAgICAgICAgICAgIC8vIEVhY2ggY29tcG9uZW50IGlzIGFuIGFycmF5IG9mOlxuICAgICAgICAgICAgLy8gW0dMIGF0dHJpYiB0eXBlLCBwb2ludGVyIHRvIHR5cGVkIGFycmF5IHZpZXcsIGJpdHMgdG8gc2hpZnQgcmlnaHQgdG8gZGV0ZXJtaW5lIGJ1ZmZlciBvZmZzZXQsIGFkZGl0aW9uYWwgYnVmZmVyIG9mZnNldCBmb3IgdGhlIGNvbXBvbmVudF1cbiAgICAgICAgICAgIHZhciBvZmZzZXRfdHlwZWQgPSBhdHRyaWIub2Zmc2V0ID4+IHNoaWZ0O1xuICAgICAgICAgICAgaWYgKGF0dHJpYi5zaXplID4gMSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IGF0dHJpYi5zaXplOyBzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goW2F0dHJpYi50eXBlLCBudWxsLCBzaGlmdCwgb2Zmc2V0X3R5cGVkKytdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbYXR0cmliLnR5cGUsIG51bGwsIHNoaWZ0LCBvZmZzZXRfdHlwZWRdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJvdmlkZSBhbiBpbmRleCBpbnRvIHRoZSB2ZXJ0ZXggZGF0YSBidWZmZXIgZm9yIGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudFxuICAgICAgICAgICAgdGhpcy5pbmRleFthdHRyaWIubmFtZV0gPSBjb3VudDtcbiAgICAgICAgICAgIGNvdW50ICs9IGF0dHJpYi5zaXplO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgYSB2ZXJ0ZXggbGF5b3V0IGZvciBhIHNwZWNpZmljIEdMIHByb2dyYW1cbiAgICAvLyBBc3N1bWVzIHRoYXQgdGhlIGRlc2lyZWQgdmVydGV4IGJ1ZmZlciAoVkJPKSBpcyBhbHJlYWR5IGJvdW5kXG4gICAgLy8gSWYgYSBnaXZlbiBwcm9ncmFtIGRvZXNuJ3QgaW5jbHVkZSBhbGwgYXR0cmlidXRlcywgaXQgY2FuIHN0aWxsIHVzZSB0aGUgdmVydGV4IGxheW91dFxuICAgIC8vIHRvIHJlYWQgdGhvc2UgYXR0cmlicyB0aGF0IGl0IGRvZXMgcmVjb2duaXplLCB1c2luZyB0aGUgYXR0cmliIG9mZnNldHMgdG8gc2tpcCBvdGhlcnMuXG4gICAgZW5hYmxlIChnbCwgcHJvZ3JhbSwgZm9yY2UpXG4gICAge1xuICAgICAgICB2YXIgYXR0cmliLCBsb2NhdGlvbjtcblxuICAgICAgICAvLyBFbmFibGUgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbGF5b3V0XG4gICAgICAgIGZvciAodmFyIGE9MDsgYSA8IHRoaXMuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgYXR0cmliID0gdGhpcy5hdHRyaWJzW2FdO1xuICAgICAgICAgICAgbG9jYXRpb24gPSBwcm9ncmFtLmF0dHJpYnV0ZShhdHRyaWIubmFtZSkubG9jYXRpb247XG5cbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIVZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihsb2NhdGlvbiwgYXR0cmliLnNpemUsIGF0dHJpYi50eXBlLCBhdHRyaWIubm9ybWFsaXplZCwgdGhpcy5zdHJpZGUsIGF0dHJpYi5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dID0gcHJvZ3JhbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgYW55IHByZXZpb3VzbHkgYm91bmQgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBmb3IgdGhpcyBsYXlvdXRcbiAgICAgICAgZm9yIChsb2NhdGlvbiBpbiBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGUoZ2wsIGxvY2F0aW9uLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc2FibGUgYW4gYXR0cmlidXRlIGlmIGl0IHdhcyBub3QgZW5hYmxlZCBmb3IgdGhlIHNwZWNpZmllZCBwcm9ncmFtXG4gICAgLy8gTk9URTogdGhpcyB3YXMgbW92ZWQgb3V0IG9mIHRoZSBpbm5lciBsb29wIGluIGVuYWJsZSgpIHRvIGFzc2lzdCB3L1ZNIG9wdGltaXphdGlvblxuICAgIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGUgKGdsLCBsb2NhdGlvbiwgcHJvZ3JhbSkge1xuICAgICAgICBpZiAoVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gIT09IHByb2dyYW0pIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XG4gICAgICAgICAgICBkZWxldGUgVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVWZXJ0ZXhEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXhEYXRhKHRoaXMpO1xuICAgIH1cblxufVxuXG4vLyBUcmFjayBjdXJyZW50bHkgZW5hYmxlZCBhdHRyaWJzLCBieSB0aGUgcHJvZ3JhbSB0aGV5IGFyZSBib3VuZCB0b1xuLy8gU3RhdGljIGNsYXNzIHByb3BlcnR5IHRvIHJlZmxlY3QgZ2xvYmFsIEdMIHN0YXRlXG5WZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzID0ge307XG4iLCJpbXBvcnQgUmVwZWF0R3JvdXAgZnJvbSAnLi9yZXBlYXRfZ3JvdXAnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG52YXIgQ29sbGlzaW9uO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb24gPSB7XG5cbiAgICB0aWxlczoge30sXG5cbiAgICBzdGFydFRpbGUgKHRpbGUpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy50aWxlc1t0aWxlXSA9IHtcbiAgICAgICAgICAgIGJib3hlczogeyAgICAgICAgICAgLy8gY3VycmVudCBzZXQgb2YgcGxhY2VkIGJvdW5kaW5nIGJveGVzXG4gICAgICAgICAgICAgICAgYWFiYjogW10sXG4gICAgICAgICAgICAgICAgb2JiOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9iamVjdHM6IHt9LCAgICAgICAgLy8gb2JqZWN0cyB0byBjb2xsaWRlLCBncm91cGVkIGJ5IHByaW9yaXR5LCB0aGVuIGJ5IHN0eWxlXG4gICAgICAgICAgICBrZWVwOiB7fSwgICAgICAgICAgIC8vIG9iamVjdHMgdGhhdCB3ZXJlIGtlcHQgYWZ0ZXIgY29sbGlzaW9uLCBncm91cGVkIGJ5IHN0eWxlXG4gICAgICAgICAgICBzdHlsZXM6IHt9ICAgICAgICAgIC8vIHN0eWxlcyBjb250cmlidXRpbmcgY29sbGlzaW9uIG9iamVjdHNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVkIHdoZW4gYWxsIHJlZ2lzdGVyZWQgc3R5bGVzIGhhdmUgYWRkZWQgb2JqZWN0c1xuICAgICAgICBzdGF0ZS5jb21wbGV0ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzZXRUaWxlICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzdHlsZSB0byB0aGUgcGVuZGluZyBzZXQsIGNvbGxpc2lvbiB3aWxsIGJsb2NrIG9uIGFsbCBzdHlsZXMgc3VibWl0dGluZyB0byBjb2xsaXNpb24gc2V0XG4gICAgYWRkU3R5bGUgKHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZV0uc3R5bGVzW3N0eWxlXSA9IHRydWU7XG4gICAgfSxcblxuICAgIC8vIEFkZCBjb2xsaXNpb24gb2JqZWN0cyBmb3IgYSBzdHlsZVxuICAgIGNvbGxpZGUgKG9iamVjdHMsIHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCAnQ29sbGlzaW9uLmNvbGxpZGUoKSBjYWxsZWQgd2l0aCBudWxsIHRpbGUnLCB0aWxlLCB0aGlzLnRpbGVzLCBzdHlsZSwgb2JqZWN0cyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdyb3VwIGJ5IHByaW9yaXR5IGFuZCBzdHlsZVxuICAgICAgICBsZXQgdGlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0cztcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG9iaiA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBvYmoubGFiZWwubGF5b3V0LnByaW9yaXR5O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV0gfHwge307XG4gICAgICAgICAgICB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdIHx8IFtdO1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0ucHVzaChvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gcGVuZGluZyBzdHlsZSBzZXQsIGlmIG5vIG1vcmUgc3R5bGVzLCBkbyBjb2xsaXNpb24gJiBmaW5pc2ggdGlsZVxuICAgICAgICBkZWxldGUgc3RhdGUuc3R5bGVzW3N0eWxlXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFRpbGUodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWl0IGZvciBvYmplY3RzIHRvIGJlIGFkZGVkIGZyb20gYWxsIHN0eWxlc1xuICAgICAgICByZXR1cm4gc3RhdGUuY29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUua2VlcFtzdHlsZV0gfHwgW107XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBUZXN0IGxhYmVscyBmb3IgY29sbGlzaW9ucywgaGlnaGVyIHRvIGxvd2VyIHByaW9yaXR5XG4gICAgLy8gV2hlbiB0d28gY29sbGlkZSwgZGlzY2FyZCB0aGUgbG93ZXItcHJpb3JpdHkgbGFiZWxcbiAgICBlbmRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGxldCBrZWVwID0gc3RhdGUua2VlcDtcblxuICAgICAgICBSZXBlYXRHcm91cC5jbGVhcih0aWxlKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGxhYmVscyBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICBsZXQgcHJpb3JpdGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLm9iamVjdHMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcHJpb3JpdGllcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgbGV0IHN0eWxlX29iamVjdHMgPSBzdGF0ZS5vYmplY3RzW3ByaW9yaXRpZXNbcF1dO1xuICAgICAgICAgICAgaWYgKCFzdHlsZV9vYmplY3RzKSB7IC8vIG5vIGxhYmVscyBhdCB0aGlzIHByaW9yaXR5LCBza2lwIHRvIG5leHRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggc3R5bGVcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHN0eWxlX29iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0cyA9IHN0eWxlX29iamVjdHNbc3R5bGVdO1xuICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdID0ga2VlcFtzdHlsZV0gfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdCA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkJlUGxhY2VkKG9iamVjdCwgdGlsZSwgb2JqZWN0LmxpbmtlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgb2JqZWN0IGlmIGl0IGlzbid0IGRlcGVuZGVudCBvbiBhIHBhcmVudCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0LmxpbmtlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdLnB1c2gob2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvYmplY3QgaXMgZGVwZW5kZW50IG9uIGEgcGFyZW50LCBvbmx5IGtlZXAgaWYgYm90aCBjYW4gYmUgcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNhbkJlUGxhY2VkKG9iamVjdC5saW5rZWQsIHRpbGUsIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXS5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LmxpbmtlZCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy50aWxlc1t0aWxlXTtcbiAgICAgICAgc3RhdGUucmVzb2x2ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBSdW4gY29sbGlzaW9uIGFuZCByZXBlYXQgY2hlY2sgdG8gc2VlIGlmIGxhYmVsIGNhbiBjdXJyZW50bHkgYmUgcGxhY2VkXG4gICAgY2FuQmVQbGFjZWQgKG9iamVjdCwgdGlsZSwgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGxhYmVsID0gb2JqZWN0LmxhYmVsO1xuICAgICAgICBsZXQgbGF5b3V0ID0gb2JqZWN0LmxhYmVsLmxheW91dDtcblxuICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkIChlLmcuIGJ5IHBhcmVudCBvYmplY3QpXG4gICAgICAgIGlmIChsYWJlbC5wbGFjZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnBsYWNlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlc3QgdGhlIGxhYmVsIGZvciBpbnRlcnNlY3Rpb25zIHdpdGggb3RoZXIgbGFiZWxzIGluIHRoZSB0aWxlXG4gICAgICAgIGxldCBiYm94ZXMgPSB0aGlzLnRpbGVzW3RpbGVdLmJib3hlcztcbiAgICAgICAgaWYgKCFsYXlvdXQuY29sbGlkZSB8fCAhbGFiZWwuZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgJiYgZXhjbHVkZS5sYWJlbCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciByZXBlYXRzXG4gICAgICAgICAgICBsZXQgcmVwZWF0ID0gUmVwZWF0R3JvdXAuY2hlY2sobGFiZWwsIGxheW91dCwgdGlsZSk7XG4gICAgICAgICAgICBpZiAocmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBkaXNjYXJkIGxhYmVsICcke2xhYmVsLnRleHR9JywgKG9uZV9wZXJfZ3JvdXA6ICR7cmVwZWF0Lm9uZV9wZXJfZ3JvdXB9KSwgZGlzdCAke01hdGguc3FydChyZXBlYXQuZGlzdF9zcSkvbGF5b3V0LnVuaXRzX3Blcl9waXhlbH0gPCAke01hdGguc3FydChyZXBlYXQucmVwZWF0X2Rpc3Rfc3EpL2xheW91dC51bml0c19wZXJfcGl4ZWx9YCk7XG4gICAgICAgICAgICAgICAgbGFiZWwucGxhY2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsYXlvdXQuY29sbGlkZSkge1xuICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBkaXNjYXJkIGxhYmVsICcke2xhYmVsLnRleHR9JyBkdWUgdG8gY29sbGlzaW9uYCk7XG4gICAgICAgICAgICBsYWJlbC5wbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWwucGxhY2VkO1xuICAgIH0sXG5cbiAgICAvLyBQbGFjZSBsYWJlbFxuICAgIHBsYWNlICh7IGxhYmVsIH0sIHRpbGUpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZCAoZS5nLiBieSBwYXJlbnQgb2JqZWN0KVxuICAgICAgICBpZiAobGFiZWwucGxhY2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGFzIHBsYWNlZCBmb3IgZnV0dXJlIGNvbGxpc2lvbiBhbmQgcmVwZWF0IGN1bGxpbmdcbiAgICAgICAgUmVwZWF0R3JvdXAuYWRkKGxhYmVsLCBsYWJlbC5sYXlvdXQsIHRpbGUpO1xuICAgICAgICBsYWJlbC5hZGQodGhpcy50aWxlc1t0aWxlXS5iYm94ZXMpO1xuICAgIH1cblxufTtcbiIsIlxuLy8gRG8gQUFCQiBgYWAgYW5kIGBiYCBpbnRlcnNlY3Q/XG5leHBvcnQgZnVuY3Rpb24gYm94SW50ZXJzZWN0c0JveCAoYSwgYikge1xuICAgIGlmIChhWzJdIDwgYlswXSB8fCAvLyBhIGlzIGxlZnQgb2YgYlxuICAgICAgICBhWzBdID4gYlsyXSB8fCAvLyBhIGlzIHJpZ2h0IG9mIGJcbiAgICAgICAgYVszXSA8IGJbMV0gfHwgLy8gYSBpcyBhYm92ZSBiXG4gICAgICAgIGFbMV0gPiBiWzNdKSB7IC8vIGEgaXMgYmVsb3cgYlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlOyAvLyBib3hlcyBvdmVybGFwXG59XG5cbi8vIERvZXMgQUFCQiBgYWAgaW50ZXJzZWN0IGFueSBvZiB0aGUgQUFCQnMgaW4gYXJyYXkgYGJveGVzYD9cbi8vIEludm9rZXMgYGNhbGxiYWNrYCB3aXRoIGluZGV4IG9mIGludGVyc2VjdGluZyBib3hcbi8vIFN0b3BzIGludGVyc2VjdGluZyBpZiBgY2FsbGJhY2tgIHJldHVybnMgbm9uLW51bGwgdmFsdWUgKGNvbnRpbnVlcyBvdGhlcndpc2UpXG5leHBvcnQgZnVuY3Rpb24gYm94SW50ZXJzZWN0c0xpc3QgKGEsIGJveGVzLCBjYWxsYmFjaykge1xuICAgIGZvciAobGV0IGk9MDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChib3hJbnRlcnNlY3RzQm94KGEsIGJveGVzW2ldKSkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQb2ludEFuY2hvciBmcm9tICcuL3BvaW50X2FuY2hvcic7XG5pbXBvcnQge2JveEludGVyc2VjdHNMaXN0fSBmcm9tICcuL2ludGVyc2VjdCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuLy8gaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2l6ZSwgbGF5b3V0ID0ge30pIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmFuY2hvciA9IEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSA/IHRoaXMubGF5b3V0LmFuY2hvclswXSA6IHRoaXMubGF5b3V0LmFuY2hvcjsgLy8gaW5pdGlhbCBhbmNob3JcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBudWxsO1xuICAgICAgICB0aGlzLm9mZnNldCA9IGxheW91dC5vZmZzZXQ7XG4gICAgICAgIHRoaXMuYWFiYiA9IG51bGw7XG4gICAgICAgIHRoaXMub2JiID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSBmYWxzZTsgICAgLy8gaWYgbGFiZWwgZG9lcyBub3QgZml0IChleGNlZWRzIHRpbGUgYm91bmRhcnksIGV0YykgdGhpcyBib29sZWFuIHdpbGwgYmUgdHJ1ZVxuICAgIH1cblxuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIHRoaXMuYWxpZ24gPSB0aGlzLmxheW91dC5hbGlnbiB8fCBQb2ludEFuY2hvci5hbGlnbkZvckFuY2hvcih0aGlzLmFuY2hvcik7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgZm9yIG92ZXJsYXBzIHdpdGggb3RoZXIgbGFiZWxzIGluIHRoZSB0aWxlXG4gICAgb2NjbHVkZWQgKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGludGVyc2VjdCA9IGZhbHNlO1xuICAgICAgICBsZXQgYWFiYnMgPSBiYm94ZXMuYWFiYjtcbiAgICAgICAgbGV0IG9iYnMgPSBiYm94ZXMub2JiO1xuXG4gICAgICAgIC8vIEJyb2FkIHBoYXNlXG4gICAgICAgIGlmIChhYWJicy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBib3hJbnRlcnNlY3RzTGlzdCh0aGlzLmFhYmIsIGFhYmJzLCAoaikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBicm9hZCBwaGFzZSBjb2xsaWRlJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMuYWFiYiwgYWFiYnNbal0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb2xsaWRpbmcgd2l0aCBleGNsdWRlZCBsYWJlbFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlICYmIGFhYmJzW2pdID09PSBleGNsdWRlLmFhYmIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsICdjb2xsaXNpb246IHNraXBwaW5nIGR1ZSB0byBleHBsaWNpdCBleGNsdXNpb24nLCB0aGlzLCBleGNsdWRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNraXAgbmFycm93IHBoYXNlIGNvbGxpc2lvbiBpZiBubyByb3RhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iYi5hbmdsZSA9PT0gMCAmJiBvYmJzW2pdLmFuZ2xlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwIG5hcnJvdyBwaGFzZSBjb2xsaWRlIGJlY2F1c2UgbmVpdGhlciBpcyByb3RhdGVkJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMub2JiLCBvYmJzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTmFycm93IHBoYXNlXG4gICAgICAgICAgICAgICAgaWYgKE9CQi5pbnRlcnNlY3QodGhpcy5vYmIsIG9iYnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBuYXJyb3cgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnRlcnNlY3Q7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoaXMgbGFiZWwncyBib3VuZGluZyBib3ggdG8gdGhlIHByb3ZpZGVkIHNldFxuICAgIGFkZCAoYmJveGVzKSB7XG4gICAgICAgIHRoaXMucGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgYmJveGVzLmFhYmIucHVzaCh0aGlzLmFhYmIpO1xuICAgICAgICBiYm94ZXMub2JiLnB1c2godGhpcy5vYmIpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrcyB3aGV0aGVyIHRoZSBsYWJlbCBpcyB3aXRoaW4gdGhlIHRpbGUgYm91bmRhcmllc1xuICAgIGluVGlsZUJvdW5kcyAoKSB7XG4gICAgICAgIGxldCBtaW4gPSBbIHRoaXMuYWFiYlswXSwgdGhpcy5hYWJiWzFdIF07XG4gICAgICAgIGxldCBtYXggPSBbIHRoaXMuYWFiYlsyXSwgdGhpcy5hYWJiWzNdIF07XG5cbiAgICAgICAgaWYgKCFVdGlscy5wb2ludEluVGlsZShtaW4pIHx8ICFVdGlscy5wb2ludEluVGlsZShtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXaGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYmUgZGlzY2FyZGVkXG4gICAgLy8gRGVwZW5kcyBvbiB3aGV0aGVyIGxhYmVsIG11c3QgZml0IGluIHRoZSB0aWxlIGJvdW5kcywgYW5kIGlmIHNvLCBjYW4gaXQgYmUgbW92ZWQgdG8gZml0IHRoZXJlXG4gICAgZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLnRocm93X2F3YXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm9jY2x1ZGVkKGJib3hlcywgZXhjbHVkZSk7XG4gICAgfVxufVxuXG5MYWJlbC5lcHNpbG9uID0gMC45OTk5OyAvLyB0b2xlcmFuY2UgYXJvdW5kIGNvbGxpc2lvbiBib3hlcywgcHJldmVudCBwZXJmZWN0bHkgYWRqYWNlbnQgb2JqZWN0cyBmcm9tIGNvbGxpZGluZ1xuIiwiaW1wb3J0IExhYmVsIGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuXG5jb25zdCBQTEFDRU1FTlQgPSB7XG4gICAgTUlEX1BPSU5UOiAwLFxuICAgIENPUk5FUjogMVxufTtcblxuY29uc3QgTUFYX0FOR0xFID0gTWF0aC5QSSAvIDI7ICAgICAgLy8gbWF4aW11bSBhbmdsZSBmb3IgYXJ0aWN1bGF0ZWQgbGFiZWxzXG5jb25zdCBMSU5FX0VYQ0VFRF9TVFJBSUdIVCA9IDAuNzsgICAvLyBtaW5pbWFsIHJhdGlvIGZvciBzdHJhaWdodCBsYWJlbHMgKGxhYmVsIGxlbmd0aCkgLyAobGluZSBsZW5ndGgpXG5jb25zdCBMSU5FX0VYQ0VFRF9LSU5LRUQgPSAwLjY7ICAgICAvLyBtaW5pbWFsIHJhdGlvIGZvciBraW5rZWQgbGFiZWxzXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsTGluZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2l6ZSwgbGluZXMsIGxheW91dCkge1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5saW5lcyA9IGxpbmVzO1xuICAgICAgICB0aGlzLnNwYWNlX3dpZHRoID0gbGF5b3V0LnNwYWNlX3dpZHRoOyAvLyB3aWR0aCBvZiBzcGFjZSBmb3IgdGhlIGZvbnQgdXNlZFxuICAgICAgICB0aGlzLm51bV9zZWdtZW50cyA9IHNpemUubGVuZ3RoOyAvLyBudW1iZXIgb2YgbGFiZWwgc2VnbWVudHNcbiAgICAgICAgdGhpcy50b3RhbF9sZW5ndGggPSBzaXplLnJlZHVjZShmdW5jdGlvbihwcmV2LCBuZXh0KXsgcmV0dXJuIHByZXYgKyBuZXh0WzBdOyB9LCAwKSArIChzaXplLmxlbmd0aCAtIDEpICogdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgdGhpcy50b3RhbF9oZWlnaHQgPSBzaXplWzBdWzFdO1xuICAgICAgICB0aGlzLnBsYWNlbWVudCA9IChsYXlvdXQucGxhY2VtZW50ID09PSB1bmRlZmluZWQpID8gUExBQ0VNRU5ULk1JRF9QT0lOVCA6IGxheW91dC5wbGFjZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gMDsgLy8gaW5kZXggYXQgd2hpY2ggYW4gYXJ0aWN1bGF0ZWQgbGFiZWwgd2lsbCBraW5rIChlLmcuLCAxIG1lYW5zIGEga2luayBfYWZ0ZXJfIHRoZSBmaXJzdCBzZWdtZW50KVxuICAgICAgICB0aGlzLnNwcmVhZF9mYWN0b3IgPSAwLjU7IC8vIHNwYWNlcyBvdXQgYWRqYWNlbnQgd29yZHMgdG8gcHJldmVudCBvdmVybGFwXG4gICAgICAgIHRoaXMuZml0bmVzcyA9IDA7IC8vIG1lYXN1cmUgb2YgcXVhbGl0eSBvZiBmaXRcblxuICAgICAgICAvLyBBcnJheXMgZm9yIExhYmVsIHByb3BlcnRpZXMuIFRPRE86IGNyZWF0ZSBhcnJheSBvZiBMYWJlbCB0eXBlcywgd2hlcmUgTGFiZWxMaW5lIGFjdHMgYXMgYSBcImdyb3VwZWQgbGFiZWxcIlxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW107XG4gICAgICAgIHRoaXMuYW5nbGUgPSBbXTtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW107XG4gICAgICAgIHRoaXMub2JicyA9IFtdO1xuICAgICAgICB0aGlzLmFhYmJzID0gW107XG5cbiAgICAgICAgLy8gb3B0aW9uYWxseSBsaW1pdCB0aGUgbGluZSBzZWdtZW50cyB0aGF0IHRoZSBsYWJlbCBtYXkgYmUgcGxhY2VkIGluLCBieSBzcGVjaWZ5aW5nIGEgc2VnbWVudCBpbmRleCByYW5nZVxuICAgICAgICAvLyB1c2VkIGFzIGEgY29hcnNlIHN1YmRpdmlkZSBmb3IgcGxhY2luZyBtdWx0aXBsZSBsYWJlbHMgcGVyIGxpbmUgZ2VvbWV0cnlcbiAgICAgICAgdGhpcy5zZWdtZW50X2luZGV4ID0gbGF5b3V0LnNlZ21lbnRfaW5kZXggfHwgbGF5b3V0LnNlZ21lbnRfc3RhcnQgfHwgMDtcbiAgICAgICAgdGhpcy5zZWdtZW50X21heCA9IGxheW91dC5zZWdtZW50X2VuZCB8fCB0aGlzLmxpbmVzLmxlbmd0aDtcblxuICAgICAgICAvLyBGaXJzdCBmaXR0aW5nIHNlZ21lbnRcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldE5leHRGaXR0aW5nU2VnbWVudCh0aGlzLmdldEN1cnJlbnRTZWdtZW50KCkpO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSAoIXNlZ21lbnQpO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGluZSBnZW9tZXRyeSBjcmVhdGluZyB0aGUgbmV4dCB2YWxpZCBsYWJlbC5cbiAgICBzdGF0aWMgbmV4dExhYmVsKGxhYmVsKSB7XG4gICAgICAgIC8vIGluY3JlbWVudCBzZWdtZW50XG4gICAgICAgIGxldCBoYXNOZXh0ID0gbGFiZWwuZ2V0TmV4dFNlZ21lbnQoKTtcbiAgICAgICAgaWYgKCFoYXNOZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbG9uZSBvcHRpb25zXG4gICAgICAgIGxldCBsYXlvdXQgPSBPYmplY3QuY3JlYXRlKGxhYmVsLmxheW91dCk7XG4gICAgICAgIGxheW91dC5zZWdtZW50X2luZGV4ID0gbGFiZWwuc2VnbWVudF9pbmRleDtcbiAgICAgICAgbGF5b3V0LnBsYWNlbWVudCA9IGxhYmVsLnBsYWNlbWVudDtcblxuICAgICAgICAvLyBjcmVhdGUgbmV3IGxhYmVsXG4gICAgICAgIGxldCBuZXh0TGFiZWwgPSBuZXcgTGFiZWxMaW5lKGxhYmVsLnNpemUsIGxhYmVsLmxpbmVzLCBsYXlvdXQpO1xuXG4gICAgICAgIHJldHVybiAobmV4dExhYmVsLnRocm93X2F3YXkpID8gZmFsc2UgOiBuZXh0TGFiZWw7XG4gICAgfVxuXG4gICAgLy8gU3RyYXRlZ3kgZm9yIHJldHVybmluZyB0aGUgbmV4dCBzZWdtZW50LiBBc3N1bWVzIGFuIFwib3JkZXJpbmdcIiBvZiBwb3NzaWJsZSBzZWdtZW50c1xuICAgIC8vIHRha2luZyBpbnRvIGFjY291bnQgYm90aCBzdHJhaWdodCBhbmQgYXJ0aWN1bGF0ZWQgc2VnbWVudHMuIFJldHVybnMgZmFsc2UgaWYgYWxsIHBvc3NpYmlsaXRpZXNcbiAgICAvLyBoYXZlIGJlZW4gZXhoYXVzdGVkXG4gICAgZ2V0TmV4dFNlZ21lbnQoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IFBMQUNFTUVOVC5NSURfUE9JTlQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VnbWVudF9pbmRleCA+PSB0aGlzLmxpbmVzLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNpemUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IFBMQUNFTUVOVC5DT1JORVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHRoZSBsaW5lIHNlZ21lbnRzIG5lY2Vzc2FyeSBmb3Igb3RoZXIgY2FsY3VsYXRpb25zIGF0IHRoZSBjdXJyZW50IGxpbmUgc2VnbWVudCBpbmRleC5cbiAgICAvLyBUaGlzIGlzIHRoZSBjdXJyZW50IGFuZCBuZXh0IHNlZ21lbnQgZm9yIGEgc3RyYWlnaHQgbGluZSwgYW5kIHRoZSBwcmV2aW91cywgY3VycmVudCBhbmQgbmV4dFxuICAgIC8vIGZvciBhbiBhcnRpY3VsYXRlZCBzZWdtZW50LlxuICAgIGdldEN1cnJlbnRTZWdtZW50KCkge1xuICAgICAgICBsZXQgcDEsIHAyLCBzZWdtZW50O1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCAtIDFdO1xuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBwMyA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IFsgcDEsIHAyLCBwMyBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gWyBwMSwgcDIgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbmV4dCBzZWdtZW50IHRoYXQgaXMgdmFsaWQgKHdpdGhpbiB0aWxlLCBpbnNpZGUgYW5nbGUgcmVxdWlyZW1lbnRzIGFuZCB3aXRoaW4gbGluZSBnZW9tZXRyeSkuXG4gICAgZ2V0TmV4dEZpdHRpbmdTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQgfHwgdGhpcy5nZXROZXh0U2VnbWVudCgpO1xuICAgICAgICBpZiAoIXNlZ21lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRvZXNTZWdtZW50Rml0KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5UaWxlQm91bmRzKCkgJiYgdGhpcy5pbkFuZ2xlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE5leHRGaXR0aW5nU2VnbWVudCgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgY3VycmVudCBzZWdtZW50IGlzIHZhbGlkXG4gICAgZG9lc1NlZ21lbnRGaXQoc2VnbWVudCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml0S2lua2VkU2VnbWVudChzZWdtZW50KTtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXRTdHJhaWdodFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtpbmtlZCBzZWdtZW50IGlzIHZhbGlkXG4gICAgLy8gQ3ljbGVzIHRocm91Z2ggdmFyaW91cyB3YXlzIG9mIGtpbmtpbmcgdGhlIGxhYmVscyBhcm91bmQgdGhlIHNlZ21lbnQncyBwaXZvdCxcbiAgICAvLyBmaW5kaW5nIHRoZSBiZXN0IGZpdCwgYW5kIGRldGVybWluZXMgdGhlIGtpbmtfaW5kZXguXG4gICAgZml0S2lua2VkU2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG5cbiAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgLy8gRG9uJ3QgZml0IGlmIHNlZ21lbnQgZG9lc24ndCBwYXNzIHRoZSB2ZXJ0aWNhbCBsaW5lIHRlc3QsIHJlc3VsdGluZyBpbiB1cHNpZGUtZG93biBsYWJlbHNcbiAgICAgICAgaWYgKHAwcDFbMF0gKiBwMXAyWzBdIDwgMCAmJiBwMHAxWzFdICogcDFwMlsxXSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW5lX2xlbmd0aDEgPSBWZWN0b3IubGVuZ3RoKHAwcDEpIC8gdXBwO1xuICAgICAgICBsZXQgbGluZV9sZW5ndGgyID0gVmVjdG9yLmxlbmd0aChwMXAyKSAvIHVwcDtcblxuICAgICAgICAvLyBicmVhayB1cCBtdWx0aXBsZSBzZWdtZW50cyBpbnRvIHR3byBjaHVua3MgKE4tMSBvcHRpb25zKVxuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoMSA9IHRoaXMudG90YWxfbGVuZ3RoO1xuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoMiA9IDA7XG4gICAgICAgIGxldCB3aWR0aCwgZml0bmVzcyA9IDA7XG4gICAgICAgIGxldCBraW5rX2luZGV4ID0gdGhpcy5udW1fc2VnbWVudHMgLSAxO1xuICAgICAgICBsZXQgZml0bmVzc2VzID0gW107XG5cbiAgICAgICAgd2hpbGUgKGtpbmtfaW5kZXggPiAwKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuc2l6ZVtraW5rX2luZGV4XVswXSArIHRoaXMuc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgIGxhYmVsX2xlbmd0aDEgLT0gd2lkdGg7XG4gICAgICAgICAgICBsYWJlbF9sZW5ndGgyICs9IHdpZHRoO1xuXG4gICAgICAgICAgICBmaXRuZXNzID0gTWF0aC5tYXgoY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgxLCBsYWJlbF9sZW5ndGgxKSwgY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgyLCBsYWJlbF9sZW5ndGgyKSk7XG4gICAgICAgICAgICBmaXRuZXNzZXMudW5zaGlmdChmaXRuZXNzKTtcblxuICAgICAgICAgICAga2lua19pbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heF9maXRuZXNzID0gTWF0aC5tYXguYXBwbHkobnVsbCwgZml0bmVzc2VzKTtcblxuICAgICAgICBpZiAobWF4X2ZpdG5lc3MgPCBMSU5FX0VYQ0VFRF9LSU5LRUQpIHtcbiAgICAgICAgICAgIHRoaXMua2lua19pbmRleCA9IGZpdG5lc3Nlcy5pbmRleE9mKG1heF9maXRuZXNzKSArIDE7XG4gICAgICAgICAgICB0aGlzLmZpdG5lc3MgPSBtYXhfZml0bmVzcztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gMDtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgc3RyYWlnaHQgc2VnbWVudCBpcyB2YWxpZFxuICAgIC8vIEEgc3RyYWlnaHQgc2VnbWVudCBpcyBwbGFjZWQgYXQgdGhlIG1pZHBvaW50IGFuZCBpcyB2YWxpZCBpZiB0aGUgbGFiZWwncyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGFcbiAgICAvLyBmYWN0b3IgKExJTkVfRVhDRUVEX1NUUkFJR0hUKSBvZiB0aGUgbGluZSBzZWdtZW50J3MgbGVuZ3RoXG4gICAgZml0U3RyYWlnaHRTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoID0gVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pKSAvIHVwcDtcbiAgICAgICAgbGV0IGZpdG5lc3MgPSBjYWxjRml0bmVzcyhsaW5lX2xlbmd0aCwgdGhpcy50b3RhbF9sZW5ndGgpO1xuXG4gICAgICAgIGlmIChmaXRuZXNzIDwgTElORV9FWENFRURfU1RSQUlHSFQpe1xuICAgICAgICAgICAgdGhpcy5maXRuZXNzID0gZml0bmVzcztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25jZSBhIGZpdHRpbmcgc2VnbWVudCBpcyBmb3VuZCwgZGV0ZXJtaW5lIGl0cyBhbmdsZXMsIHBvc2l0aW9ucyBhbmQgYm91bmRpbmcgYm94ZXNcbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuYW5nbGUgPSB0aGlzLmdldEN1cnJlbnRBbmdsZSgpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5nZXRDdXJyZW50UG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50QW5nbGUoKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgYW5nbGVzID0gW107XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIGxldCB0aGV0YTEgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGxldCB0aGV0YTIgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGxldCBwMXAyID0gVmVjdG9yLnN1YihzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAgICAgICAgIGxldCBvcmllbnRhdGlvbiA9IChwMHAxWzBdID49IDAgJiYgcDFwMlswXSA+PSAwKSA/IDEgOiAtMTtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHRoaXMua2lua19pbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IChvcmllbnRhdGlvbiA+IDApID8gdGhldGEyIDogdGhldGExO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAob3JpZW50YXRpb24gPiAwKSA/IHRoZXRhMSA6IHRoZXRhMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhbmdsZXMucHVzaChhbmdsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IGdldEFuZ2xlRnJvbVNlZ21lbnQoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGVzLnB1c2godGhldGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbmdsZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBsYWJlbFxuICAgIGdldEN1cnJlbnRQb3NpdGlvbigpIHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgICAgIGxldCBwb3NpdGlvbjtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBzZWdtZW50WzFdLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBbXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChzZWdtZW50WzBdWzBdICsgc2VnbWVudFsxXVswXSksXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChzZWdtZW50WzBdWzFdICsgc2VnbWVudFsxXVsxXSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhcnRpY3VsYXRlZCBsYWJlbHMgdG8gYmUgd2l0aGluIGFuIGFuZ2xlIHJhbmdlIFstTUFYX0FOR0xFLCArTUFYX0FOR0xFXVxuICAgIGluQW5nbGVCb3VuZHMoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVswXTtcbiAgICAgICAgICAgICAgICBpZiAoYW5nbGUwIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhbmdsZTAgKz0gMiAqIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMSA9IHRoaXMuYW5nbGVbMV07XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlMSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUxICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IE1hdGguYWJzKGFuZ2xlMSAtIGFuZ2xlMCk7XG4gICAgICAgICAgICAgICAgdGhldGEgPSBNYXRoLm1pbigyICogTWF0aC5QSSAtIHRoZXRhLCB0aGV0YSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhldGEgPD0gTUFYX0FOR0xFO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGJvdW5kaW5nIGJveGVzXG4gICAgdXBkYXRlQkJveGVzKCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMudG90YWxfaGVpZ2h0ICsgdGhpcy5sYXlvdXQuYnVmZmVyWzFdICogMikgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgIC8vIHJlc2V0IGJvdW5kaW5nIGJveGVzXG4gICAgICAgIHRoaXMub2JicyA9IFtdO1xuICAgICAgICB0aGlzLmFhYmJzID0gW107XG5cbiAgICAgICAgLy8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBsZXQgaXRhbGljc19idWZmZXIgPSAodGhpcy5sYXlvdXQuaXRhbGljKSA/IDUgKiB1cHAgOiAwO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXggLSAxXTsgLy8gYW5nbGUgYmVmb3JlIGtpbmtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUxID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXhdOyAvLyBhbmdsZSBhZnRlciBraW5rXG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhID0gTWF0aC5hYnMoYW5nbGUxIC0gYW5nbGUwKTsgLy8gYW5nbGUgZGVsdGFcblxuICAgICAgICAgICAgICAgIC8vIEEgc3ByZWFkIGZhY3RvciBvZiAwIHBpdm90cyB0aGUgYm94ZXMgb24gdGhlaXIgaG9yaXpvbnRhbCBjZW50ZXIsIGxvb2tpbmcgbGlrZTogXCJYXCJcbiAgICAgICAgICAgICAgICAvLyBhIHNwcmVhZCBmYWN0b3Igb2YgMSBvZmZzZXRzIHRoZSBib3hlcyBzbyB0aGF0IHRoZWlyIGNvcm5lcnMgdG91Y2gsIGxvb2tpbmcgbGlrZTogXCJcXC9cIiBvciBcIi9cXFwiXG4gICAgICAgICAgICAgICAgbGV0IGR4ID0gdGhpcy5zcHJlYWRfZmFjdG9yICogTWF0aC5hYnModGhpcy50b3RhbF9oZWlnaHQgKiBNYXRoLnRhbigwLjUgKiB0aGV0YSkpO1xuICAgICAgICAgICAgICAgIGxldCBudWRnZSA9IDAuNSAqICgtZHggLSB0aGlzLnNwYWNlX3dpZHRoKTtcblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBiYWNrd2FyZHMgZnJvbSBraW5rIGluZGV4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgbnVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSAtPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUGxhY2UgbGFiZWxzIGZvcndhcmRzIGZyb20ga2luayBpbmRleFxuICAgICAgICAgICAgICAgIG51ZGdlID0gMC41ICogKGR4ICsgdGhpcy5zcGFjZV93aWR0aCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5raW5rX2luZGV4OyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgKz0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgbnVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSArPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGxldCBzaGlmdCA9IC0wLjUgKiB0aGlzLnRvdGFsX2xlbmd0aDsgLy8gc2hpZnQgZm9yIGNlbnRlcmluZyB0aGUgbGFiZWxzXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9ICh3aWR0aF9weCArIDIgKiB0aGlzLmxheW91dC5idWZmZXJbMF0pICogdXBwICogTGFiZWwuZXBzaWxvbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSAwLjUgKiB3aWR0aF9weDtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gVmVjdG9yLnJvdChbc2hpZnQgKiB1cHAsIDBdLCAtYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBWZWN0b3IuYWRkKHRoaXMucG9zaXRpb24sIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iYiA9IGdldE9CQihwb3NpdGlvbiwgd2lkdGggKyBpdGFsaWNzX2J1ZmZlciwgaGVpZ2h0LCBhbmdsZSwgdGhpcy5vZmZzZXQsIHVwcCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhYWJiID0gb2JiLmdldEV4dGVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Jicy5wdXNoKG9iYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWFiYnMucHVzaChhYWJiKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMF0gKyBzaGlmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFsxXVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDAuNSAqIHdpZHRoX3B4ICsgdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IGlzIHdpdGhpbiB0aGUgdGlsZS4gSWYgYW55IHNlZ21lbnQgZmFpbHMgdGhpcyB0ZXN0LCB0aGV5IGFsbCBmYWlsLlxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgaW5UaWxlQm91bmRzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWFiYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIgfTtcbiAgICAgICAgICAgIGxldCBpbl9ib3VuZHMgPSBMYWJlbC5wcm90b3R5cGUuaW5UaWxlQm91bmRzLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghaW5fYm91bmRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFkZHMgZWFjaCBzZWdtZW50IHRvIHRoZSBjb2xsaXNpb24gcGFzcyBhcyBpdHMgb3duIGJvdW5kaW5nIGJveFxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgYWRkKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hYWJicy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iYiA9IHRoaXMub2Jic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIsIG9iYiB9O1xuICAgICAgICAgICAgTGFiZWwucHJvdG90eXBlLmFkZC5jYWxsKG9iaiwgYmJveGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IHNob3VsZCBiZSBkaXNjYXJkZWQgKHZpYSBjb2xsaXNpb24pLiBJZiBhbnkgc2VnbWVudCBmYWlscyB0aGlzIHRlc3QsIHRoZXkgYWxsIGZhaWwuXG4gICAgLy8gVE9ETzogbGFiZWwgZ3JvdXBcbiAgICBkaXNjYXJkKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dfYXdheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub2Jicy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JiID0gdGhpcy5vYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iaiA9IHsgYWFiYiwgb2JiIH07XG5cbiAgICAgICAgICAgIGxldCBzaG91bGREaXNjYXJkID0gTGFiZWwucHJvdG90eXBlLm9jY2x1ZGVkLmNhbGwob2JqLCBiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgICAgICAgICAgaWYgKHNob3VsZERpc2NhcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgb3JpZW50ZWQgYm91bmRpbmcgYm94XG5mdW5jdGlvbiBnZXRPQkIocG9zaXRpb24sIHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCBvZmZzZXQsIHVwcCkge1xuICAgIGxldCBwMCwgcDE7XG4gICAgLy8gYXBwbHkgb2Zmc2V0LCB4IHBvc2l0aXZlLCB5IHBvaW50aW5nIGRvd25cbiAgICBpZiAob2Zmc2V0ICYmIChvZmZzZXRbMF0gIT09IDAgfHwgb2Zmc2V0WzFdICE9PSAwKSkge1xuICAgICAgICBvZmZzZXQgPSBWZWN0b3Iucm90KG9mZnNldCwgYW5nbGUpO1xuICAgICAgICBwMCA9IHBvc2l0aW9uWzBdICsgKG9mZnNldFswXSAqIHVwcCk7XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV0gLSAob2Zmc2V0WzFdICogdXBwKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHAwID0gcG9zaXRpb25bMF07XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV07XG4gICAgfVxuXG4gICAgLy8gdGhlIGFuZ2xlIG9mIHRoZSBvYmIgaXMgbmVnYXRpdmUgc2luY2UgaXQncyB0aGUgdGlsZSBzeXN0ZW0geSBheGlzIGlzIHBvaW50aW5nIGRvd25cbiAgICByZXR1cm4gbmV3IE9CQihwMCwgcDEsIC1hbmdsZSwgd2lkdGgsIGhlaWdodCk7XG59XG5cbi8vIFByaXZhdGUgbWV0aG9kIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGUgb2YgYSBzZWdtZW50LlxuLy8gVHJhbnNmb3JtcyB0aGUgYW5nbGUgdG8gbGllIHdpdGhpbiB0aGUgcmFuZ2UgWzAsIFBJLzJdIGFuZCBbMypQSS8yLCAyKlBJXSAoMXN0IG9yIDR0aCBxdWFkcmFudHMpXG4vLyBhcyBvdGhlciByYW5nZXMgcHJvZHVjZSBcInVwc2lkZSBkb3duXCIgbGFiZWxzXG5mdW5jdGlvbiBnZXRBbmdsZUZyb21TZWdtZW50KHB0MSwgcHQyKSB7XG4gICAgbGV0IFBJID0gTWF0aC5QSTtcbiAgICBsZXQgUElfMiA9IFBJIC8gMjtcbiAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIocHQxLCBwdDIpO1xuICAgIGxldCB0aGV0YSA9IE1hdGguYXRhbjIocDFwMlswXSwgcDFwMlsxXSkgKyBQSV8yO1xuXG4gICAgaWYgKHRoZXRhID4gUElfMikge1xuICAgICAgICAvLyBJZiBpbiAybmQgcXVhZHJhbnQsIG1vdmUgdG8gNHRoIHF1YWRyYW50XG4gICAgICAgIHRoZXRhICs9IFBJO1xuICAgICAgICB0aGV0YSAlPSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhldGEgPCAwKSB7XG4gICAgICAgIC8vIElmIGluIDR0aCBxdWFkcmFudCwgbWFrZSBhIHBvc2l0aXZlIGFuZ2xlXG4gICAgICAgIHRoZXRhICs9IDIgKiBQSTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhldGE7XG59XG5cbmZ1bmN0aW9uIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoLCBsYWJlbF9sZW5ndGgpe1xuICAgIHJldHVybiAxIC0gbGluZV9sZW5ndGggLyBsYWJlbF9sZW5ndGg7XG59XG4iLCJpbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsUG9pbnQgZXh0ZW5kcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocG9zaXRpb24sIHNpemUsIGxheW91dCkge1xuICAgICAgICBzdXBlcihzaXplLCBsYXlvdXQpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW3Bvc2l0aW9uWzBdLCBwb3NpdGlvblsxXV07XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5sYXlvdXQucGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuc3RhcnRfYW5jaG9yX2luZGV4ID0gMTtcbiAgICAgICAgdGhpcy5kZWdlbmVyYXRlID0gIXRoaXMuc2l6ZVswXSAmJiAhdGhpcy5zaXplWzFdICYmICF0aGlzLmxheW91dC5idWZmZXJbMF0gJiYgIXRoaXMubGF5b3V0LmJ1ZmZlclsxXTtcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gIXRoaXMuZ2V0TmV4dEZpdCgpO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuY29tcHV0ZU9mZnNldCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgIH1cblxuICAgIGNvbXB1dGVPZmZzZXQgKCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IFt0aGlzLmxheW91dC5vZmZzZXRbMF0sIHRoaXMubGF5b3V0Lm9mZnNldFsxXV07XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IGZvciBwb2ludDpcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICAvLyBwb2ludCdzIG93biBhbmNob3IsIHRleHQgYW5jaG9yIGFwcGxpZWQgdG8gcG9pbnQsIGFkZGl0aW9uYWwgcG9pbnQgb2Zmc2V0XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCBwYXJlbnQuYW5jaG9yLCBQb2ludEFuY2hvci56ZXJvX2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCB0aGlzLmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5vZmZzZXQgIT09IFN0eWxlUGFyc2VyLnplcm9QYWlyKSB7ICAgICAgICAvLyBwb2ludCBoYXMgYW4gb2Zmc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID09PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAgICAgIC8vIG5vIHRleHQgb2Zmc2V0LCB1c2UgcG9pbnQnc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IHBhcmVudC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGhhcyBvZmZzZXQsIGFkZCBwb2ludCdzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzBdICs9IHBhcmVudC5vZmZzZXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzFdICs9IHBhcmVudC5vZmZzZXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCB0aGlzLnNpemUsIHRoaXMuYW5jaG9yKTtcbiAgICB9XG5cbiAgICB1cGRhdGVCQm94ZXMgKCkge1xuICAgICAgICBsZXQgd2lkdGggPSAodGhpcy5zaXplWzBdICsgdGhpcy5sYXlvdXQuYnVmZmVyWzBdICogMikgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwgKiBMYWJlbC5lcHNpbG9uO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMuc2l6ZVsxXSArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAvLyBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5pdGFsaWMpe1xuICAgICAgICAgICAgd2lkdGggKz0gNSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwID0gW1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSArICh0aGlzLm9mZnNldFswXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbCksXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC0gKHRoaXMub2Zmc2V0WzFdICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMub2JiID0gbmV3IE9CQihwWzBdLCBwWzFdLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5hYWJiID0gdGhpcy5vYmIuZ2V0RXh0ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIG1vdmUgdGhlIGxhYmVsIGludG8gdGhlIHRpbGUgYm91bmRzXG4gICAgLy8gUmV0dXJucyB0cnVlIGlmIGxhYmVsIHdhcyBtb3ZlZCBpbnRvIHRpbGUsIGZhbHNlIGlmIGl0IGNvdWxkbid0IGJlIG1vdmVkXG4gICAgbW92ZUludG9UaWxlICgpIHtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5hYWJiWzBdIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSArPSAtdGhpcy5hYWJiWzBdO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzJdID49IEdlby50aWxlX3NjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzBdIC09IHRoaXMuYWFiYlsyXSAtIEdlby50aWxlX3NjYWxlICsgMTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlszXSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzNdO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzFdIDw9IC1HZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtPSB0aGlzLmFhYmJbMV0gKyBHZW8udGlsZV9zY2FsZSAtIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfVxuXG4gICAgZ2V0TmV4dEZpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSB8fCB0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5tb3ZlX2ludG9fdGlsZSl7XG4gICAgICAgICAgICB0aGlzLm1vdmVJbnRvVGlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb24gc2Vjb25kIGFuY2hvciAoZmlyc3QgYW5jaG9yIHdhcyBzZXQgb24gY3JlYXRpb24pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmxheW91dC5hbmNob3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3IgPSB0aGlzLmxheW91dC5hbmNob3JbaV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydF9hbmNob3JfaW5kZXggPSBpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm8gYW5jaG9ycyByZXN1bHQgaW4gZml0XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNjYXJkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmRlZ2VuZXJhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYW5jaG9yIHNwZWNpZmllZCwgdHJ5IHRoZW0gaW4gb3JkZXJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBvbiBzZWNvbmQgYW5jaG9yIChmaXJzdCBhbmNob3Igd2FzIHNldCBvbiBjcmVhdGlvbilcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPXRoaXMuc3RhcnRfYW5jaG9yX2luZGV4OyBpIDwgdGhpcy5sYXlvdXQuYW5jaG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gdGhpcy5sYXlvdXQuYW5jaG9yW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSAmJiAhdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1cGVyLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuXG4vLyBQbGFjZW1lbnQgc3RyYXRlZ2llc1xuTGFiZWxQb2ludC5QTEFDRU1FTlQgPSB7XG4gICAgVkVSVEVYOiAwLCAgICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgZW5kcG9pbnRzIG9mIGxpbmUgc2VnbWVudHNcbiAgICBNSURQT0lOVDogMSwgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBtaWRwb2ludHMgb2YgbGluZSBzZWdtZW50c1xuICAgIFNQQUNFRDogMiwgICAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGVxdWFsbHkgc3BhY2VkIGFsb25nIGxpbmVcbiAgICBDRU5UUk9JRDogMyAgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBjZW50ZXIgb2YgcG9seWdvbnNcbn07XG4iLCIvLyBTZXRzIG9mIHZhbHVlcyB0byBtYXRjaCBmb3IgZGlyZWN0aW9uYWwgYW5kIGNvcm5lciBhbmNob3JzXG5jb25zdCBsZWZ0cyA9IFsnbGVmdCcsICd0b3AtbGVmdCcsICdib3R0b20tbGVmdCddO1xuY29uc3QgcmlnaHRzID0gWydyaWdodCcsICd0b3AtcmlnaHQnLCAnYm90dG9tLXJpZ2h0J107XG5jb25zdCB0b3BzID0gWyd0b3AnLCAndG9wLWxlZnQnLCAndG9wLXJpZ2h0J107XG5jb25zdCBib3R0b21zID0gWydib3R0b20nLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0J107XG5cbmxldCBQb2ludEFuY2hvcjtcblxuZXhwb3J0IGRlZmF1bHQgUG9pbnRBbmNob3IgPSB7XG5cbiAgICBjb21wdXRlT2Zmc2V0IChvZmZzZXQsIHNpemUsIGFuY2hvciwgYnVmZmVyID0gbnVsbCkge1xuICAgICAgICBpZiAoIWFuY2hvciB8fCBhbmNob3IgPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9mZnNldDIgPSBbb2Zmc2V0WzBdLCBvZmZzZXRbMV1dO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgfHwgdGhpcy5kZWZhdWx0X2J1ZmZlcjtcblxuICAgICAgICAvLyBBbiBvcHRpb25hbCBsZWZ0L3JpZ2h0IG9mZnNldFxuICAgICAgICBpZiAodGhpcy5pc0xlZnRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlswXSAtPSBzaXplWzBdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMF0gLT0gYnVmZmVyWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNSaWdodEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzBdICs9IHNpemVbMF0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMF0gKz0gYnVmZmVyWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgdG9wL2JvdHRvbSBvZmZzZXRcbiAgICAgICAgaWYgKHRoaXMuaXNUb3BBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlsxXSAtPSBzaXplWzFdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICd0b3AnKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlsxXSAtPSBidWZmZXJbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc0JvdHRvbUFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzFdICs9IHNpemVbMV0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzFdICs9IGJ1ZmZlclszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvZmZzZXQyO1xuICAgIH0sXG5cbiAgICBhbGlnbkZvckFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIGlmIChhbmNob3IgJiYgYW5jaG9yICE9PSAnY2VudGVyJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWZ0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNSaWdodEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSxcblxuICAgIGlzTGVmdEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAobGVmdHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc1JpZ2h0QW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChyaWdodHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc1RvcEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAodG9wcy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIGlzQm90dG9tQW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChib3R0b21zLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gQnVmZmVyczogW2xlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbV1cbiAgICBkZWZhdWx0X2J1ZmZlcjogWzIuNSwgMi41LCAxLjUsIDAuNzVdLFxuICAgIHplcm9fYnVmZmVyOiBbMCwgMCwgMCwgMF1cblxufTtcbiIsIi8vIExvZ2ljIGZvciBwbGFjaW5nIHBvaW50IGxhYmVscyBhbG9uZyBhIGxpbmUgZ2VvbWV0cnlcblxuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi9sYWJlbF9wb2ludCc7XG5pbXBvcnQge2lzQ29vcmRPdXRzaWRlVGlsZX0gZnJvbSAnLi4vYnVpbGRlcnMvY29tbW9uJztcblxuY29uc3QgUExBQ0VNRU5UID0gTGFiZWxQb2ludC5QTEFDRU1FTlQ7XG5jb25zdCBkZWZhdWx0X3NwYWNpbmcgPSA4MDsgLy8gc3BhY2luZyBvZiBwb2ludHMgYWxvbmcgbGluZSBpbiBwaXhlbHNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGxhY2VQb2ludHNPbkxpbmUgKGxpbmUsIHNpemUsIG9wdGlvbnMpIHtcbiAgICBsZXQgbGFiZWxzID0gW107XG4gICAgbGV0IHN0cmF0ZWd5ID0gb3B0aW9ucy5wbGFjZW1lbnQ7XG4gICAgbGV0IG1pbl9sZW5ndGggPSBNYXRoLm1heChzaXplWzBdLCBzaXplWzFdKSAqIG9wdGlvbnMucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gKiBvcHRpb25zLnVuaXRzX3Blcl9waXhlbDtcblxuICAgIHN3aXRjaCAoc3RyYXRlZ3kpe1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5TUEFDRUQ6XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UG9zaXRpb25zQW5kQW5nbGVzKGxpbmUsIG1pbl9sZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gZmFsc2Ugd2lsbCBiZSByZXR1cm5lZCBpZiBsaW5lIGhhdmUgbm8gbGVuZ3RoXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHJlc3VsdC5wb3NpdGlvbnM7XG4gICAgICAgICAgICBsZXQgYW5nbGVzID0gcmVzdWx0LmFuZ2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gYW5nbGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbGVfZWRnZXMgPT09IHRydWUgfHwgIWlzQ29vcmRPdXRzaWRlVGlsZShwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsUG9pbnQocG9zaXRpb24sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULlZFUlRFWDpcbiAgICAgICAgICAgIGxldCBwLCBxLCBsYWJlbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICAgICAgICAgIHAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgICAgIHEgPSBsaW5lW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWxQb2ludChwLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRkIGxhc3QgZW5kcG9pbnRcbiAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsUG9pbnQocSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRFBPSU5UOlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKyl7XG4gICAgICAgICAgICAgICAgbGV0IHAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgICAgIGxldCBxID0gbGluZVtpICsgMV07XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgICAgICAgICAwLjUgKiAocFswXSArIHFbMF0pLFxuICAgICAgICAgICAgICAgICAgICAwLjUgKiAocFsxXSArIHFbMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWluX2xlbmd0aCB8fCBub3JtKHAsIHEpID4gbWluX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsUG9pbnQocG9zaXRpb24sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxzO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbnNBbmRBbmdsZXMobGluZSwgbWluX2xlbmd0aCwgb3B0aW9ucyl7XG4gICAgbGV0IHVwcCA9IG9wdGlvbnMudW5pdHNfcGVyX3BpeGVsO1xuICAgIGxldCBzcGFjaW5nID0gKG9wdGlvbnMucGxhY2VtZW50X3NwYWNpbmcgfHwgZGVmYXVsdF9zcGFjaW5nKSAqIHVwcDtcblxuICAgIGxldCBsZW5ndGggPSBnZXRMaW5lTGVuZ3RoKGxpbmUpO1xuICAgIGlmIChsZW5ndGggPD0gbWluX2xlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IG51bV9sYWJlbHMgPSBNYXRoLm1heChNYXRoLmZsb29yKGxlbmd0aCAvIHNwYWNpbmcpLCAxKTtcbiAgICBsZXQgcmVtYWluZGVyID0gbGVuZ3RoIC0gKG51bV9sYWJlbHMgLSAxKSAqIHNwYWNpbmc7XG4gICAgbGV0IHBvc2l0aW9ucyA9IFtdO1xuICAgIGxldCBhbmdsZXMgPSBbXTtcblxuICAgIGxldCBkaXN0YW5jZSA9IDAuNSAqIHJlbWFpbmRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bV9sYWJlbHM7IGkrKyl7XG4gICAgICAgIGxldCB7cG9zaXRpb24sIGFuZ2xlfSA9IGludGVycG9sYXRlTGluZShsaW5lLCBkaXN0YW5jZSwgbWluX2xlbmd0aCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChwb3NpdGlvbiAhPSBudWxsICYmIGFuZ2xlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIGFuZ2xlcy5wdXNoKGFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICBkaXN0YW5jZSArPSBzcGFjaW5nO1xuICAgIH1cblxuICAgIHJldHVybiB7cG9zaXRpb25zLCBhbmdsZXN9O1xufVxuXG5mdW5jdGlvbiBnZXRBbmdsZShwLCBxLCBhbmdsZSA9IDApe1xuICAgIHJldHVybiAoYW5nbGUgPT09ICdhdXRvJykgPyBNYXRoLmF0YW4yKHFbMF0gLSBwWzBdLCBxWzFdIC0gcFsxXSkgOiBhbmdsZTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lKXtcbiAgICBsZXQgZGlzdGFuY2UgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICBkaXN0YW5jZSArPSBub3JtKGxpbmVbaV0sIGxpbmVbaSsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0YW5jZTtcbn1cblxuZnVuY3Rpb24gbm9ybShwLCBxKXtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHBbMF0gLSBxWzBdLCAyKSArIE1hdGgucG93KHBbMV0gLSBxWzFdLCAyKSk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlTGluZShsaW5lLCBkaXN0YW5jZSwgbWluX2xlbmd0aCwgb3B0aW9ucyl7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgbGV0IHBvc2l0aW9uLCBhbmdsZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoLTE7IGkrKyl7XG4gICAgICAgIGxldCBwID0gbGluZVtpXTtcbiAgICAgICAgbGV0IHEgPSBsaW5lW2krMV07XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gbm9ybShwLCBxKTtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSBtaW5fbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1bSArPSBsZW5ndGg7XG5cbiAgICAgICAgaWYgKHN1bSA+IGRpc3RhbmNlKXtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaW50ZXJwb2xhdGVTZWdtZW50KHAsIHEsIHN1bSAtIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIGFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3Bvc2l0aW9uLCBhbmdsZX07XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlU2VnbWVudChwLCBxLCBkaXN0YW5jZSl7XG4gICAgbGV0IGxlbmd0aCA9IG5vcm0ocCwgcSk7XG4gICAgbGV0IHJhdGlvID0gZGlzdGFuY2UgLyBsZW5ndGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcmF0aW8gKiBwWzBdICsgKDEgLSByYXRpbykgKiBxWzBdLFxuICAgICAgICByYXRpbyAqIHBbMV0gKyAoMSAtIHJhdGlvKSAqIHFbMV1cbiAgICBdO1xufVxuIiwiaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBlYXRHcm91cCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoa2V5LCByZXBlYXRfZGlzdCwgbWF4X3JlcGVhdF9kaXN0KSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnJlcGVhdF9kaXN0ID0gcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMucmVwZWF0X2Rpc3Rfc3EgPSB0aGlzLnJlcGVhdF9kaXN0ICogdGhpcy5yZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EgPSBtYXhfcmVwZWF0X2Rpc3QgKiBtYXhfcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMub25lX3Blcl9ncm91cCA9ICh0aGlzLnJlcGVhdF9kaXN0X3NxID49IHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgaW4gdGhpcyBncm91cFxuICAgIGNoZWNrIChvYmopIHtcbiAgICAgICAgLy8gSWYgb25seSBvbmUgb2JqZWN0IGFsbG93ZWQgcGVyIGdyb3VwLCBzaG9ydGN1dCBkaXN0YW5jZSBsb2dpY1xuICAgICAgICBpZiAodGhpcy5vbmVfcGVyX2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGRpc3RhbmNlIG1heGVzIG91dCBhdCB0aHJlc2hvbGQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICAgICAgLy8gKG5vdCB0cnVlIGRpc3QgdmFsdWUgc2luY2Ugd2Ugc2tpcHBlZCBjYWxjdWxhdGluZyBpdClcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkaXN0X3NxOiB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIG9uZV9wZXJfZ3JvdXA6IHRoaXMub25lX3Blcl9ncm91cFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIG9iamVjdCBmb3IgdGhpcyBncm91cCB5ZXRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGRpc3RhbmNlIGZyb20gbmV3IG9iamVjdCB0byBvYmplY3RzIGFscmVhZHkgaW4gZ3JvdXBcbiAgICAgICAgbGV0IHAxID0gb2JqLnBvc2l0aW9uO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0aGlzLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHAyID0gdGhpcy5wb3NpdGlvbnNbaV07XG4gICAgICAgICAgICBsZXQgZHggPSBwMVswXSAtIHAyWzBdO1xuICAgICAgICAgICAgbGV0IGR5ID0gcDFbMV0gLSBwMlsxXTtcbiAgICAgICAgICAgIGxldCBkaXN0X3NxID0gZHggKiBkeCArIGR5ICogZHk7XG5cbiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGV4aXN0aW5nIG9iamVjdCB3aXRoaW4gYWxsb3dlZCBkaXN0YW5jZVxuICAgICAgICAgICAgaWYgKGRpc3Rfc3EgPCB0aGlzLnJlcGVhdF9kaXN0X3NxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3FcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIG9iamVjdCB0byB0aGlzIGdyb3VwXG4gICAgYWRkIChvYmopIHtcbiAgICAgICAgLy8gb25seSBzdG9yZSBvYmplY3QncyBwb3NpdGlvbiwgdG8gc2F2ZSBzcGFjZSAvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVmZXJlbmNlc1xuICAgICAgICBpZiAob2JqICYmIG9iai5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChvYmoucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhdGljIG1ldGhvZHMgYXJlIHVzZWQgdG8gbWFuYWdlIHJlcGVhdCBncm91cHMsIHdpdGhpbiBhbmQgYWNyb3NzIHRpbGVzXG5cbiAgICAvLyBSZXNldCBhbGwgZ3JvdXBzIGZvciB0aGlzIHRpbGVcbiAgICBzdGF0aWMgY2xlYXIgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5ncm91cHNbdGlsZV0gPSB7fTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgd2l0aGluIGl0cyBkZXNpZ25hdGVkIGdyb3VwXG4gICAgc3RhdGljIGNoZWNrIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwICYmIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uY2hlY2sob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhbiBvYmplY3QgdG8gaXRzIGRlc2lnbmF0ZWQgZ3JvdXBcbiAgICBzdGF0aWMgYWRkIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdID0gbmV3IFJlcGVhdEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBSZXBlYXRHcm91cC5tYXhfcmVwZWF0X2Rpc3RcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uYWRkKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuLy8gQ3VycmVudCBzZXQgb2YgcmVwZWF0IGdyb3VwcywgZ3JvdXBlZCBhbmQga2V5ZWQgYnkgdGlsZVxuUmVwZWF0R3JvdXAuZ3JvdXBzID0ge307XG5cbi8vIE1heCByZXBlYXQgZGlzdDogZm9yIGdyb3VwcyB3aXRoIGEgcmVwZWF0IGRpc3QgYmV5b25kIHRoaXMgdGhyZXNob2xkLCBvbmx5IG9uZSBsYWJlbFxuLy8gd2lsbCBiZSBhbGxvd2VkIHBlciBncm91cCwgZS5nLiBzZXQgdG8gdGlsZSBzaXplIGZvciBvbmUtbGFiZWwtcGVyLXRpbGVcblJlcGVhdEdyb3VwLm1heF9yZXBlYXRfZGlzdCA9IEdlby50aWxlX3NjYWxlO1xuIiwiaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgU2NlbmUgZnJvbSAnLi9zY2VuZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcblxuLy8gRXhwb3J0cyBtdXN0IGFwcGVhciBvdXRzaWRlIGEgZnVuY3Rpb24sIGJ1dCB3aWxsIG9ubHkgYmUgZGVmaW5lZCBpbiBtYWluIHRocmVhZCAoYmVsb3cpXG5leHBvcnQgdmFyIExlYWZsZXRMYXllcjtcbmV4cG9ydCBmdW5jdGlvbiBsZWFmbGV0TGF5ZXIob3B0aW9ucykge1xuICAgIHJldHVybiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpIHtcblxuICAgIC8vIElmIExlYWZsZXRMYXllciBpcyBhbHJlYWR5IGRlZmluZWQgd2hlbiB0aGlzIGlzIGNhbGxlZCBqdXN0IHJldHVybiB0aGF0IGltbWVkaWF0ZWx5XG4gICAgLy8gZS5nLiBpZiB5b3UgY2FsbCBsZWFmbGV0TGF5ZXIgbXVsdGlwbGUgdGltZXMgKHdoaWNoIGlzIHZhbGlkKVxuICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IExlYWZsZXRMYXllcihvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMZWFmbGV0IGxheWVyIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBkZWZpbmVkIGluIG1haW4gdGhyZWFkXG4gICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG5cbiAgICAgICAgbGV0IEwgPSBvcHRpb25zLmxlYWZsZXQgfHwgd2luZG93Lkw7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSBleHRlbmRpbmcgdGhlIGxlYWZsZXQgMC43LnggVGlsZUxheWVyIGNsYXNzLCBvciB0aGUgbmV3ZXJcbiAgICAgICAgLy8gbGVhZmxldCAxLnggR3JpZExheWVyIGNsYXNzLlxuICAgICAgICBsZXQgbGF5ZXJCYXNlQ2xhc3MgPSBMLkdyaWRMYXllciA/IEwuR3JpZExheWVyIDogTC5UaWxlTGF5ZXI7XG4gICAgICAgIGxldCBsZWFmbGV0VmVyc2lvbiA9IGxheWVyQmFzZUNsYXNzID09PSBMLkdyaWRMYXllciA/ICcxLngnIDogJzAuNy54JztcbiAgICAgICAgbGV0IGxheWVyQ2xhc3NDb25maWcgPSB7fTtcblxuICAgICAgICAvLyBJZiBleHRlbmRpbmcgbGVhZmxldCAwLjcueCBUaWxlTGF5ZXIsIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkXG4gICAgICAgIGlmIChsYXllckJhc2VDbGFzcyA9PT0gTC5UaWxlTGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX2FkZFRpbGUgPSBmdW5jdGlvbigpe307XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9yZW1vdmVUaWxlID0gZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUuX3Jlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgLy8gcmUtYWRkIHRoZSBjYW52YXMgc2luY2UgYmFzZSBjbGFzcyBgdmlld3Jlc2V0YCBldmVudCBjYW4gcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUgJiYgdGhpcy5zY2VuZS5jb250YWluZXIgJiYgdGhpcy5zY2VuZS5jYW52YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY2VuZS5jYW52YXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgY3VzdG9tIGxheWVyIG1ldGhvZHNcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsYXllckNsYXNzQ29uZmlnLCB7XG5cbiAgICAgICAgICAgIGluaXRpYWxpemUgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvd0RlYnVnID0gKCFvcHRpb25zLnNob3dEZWJ1ZyA/IGZhbHNlIDogdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBGb3JjZSBsZWFmbGV0IHpvb20gYW5pbWF0aW9ucyBvZmZcbiAgICAgICAgICAgICAgICB0aGlzLl96b29tQW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVNjZW5lICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lID0gU2NlbmUuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVdvcmtlcnM6IHRoaXMub3B0aW9ucy5udW1Xb3JrZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlVXBkYXRlOiB0aGlzLm9wdGlvbnMucHJlVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFVwZGF0ZTogdGhpcy5vcHRpb25zLnBvc3RVcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzWm9vbTogKExlYWZsZXRMYXllci5sZWFmbGV0VmVyc2lvbiA9PT0gJzEueCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaERlbnNpdHlEaXNwbGF5OiB0aGlzLm9wdGlvbnMuaGlnaERlbnNpdHlEaXNwbGF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTGV2ZWw6IHRoaXMub3B0aW9ucy5sb2dMZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludHJvc3BlY3Rpb246IHRoaXMub3B0aW9ucy5pbnRyb3NwZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZWQgb3B0aW9uLCBhcHAgd2lsbCBoYXZlIHRvIG1hbnVhbGx5IGNhbGxlZCBzY2VuZS51cGRhdGUoKSBwZXIgZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVSZW5kZXJMb29wOiB0aGlzLm9wdGlvbnMuZGlzYWJsZVJlbmRlckxvb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlZCBvcHRpb24sIHdpbGwgcmVxdWlyZSBsaWJyYXJ5IHRvIGJlIHNlcnZlZCBhcyBzYW1lIGhvc3QgYXMgcGFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDcm9zc0RvbWFpbldvcmtlcnM6IHRoaXMub3B0aW9ucy5hbGxvd0Nyb3NzRG9tYWluV29ya2Vyc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIEZpbmlzaCBpbml0aWFsaXppbmcgc2NlbmUgYW5kIHNldHVwIGV2ZW50cyB3aGVuIGxheWVyIGlzIGFkZGVkIHRvIG1hcFxuICAgICAgICAgICAgb25BZGQgKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNjZW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLm9uQWRkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG1hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy56b29tID0gTWF0aC5taW4obWFwLmdldFpvb20oKSwgbWFwLmdldE1heFpvb20oKSB8fCBHZW8uZGVmYXVsdF92aWV3X21heF96b29tKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5pbW1lZGlhdGVSZWRyYXcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuaG9va3MubW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnpvb21zdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc3RhcnRab29tKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignem9vbXN0YXJ0JywgdGhpcy5ob29rcy56b29tc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5kcmFnc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRQYW5uaW5nKHRydWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdkcmFnc3RhcnQnLCB0aGlzLmhvb2tzLmRyYWdzdGFydCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdmVlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRQYW5uaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLmhvb2tzLm1vdmVlbmQpO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgbWFwLl96b29tQW5pbWF0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIE1vZGlmeSBkZWZhdWx0IExlYWZsZXQgYmVoYXZpb3JzXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlTY3JvbGxXaGVlbEJlaGF2aW9yKG1hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlEb3VibGVDbGlja1pvb20obWFwKTtcblxuICAgICAgICAgICAgICAgIC8vIFNldHVwIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cFNlbGVjdGlvbkV2ZW50SGFuZGxlcnMobWFwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkV2ZW50cyh0aGlzLm9wdGlvbnMuZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBHTCBjYW52YXMgdG8gbGF5ZXIgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5jb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbCB2aWV3XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVPbkZpcnN0VmlzaWJsZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRhbmdyYW0gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBtb3ZlOiB0aGlzLm9uVGFuZ3JhbVZpZXdVcGRhdGUuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGxlYWZsZXQncyBleGlzdGluZyBldmVudCBzeXN0ZW0gYXMgdGhlIGNhbGxiYWNrIG1lY2hhbmlzbVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUubG9hZCh0aGlzLm9wdGlvbnMuc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIHsgY29uZmlnX3BhdGg6IHRoaXMub3B0aW9ucy5zY2VuZUJhc2VQYXRoLCBibG9ja2luZzogZmFsc2UgfSkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdpbml0Jyk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25SZW1vdmUgKG1hcCkge1xuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5vblJlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgbWFwLm9mZigncmVzaXplJywgdGhpcy5ob29rcy5yZXNpemUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdmUnLCB0aGlzLmhvb2tzLm1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3pvb21zdGFydCcsIHRoaXMuaG9va3Muem9vbXN0YXJ0KTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdkcmFnc3RhcnQnLCB0aGlzLmhvb2tzLmRyYWdzdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuaG9va3MubW92ZWVuZCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignY2xpY2snLCB0aGlzLmhvb2tzLmNsaWNrKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLmhvb2tzLm1vdXNlbW92ZSk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2VvdXQnLCB0aGlzLmhvb2tzLm1vdXNlb3V0KTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5ob29rcy52aXNpYmlsaXR5Y2hhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY3JlYXRlVGlsZSAoY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGNvb3Jkcy54ICsgJy8nICsgY29vcmRzLnkgKyAnLycgKyBjb29yZHMuejtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgZGl2LnNldEF0dHJpYnV0ZSgnZGF0YS10aWxlLWtleScsIGtleSk7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gJzI1NnB4JztcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gJzI1NnB4JztcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0RlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWJ1Z19vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkudGV4dENvbnRlbnQgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmxlZnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnRvcCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUuY29sb3IgPSAnd2hpdGUnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmZvbnRTaXplID0gJzE2cHgnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnRleHRPdXRsaW5lID0gJzFweCAjMDAwMDAwJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5wYWRkaW5nID0gJzhweCc7XG5cbiAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRlYnVnX292ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyQ29sb3IgPSAnd2hpdGUnO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGl2O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gTW9kaWZ5IGxlYWZsZXQncyBkZWZhdWx0IHNjcm9sbCB3aGVlbCBiZWhhdmlvciB0byByZW5kZXIgZnJhbWVzIG1vcmUgZnJlcXVlbnRseVxuICAgICAgICAgICAgLy8gKHNob3VsZCBnZW5lcmFsbHkgbGVhZCB0byBzbW9vdGhlciBzY3JvbGwgd2l0aCBUYW5ncmFtIGZyYW1lIHJlLXJlbmRlcilcbiAgICAgICAgICAgIG1vZGlmeVNjcm9sbFdoZWVsQmVoYXZpb3IgKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLnZpZXcuY29udGludW91c196b29tICYmIG1hcC5zY3JvbGxXaGVlbFpvb20gJiYgdGhpcy5vcHRpb25zLm1vZGlmeVNjcm9sbFdoZWVsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy56b29tU25hcCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9IG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmRpc2FibGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgYW5kIFNhZmFyaSBoYXZlIHNtb290aGVyIHNjcm9sbC16b29tIHdpdGhvdXQgYWN0aXZlbHkgdGhyb3R0bGluZyB0aGUgbW91c2Ugd2hlZWwsXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIEZGIGFuZCBFZGdlL0lFIGRvIGJldHRlciB3aXRoIHRocm90dGxpbmcuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1heSBiZSByZWxhdGVkIHRvIHN5bmNpbmcgZGlmZmVyZW5jZXMgd2l0aCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgbG9vcCwgaW52ZXN0aWdhdGUgZnVydGhlclxuICAgICAgICAgICAgICAgICAgICBpZiAoTC5Ccm93c2VyLmNocm9tZSB8fCBMLkJyb3dzZXIuc2FmYXJpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLl9vbldoZWVsU2Nyb2xsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSBMLkRvbUV2ZW50LmdldFdoZWVsRGVsdGEoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsdGEgKz0gZGVsdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdE1vdXNlUG9zID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlcmZvcm1ab29tKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTC5Eb21FdmVudC5zdG9wKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5vcHRpb25zLndoZWVsRGVib3VuY2VUaW1lID0gMjA7IC8vIGJldHRlciBkZWZhdWx0IGZvciBGRiBhbmQgRWRnZS9JRVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5fcGVyZm9ybVpvb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBtYXAuZ2V0Wm9vbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuX3N0b3AoKTsgLy8gc3RvcCBwYW5uaW5nIGFuZCBmbHkgYW5pbWF0aW9ucyBpZiBhbnlcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gdGhpcy5fZGVsdGEgLyAodGhpcy5fbWFwLm9wdGlvbnMud2hlZWxQeFBlclpvb21MZXZlbCAqIDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHpvb20gKyBkZWx0YSkgPj0gdGhpcy5fbWFwLmdldE1heFpvb20oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gdGhpcy5fbWFwLmdldE1heFpvb20oKSAtIHpvb207IC8vIGRvbid0IGdvIHBhc3QgbWF4IHpvb21cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWx0YSkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5vcHRpb25zLnNjcm9sbFdoZWVsWm9vbSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0Wm9vbSh6b29tICsgZGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0Wm9vbUFyb3VuZCh0aGlzLl9sYXN0TW91c2VQb3MsIHpvb20gKyBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBNb2RpZnkgbGVhZmxldCdzIGRlZmF1bHQgZG91YmxlLWNsaWNrIHpvb20gYmVoYXZpb3IsIHRvIG1hdGNoIHR5cGljYWwgdmVjdG9yIGJhc2VtYXAgcHJvZHVjdHNcbiAgICAgICAgICAgIG1vZGlmeURvdWJsZUNsaWNrWm9vbSAobWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUudmlldy5jb250aW51b3VzX3pvb20gJiYgbWFwLmRvdWJsZUNsaWNrWm9vbSAmJiB0aGlzLm9wdGlvbnMubW9kaWZ5RG91YmxlQ2xpY2tab29tICE9PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmaWVkIHZlcnNpb24gb2YgTGVhZmxldCdzIHNldFpvb21Bcm91bmQgdGhhdCBkb2Vzbid0IHRyaWdnZXIgYSBtb3ZlRW5kIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldFpvb21Bcm91bmROb01vdmVFbmQgPSBmdW5jdGlvbiAobWFwLCBsYXRsbmcsIHpvb20sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY2FsZSA9IG1hcC5nZXRab29tU2NhbGUoem9vbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0hhbGYgPSBtYXAuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvaW50ID0gbGF0bG5nIGluc3RhbmNlb2YgTC5Qb2ludCA/IGxhdGxuZyA6IG1hcC5sYXRMbmdUb0NvbnRhaW5lclBvaW50KGxhdGxuZyksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJPZmZzZXQgPSBjb250YWluZXJQb2ludC5zdWJ0cmFjdCh2aWV3SGFsZikubXVsdGlwbHlCeSgxIC0gMSAvIHNjYWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDZW50ZXIgPSBtYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh2aWV3SGFsZi5hZGQoY2VudGVyT2Zmc2V0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXAuX21vdmUobmV3Q2VudGVyLCB6b29tLCB7IGZseVRvOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBMZWFmbGV0J3MgZmx5VG8sIGZvciBzaG9ydCBhbmltYXRpb25zIHpvb21pbmcgYXJvdW5kIGEgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmx5QXJvdW5kID0gZnVuY3Rpb24gKG1hcCwgdGFyZ2V0Q2VudGVyLCB0YXJnZXRab29tLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlIHx8ICFMLkJyb3dzZXIuYW55M2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnNldFZpZXcodGFyZ2V0Q2VudGVyLCB0YXJnZXRab29tLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9zdG9wKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydFpvb20gPSBtYXAuX3pvb207XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlciA9IEwubGF0TG5nKHRhcmdldENlbnRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRab29tID0gdGFyZ2V0Wm9vbSA9PT0gdW5kZWZpbmVkID8gc3RhcnRab29tIDogdGFyZ2V0Wm9vbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFpvb20gPSBNYXRoLm1pbih0YXJnZXRab29tLCBtYXAuZ2V0TWF4Wm9vbSgpKTsgLy8gZG9uJ3QgZ28gcGFzdCBtYXggem9vbVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnJvbSA9IG1hcC5wcm9qZWN0KG1hcC5nZXRDZW50ZXIoKSwgc3RhcnRab29tKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byA9IG1hcC5wcm9qZWN0KHRhcmdldENlbnRlciwgc3RhcnRab29tKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gPyAxMDAwICogb3B0aW9ucy5kdXJhdGlvbiA6IDc1O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmcmFtZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gZHVyYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldXNlIGludGVybmFsIGZseVRvIGZyYW1lIHRvIGVuc3VyZSB0aGVzZSBhbmltYXRpb25zIGFyZSBjYW5jZWxlZCBsaWtlIG90aGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuX2ZseVRvRnJhbWUgPSBMLlV0aWwucmVxdWVzdEFuaW1GcmFtZShmcmFtZSwgbWFwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VudGVyID0gZnJvbS5hZGQodG8uc3VidHJhY3QoZnJvbSkubXVsdGlwbHlCeSh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IFtjZW50ZXIueCwgY2VudGVyLnldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBHZW8ubWV0ZXJzVG9MYXRMbmcoY2VudGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Wm9vbUFyb3VuZE5vTW92ZUVuZChtYXAsIHRhcmdldENlbnRlciwgc3RhcnRab29tICsgKHRhcmdldFpvb20gLSBzdGFydFpvb20pICogdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Wm9vbUFyb3VuZE5vTW92ZUVuZChtYXAsIHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5fbW92ZUVuZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fbW92ZVN0YXJ0KHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jYWxsKG1hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgZG91YmxlLWNsaWNrIHpvb20gaGFuZGxlciB0byBkbyBhIHNob3J0IHpvb20gYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSBtYXAuZG91YmxlQ2xpY2tab29tLmVuYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5kaXNhYmxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5fb25Eb3VibGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFpvb20gPSBtYXAuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gbWFwLm9wdGlvbnMuem9vbURlbHRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBlLm9yaWdpbmFsRXZlbnQuc2hpZnRLZXkgPyBvbGRab29tIC0gZGVsdGEgOiBvbGRab29tICsgZGVsdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5kb3VibGVDbGlja1pvb20gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx5QXJvdW5kKG1hcCwgbWFwLmdldENlbnRlcigpLCB6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx5QXJvdW5kKG1hcCwgbWFwLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoZS5jb250YWluZXJQb2ludCksIHpvb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdXBkYXRlVmlldyAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXcgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgICAgICAgICAgdmlldy56b29tID0gTWF0aC5taW4odGhpcy5fbWFwLmdldFpvb20oKSwgdGhpcy5fbWFwLmdldE1heFpvb20oKSB8fCBHZW8uZGVmYXVsdF92aWV3X21heF96b29tKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHVwZGF0ZVNpemUgKCkge1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnJlc2l6ZU1hcChzaXplLngsIHNpemUueSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZXNpemVPbkZpcnN0VmlzaWJsZSAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0X3Zpc2liaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MudmlzaWJpbGl0eWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X3Zpc2liaWxpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3Zpc2liaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLmhvb2tzLnZpc2liaWxpdHljaGFuZ2UpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25UYW5ncmFtVmlld1VwZGF0ZSAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAgfHwgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmlldyBjaGFuZ2VkP1xuICAgICAgICAgICAgICAgIGxldCBtYXBfY2VudGVyID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgIGxldCB2aWV3X2NlbnRlciA9IHRoaXMuc2NlbmUudmlldy5jZW50ZXI7XG4gICAgICAgICAgICAgICAgaWYgKG1hcF9jZW50ZXIubG5nID09PSB2aWV3X2NlbnRlci5sbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFwX2NlbnRlci5sYXQgPT09IHZpZXdfY2VudGVyLmxhdCAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZ2V0Wm9vbSgpID09PSB0aGlzLnNjZW5lLnZpZXcuem9vbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldFZpZXcoW3RoaXMuc2NlbmUudmlldy5jZW50ZXIubGF0LCB0aGlzLnNjZW5lLnZpZXcuY2VudGVyLmxuZ10sIHRoaXMuc2NlbmUudmlldy56b29tLCB7IGFuaW1hdGU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlbmRlciAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIENTUyBwb3NpdGlvbmluZyBMZWFmbGV0IGFwcGxpZXMgdG8gdGhlIGxheWVyLCBzaW5jZSBUYW5ncmFtJ3MgV2ViR0wgY2FudmFzXG4gICAgICAgICAgICAvLyBpcyBleHBlY3RlZCB0byBiZSAnYWJzb2x1dGVseScgcG9zaXRpb25lZC5cbiAgICAgICAgICAgIHJldmVyc2VUcmFuc2Zvcm0gKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFwIHx8ICF0aGlzLnNjZW5lIHx8ICF0aGlzLnNjZW5lLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHRvcF9sZWZ0ID0gdGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KFswLCAwXSk7XG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuc2NlbmUuY29udGFpbmVyLCB0b3BfbGVmdCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBUaWUgTGVhZmxldCBldmVudCBoYW5kbGVycyB0byBUYW5ncmFtIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgICAgICBzZXR1cFNlbGVjdGlvbkV2ZW50SGFuZGxlcnMgKG1hcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMgPSB7fTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MuY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEZlYXR1cmVBdChldmVudC5jb250YWluZXJQb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiwgeyBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5jbGljayhyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdjbGljaycsIHRoaXMuaG9va3MuY2xpY2spO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3VzZW1vdmUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEZlYXR1cmVBdChldmVudC5jb250YWluZXJQb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiwgeyBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlcihyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW1vdmUnLCB0aGlzLmhvb2tzLm1vdXNlbW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdXNlb3V0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW91c2UgbGVhdmVzIG1hcCwgc2VuZCBhbiBhZGRpdGlvbmFsIHNlbGVjdGlvbiBldmVudCB0byBpbmRpY2F0ZSBubyBmZWF0dXJlIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3Zlcih7IGNoYW5nZWQ6IHRydWUsIGxlYWZsZXRfZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBTZXQgdXNlci1kZWZpbmVkIGhhbmRsZXJzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiBldmVudHNcbiAgICAgICAgICAgIC8vIEN1cnJlbnRseSBvbmx5IG9uZSBoYW5kbGVyIGNhbiBiZSBkZWZpbmVkIGZvciBlYWNoIGV2ZW50IHR5cGVcbiAgICAgICAgICAgIC8vIEV2ZW50IHR5cGVzIGFyZTogYGNsaWNrYCwgYGhvdmVyYCAobGVhZmxldCBgbW91c2Vtb3ZlYClcbiAgICAgICAgICAgIHNldFNlbGVjdGlvbkV2ZW50cyAoZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fc2VsZWN0aW9uX2V2ZW50cywgZXZlbnRzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxheWVyIGNsYXNzXG4gICAgICAgIExlYWZsZXRMYXllciA9IGxheWVyQmFzZUNsYXNzLmV4dGVuZChsYXllckNsYXNzQ29uZmlnKTtcblxuICAgICAgICAvLyBQb2x5ZmlsbCBzb21lIDEuMCBtZXRob2RzXG4gICAgICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyLnJlbW92ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgTGVhZmxldExheWVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyZW1vdmUnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBMZWFmbGV0TGF5ZXIubGF5ZXJCYXNlQ2xhc3MgPSBsYXllckJhc2VDbGFzcztcbiAgICAgICAgTGVhZmxldExheWVyLmxlYWZsZXRWZXJzaW9uID0gbGVhZmxldFZlcnNpb247XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMZWFmbGV0TGF5ZXIob3B0aW9ucyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4vdmVjdG9yJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IHNoYWRlclNyY19hbWJpZW50TGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL2FtYmllbnRMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19kaXJlY3Rpb25hbExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9kaXJlY3Rpb25hbExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50TGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL3BvaW50TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc3BvdExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9zcG90TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5cbi8vIEFic3RyYWN0IGxpZ2h0XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuXG4gICAgICAgIGlmIChjb25maWcuYW1iaWVudCA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuYW1iaWVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuYW1iaWVudCB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLmFtYmllbnQpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5kaWZmdXNlID09IG51bGwgfHwgdHlwZW9mIGNvbmZpZy5kaWZmdXNlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5kaWZmdXNlID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5kaWZmdXNlICE9IG51bGwgPyBjb25maWcuZGlmZnVzZSA6IDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWZmdXNlID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihjb25maWcuZGlmZnVzZSkuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLnNwZWN1bGFyID09IG51bGwgfHwgdHlwZW9mIGNvbmZpZy5zcGVjdWxhciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLnNwZWN1bGFyIHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zcGVjdWxhciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLnNwZWN1bGFyKS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGxpZ2h0IGJ5IHR5cGUgbmFtZSwgZmFjdG9yeS1zdHlsZVxuICAgIC8vICdjb25maWcnIG11c3QgaW5jbHVkZSAnbmFtZScgYW5kICd0eXBlJywgYWxvbmcgd2l0aCBhbnkgb3RoZXIgdHlwZS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgc3RhdGljIGNyZWF0ZSAodmlldywgY29uZmlnKSB7XG4gICAgICAgIGlmIChMaWdodC50eXBlc1tjb25maWcudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGlnaHQudHlwZXNbY29uZmlnLnR5cGVdKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgbGlnaHQgZm9yIGEgc3R5bGU6IGZyYWdtZW50IGxpZ2h0aW5nLCB2ZXJ0ZXggbGlnaHRpbmcsIG9yIG5vbmVcbiAgICBzdGF0aWMgc2V0TW9kZSAobW9kZSwgc3R5bGUpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG1vZGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICB9XG4gICAgICAgIG1vZGUgPSBMaWdodC5lbmFibGVkICYmICgobW9kZSAhPSBudWxsKSA/IG1vZGUgOiAnZnJhZ21lbnQnKTsgLy8gZGVmYXVsdCB0byBmcmFnbWVudCBsaWdodGluZ1xuICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX0xJR0hUSU5HX0ZSQUdNRU5UJ10gPSAobW9kZSA9PT0gJ2ZyYWdtZW50Jyk7XG4gICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTElHSFRJTkdfVkVSVEVYJ10gPSAobW9kZSA9PT0gJ3ZlcnRleCcpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBhbGwgcHJvdmlkZWQgbGlnaHQgZGVmaW5pdGlvbnMsIGFuZCBjYWxjdWxhdGUgY3VtdWxhdGl2ZSBsaWdodCBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKGxpZ2h0cykge1xuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBpbmplY3Rpb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soTGlnaHQuYmxvY2spO1xuXG4gICAgICAgIC8vIElmIGxpZ2h0aW5nIGlzIGdsb2JhbGx5IGRpc2FibGVkLCBub3RoaW5nIGlzIGluamVjdGVkIChtb3N0bHkgZm9yIGRlYnVnZ2luZyBvciBsaXZlIGVkaXRpbmcpXG4gICAgICAgIGlmICghTGlnaHQuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGNvZGUgdG8gY2FsY3VsYXRlIGVhY2ggbGlnaHQgaW5zdGFuY2VcbiAgICAgICAgbGV0IGNhbGN1bGF0ZUxpZ2h0cyA9IFwiXCI7XG4gICAgICAgIGlmIChsaWdodHMgJiYgT2JqZWN0LmtleXMobGlnaHRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBDb2xsZWN0IHVuaXF1ZXMgdHlwZXMgb2YgbGlnaHRzXG4gICAgICAgICAgICBsZXQgdHlwZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGxpZ2h0X25hbWUgaW4gbGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbbGlnaHRzW2xpZ2h0X25hbWVdLnR5cGVdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGVhY2ggdHlwZSBvZiBsaWdodFxuICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBpbiB0eXBlcykge1xuICAgICAgICAgICAgICAgIExpZ2h0LnR5cGVzW3R5cGVdLmluamVjdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgcGVyLWluc3RhbmNlIGJsb2NrcyBhbmQgY29uc3RydWN0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBjYWxjdWxhdGUgZWFjaCBsaWdodFxuICAgICAgICAgICAgZm9yIChsZXQgbGlnaHRfbmFtZSBpbiBsaWdodHMpIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZpbmUgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICBsaWdodHNbbGlnaHRfbmFtZV0uaW5qZWN0KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNhbGN1bGF0aW9uIGZ1bmN0aW9uIHRvIHRoZSBsaXN0XG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlTGlnaHRzICs9IGBjYWxjdWxhdGVMaWdodCgke2xpZ2h0X25hbWV9LCBfZXllVG9Qb2ludCwgX25vcm1hbCk7XFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdsdWUgdG9nZXRoZXIgdGhlIGZpbmFsIGxpZ2h0aW5nIGZ1bmN0aW9uIHRoYXQgc3VtcyBhbGwgdGhlIGxpZ2h0c1xuICAgICAgICBsZXQgY2FsY3VsYXRlRnVuY3Rpb24gPSBgXG4gICAgICAgICAgICB2ZWM0IGNhbGN1bGF0ZUxpZ2h0aW5nKGluIHZlYzMgX2V5ZVRvUG9pbnQsIGluIHZlYzMgX25vcm1hbCwgaW4gdmVjNCBfY29sb3IpIHtcblxuICAgICAgICAgICAgICAgIC8vIERvIGluaXRpYWwgbWF0ZXJpYWwgY2FsY3VsYXRpb25zIG92ZXIgbm9ybWFsLCBlbWlzc2lvbiwgYW1iaWVudCwgZGlmZnVzZSBhbmQgc3BlY3VsYXIgdmFsdWVzXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF0ZXJpYWwoX2V5ZVRvUG9pbnQsX25vcm1hbCk7XG5cbiAgICAgICAgICAgICAgICAvLyBVbiByb2xsIHRoZSBsb29wIG9mIGluZGl2aWR1YWwgbGlndGhzIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgICR7Y2FsY3VsYXRlTGlnaHRzfVxuXG4gICAgICAgICAgICAgICAgLy8gIEZpbmFsIGxpZ2h0IGludGVuc2l0eSBjYWxjdWxhdGlvblxuICAgICAgICAgICAgICAgIHZlYzQgY29sb3IgPSB2ZWM0KHZlYzMoMC4pLCBfY29sb3IuYSk7IC8vIHN0YXJ0IHdpdGggdmVydGV4IGNvbG9yIGFscGhhXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9FTUlTU0lPTlxuICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgPSBtYXRlcmlhbC5lbWlzc2lvbi5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuZW1pc3Npb24uYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0FNQklFTlRcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2FtYmllbnQucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmFtYmllbnQucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmFtYmllbnQuYTtcbiAgICAgICAgICAgICAgICAjZWxzZVxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfYW1iaWVudC5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5yZ2I7XG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfZGlmZnVzZS5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuZGlmZnVzZS5hO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfU1BFQ1VMQVJcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX3NwZWN1bGFyLnJnYiAqIG1hdGVyaWFsLnNwZWN1bGFyLnJnYjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSAqPSBtYXRlcmlhbC5zcGVjdWxhci5hO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgLy8gQ2xhbXAgZmluYWwgY29sb3JcbiAgICAgICAgICAgICAgICBjb2xvciA9IGNsYW1wKGNvbG9yLCAwLjAsIDEuMCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgICAgICAgICB9YDtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBjYWxjdWxhdGVGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQ29tbW9uIGluc3RhbmNlIGRlZmluaXRpb25cbiAgICBpbmplY3QgKCkge1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSAgYFxuICAgICAgICAgICAgdW5pZm9ybSAke3RoaXMuc3RydWN0X25hbWV9IHVfJHt0aGlzLm5hbWV9O1xuICAgICAgICAgICAgJHt0aGlzLnN0cnVjdF9uYW1lfSAke3RoaXMubmFtZX07XG4gICAgICAgICAgICBgO1xuICAgICAgICBsZXQgYXNzaWduID0gYFxuICAgICAgICAgICAgJHt0aGlzLm5hbWV9ID0gdV8ke3RoaXMubmFtZX07XFxuXG4gICAgICAgIGA7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgaW5zdGFuY2UpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdzZXR1cCcsIGFzc2lnbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUgKCkge1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbmNlIHBlciBmcmFtZSBwZXIgcHJvZ3JhbSAoZS5nLiBmb3IgbWFpbiByZW5kZXIgcGFzcywgdGhlbiBmb3IgZWFjaCBhZGRpdGlvbmFsXG4gICAgLy8gcGFzcyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGV0Yy4pXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICAvLyAgVGhyZWUgY29tbW9uIGxpZ2h0IHByb3BlcnRpZXNcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmFtYmllbnRgLCB0aGlzLmFtYmllbnQpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlmZnVzZWAsIHRoaXMuZGlmZnVzZSk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5zcGVjdWxhcmAsIHRoaXMuc3BlY3VsYXIpO1xuICAgIH1cblxufVxuXG5MaWdodC50eXBlcyA9IHt9OyAvLyByZWZlcmVuY2VzIHRvIHN1YmNsYXNzZXMgYnkgc2hvcnQgbmFtZVxuTGlnaHQuYmxvY2sgPSAnbGlnaHRpbmcnOyAvLyBzaGFkZXIgYmxvY2sgbmFtZVxuTGlnaHQuZW5hYmxlZCA9IHRydWU7IC8vIGxpZ2h0aW5nIGNhbiBiZSBnbG9iYWxseSBlbmFibGVkL2Rpc2FibGVkXG5cblxuLy8gTGlnaHQgc3ViY2xhc3Nlc1xuY2xhc3MgQW1iaWVudExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdhbWJpZW50JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdBbWJpZW50TGlnaHQnO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19hbWJpZW50TGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmFtYmllbnRgLCB0aGlzLmFtYmllbnQpO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ2FtYmllbnQnXSA9IEFtYmllbnRMaWdodDtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZGlyZWN0aW9uYWwnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ0RpcmVjdGlvbmFsTGlnaHQnO1xuXG4gICAgICAgIGlmIChjb25maWcuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBjb25maWcuZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCBkaXJlY3Rpb25hbCBsaWdodCBtYWludGFpbnMgZnVsbCBpbnRlbnNpdHkgb24gZ3JvdW5kLCB3aXRoIGJhc2ljIGV4dHJ1c2lvbiBzaGFkaW5nXG4gICAgICAgICAgICBsZXQgdGhldGEgPSAxMzU7IC8vIGFuZ2xlIG9mIGxpZ2h0IGluIHh5IHBsYW5lIChyb3RhdGVkIGFyb3VuZCB6IGF4aXMpXG4gICAgICAgICAgICBsZXQgc2NhbGUgPSBNYXRoLnNpbihNYXRoLlBJKjYwLzE4MCk7IC8vIHNjYWxpbmcgZmFjdG9yIHRvIGtlZXAgdG90YWwgZGlyZWN0aW9uYWwgaW50ZW5zaXR5IHRvIDAuNVxuICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gW1xuICAgICAgICAgICAgICAgIE1hdGguY29zKE1hdGguUEkqdGhldGEvMTgwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIE1hdGguc2luKE1hdGguUEkqdGhldGEvMTgwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIC0wLjVcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmIChjb25maWcuYW1iaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbWJpZW50ID0gR0xTTC5leHBhbmRWZWMzKDAuNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLl9kaXJlY3Rpb24ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGdldCBkaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHNldCBkaXJlY3Rpb24gKHYpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGl6ZSh2KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0KCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlyZWN0aW9uYCwgdGhpcy5kaXJlY3Rpb24pO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ2RpcmVjdGlvbmFsJ10gPSBEaXJlY3Rpb25hbExpZ2h0O1xuXG5cbmNsYXNzIFBvaW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdwb2ludCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnUG9pbnRMaWdodCc7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IGNvbmZpZy5wb3NpdGlvbiB8fCBbMCwgMCwgJzEwMHB4J107XG4gICAgICAgIHRoaXMucG9zaXRpb25fZXllID0gW107IC8vIHBvc2l0aW9uIGluIGV5ZXNwYWNlXG4gICAgICAgIHRoaXMub3JpZ2luID0gY29uZmlnLm9yaWdpbiB8fCAnZ3JvdW5kJztcbiAgICAgICAgdGhpcy5hdHRlbnVhdGlvbiA9ICFpc05hTihwYXJzZUZsb2F0KGNvbmZpZy5hdHRlbnVhdGlvbikpID8gcGFyc2VGbG9hdChjb25maWcuYXR0ZW51YXRpb24pIDogMDtcblxuICAgICAgICBpZiAoY29uZmlnLnJhZGl1cykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJhZGl1cykgJiYgY29uZmlnLnJhZGl1cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IGNvbmZpZy5yYWRpdXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IFtudWxsLCBjb25maWcucmFkaXVzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFkaXVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfcG9pbnRMaWdodCk7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IGlzbnRhbmNlLXNwZWNpZmljIHNldHRpbmdzXG4gICAgaW5qZWN0KCkge1xuICAgICAgICBzdXBlci5pbmplY3QoKTtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9FWFBPTkVOVCddID0gKHRoaXMuYXR0ZW51YXRpb24gIT09IDApO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9JTk5FUl9SQURJVVMnXSA9ICh0aGlzLnJhZGl1cyAhPSBudWxsICYmIHRoaXMucmFkaXVzWzBdICE9IG51bGwpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9PVVRFUl9SQURJVVMnXSA9ICh0aGlzLnJhZGl1cyAhPSBudWxsKTtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUV5ZVBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlRXllUG9zaXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcmlnaW4gPT09ICd3b3JsZCcpIHtcbiAgICAgICAgICAgIC8vIEZvciB3b3JsZCBvcmlnaW4sIGZvcm1hdCBpczogW2xvbmdpdHVkZSwgbGF0aXR1ZGUsIG1ldGVycyAoZGVmYXVsdCkgb3IgcGl4ZWxzIHcvcHggdW5pdHNdXG5cbiAgICAgICAgICAgIC8vIE1vdmUgbGlnaHQncyB3b3JsZCBwb3NpdGlvbiBpbnRvIGNhbWVyYSBzcGFjZVxuICAgICAgICAgICAgbGV0IFt4LCB5XSA9IEdlby5sYXRMbmdUb01ldGVycyh0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzBdID0geCAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzBdO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMV0gPSB5IC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMV07XG5cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucG9zaXRpb25bMl0sXG4gICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gdGhpcy5wb3NpdGlvbl9leWVbMl0gLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1syXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9yaWdpbiA9PT0gJ2dyb3VuZCcgfHwgdGhpcy5vcmlnaW4gPT09ICdjYW1lcmEnKSB7XG4gICAgICAgICAgICAvLyBGb3IgY2FtZXJhIG9yIGdyb3VuZCBvcmlnaW4sIGZvcm1hdCBpczogW3gsIHksIHpdIGluIG1ldGVycyAoZGVmYXVsdCkgb3IgcGl4ZWxzIHcvcHggdW5pdHNcblxuICAgICAgICAgICAgLy8gTGlnaHQgaXMgaW4gY2FtZXJhIHNwYWNlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllID0gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3JpZ2luID09PSAnZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIC8vIExlYXZlIGxpZ2h0J3MgeHkgaW4gY2FtZXJhIHNwYWNlLCBidXQgeiBuZWVkcyB0byBiZSBtb3ZlZCByZWxhdGl2ZSB0byBncm91bmQgcGxhbmVcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IHRoaXMucG9zaXRpb25fZXllWzJdIC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbM10gPSAxO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcblxuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV8ke3RoaXMubmFtZX0ucG9zaXRpb25gLCB0aGlzLnBvc2l0aW9uX2V5ZSk7XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fRVhQT05FTlQnXSkge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uYXR0ZW51YXRpb25FeHBvbmVudGAsIHRoaXMuYXR0ZW51YXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fSU5ORVJfUkFESVVTJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LmlubmVyUmFkaXVzYCxcbiAgICAgICAgICAgICAgICBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5yYWRpdXNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fT1VURVJfUkFESVVTJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9Lm91dGVyUmFkaXVzYCxcbiAgICAgICAgICAgICAgICBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5yYWRpdXNbMV0sXG4gICAgICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuTGlnaHQudHlwZXNbJ3BvaW50J10gPSBQb2ludExpZ2h0O1xuXG5cbmNsYXNzIFNwb3RMaWdodCBleHRlbmRzIFBvaW50TGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnc3BvdGxpZ2h0JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdTcG90TGlnaHQnO1xuXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5fZGlyZWN0aW9uID0gKGNvbmZpZy5kaXJlY3Rpb24gfHwgWzAsIDAsIC0xXSkubWFwKHBhcnNlRmxvYXQpOyAvLyBbeCwgeSwgel1cbiAgICAgICAgdGhpcy5leHBvbmVudCA9IGNvbmZpZy5leHBvbmVudCA/IHBhcnNlRmxvYXQoY29uZmlnLmV4cG9uZW50KSA6IDAuMjtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGNvbmZpZy5hbmdsZSA/IHBhcnNlRmxvYXQoY29uZmlnLmFuZ2xlKSA6IDIwO1xuICAgIH1cblxuICAgIGdldCBkaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHNldCBkaXJlY3Rpb24gKHYpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGl6ZSh2KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3Nwb3RMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaXJlY3Rpb25gLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LnNwb3RDb3NDdXRvZmZgLCBNYXRoLmNvcyh0aGlzLmFuZ2xlICogMy4xNDE1OSAvIDE4MCkpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5zcG90RXhwb25lbnRgLCB0aGlzLmV4cG9uZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydzcG90bGlnaHQnXSA9IFNwb3RMaWdodDtcbiIsImltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX21hdGVyaWFsID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9tYXRlcmlhbC5nbHNsJywgJ3V0ZjgnKTtcblxuY29uc3QgbWF0ZXJpYWxfcHJvcHMgPSBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhciddO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXRlcmlhbCB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuXG4gICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcblxuICAgICAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFsbCBoYXZlIHRoZSBzYW1lIGRlZmF1bHRzLCBzbyB0aGV5IGNhbiBiZSBzZXQgaW4gYnVsa1xuICAgICAgICBtYXRlcmlhbF9wcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcF07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlOiB2YWx1ZS50ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZzogdmFsdWUubWFwcGluZyB8fCAnc3BoZXJlbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBHTFNMLmV4cGFuZFZlYzModmFsdWUuc2NhbGUgIT0gbnVsbCA/IHZhbHVlLnNjYWxlIDogMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IEdMU0wuZXhwYW5kVmVjNCh2YWx1ZS5hbW91bnQgIT0gbnVsbCA/IHZhbHVlLmFtb3VudCA6IDEpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHsgYW1vdW50OiBHTFNMLmV4cGFuZFZlYzQodmFsdWUpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHsgYW1vdW50OiBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKHZhbHVlKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIuc2hpbmluZXNzID0gY29uZmlnLnNoaW5pbmVzcyA/IHBhcnNlRmxvYXQoY29uZmlnLnNoaW5pbmVzcykgOiAwLjI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICBpZiAoY29uZmlnLm5vcm1hbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbCA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb25maWcubm9ybWFsLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgbWFwcGluZzogY29uZmlnLm5vcm1hbC5tYXBwaW5nIHx8ICd0cmlwbGFuYXInLFxuICAgICAgICAgICAgICAgIHNjYWxlOiBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLm5vcm1hbC5zY2FsZSAhPSBudWxsID8gY29uZmlnLm5vcm1hbC5zY2FsZSA6IDEpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogY29uZmlnLm5vcm1hbC5hbW91bnQgIT0gbnVsbCA/IGNvbmZpZy5ub3JtYWwuYW1vdW50IDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiBhIG1hdGVyaWFsIGNvbmZpZyBibG9jayBoYXMgc3VmZmljaWVudCBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIG1hdGVyaWFsXG4gICAgc3RhdGljIGlzVmFsaWQgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZW1pc3Npb24gPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmFtYmllbnQgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmRpZmZ1c2UgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLnNwZWN1bGFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluamVjdCAoc3R5bGUpIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggcHJvcGVydHksIHNldHMgZGVmaW5lcyB0byBjb25maWd1cmUgdGV4dHVyZSBtYXBwaW5nLCB3aXRoIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRSwgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFX1RFWFRVUkUsIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRV9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICAvLyBBbHNvIHNldHMgZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHVuaXF1ZSBtYXBwaW5nIHR5cGUgYmVpbmcgdXNlZCwgZS5nLjpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIC8vIEVuYWJsZXMgdGV4dHVyZSBjb29yZGluYXRlcyBpZiBuZWVkZWQgYW5kIG5vdCBhbHJlYWR5IG9uXG4gICAgICAgIG1hdGVyaWFsX3Byb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBsZXQgZGVmID0gYFRBTkdSQU1fTUFURVJJQUxfJHtwcm9wLnRvVXBwZXJDYXNlKCl9YDtcbiAgICAgICAgICAgIGxldCB0ZXhkZWYgPSBkZWYgKyAnX1RFWFRVUkUnO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tkZWZdID0gKHRoaXNbcHJvcF0gIT0gbnVsbCk7XG4gICAgICAgICAgICBpZiAodGhpc1twcm9wXSAmJiB0aGlzW3Byb3BdLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW3RleGRlZl0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbdGV4ZGVmICsgJ18nICsgdGhpc1twcm9wXS5tYXBwaW5nLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW2BUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfJHt0aGlzW3Byb3BdLm1hcHBpbmcudG9VcHBlckNhc2UoKX1gXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3R5bGUudGV4Y29vcmRzIHx8ICh0aGlzW3Byb3BdLm1hcHBpbmcgPT09ICd1dicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICAvLyBBcyBhbm92ZSwgc2V0cyBmbGFncyB0byBrZWVwIHRyYWNrIG9mIGVhY2ggdW5pcXVlIG1hcHBpbmcgdHlwZSBiZWluZyB1c2VkLCBlLmcuOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV9TUEhFUkVNQVBcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsICYmIHRoaXMubm9ybWFsLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTUFURVJJQUxfTk9STUFMX1RFWFRVUkUnXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX01BVEVSSUFMX05PUk1BTF9URVhUVVJFXycgKyB0aGlzLm5vcm1hbC5tYXBwaW5nLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbYFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV8ke3RoaXMubm9ybWFsLm1hcHBpbmcudG9VcHBlckNhc2UoKX1gXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzdHlsZS50ZXhjb29yZHMgfHwgKHRoaXMubm9ybWFsLm1hcHBpbmcgPT09ICd1dicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUucmVwbGFjZVNoYWRlckJsb2NrKE1hdGVyaWFsLmJsb2NrLCBzaGFkZXJTcmNfbWF0ZXJpYWwsICdNYXRlcmlhbCcpO1xuICAgICAgICBzdHlsZS5hZGRTaGFkZXJCbG9jaygnc2V0dXAnLCAnXFxubWF0ZXJpYWwgPSB1X21hdGVyaWFsO1xcbicsICdNYXRlcmlhbCcpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggcHJvcGVydHksIHNldHMgdW5pZm9ybXMgaW4gdGhlIHBhdHRlcm46XG4gICAgICAgIC8vIHVfbWF0ZXJpYWwuZGlmZnVzZSwgdV9tYXRlcmlhbC5kaWZmdXNlU2NhbGUgdV9tYXRlcmlhbF9kaWZmdXNlX3RleHR1cmVcbiAgICAgICAgbWF0ZXJpYWxfcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0udGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS5zZXRUZXh0dXJlVW5pZm9ybShgdV9tYXRlcmlhbF8ke3Byb3B9X3RleHR1cmVgLCB0aGlzW3Byb3BdLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9U2NhbGVgLCB0aGlzW3Byb3BdLnNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfWAsIHRoaXNbcHJvcF0uYW1vdW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbcHJvcF0uYW1vdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1gLCB0aGlzW3Byb3BdLmFtb3VudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeHRyYSBzcGVjdWxhciBwcm9wc1xuICAgICAgICBpZiAodGhpcy5zcGVjdWxhcikge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCAndV9tYXRlcmlhbC5zaGluaW5lc3MnLCB0aGlzLnNwZWN1bGFyLnNoaW5pbmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICBpZiAodGhpcy5ub3JtYWwgJiYgdGhpcy5ub3JtYWwudGV4dHVyZSkge1xuICAgICAgICAgICAgX3Byb2dyYW0uc2V0VGV4dHVyZVVuaWZvcm0oJ3VfbWF0ZXJpYWxfbm9ybWFsX3RleHR1cmUnLCB0aGlzLm5vcm1hbC50ZXh0dXJlKTtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X21hdGVyaWFsLm5vcm1hbFNjYWxlJywgdGhpcy5ub3JtYWwuc2NhbGUpO1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCAndV9tYXRlcmlhbC5ub3JtYWxBbW91bnQnLCB0aGlzLm5vcm1hbC5hbW91bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5NYXRlcmlhbC5ibG9jayA9ICdtYXRlcmlhbCc7XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG5pbXBvcnQgJy4vdXRpbHMvcG9seWZpbGxzJztcblxuLy8gVGhlIGxlYWZsZXQgbGF5ZXIgcGx1Z2luIGlzIGN1cnJlbnRseSB0aGUgcHJpbWFyeSBwdWJsaWMgQVBJXG5pbXBvcnQge2xlYWZsZXRMYXllcn0gZnJvbSAnLi9sZWFmbGV0X2xheWVyJztcblxuLy8gVGhlIHNjZW5lIHdvcmtlciBpcyBvbmx5IGFjdGl2YXRlZCB3aGVuIGEgd29ya2VyIHRocmVhZCBpcyBpbnN0YW50aWF0ZWQsIGJ1dCBtdXN0IGFsd2F5cyBiZSBsb2FkZWRcbmltcG9ydCBTY2VuZSBmcm9tICcuL3NjZW5lJztcbmltcG9ydCB7U2NlbmVXb3JrZXJ9IGZyb20gJy4vc2NlbmVfd29ya2VyJztcblxuLy8gQWRkaXRpb25hbCBtb2R1bGVzIGFyZSBleHBvc2VkIGZvciBkZWJ1Z2dpbmdcbmltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdXRpbHMvdmVyc2lvbic7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4vdmVjdG9yJztcbmltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vc291cmNlcy9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgJy4vc291cmNlcy9nZW9qc29uJztcbmltcG9ydCAnLi9zb3VyY2VzL3RvcG9qc29uJztcbmltcG9ydCAnLi9zb3VyY2VzL212dCc7XG5pbXBvcnQgJy4vc291cmNlcy9yYXN0ZXInO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleERhdGEgZnJvbSAnLi9nbC92ZXJ0ZXhfZGF0YSc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4vbWF0ZXJpYWwnO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4vbGlnaHQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IHtsYXllcl9jYWNoZX0gZnJvbSAnLi9zdHlsZXMvbGF5ZXInO1xuaW1wb3J0IHtTdHlsZU1hbmFnZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX21hbmFnZXInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBDYW52YXNUZXh0IGZyb20gJy4vc3R5bGVzL3RleHQvY2FudmFzX3RleHQnO1xuaW1wb3J0IGRlYnVnU2V0dGluZ3MgZnJvbSAnLi91dGlscy9kZWJ1Z19zZXR0aW5ncyc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcblxuLy8gTWFrZSBzb21lIG1vZHVsZXMgYWNjZXNzaWJsZSBmb3IgZGVidWdnaW5nXG52YXIgZGVidWcgPSB7XG4gICAgbG9nLFxuICAgIHlhbWwsXG4gICAgVGhyZWFkLFxuICAgIFV0aWxzLFxuICAgIEdlbyxcbiAgICBWZWN0b3IsXG4gICAgRGF0YVNvdXJjZSxcbiAgICBHTFNMLFxuICAgIFNoYWRlclByb2dyYW0sXG4gICAgVmVydGV4RGF0YSxcbiAgICBUZXh0dXJlLFxuICAgIE1hdGVyaWFsLFxuICAgIExpZ2h0LFxuICAgIFNjZW5lLFxuICAgIFNjZW5lV29ya2VyLFxuICAgIFdvcmtlckJyb2tlcixcbiAgICBsYXllcl9jYWNoZSxcbiAgICBTdHlsZU1hbmFnZXIsXG4gICAgU3R5bGVQYXJzZXIsXG4gICAgQ29sbGlzaW9uLFxuICAgIEZlYXR1cmVTZWxlY3Rpb24sXG4gICAgQ2FudmFzVGV4dCxcbiAgICBkZWJ1Z1NldHRpbmdzXG59O1xuXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBVdGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCgpO1xuXG4gICAgLy8gQXR0YWNoIFByb21pc2UgcG9seWZpbGwgdG8gd2luZG93XG4gICAgLy8gQWxsb3dzIEZvbnRGYWNlT2JzZXJ2ZXIgdG8gdXNlIHBvbHlmaWxsICh3aXRob3V0IG5lZWRpbmcgdG8gaW5jbHVkZSBpdHMgb3duIGR1cGxpY2F0ZSBwb2x5ZmlsbClcbiAgICBpZiAod2luZG93LlByb21pc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3aW5kb3cuUHJvbWlzZSA9IFByb21pc2U7XG4gICAgICAgIEpTWmlwLmV4dGVybmFsLlByb21pc2UgPSBQcm9taXNlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbGVhZmxldExheWVyLFxuICAgIGRlYnVnLFxuICAgIHZlcnNpb25cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL2dsL2NvbnRleHQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vZ2wvdmFvJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4vc3R5bGVzL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgU2NlbmVMb2FkZXIgZnJvbSAnLi9zY2VuZV9sb2FkZXInO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBUaWxlTWFuYWdlciBmcm9tICcuL3RpbGVfbWFuYWdlcic7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IFJlbmRlclN0YXRlTWFuYWdlciBmcm9tICcuL2dsL3JlbmRlcl9zdGF0ZSc7XG5pbXBvcnQgRm9udE1hbmFnZXIgZnJvbSAnLi9zdHlsZXMvdGV4dC9mb250X21hbmFnZXInO1xuaW1wb3J0IE1lZGlhQ2FwdHVyZSBmcm9tICcuL3V0aWxzL21lZGlhX2NhcHR1cmUnO1xuXG4vLyBMb2FkIHNjZW5lIGRlZmluaXRpb246IHBhc3MgYW4gb2JqZWN0IGRpcmVjdGx5LCBvciBhIFVSTCBhcyBzdHJpbmcgdG8gbG9hZCByZW1vdGVseVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NlbmUge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnX3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgc3Vic2NyaWJlTWl4aW4odGhpcyk7XG5cbiAgICAgICAgdGhpcy5pZCA9IFNjZW5lLmlkKys7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsOyAvLyB3aWxsIGJlIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2NlbmUgaXMgbG9hZGVkXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBWaWV3KHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlciA9IG5ldyBUaWxlTWFuYWdlcih7IHNjZW5lOiB0aGlzLCB2aWV3OiB0aGlzLnZpZXcgfSk7XG4gICAgICAgIHRoaXMubnVtX3dvcmtlcnMgPSBvcHRpb25zLm51bVdvcmtlcnMgfHwgMjtcbiAgICAgICAgdGhpcy53b3JrZXJfdXJsID0gb3B0aW9ucy53b3JrZXJVcmw7XG4gICAgICAgIGlmIChvcHRpb25zLmRpc2FibGVWZXJ0ZXhBcnJheU9iamVjdHMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSA9IG9wdGlvbnMuaGlnaERlbnNpdHlEaXNwbGF5ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSA6IHRydWU7XG4gICAgICAgIFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19zb3VyY2U7XG4gICAgICAgIHRoaXMuY29uZmlnX2J1bmRsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIgPSBuZXcgU3R5bGVNYW5hZ2VyKCk7XG5cbiAgICAgICAgdGhpcy5idWlsZGluZyA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2tzIGN1cnJlbnQgc2NlbmUgYnVpbGRpbmcgc3RhdGUgKHRpbGVzIGJlaW5nIGJ1aWx0LCBldGMuKVxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGEgcmVkcmF3XG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgcmVkcmF3IGV2ZXJ5IGZyYW1lXG4gICAgICAgIHRoaXMucHJlVXBkYXRlID0gb3B0aW9ucy5wcmVVcGRhdGU7ICAgICAgICAgICAgIC8vIG9wdGlvbmFsIHByZS1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIHRoaXMucG9zdFVwZGF0ZSA9IG9wdGlvbnMucG9zdFVwZGF0ZTsgICAgICAgICAgIC8vIG9wdGlvbmFsIHBvc3QtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wID0gIW9wdGlvbnMuZGlzYWJsZVJlbmRlckxvb3A7ICAvLyBkaXNhYmxlIHJlbmRlciBsb29wIC0gYXBwIHdpbGwgaGF2ZSB0byBtYW51YWxseSBjYWxsIFNjZW5lLnJlbmRlcigpIHBlciBmcmFtZVxuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RfcmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyYW1lID0gMDtcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlID0gbmV3IE1lZGlhQ2FwdHVyZSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0VGltZSgpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG5cbiAgICAgICAgdGhpcy5saWdodHMgPSBudWxsO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBTY2VuZS5nZW5lcmF0aW9uOyAvLyBhbiBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgc2NlbmUgY29uZmlnIGlzIGludmFsaWRhdGVkXG4gICAgICAgIHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uID0gU2NlbmUuZ2VuZXJhdGlvbjsgLy8gbGFzdCBnZW5lcmF0aW9uIGlkIHdpdGggYSBjb21wbGV0ZSB2aWV3XG4gICAgICAgIHRoaXMuc2V0dXBEZWJ1ZygpO1xuXG4gICAgICAgIHRoaXMubG9nX2xldmVsID0gb3B0aW9ucy5sb2dMZXZlbCB8fCAnd2Fybic7XG4gICAgICAgIGxvZy5zZXRMZXZlbCh0aGlzLmxvZ19sZXZlbCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZSAoY29uZmlnLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2VuZShjb25maWcsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIExvYWQgc2NlbmUgKG9yIHJlbG9hZCBleGlzdGluZyBzY2VuZSBpZiBubyBuZXcgc291cmNlIHNwZWNpZmllZClcbiAgICAvLyBPcHRpb25zOlxuICAgIC8vICAgYGNvbmZpZ19wYXRoYDogYmFzZSBVUkwgYWdhaW5zdCB3aGljaCByb28gc2NlbmUgcmVzb3VyY2VzIHNob3VsZCBiZSByZXNvbHZlZCAodXNlZnVsIGZvciBQbGF5KSAoZGVmYXVsdCBudWxsbClcbiAgICAvLyAgIGBibG9ja2luZ2A6IHNob3VsZCByZW5kZXJpbmcgYmxvY2sgb24gc2NlbmUgbG9hZCBjb21wbGV0aW9uIChkZWZhdWx0IHRydWUpXG4gICAgbG9hZChjb25maWdfc291cmNlID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWx0eSBmb3IgcGFzc2luZyBgY29uZmlnX3BhdGhgIHN0cmluZyBhcyBzZWNvbmQgYXJndW1lbnRcbiAgICAgICAgLy8gKHNpbmNlIHRyYW5zaXRpb25lZCB0byB1c2luZyBvcHRpb25zIGFyZ3VtZW50IHRvIGFjY2VwdCBtb3JlIHBhcmFtZXRlcnMpXG4gICAgICAgIG9wdGlvbnMgPSAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSA/IHsgY29uZmlnX3BhdGg6IG9wdGlvbnMgfSA6IG9wdGlvbnM7XG4gICAgICAgIGxldCBjb25maWdfcGF0aCA9IG9wdGlvbnMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgLy8gU2hvdWxkIHJlbmRlcmluZyBibG9jayBvbiBsb2FkIChub3QgZGVzaXJhYmxlIGZvciBpbml0aWFsIGxvYWQsIG9mdGVuIGRlc2lyZWQgZm9yIGxpdmUgc3R5bGUtc3dpdGNoaW5nKVxuICAgICAgICBvcHRpb25zLmJsb2NraW5nID0gKG9wdGlvbnMuYmxvY2tpbmcgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmJsb2NraW5nIDogdHJ1ZTtcblxuICAgICAgICAvLyBMb2FkIHNjZW5lIGRlZmluaXRpb24gKHNvdXJjZXMsIHN0eWxlcywgZXRjLiksIHRoZW4gY3JlYXRlIHN0eWxlcyAmIHdvcmtlcnNcbiAgICAgICAgdGhpcy5jcmVhdGVDYW52YXMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0aGlzLmxvYWRTY2VuZShjb25maWdfc291cmNlLCBjb25maWdfcGF0aClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuY3JlYXRlV29ya2VycygpKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGZWF0dXJlU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTY2VuZSBsb2FkZWQgZnJvbSBhIEpTIG9iamVjdCwgb3IgbW9kaWZpZWQgYnkgYSBgbG9hZGAgZXZlbnQsIG1heSBjb250YWluIGNvbXBpbGVkIEpTIGZ1bmN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIHdoaWNoIG5lZWQgdG8gYmUgc2VyaWFsaXplZCwgd2hpbGUgb25lIGxvYWRlZCBvbmx5IGZyb20gYSBVUkwgZG9lcyBub3QuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplX2Z1bmNzID0gKCh0eXBlb2YgdGhpcy5jb25maWdfc291cmNlID09PSAnb2JqZWN0JykgfHwgdGhpcy5oYXNTdWJzY3JpYmVyc0ZvcignbG9hZCcpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0aW5nID0gdGhpcy51cGRhdGVDb25maWcoeyBzZXJpYWxpemVfZnVuY3MsIGZhZGVfaW46IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0aW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRpbmctLTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UgPSB0aGlzLmNvbmZpZ19zb3VyY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19wYXRoID0gdGhpcy5jb25maWdfcGF0aDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcl9sb29wICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHVwUmVuZGVyTG9vcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy51cGRhdGluZyA9IDA7XG5cbiAgICAgICAgICAgIC8vIFJlcG9ydCBhbmQgcmV2ZXJ0IHRvIGxhc3QgdmFsaWQgY29uZmlnIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgbGV0IHR5cGUsIG1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1lBTUxFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9ICd5YW1sJztcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ0Vycm9yIHBhcnNpbmcgc2NlbmUgWUFNTCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBtb3JlIGVycm9yIHR5cGVzXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBpbml0aWFsaXppbmcgc2NlbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHsgdHlwZSwgbWVzc2FnZSwgZXJyb3IsIHVybDogdGhpcy5jb25maWdfc291cmNlIH0pO1xuXG4gICAgICAgICAgICBtZXNzYWdlID0gYFNjZW5lLmxvYWQoKSBmYWlsZWQgdG8gbG9hZCAke3RoaXMuY29uZmlnX3NvdXJjZX06ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZS5sb2FkKCkgcmV2ZXJ0aW5nIHRvIGxhc3QgdmFsaWQgY29uZmlndXJhdGlvbmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWQodGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UsIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemluZztcbiAgICB9XG5cbiAgICAvLyBGb3IgQVBJIGNvbXBhdGliaWxpdHlcbiAgICByZWxvYWQoY29uZmlnX3NvdXJjZSA9IG51bGwsIGNvbmZpZ19wYXRoID0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkKGNvbmZpZ19zb3VyY2UsIGNvbmZpZ19wYXRoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IHRydWU7IC8vIHNjaGVkdWxlIHJlbmRlciBsb29wIHRvIHN0b3BcblxuICAgICAgICB0aGlzLmRlc3Ryb3lMaXN0ZW5lcnMoKTtcblxuICAgICAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5jYW52YXMucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2wpIHtcbiAgICAgICAgICAgIFRleHR1cmUuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5kZXN0cm95KHRoaXMuZ2wpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcblxuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXNldCgpO1xuXG4gICAgICAgICAgICAvLyBGb3JjZSBjb250ZXh0IGxvc3NcbiAgICAgICAgICAgIGxldCBleHQgPSB0aGlzLmdsLmdldEV4dGVuc2lvbignV0VCR0xfbG9zZV9jb250ZXh0Jyk7XG4gICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgZXh0Lmxvc2VDb250ZXh0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2wgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zb3VyY2VzID0ge307XG5cbiAgICAgICAgdGhpcy5kZXN0cm95V29ya2VycygpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBjcmVhdGVDYW52YXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLnRvcCA9IDA7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmxlZnQgPSAwO1xuXG4gICAgICAgIC8vIEZvcmNlIHRhbmdyYW0gY2FudmFzIHVuZGVybmVhdGggYWxsIGxlYWZsZXQgbGF5ZXJzLCBhbmQgc2V0IGJhY2tncm91bmQgdG8gdHJhbnNwYXJlbnRcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmdsID0gQ29udGV4dC5nZXRDb250ZXh0KHRoaXMuY2FudmFzLCB7XG4gICAgICAgICAgICAgICAgYWxwaGE6IHRydWUsIHByZW11bHRpcGxpZWRBbHBoYTogdHJ1ZSwgLy8gVE9ETzogdmFyeSB3L3NjZW5lIGFscGhhXG4gICAgICAgICAgICAgICAgZGV2aWNlX3BpeGVsX3JhdGlvOiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNvdWxkbid0IGNyZWF0ZSBXZWJHTCBjb250ZXh0LiBcIiArXG4gICAgICAgICAgICAgICAgXCJZb3VyIGJyb3dzZXIgbWF5IG5vdCBzdXBwb3J0IFdlYkdMLCBvciBpdCdzIHR1cm5lZCBvZmY/IFwiICtcbiAgICAgICAgICAgICAgICBcIlZpc2l0IGh0dHA6Ly93ZWJnbHJlcG9ydC5jb20vIGZvciBtb3JlIGluZm8uXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2l6ZU1hcCh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCwgdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuaW5pdCh0aGlzLmdsKTtcbiAgICAgICAgdGhpcy5yZW5kZXJfc3RhdGVzID0gbmV3IFJlbmRlclN0YXRlTWFuYWdlcih0aGlzLmdsKTtcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlLnNldENhbnZhcyh0aGlzLmNhbnZhcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBVUkwgdG8gbG9hZCB0aGUgd2ViIHdvcmtlciBmcm9tXG4gICAgZ2V0V29ya2VyVXJsKCkge1xuICAgICAgICBsZXQgd29ya2VyX3VybCA9IHRoaXMud29ya2VyX3VybCB8fCBVUkxzLmZpbmRDdXJyZW50VVJMKCd0YW5ncmFtLmRlYnVnLmpzJywgJ3RhbmdyYW0ubWluLmpzJyk7XG5cbiAgICAgICAgaWYgKCF3b3JrZXJfdXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBsb2FkIHdvcmtlciBiZWNhdXNlIGNvdWxkbid0IGZpbmQgYmFzZSBVUkwgdGhhdCBsaWJyYXJ5IHdhcyBsb2FkZWQgZnJvbVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyBhbG9uZ3NpZGUgY29yZSBsaWJyYXJ5XG4gICAgICAgIC8vIE5PVEU6IHdvcmthcm91bmQgZm9yIGlzc3VlIHdoZXJlIGxhcmdlIGxpYnJhcmllcyBpbnRlcm1pdHRlbnRseSBmYWlsIHRvIGxvYWQgaW4gd2ViIHdvcmtlcnMsXG4gICAgICAgIC8vIHdoZW4gbXVsdGlwbGUgaW1wb3J0U2NyaXB0cygpIGNhbGxzIGFyZSB1c2VkLiBMb2FkaW5nIGFsbCBzY3JpcHRzIChpbmNsdWRpbmcgVGFuZ3JhbSBpdHNlbGYpXG4gICAgICAgIC8vIGluIG9uZSBjYWxsIGF0IGF0IHdvcmtlciBjcmVhdGlvbiB0aW1lIGhhcyBub3QgZXhoaWJpdGVkIHRoZSBzYW1lIGlzc3VlLlxuICAgICAgICBsZXQgdXJscyA9IFsuLi50aGlzLmRhdGFfc291cmNlX3NjcmlwdHNdO1xuICAgICAgICB1cmxzLnB1c2god29ya2VyX3VybCk7IC8vIGxvYWQgVGFuZ3JhbSAqbGFzdCogKGhhcyBiZWVuIG1vcmUgcmVsaWFibGUsIHRob3VnaCByZWFzb24gdW5rbm93bilcbiAgICAgICAgbGV0IGJvZHkgPSBgaW1wb3J0U2NyaXB0cygke3VybHMubWFwKHVybCA9PiBgJyR7dXJsfSdgKS5qb2luKCcsJyl9KTtgO1xuICAgICAgICByZXR1cm4gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2JvZHldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxpc3Qgb2YgYW55IGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIChpZiBhbnkpXG4gICAgdXBkYXRlRGF0YVNvdXJjZVNjcmlwdHMgKCkge1xuICAgICAgICBsZXQgcHJldl9zY3JpcHRzID0gWy4uLih0aGlzLmRhdGFfc291cmNlX3NjcmlwdHN8fFtdKV07IC8vIHNhdmUgbGlzdCBvZiBwcmV2aW91c2x5IGxvYWRlZCBzY3JpcHRzXG4gICAgICAgIGxldCBzY3JpcHRzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcuc291cmNlcykubWFwKHMgPT4gdGhpcy5jb25maWcuc291cmNlc1tzXS5zY3JpcHRzKS5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgaWYgKHNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsICdsb2FkaW5nIGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIGluIHdvcmtlcjonLCBzY3JpcHRzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFfc291cmNlX3NjcmlwdHMgPSBbXS5jb25jYXQoLi4uc2NyaXB0cykuc29ydCgpO1xuXG4gICAgICAgIC8vIFNjcmlwdHMgY2hhbmdlZD9cbiAgICAgICAgcmV0dXJuICEodGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzLmxlbmd0aCA9PT0gcHJldl9zY3JpcHRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBwcmV2X3NjcmlwdHNbaV0pKTtcbiAgICB9XG5cbiAgICAvLyBXZWIgd29ya2VycyBoYW5kbGUgaGVhdnkgZHV0eSB0aWxlIGNvbnN0cnVjdGlvbjogbmV0d29ya2luZywgZ2VvbWV0cnkgcHJvY2Vzc2luZywgZXRjLlxuICAgIGNyZWF0ZVdvcmtlcnMoKSB7XG4gICAgICAgIC8vIFJlc2V0IG9sZCB3b3JrZXJzIChpZiBhbnkpIGlmIHdlIG5lZWQgdG8gcmUtaW5zdGFudGlhdGUgd2l0aCBuZXcgZXh0ZXJuYWwgc2NyaXB0c1xuICAgICAgICBpZiAodGhpcy51cGRhdGVEYXRhU291cmNlU2NyaXB0cygpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lXb3JrZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMud29ya2Vycykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFrZVdvcmtlcnModGhpcy5nZXRXb3JrZXJVcmwoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIC8vIEluc3RhbnRpYXRlIHdvcmtlcnMgZnJvbSBVUkwsIGluaXQgZXZlbnQgaGFuZGxlcnNcbiAgICBtYWtlV29ya2Vycyh1cmwpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy53b3JrZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkPTA7IGlkIDwgdGhpcy5udW1fd29ya2VyczsgaWQrKykge1xuICAgICAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIodXJsKTtcbiAgICAgICAgICAgIHRoaXMud29ya2Vyc1tpZF0gPSB3b3JrZXI7XG5cbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcblxuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZS5tYWtlV29ya2VyczogaW5pdGlhbGl6aW5nIHdvcmtlciAke2lkfWApO1xuICAgICAgICAgICAgbGV0IF9pZCA9IGlkO1xuICAgICAgICAgICAgcXVldWUucHVzaChXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5pbml0JywgdGhpcy5pZCwgaWQsIHRoaXMubnVtX3dvcmtlcnMsIHRoaXMubG9nX2xldmVsLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pLnRoZW4oXG4gICAgICAgICAgICAgICAgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmUubWFrZVdvcmtlcnM6IGluaXRpYWxpemVkIHdvcmtlciAke2lkfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBTY2VuZS5tYWtlV29ya2VyczogZmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2VyICR7X2lkfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHRfd29ya2VyID0gMDtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZy5zZXRXb3JrZXJzKHRoaXMud29ya2Vycyk7XG5cbiAgICAgICAgICAgIC8vIExldCBWZXJ0ZXhFbGVtZW50cyBrbm93IGlmIDMyIGJpdCBpbmRpY2VzIGZvciBlbGVtZW50IGFycmF5cyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgICBsZXQgVWludDMyX2ZsYWcgPSB0aGlzLmdsLmdldEV4dGVuc2lvbihcIk9FU19lbGVtZW50X2luZGV4X3VpbnRcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnVmVydGV4RWxlbWVudHMuc2V0VWludDMyRmxhZycsIFVpbnQzMl9mbGFnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzdHJveVdvcmtlcnMoKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMud29ya2VycykpIHtcbiAgICAgICAgICAgIGxvZy5zZXRXb3JrZXJzKG51bGwpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzc2lnbiB0aWxlIHRvIHdvcmtlciB0aHJlYWQgYmFzZWQgb24gZGF0YSBzb3VyY2VcbiAgICBnZXRXb3JrZXJGb3JEYXRhU291cmNlKHNvdXJjZSkge1xuICAgICAgICBsZXQgd29ya2VyO1xuXG4gICAgICAgIGlmIChzb3VyY2UudGlsZWQpIHtcbiAgICAgICAgICAgIC8vIFJvdW5kIHJvYmluIHRpbGVkIHNvdXJjZXMgYWNyb3NzIGFsbCB3b3JrZXJzXG4gICAgICAgICAgICB3b3JrZXIgPSB0aGlzLndvcmtlcnNbdGhpcy5uZXh0X3dvcmtlcl07XG4gICAgICAgICAgICB0aGlzLm5leHRfd29ya2VyID0gKHRoaXMubmV4dF93b3JrZXIgKyAxKSAlIHRoaXMud29ya2Vycy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBQaW4gYWxsIHRpbGVzIGZyb20gZWFjaCBub24tdGlsZWQgc291cmNlIHRvIGEgc2luZ2xlIHdvcmtlclxuICAgICAgICAgICAgLy8gUHJldmVudHMgZGF0YSBmb3IgdGhlc2Ugc291cmNlcyBmcm9tIGJlaW5nIGxvYWRlZCBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgICAgd29ya2VyID0gdGhpcy53b3JrZXJzW3NvdXJjZS5pZCAlIHRoaXMud29ya2Vycy5sZW5ndGhdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9XG5cbiAgICAvLyBTY2VuZSBpcyByZWFkeSBmb3IgcmVuZGVyaW5nXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3LnJlYWR5KCkgfHwgT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVzaXplIHRoZSBtYXAgd2hlbiBkZXZpY2UgcGl4ZWwgcmF0aW8gY2hhbmdlcywgZS5nLiB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGRpc3BsYXlzXG4gICAgdXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyAoKSB7XG4gICAgICAgIGlmIChVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCkpIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnVwZGF0ZURldmljZVBpeGVsUmF0aW8nLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWJ1aWxkKCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZXNpemVNYXAodGhpcy52aWV3LnNpemUuY3NzLndpZHRoLCB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNpemVNYXAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBpZiAod2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWV3LnNldFZpZXdwb3J0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuZ2wpIHtcbiAgICAgICAgICAgIENvbnRleHQucmVzaXplKHRoaXMuZ2wsIHdpZHRoLCBoZWlnaHQsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IHNjZW5lIGJlIHJlZHJhd24gYXQgbmV4dCBhbmltYXRpb24gbG9vcFxuICAgIHJlcXVlc3RSZWRyYXcoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlZHJhdyBzY2VuZSBpbW1lZGlhdGVseSAtIGRvbid0IHdhaXQgZm9yIGFuaW1hdGlvbiBsb29wXG4gICAgLy8gVXNlIHNwYXJpbmdseSwgYnV0IGZvciBjYXNlcyB3aGVyZSB5b3UgbmVlZCB0aGUgY2xvc2VzdCBwb3NzaWJsZSBzeW5jIHdpdGggb3RoZXIgVUkgZWxlbWVudHMsXG4gICAgLy8gc3VjaCBhcyBvdGhlciwgbm9uLVdlYkdMIG1hcCBsYXllcnMgKGUuZy4gTGVhZmxldCByYXN0ZXIgbGF5ZXJzLCBtYXJrZXJzLCBldGMuKVxuICAgIGltbWVkaWF0ZVJlZHJhdygpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyTG9vcCAoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gdHJ1ZTsgLy8gb25seSBsZXQgdGhlIHJlbmRlciBsb29wIGluc3RhbnRpYXRlIG9uY2VcblxuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBzY2VuZVxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcXVlc3QgdGhlIG5leHQgZnJhbWUgaWYgbm90IHNjaGVkdWxlZCB0byBzdG9wXG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJfbG9vcF9zdG9wKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyTG9vcC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldHVwIHRoZSByZW5kZXIgbG9vcFxuICAgIHNldHVwUmVuZGVyTG9vcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMucmVuZGVyTG9vcCgpOyB9LCAwKTsgLy8gZGVsYXkgc3RhcnQgYnkgb25lIHRpY2tcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgLy8gUmVuZGVyIG9uIGRlbWFuZFxuICAgICAgICB2YXIgd2lsbF9yZW5kZXIgPSAhKFxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICB0aGlzLnVwZGF0aW5nID4gMCB8fFxuICAgICAgICAgICAgdGhpcy5yZWFkeSgpID09PSBmYWxzZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFByZS1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucHJlVXBkYXRlKHdpbGxfcmVuZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhaWwgaWYgbm8gbmVlZCB0byByZW5kZXJcbiAgICAgICAgaWYgKCF3aWxsX3JlbmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTsgLy8gc3ViY2xhc3NlcyBjYW4gc2V0IHRoaXMgYmFjayB0byB0cnVlIHdoZW4gYW5pbWF0aW9uIGlzIG5lZWRlZFxuXG4gICAgICAgIC8vIFJlbmRlciB0aGUgc2NlbmVcbiAgICAgICAgdGhpcy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld0NvbXBsZXRlKCk7IC8vIGZpcmVzIGV2ZW50IHdoZW4gcmVuZGVyZWQgdGlsZSBzZXQgb3Igc3R5bGUgY2hhbmdlc1xuICAgICAgICB0aGlzLm1lZGlhX2NhcHR1cmUuY29tcGxldGVTY3JlZW5zaG90KCk7IC8vIGNvbXBsZXRlcyBzY3JlZW5zaG90IGNhcHR1cmUgaWYgcmVxdWVzdGVkXG5cbiAgICAgICAgLy8gUG9zdC1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb3N0VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RVcGRhdGUod2lsbF9yZW5kZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVkcmF3IGV2ZXJ5IGZyYW1lIGlmIGFuaW1hdGluZ1xuICAgICAgICBpZiAodGhpcy5hbmltYXRlZCA9PT0gdHJ1ZSB8fCB0aGlzLnZpZXcuaXNBbmltYXRpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZyYW1lKys7XG4gICAgICAgIGxvZygndHJhY2UnLCAnU2NlbmUucmVuZGVyKCknKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdHlsZXMsIGNhbWVyYSwgbGlnaHRzXG4gICAgICAgIHRoaXMudmlldy51cGRhdGUoKTtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5saWdodHMpLmZvckVhY2goaSA9PiB0aGlzLmxpZ2h0c1tpXS51cGRhdGUoKSk7XG5cbiAgICAgICAgLy8gUmVuZGVyIG1haW4gcGFzc1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudCA9IHRoaXMucmVuZGVyUGFzcygpO1xuXG4gICAgICAgIC8vIFJlbmRlciBzZWxlY3Rpb24gcGFzcyAoaWYgbmVlZGVkKVxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24ucGVuZGluZ1JlcXVlc3RzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcucGFubmluZyB8fCB0aGlzLnZpZXcuem9vbWluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyUGVuZGluZ1JlcXVlc3RzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmxvY2tlZCkgeyAgICAgICAvLyBjaGVjayBpZiBzZWxlY3Rpb24gYnVmZmVyIGlzIGxvY2tlZCAoZS5nLiBidWlsZGluZyB0aWxlcylcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5iaW5kKCk7ICAgICAgICAgIC8vIHN3aXRjaCB0byBGQk9cbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclBhc3MoXG4gICAgICAgICAgICAgICAgICAgICdzZWxlY3Rpb25fcHJvZ3JhbScsICAgICAgICAvLyByZW5kZXIgdy9hbHRlcm5hdGUgcHJvZ3JhbVxuICAgICAgICAgICAgICAgICAgICB7IGFsbG93X2JsZW5kOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRvIHNjcmVlbiBidWZmZXJcbiAgICAgICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZWFkKCk7IC8vIHByb2Nlc3MgYW55IHBlbmRpbmcgcmVzdWx0cyBmcm9tIHNlbGVjdGlvbiBidWZmZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyX2NvdW50ICE9PSB0aGlzLmxhc3RfcmVuZGVyX2NvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5nZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSgpLnRoZW4oc2l6ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNpemUpIHsgLy8gcmV0dXJucyB1bmRlZmluZWQgaWYgcHJldmlvdXMgcmVxdWVzdCBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZTogcmVuZGVyZWQgJHt0aGlzLnJlbmRlcl9jb3VudH0gcHJpbWl0aXZlcyAoJHtzaXplfSBmZWF0dXJlcyBpbiBzZWxlY3Rpb24gbWFwKWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdF9yZW5kZXJfY291bnQgPSB0aGlzLnJlbmRlcl9jb3VudDtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgYWxsIGFjdGl2ZSBzdHlsZXMsIGdyb3VwZWQgYnkgYmxlbmQvZGVwdGggdHlwZSAob3BhcXVlLCBvdmVybGF5LCBldGMuKSBhbmQgYnkgcHJvZ3JhbSAoc3R5bGUpXG4gICAgLy8gQ2FsbGVkIGJvdGggZm9yIG1haW4gcmVuZGVyIHBhc3MsIGFuZCBmb3Igc2Vjb25kYXJ5IHBhc3NlcyBsaWtlIHNlbGVjdGlvbiBidWZmZXJcbiAgICByZW5kZXJQYXNzKHByb2dyYW1fa2V5ID0gJ3Byb2dyYW0nLCB7IGFsbG93X2JsZW5kIH0gPSB7fSkge1xuICAgICAgICAvLyBvcHRpb25hbGx5IGZvcmNlIGFscGhhIG9mZiAoZS5nLiBmb3Igc2VsZWN0aW9uIHBhc3MpXG4gICAgICAgIGFsbG93X2JsZW5kID0gKGFsbG93X2JsZW5kID09IG51bGwpID8gdHJ1ZSA6IGFsbG93X2JsZW5kO1xuXG4gICAgICAgIHRoaXMuY2xlYXJGcmFtZSh7IGNsZWFyX2NvbG9yOiB0cnVlLCBjbGVhcl9kZXB0aDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBTb3J0IHN0eWxlcyBieSBibGVuZCBvcmRlclxuICAgICAgICBsZXQgc3R5bGVzID0gdGhpcy50aWxlX21hbmFnZXIuZ2V0QWN0aXZlU3R5bGVzKCkuXG4gICAgICAgICAgICBtYXAocyA9PiB0aGlzLnN0eWxlc1tzXSkuXG4gICAgICAgICAgICBmaWx0ZXIocyA9PiBzKS4gLy8gZ3VhcmQgYWdhaW5zdCBtaXNzaW5nIHN0eWxlcywgc3VjaCBhcyB3aGlsZSBsb2FkaW5nIGEgbmV3IHNjZW5lXG4gICAgICAgICAgICBzb3J0KFN0eWxlLmJsZW5kT3JkZXJTb3J0KTtcblxuICAgICAgICAvLyBSZW5kZXIgc3R5bGVzXG4gICAgICAgIGxldCBjb3VudCA9IDA7IC8vIGhvdyBtYW55IHByaW1pdGl2ZXMgd2VyZSByZW5kZXJlZFxuICAgICAgICBsZXQgbGFzdF9ibGVuZDtcbiAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc3R5bGVzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSBzdHlsZXNbc107XG5cbiAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHJlbmRlciBzdGF0ZSB3aGVuIGJsZW5kIG1vZGUgY2hhbmdlc1xuICAgICAgICAgICAgaWYgKHN0eWxlLmJsZW5kICE9PSBsYXN0X2JsZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSxcbiAgICAgICAgICAgICAgICAgICAgU3R5bGUucmVuZGVyX3N0YXRlc1tzdHlsZS5ibGVuZF0sICAgICAgIC8vIHJlbmRlciBzdGF0ZSBmb3IgYmxlbmQgbW9kZVxuICAgICAgICAgICAgICAgICAgICB7IGJsZW5kOiAoYWxsb3dfYmxlbmQgJiYgc3R5bGUuYmxlbmQpIH0gLy8gZW5hYmxlL2Rpc2FibGUgYmxlbmRpbmcgKGUuZy4gbm8gYmxlbmQgZm9yIHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyU3RhdGUoc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnQgKz0gdGhpcy5yZW5kZXJTdHlsZShzdHlsZS5uYW1lLCBwcm9ncmFtX2tleSk7XG4gICAgICAgICAgICBsYXN0X2JsZW5kID0gc3R5bGUuYmxlbmQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgcmVuZGVyU3R5bGUoc3R5bGVfbmFtZSwgcHJvZ3JhbV9rZXkpIHtcbiAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5zdHlsZXNbc3R5bGVfbmFtZV07XG4gICAgICAgIGxldCBmaXJzdF9mb3Jfc3R5bGUgPSB0cnVlO1xuICAgICAgICBsZXQgcmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgbGV0IHByb2dyYW07XG5cbiAgICAgICAgLy8gUmVuZGVyIHRpbGUgR0wgZ2VvbWV0cmllc1xuICAgICAgICBsZXQgcmVuZGVyYWJsZV90aWxlcyA9IHRoaXMudGlsZV9tYW5hZ2VyLmdldFJlbmRlcmFibGVUaWxlcygpO1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCByZW5kZXJhYmxlX3RpbGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHJlbmRlcmFibGVfdGlsZXNbdF07XG5cbiAgICAgICAgICAgIGlmICh0aWxlLm1lc2hlc1tzdHlsZV9uYW1lXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0eWxlLXNwZWNpZmljIHN0YXRlXG4gICAgICAgICAgICAvLyBPbmx5IHNldHVwIHN0eWxlIGlmIHJlbmRlcmluZyBmb3IgZmlyc3QgdGltZSB0aGlzIGZyYW1lXG4gICAgICAgICAgICAvLyAobGF6eSBpbml0LCBub3QgYWxsIHN0eWxlcyB3aWxsIGJlIHVzZWQgaW4gYWxsIHNjcmVlbiB2aWV3czsgc29tZSBzdHlsZXMgbWlnaHQgYmUgZGVmaW5lZCBidXQgbmV2ZXIgdXNlZClcbiAgICAgICAgICAgIGlmIChmaXJzdF9mb3Jfc3R5bGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBmaXJzdF9mb3Jfc3R5bGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtID0gdGhpcy5zZXR1cFN0eWxlKHN0eWxlLCBwcm9ncmFtX2tleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBwcm94eSB0aWxlcyBpZiBuZXcgdGlsZXMgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIHRoaXMgc3R5bGVcbiAgICAgICAgICAgIGlmICghdGlsZS5zaG91bGRQcm94eUZvclN0eWxlKHN0eWxlX25hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBTY2VuZS5yZW5kZXJTdHlsZSgpOiBTa2lwIHByb3h5IHRpbGUgZm9yIHN0eWxlICcke3N0eWxlX25hbWV9JyBgLCB0aWxlLCB0aWxlLnByb3h5X2Zvcik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIHRoaXMudmlldy5zZXR1cFRpbGUodGlsZSwgcHJvZ3JhbSk7XG5cbiAgICAgICAgICAgIC8vIFJlbmRlciB0aWxlXG4gICAgICAgICAgICBsZXQgbWVzaCA9IHRpbGUubWVzaGVzW3N0eWxlX25hbWVdO1xuICAgICAgICAgICAgaWYgKHN0eWxlLnJlbmRlcihtZXNoKSkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGluY3VyIGFkZGl0aW9uYWwgcmVuZGVycyB3aGlsZSB2aWV3cG9ydCBpcyBtb3ZpbmdcbiAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnZpZXcucGFubmluZyB8fCB0aGlzLnZpZXcuem9vbWluZykpIHtcbiAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW5kZXJfY291bnQgKz0gbWVzaC5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW5kZXJfY291bnQ7XG4gICAgfVxuXG4gICAgc2V0dXBTdHlsZShzdHlsZSwgcHJvZ3JhbV9rZXkpIHtcbiAgICAgICAgLy8gR2V0IHNoYWRlciBwcm9ncmFtIGZyb20gc3R5bGUsIGxhemlseSBjb21waWxpbmcgaWYgbmVjZXNzYXJ5XG4gICAgICAgIGxldCBwcm9ncmFtO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IHN0eWxlLmdldFByb2dyYW0ocHJvZ3JhbV9rZXkpO1xuICAgICAgICAgICAgaWYgKCFwcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3dhcm5pbmcnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3N0eWxlcycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGNvbXBpbGluZyBzdHlsZSAke3N0eWxlLm5hbWV9YCxcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzaGFkZXJfZXJyb3JzOiBzdHlsZS5wcm9ncmFtICYmIHN0eWxlLnByb2dyYW0uc2hhZGVyX2Vycm9yc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcm9ncmFtLnVzZSgpO1xuICAgICAgICBzdHlsZS5zZXR1cCgpO1xuXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV90aW1lJywgdGhpcy5hbmltYXRlZCA/ICgoKCtuZXcgRGF0ZSgpKSAtIHRoaXMuc3RhcnRfdGltZSkgLyAxMDAwKSA6IDApO1xuICAgICAgICB0aGlzLnZpZXcuc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMubGlnaHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxpZ2h0c1tpXS5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvZ3JhbTtcbiAgICB9XG5cbiAgICBjbGVhckZyYW1lKHsgY2xlYXJfY29sb3IsIGNsZWFyX2RlcHRoIH0gPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHRzXG4gICAgICAgIGNsZWFyX2NvbG9yID0gKGNsZWFyX2NvbG9yID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7IC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBjbGVhcl9kZXB0aCA9IChjbGVhcl9kZXB0aCA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlOyAvLyBkZWZhdWx0IHRydWVcblxuICAgICAgICAvLyBTZXQgR0wgc3RhdGVcbiAgICAgICAgdGhpcy5yZW5kZXJfc3RhdGVzLmRlcHRoX3dyaXRlLnNldCh7IGRlcHRoX3dyaXRlOiBjbGVhcl9kZXB0aCB9KTtcblxuICAgICAgICBsZXQgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAoY2xlYXJfY29sb3IgfHwgY2xlYXJfZGVwdGgpIHtcbiAgICAgICAgICAgIGxldCBtYXNrID0gKGNsZWFyX2NvbG9yICYmIGdsLkNPTE9SX0JVRkZFUl9CSVQpIHwgKGNsZWFyX2RlcHRoICYmIGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICAgICAgICAgICAgZ2wuY2xlYXIobWFzayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRSZW5kZXJTdGF0ZSh7IGRlcHRoX3Rlc3QsIGRlcHRoX3dyaXRlLCBjdWxsX2ZhY2UsIGJsZW5kIH0gPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHRzXG4gICAgICAgIC8vIFRPRE86IHdoZW4gd2UgYWJzdHJhY3Qgb3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHJlbmRlciBwYXNzZXMsIHRoZXNlIGNhbiBiZSBwZXItcGFzcyBjb25maWcgb3B0aW9uc1xuICAgICAgICBsZXQgcmVuZGVyX3N0YXRlcyA9IHRoaXMucmVuZGVyX3N0YXRlcztcbiAgICAgICAgZGVwdGhfdGVzdCA9IChkZXB0aF90ZXN0ID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuZGVwdGhfdGVzdDsgICAgICAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgZGVwdGhfd3JpdGUgPSAoZGVwdGhfd3JpdGUgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5kZXB0aF93cml0ZTsgICAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgY3VsbF9mYWNlID0gKGN1bGxfZmFjZSA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmN1bGxpbmc7ICAgICAgICAgICAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgYmxlbmQgPSAoYmxlbmQgIT0gbnVsbCkgPyBibGVuZCA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuYmxlbmRpbmc7ICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGZhbHNlXG5cbiAgICAgICAgLy8gUmVzZXQgZnJhbWUgc3RhdGVcbiAgICAgICAgbGV0IGdsID0gdGhpcy5nbDtcblxuICAgICAgICByZW5kZXJfc3RhdGVzLmRlcHRoX3Rlc3Quc2V0KHsgZGVwdGhfdGVzdDogZGVwdGhfdGVzdCB9KTtcbiAgICAgICAgcmVuZGVyX3N0YXRlcy5kZXB0aF93cml0ZS5zZXQoeyBkZXB0aF93cml0ZTogZGVwdGhfd3JpdGUgfSk7XG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuY3VsbGluZy5zZXQoeyBjdWxsOiBjdWxsX2ZhY2UsIGZhY2U6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlIH0pO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nIG9mIGFscGhhIGNoYW5uZWwgaXMgbW9kaWZpZWQgdG8gYWNjb3VudCBmb3IgV2ViR0wgYWxwaGEgYmVoYXZpb3IsIHNlZTpcbiAgICAgICAgLy8gaHR0cDovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLWFuZC1hbHBoYS5odG1sXG4gICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzExNTMzNDE2XG4gICAgICAgIGlmIChibGVuZCkge1xuICAgICAgICAgICAgLy8gT3BhcXVlOiBhbGwgc291cmNlLCBubyBkZXN0aW5hdGlvblxuICAgICAgICAgICAgaWYgKGJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmFkaXRpb25hbCBhbHBoYSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdvdmVybGF5JyB8fCBibGVuZCA9PT0gJ2lubGF5Jykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuU1JDX0FMUEhBLCBkc3Q6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsXG4gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTogZ2wuT05FLCBkc3RfYWxwaGE6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFkZGl0aXZlIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLk9ORSwgZHN0OiBnbC5PTkVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE11bHRpcGxpY2F0aXZlIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ211bHRpcGx5Jykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuWkVSTywgZHN0OiBnbC5TUkNfQ09MT1JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHsgYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBmZWF0dXJlIHNlbGVjdGlvbiBhdCBnaXZlbiBwaXhlbC4gUnVucyBhc3luYyBhbmQgcmV0dXJucyByZXN1bHRzIHZpYSBhIHByb21pc2UuXG4gICAgZ2V0RmVhdHVyZUF0KHBpeGVsKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIFwiU2NlbmUuZ2V0RmVhdHVyZUF0KCkgY2FsbGVkIGJlZm9yZSBzY2VuZSB3YXMgaW5pdGlhbGl6ZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb2ludCBzY2FsZWQgdG8gWzAuLjFdIHJhbmdlXG4gICAgICAgIHZhciBwb2ludCA9IHtcbiAgICAgICAgICAgIHg6IHBpeGVsLnggKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gLyB0aGlzLnZpZXcuc2l6ZS5kZXZpY2Uud2lkdGgsXG4gICAgICAgICAgICB5OiBwaXhlbC55ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvIC8gdGhpcy52aWV3LnNpemUuZGV2aWNlLmhlaWdodFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlOyAvLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgc2NlbmUgcmUtcmVuZGVycyBmb3IgdGhlc2UgdG8gYmUgcHJvY2Vzc2VkXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRGZWF0dXJlQXQocG9pbnQpLlxuICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4gT2JqZWN0LmFzc2lnbihzZWxlY3Rpb24sIHsgcGl4ZWwgfSkpLlxuICAgICAgICAgICAgY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZXNvbHZlKHsgZXJyb3IgfSkpO1xuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgZ2VvbWV0cnksIHdpdGhvdXQgcmUtcGFyc2luZyB0aGUgY29uZmlnIG9yIHJlLWNvbXBpbGluZyBzdHlsZXNcbiAgICAvLyBUT0RPOiBkZXRlY3Qgd2hpY2ggZWxlbWVudHMgbmVlZCB0byBiZSByZWZyZXNoZWQvcmVidWlsdCAoc3R5bGVzaGVldCBjaGFuZ2VzLCBldGMuKVxuICAgIHJlYnVpbGQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWJ1aWxkR2VvbWV0cnkob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gUmVidWlsZCBhbGwgdGlsZXNcbiAgICAvLyBzeW5jOiBib29sZWFuIG9mIHdoZXRoZXIgdG8gc3luYyB0aGUgY29uZmlnIG9iamVjdCB0byB0aGUgd29ya2VyXG4gICAgLy8gc291cmNlczogb3B0aW9uYWwgYXJyYXkgb2YgZGF0YSBzb3VyY2VzIHRvIHNlbGVjdGl2ZWx5IHJlYnVpbGQgKGJ5IGRlZmF1bHQgYWxsIG91ciByZWJ1aWx0KVxuICAgIHJlYnVpbGRHZW9tZXRyeSh7IHN5bmMgPSB0cnVlLCBzb3VyY2VzID0gbnVsbCwgc2VyaWFsaXplX2Z1bmNzLCBwcm9maWxlID0gZmFsc2UsIGZhZGVfaW4gPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFNraXAgcmVidWlsZCBpZiBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZykge1xuICAgICAgICAgICAgICAgIC8vIFF1ZXVlIHVwIHRvIG9uZSByZWJ1aWxkIGNhbGwgYXQgYSB0aW1lLCBvbmx5IHNhdmUgbGFzdCByZXF1ZXN0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcucXVldWVkICYmIHRoaXMuYnVpbGRpbmcucXVldWVkLnJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgcHJldmlvdXMgcmVxdWVzdCB0aGF0IGl0IGRpZCBub3QgY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsICdTY2VuZS5yZWJ1aWxkOiByZXF1ZXN0IHN1cGVyY2VkZWQgYnkgYSBuZXdlciBjYWxsJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcucXVldWVkLnJlc29sdmUoZmFsc2UpOyAvLyBmYWxzZSBmbGFnIGluZGljYXRlcyByZWJ1aWxkIHJlcXVlc3Qgd2FzIHN1cGVyY2VkZWRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTYXZlIHF1ZXVlZCByZXF1ZXN0XG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7IHN5bmMsIHNvdXJjZXMsIHNlcmlhbGl6ZV9mdW5jcywgcHJvZmlsZSwgZmFkZV9pbiB9O1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcucXVldWVkID0geyByZXNvbHZlLCByZWplY3QsIG9wdGlvbnMgfTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFNjZW5lLnJlYnVpbGQoKTogcXVldWluZyByZXF1ZXN0YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmFjayB0aWxlIGJ1aWxkIHN0YXRlXG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nID0geyByZXNvbHZlLCByZWplY3QgfTtcblxuICAgICAgICAgICAgLy8gUHJvZmlsaW5nXG4gICAgICAgICAgICBpZiAocHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2ZpbGUoJ1NjZW5lLnJlYnVpbGQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbmZpZyAoaW4gY2FzZSBKUyBvYmplY3RzIHdlcmUgbWFuaXB1bGF0ZWQgZGlyZWN0bHkpXG4gICAgICAgICAgICBpZiAoc3luYykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXNldEZlYXR1cmVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIC8vIFJlYnVpbGQgdmlzaWJsZSB0aWxlc1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucHJ1bmVUb1Zpc2libGVUaWxlcygpO1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VzIHx8IHNvdXJjZXMuaW5kZXhPZih0aWxlLnNvdXJjZS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmJ1aWxkVGlsZSh0aWxlLCB7IGZhZGVfaW4gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTsgLy8gcGlja3MgdXAgYWRkaXRpb25hbCB0aWxlcyBmb3IgYW55IG5ldy9jaGFuZ2VkIGRhdGEgc291cmNlc1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuY2hlY2tCdWlsZFF1ZXVlKCk7ICAgIC8vIHJlc29sdmUgaW1tZWRpYXRlbHkgaWYgbm8gdGlsZXMgdG8gYnVpbGRcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBQcm9maWxpbmdcbiAgICAgICAgICAgIGlmIChwcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZmlsZUVuZCgnU2NlbmUucmVidWlsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaWxlIG1hbmFnZXIgZmluaXNoZWQgYnVpbGRpbmcgdGlsZXNcbiAgICAvLyBUT0RPIG1vdmUgdG8gdGlsZSBtYW5hZ2VyXG4gICAgdGlsZU1hbmFnZXJCdWlsZERvbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nKSB7XG4gICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmU6IGJ1aWxkIGdlb21ldHJ5IGZpbmlzaGVkYCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZy5yZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBbm90aGVyIHJlYnVpbGQgcXVldWVkP1xuICAgICAgICAgICAgdmFyIHF1ZXVlZCA9IHRoaXMuYnVpbGRpbmcucXVldWVkO1xuICAgICAgICAgICAgdGhpcy5idWlsZGluZyA9IG51bGw7XG4gICAgICAgICAgICBpZiAocXVldWVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZTogc3RhcnRpbmcgcXVldWVkIHJlYnVpbGQoKSByZXF1ZXN0YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWJ1aWxkKHF1ZXVlZC5vcHRpb25zKS50aGVuKHF1ZXVlZC5yZXNvbHZlLCBxdWV1ZWQucmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgIExvYWQgKG9yIHJlbG9hZCkgdGhlIHNjZW5lIGNvbmZpZ1xuICAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICBsb2FkU2NlbmUoY29uZmlnX3NvdXJjZSA9IG51bGwsIGNvbmZpZ19wYXRoID0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlIHx8IHRoaXMuY29uZmlnX3NvdXJjZTtcbiAgICAgICAgdGhpcy5jb25maWdfZ2xvYmFsc19hcHBsaWVkID0gW107XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZ19zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ19wYXRoID0gVVJMcy5wYXRoRm9yVVJMKGNvbmZpZ19wYXRoIHx8IHRoaXMuY29uZmlnX3NvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ19wYXRoID0gVVJMcy5wYXRoRm9yVVJMKGNvbmZpZ19wYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBTY2VuZUxvYWRlci5sb2FkU2NlbmUodGhpcy5jb25maWdfc291cmNlLCB0aGlzLmNvbmZpZ19wYXRoKS50aGVuKCh7Y29uZmlnLCBidW5kbGV9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX2J1bmRsZSA9IGJ1bmRsZTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignbG9hZCcsIHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNvdXJjZSB0byBhIHNjZW5lLCBhcmd1bWVudHMgYG5hbWVgIGFuZCBgY29uZmlnYCBuZWVkIHRvIGJlIHByb3ZpZGVkOlxuICAgIC8vICAtIElmIHRoZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggYSBzb3VyY2VzIGl0IHdpbGwgY3JlYXRlIGl0XG4gICAgLy8gIC0gdGhlIGBjb25maWdgIG9iaiBmb2xsb3cgdGhlIFlBTUwgc2NlbmUgc3BlYywgZXg6IGBgYHt0eXBlOiAnVG9wb0pTT04nLCB1cmw6IFwiLy92ZWN0b3IubWFwemVuLmNvbS9vc20vYWxsL3t6fS97eH0ve3l9LnRvcG9qc29uXCJdfWBgYFxuICAgIC8vICAgIHRoYXQgbG9va3MgbGlrZTpcbiAgICAvL1xuICAgIC8vICAgICAgc2NlbmUuc2V0RGF0YVNvdXJjZShcIm9zbVwiLCB7dHlwZTogJ1RvcG9KU09OJywgdXJsOiBcIi8vdmVjdG9yLm1hcHplbi5jb20vb3NtL2FsbC97en0ve3h9L3t5fS50b3BvanNvblwiIH0pO1xuICAgIC8vXG4gICAgLy8gIC0gYWxzbyBjYW4gYmUgcGFzcyBhIGBgYGRhdGFgYGAgb2JqOiBgYGB7dHlwZTogJ0dlb0pTT04nLCBkYXRhOiBKU09iaiBdfWBgYFxuICAgIC8vXG4gICAgLy8gICAgICB2YXIgZ2VvanNvbl9kYXRhID0ge307XG4gICAgLy8gICAgICAuLi5cbiAgICAvLyAgICAgIHNjZW5lLnNldERhdGFTb3VyY2UoXCJkeW5hbWljX2RhdGFcIiwge3R5cGU6ICdHZW9KU09OJywgZGF0YTogZ2VvanNvbl9kYXRhIH0pO1xuICAgIC8vXG4gICAgc2V0RGF0YVNvdXJjZSAobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhY29uZmlnIHx8ICFjb25maWcudHlwZSB8fCAoIWNvbmZpZy51cmwgJiYgIWNvbmZpZy5kYXRhKSkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFwiTm8gbmFtZSBwcm92aWRlZCBvciBub3QgYSB2YWxpZCBjb25maWc6XCIsIG5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9hZCA9ICh0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdID09IG51bGwpO1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5jb25maWcuc291cmNlc1tuYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZyk7XG5cbiAgICAgICAgLy8gQ29udmVydCByYXcgZGF0YSBpbnRvIGJsb2IgVVJMXG4gICAgICAgIGlmIChzb3VyY2UuZGF0YSAmJiB0eXBlb2Ygc291cmNlLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzb3VyY2UudXJsID0gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHNvdXJjZS5kYXRhKV0pKTtcbiAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2UuZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgcGF0aHMgcmVsYXRpdmUgdG8gcm9vdCBzY2VuZSBidW5kbGVcbiAgICAgICAgU2NlbmVMb2FkZXIubm9ybWFsaXplRGF0YVNvdXJjZShzb3VyY2UsIHRoaXMuY29uZmlnX2J1bmRsZSk7XG5cbiAgICAgICAgaWYgKGxvYWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNvbmZpZyh7IHJlYnVpbGQ6IHsgc291cmNlczogW25hbWVdIH0gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWJ1aWxkKHsgc291cmNlczogW25hbWVdIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlRGF0YVNvdXJjZXMoKSB7XG4gICAgICAgIGxldCByZXNldCA9IFtdOyAvLyBzb3VyY2VzIHRvIHJlc2V0XG4gICAgICAgIGxldCBwcmV2X3NvdXJjZV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlcyk7XG4gICAgICAgIGxldCBzb3VyY2VfaWQgPSAwO1xuXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5jb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV07XG4gICAgICAgICAgICBsZXQgcHJldl9zb3VyY2UgPSB0aGlzLnNvdXJjZXNbbmFtZV07XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZSwgeyBuYW1lLCBpZDogc291cmNlX2lkKysgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW25hbWVdID0gRGF0YVNvdXJjZS5jcmVhdGUoY29uZmlnLCB0aGlzLnNvdXJjZXMpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3VyY2VzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW25hbWVdO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYENvdWxkIG5vdCBjcmVhdGUgZGF0YSBzb3VyY2U6ICR7ZS5tZXNzYWdlfWA7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFNjZW5lOiAke21lc3NhZ2V9YCwgc291cmNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IHR5cGU6ICdzb3VyY2VzJywgc291cmNlLCBtZXNzYWdlIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEYXRhIHNvdXJjZSBjaGFuZ2VkP1xuICAgICAgICAgICAgaWYgKERhdGFTb3VyY2UuY2hhbmdlZCh0aGlzLnNvdXJjZXNbbmFtZV0sIHByZXZfc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHJlc2V0LnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3VyY2VzIHRoYXQgd2VyZSByZW1vdmVkXG4gICAgICAgIHByZXZfc291cmNlX25hbWVzLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNvdXJjZXNbc10pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW3NdOyAvLyBUT0RPOiByZW1vdmUgZnJvbSB3b3JrZXJzIHRvbz9cbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZW1vdmUgdGlsZXMgZnJvbSBzb3VyY2VzIHRoYXQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIGlmIChyZXNldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJlc2V0LmluZGV4T2YodGlsZS5zb3VyY2UubmFtZSkgPiAtMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgc291cmNlcyB0aGF0IHdpbGwgZ2VuZXJhdGUgZ2VvbWV0cnkgdGlsZXNcbiAgICAgICAgLy8gKGFsbCBleGNlcHQgdGhvc2UgdGhhdCBhcmUgb25seSByYXN0ZXIgc291cmNlcyBhdHRhY2hlZCB0byBvdGhlciBzb3VyY2VzKVxuICAgICAgICBmb3IgKGxldCBsbiBpbiB0aGlzLmNvbmZpZy5sYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IHRoaXMuY29uZmlnLmxheWVyc1tsbl07XG4gICAgICAgICAgICBpZiAobGF5ZXIuZGF0YSAmJiB0aGlzLnNvdXJjZXNbbGF5ZXIuZGF0YS5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2xheWVyLmRhdGEuc291cmNlXS5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhbGwgdGV4dHVyZXMgaW4gdGhlIHNjZW5lIGRlZmluaXRpb25cbiAgICBsb2FkVGV4dHVyZXMoKSB7XG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGhpcy5jb25maWcudGV4dHVyZXMpLlxuICAgICAgICAgICAgdGhlbigoKSA9PiBUZXh0dXJlLmNyZWF0ZURlZmF1bHQodGhpcy5nbCkpOyAvLyBjcmVhdGUgYSAnZGVmYXVsdCcgdGV4dHVyZSBmb3IgcGxhY2Vob2xkZXJzXG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIChjdXJyZW50bHkgbWFudWFsbHkpIGFmdGVyIHN0eWxlcyBhcmUgdXBkYXRlZCBpbiBzdHlsZXNoZWV0XG4gICAgdXBkYXRlU3R5bGVzKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgJiYgIXRoaXMuaW5pdGlhbGl6aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjZW5lLnVwZGF0ZVN0eWxlcygpIGNhbGxlZCBiZWZvcmUgc2NlbmUgd2FzIGluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAoUmUpYnVpbGQgc3R5bGVzIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuc3R5bGVzID0gdGhpcy5zdHlsZV9tYW5hZ2VyLmJ1aWxkKHRoaXMuY29uZmlnLnN0eWxlcyk7XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5pbml0U3R5bGVzKHRoaXMpO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsbHkgc2V0IEdMIGNvbnRleHQgKHVzZWQgd2hlbiBpbml0aWFsaXppbmcgb3IgcmUtaW5pdGlhbGl6aW5nIEdMIHJlc291cmNlcylcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW3N0eWxlXS5zZXRHTCh0aGlzLmdsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBleHBsaWNpdGx5IHNldCBzY2VuZSBhbmltYXRpb24gZmxhZyBpZiBkZWZpbmVkLCBvdGhlcndpc2UgdHVybiBvbiBhbmltYXRpb24gaWYgdGhlcmUgYXJlIGFueSBhbmltYXRlZCBzdHlsZXNcbiAgICAgICAgdGhpcy5hbmltYXRlZCA9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zY2VuZS5hbmltYXRlZCAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zY2VuZS5hbmltYXRlZCA6XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLnNvbWUocyA9PiB0aGlzLnN0eWxlc1tzXS5hbmltYXRlZCk7XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIGdldEFjdGl2ZUNhbWVyYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgc2V0QWN0aXZlQ2FtZXJhKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5zZXRBY3RpdmVDYW1lcmEobmFtZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGxpZ2h0aW5nXG4gICAgY3JlYXRlTGlnaHRzKCkge1xuICAgICAgICB0aGlzLmxpZ2h0cyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMuY29uZmlnLmxpZ2h0cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5saWdodHNbaV0gfHwgdHlwZW9mIHRoaXMuY29uZmlnLmxpZ2h0c1tpXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBsaWdodCA9IHRoaXMuY29uZmlnLmxpZ2h0c1tpXTtcbiAgICAgICAgICAgIGxpZ2h0Lm5hbWUgPSBpLnJlcGxhY2UoJy0nLCAnXycpOyAvLyBsaWdodCBuYW1lcyBhcmUgaW5qZWN0ZWQgaW4gc2hhZGVycywgY2FuJ3QgaGF2ZSBoeXBoZW5zXG4gICAgICAgICAgICBsaWdodC52aXNpYmxlID0gKGxpZ2h0LnZpc2libGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsaWdodC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saWdodHNbbGlnaHQubmFtZV0gPSBMaWdodC5jcmVhdGUodGhpcy52aWV3LCBsaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTGlnaHQuaW5qZWN0KHRoaXMubGlnaHRzKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYmFja2dyb3VuZCBjb2xvclxuICAgIHNldEJhY2tncm91bmQoKSB7XG4gICAgICAgIGxldCBiZyA9IHRoaXMuY29uZmlnLnNjZW5lLmJhY2tncm91bmQ7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHt9O1xuICAgICAgICBpZiAoYmcgJiYgYmcuY29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZC5jb2xvciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoYmcuY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5iYWNrZ3JvdW5kLmNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuY29sb3IgPSBbMCwgMCwgMCwgMF07IC8vIGRlZmF1bHQgYmFja2dyb3VuZCBUT0RPOiB2YXJ5IHcvc2NlbmUgYWxwaGFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGJhY2tncm91bmQgaXMgZnVsbHkgb3BhcXVlLCBzZXQgY2FudmFzIGJhY2tncm91bmQgdG8gbWF0Y2hcbiAgICAgICAgaWYgKHRoaXMuYmFja2dyb3VuZC5jb2xvclszXSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID1cbiAgICAgICAgICAgICAgICBgcmdiYSgke3RoaXMuYmFja2dyb3VuZC5jb2xvci5tYXAoYyA9PiBNYXRoLmZsb29yKGMgKiAyNTUpKS5qb2luKCcsICcpfSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wuY2xlYXJDb2xvciguLi50aGlzLmJhY2tncm91bmQuY29sb3IpO1xuICAgIH1cblxuICAgIC8vIFR1cm4gaW50cm9zcGVjdGlvbiBtb2RlIG9uL29mZlxuICAgIHNldEludHJvc3BlY3Rpb24gKHZhbCkge1xuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSB2YWwgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKCkudGhlbigoKSA9PiB0aGlzLnVwZGF0aW5nLS0pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzY2VuZSBjb25maWcsIGFuZCBvcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAvLyByZWJ1aWxkIGNhbiBiZSBib29sZWFuLCBvciBhbiBvYmplY3QgY29udGFpbmluZyByZWJ1aWxkIG9wdGlvbnMgdG8gcGFzc3Rocm91Z2hcbiAgICB1cGRhdGVDb25maWcoeyByZWJ1aWxkID0gdHJ1ZSwgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9ICsrU2NlbmUuZ2VuZXJhdGlvbjtcbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gU2NlbmVMb2FkZXIuYXBwbHlHbG9iYWxQcm9wZXJ0aWVzKHRoaXMuY29uZmlnLCB0aGlzLmNvbmZpZ19nbG9iYWxzX2FwcGxpZWQpO1xuICAgICAgICBTY2VuZUxvYWRlci5ob2lzdFRleHR1cmVzKHRoaXMuY29uZmlnKTsgLy8gbW92ZSBpbmxpbmUgdGV4dHVyZXMgaW50byBnbG9iYWwgdGV4dHVyZSBzZXRcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmluaXQoKTtcbiAgICAgICAgdGhpcy52aWV3LnJlc2V0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlTGlnaHRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRGF0YVNvdXJjZXMoKTtcbiAgICAgICAgdGhpcy5sb2FkVGV4dHVyZXMoKTtcbiAgICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKCk7XG4gICAgICAgIEZvbnRNYW5hZ2VyLmxvYWRGb250cyh0aGlzLmNvbmZpZy5mb250cyk7XG5cbiAgICAgICAgLy8gVE9ETzogZGV0ZWN0IGNoYW5nZXMgdG8gc3R5bGVzPyBhbHJlYWR5IChjdXJyZW50bHkpIG5lZWQgdG8gcmVjb21waWxlIGFueXdheSB3aGVuIGNhbWVyYSBvciBsaWdodHMgY2hhbmdlXG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKCk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSByZWJ1aWxkIGdlb21ldHJ5XG4gICAgICAgIGxldCBkb25lID0gcmVidWlsZCA/XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGQoT2JqZWN0LmFzc2lnbih7IHNlcmlhbGl6ZV9mdW5jcywgZmFkZV9pbiB9LCB0eXBlb2YgcmVidWlsZCA9PT0gJ29iamVjdCcgJiYgcmVidWlsZCkpIDpcbiAgICAgICAgICAgIHRoaXMuc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzIH0pOyAvLyByZWJ1aWxkKCkgYWxzbyBzeW5jcyBjb25maWdcblxuICAgICAgICAvLyBGaW5pc2ggYnkgdXBkYXRpbmcgYm91bmRzIGFuZCByZS1yZW5kZXJpbmdcbiAgICAgICAgdGhpcy51cGRhdGluZy0tO1xuICAgICAgICB0aGlzLnZpZXcudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuXG4gICAgICAgIHJldHVybiBkb25lO1xuICAgIH1cblxuICAgIC8vIFNlcmlhbGl6ZSBjb25maWcgYW5kIHNlbmQgdG8gd29ya2VyXG4gICAgc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzID0gdHJ1ZSB9ID0ge30pIHtcbiAgICAgICAgLy8gVGVsbCB3b3JrZXJzIHdlJ3JlIGFib3V0IHRvIHJlYnVpbGQgKHNvIHRoZXkgY2FuIHVwZGF0ZSBzdHlsZXMsIGV0Yy4pXG4gICAgICAgIHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQgPVxuICAgICAgICAgICAgc2VyaWFsaXplX2Z1bmNzID8gVXRpbHMuc2VyaWFsaXplV2l0aEZ1bmN0aW9ucyh0aGlzLmNvbmZpZykgOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi51cGRhdGVDb25maWcnLCB7XG4gICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQsXG4gICAgICAgICAgICBnZW5lcmF0aW9uOiB0aGlzLmdlbmVyYXRpb24sXG4gICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0aGlzLmludHJvc3BlY3Rpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIHRvIHJlbGF0ZWQgb2JqZWN0c1xuICAgIGNyZWF0ZUxpc3RlbmVycyAoKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0ge307XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMudmlldyA9IHtcbiAgICAgICAgICAgIG1vdmU6ICgpID0+IHRoaXMudHJpZ2dlcignbW92ZScpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmlldy5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudmlldyk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMudGV4dHVyZSA9IHtcbiAgICAgICAgICAgIHVwZGF0ZTogKCkgPT4gdGhpcy5kaXJ0eSA9IHRydWUsXG4gICAgICAgICAgICB3YXJuaW5nOiAoZGF0YSkgPT4gdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgT2JqZWN0LmFzc2lnbih7IHR5cGU6ICd0ZXh0dXJlcycgfSwgZGF0YSkpXG4gICAgICAgIH07XG4gICAgICAgIFRleHR1cmUuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnRleHR1cmUpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlciA9IHtcbiAgICAgICAgICAgIGVycm9yOiAoZGF0YSkgPT4gdGhpcy50cmlnZ2VyKCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiAnc2NlbmUnIH0sIGRhdGEpKVxuICAgICAgICB9O1xuICAgICAgICBTY2VuZUxvYWRlci5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMuc2NlbmVfbG9hZGVyKTtcbiAgICB9XG5cbiAgICBkZXN0cm95TGlzdGVuZXJzICgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUFsbCgpO1xuICAgICAgICB0aGlzLnZpZXcudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudmlldyk7XG4gICAgICAgIFRleHR1cmUudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudGV4dHVyZSk7XG4gICAgICAgIFNjZW5lTG9hZGVyLnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlcik7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXNldEZlYXR1cmVTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IEZlYXR1cmVTZWxlY3Rpb24odGhpcy5nbCwgdGhpcy53b3JrZXJzLCAoKSA9PiB0aGlzLmJ1aWxkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnJlc2V0RmVhdHVyZVNlbGVjdGlvbicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgY3VycmVudCBmZWF0dXJlIHNlbGVjdGlvbiBtYXAgc2l6ZSBhY3Jvc3MgYWxsIHdvcmtlcnMuIFJldHVybnMgYSBwcm9taXNlLlxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIHJldHVybiB1bmRlZmluZWQgaWYgYWxyZWFkeSBwZW5kaW5nXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUnKVxuICAgICAgICAgICAgLnRoZW4oc2l6ZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaXplcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGludGVybmFsIGNsb2NrLCBtb3N0bHkgdXNlZnVsIGZvciBjb25zaXN0ZW50IGV4cGVyaWVuY2Ugd2hlbiBjaGFuZ2luZyBzdHlsZXMvZGVidWdnaW5nXG4gICAgcmVzZXRUaW1lKCkge1xuICAgICAgICB0aGlzLnN0YXJ0X3RpbWUgPSArbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICB1cGRhdGVWaWV3Q29tcGxldGUgKCkge1xuICAgICAgICBpZiAoKHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgfHwgdGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbikgJiZcbiAgICAgICAgICAgICF0aGlzLnRpbGVfbWFuYWdlci5pc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3ZpZXdfY29tcGxldGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Vmlld0NvbXBsZXRlICgpIHtcbiAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90XG4gICAgLy8gQXN5bmNocm9ub3VzIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IGZvciBuZXh0IHJlbmRlciB0byBjYXB0dXJlIGJ1ZmZlclxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnNjcmVlbnNob3QoKTtcbiAgICB9XG5cbiAgICBzdGFydFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnN0YXJ0VmlkZW9DYXB0dXJlKCk7XG4gICAgfVxuXG4gICAgc3RvcFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc3RvcFZpZGVvQ2FwdHVyZSgpO1xuICAgIH1cblxuXG4gICAgLy8gU3RhdHMvZGVidWcvcHJvZmlsaW5nIG1ldGhvZHNcblxuICAgIC8vIFByb2ZpbGUgaGVscGVycywgaXNzdWVzIGEgcHJvZmlsZSBvbiBtYWluIHRocmVhZCAmIGFsbCB3b3JrZXJzXG4gICAgX3Byb2ZpbGUobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGUoYG1haW4gdGhyZWFkOiAke25hbWV9YCk7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnByb2ZpbGUnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBfcHJvZmlsZUVuZChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgbWFpbiB0aHJlYWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucHJvZmlsZUVuZCcsIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIERlYnVnIGNvbmZpZyBhbmQgZnVuY3Rpb25zXG4gICAgc2V0dXBEZWJ1ZyAoKSB7XG4gICAgICAgIGxldCBzY2VuZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuZGVidWcgPSB7XG4gICAgICAgICAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5IGEgZ2l2ZW4gIyBvZiB0aW1lcyBhbmQgcHJpbnQgYXZlcmFnZSwgbWluLCBtYXggdGltaW5nc1xuICAgICAgICAgICAgdGltZVJlYnVpbGQgKG51bSA9IDEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjeWNsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNjZW5lLnJlYnVpbGQob3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lcy5wdXNoKCtuZXcgRGF0ZSgpIC0gc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZXMubGVuZ3RoIDwgbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdmcgPSB+fih0aW1lcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKSAvIHRpbWVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFByb2ZpbGVkIHJlYnVpbGQgJHtudW19IHRpbWVzOiAke2F2Z30gYXZnICgke01hdGgubWluKC4uLnRpbWVzKX0gbWluLCAke01hdGgubWF4KC4uLnRpbWVzKX0gbWF4KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZ2VvbWV0cnkgY291bnRzIG9mIHZpc2libGUgdGlsZXMsIGdyb3VwZWQgYnkgc3R5bGUgbmFtZVxuICAgICAgICAgICAgZ2VvbWV0cnlDb3VudEJ5U3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBzY2VuZS50aWxlX21hbmFnZXIuZ2V0UmVuZGVyYWJsZVRpbGVzKCkuZm9yRWFjaCh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGlsZS5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tzdHlsZV0gPSBjb3VudHNbc3R5bGVdIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbc3R5bGVdICs9IHRpbGUubWVzaGVzW3N0eWxlXS5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZW9tZXRyeUNvdW50QnlCYXNlU3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9jb3VudHMgPSBzY2VuZS5kZWJ1Zy5nZW9tZXRyeUNvdW50QnlTdHlsZSgpO1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9jb3VudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2UgPSBzY2VuZS5zdHlsZXNbc3R5bGVdLmJhc2VTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb3VudHNbYmFzZV0gPSBjb3VudHNbYmFzZV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzW2Jhc2VdICs9IHN0eWxlX2NvdW50c1tzdHlsZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG59XG5cblNjZW5lLmlkID0gMDsgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIGEgc2NlbmUgaW5zdGFuY2VcblNjZW5lLmdlbmVyYXRpb24gPSAwOyAvLyBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHNjZW5lIGNvbmZpZyBpcyByZS1wYXJzZWRcbiIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcblxuaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5leHBvcnQgY2xhc3MgU2NlbmVCdW5kbGUge1xuXG4gICAgY29uc3RydWN0b3IodXJsLCBwYXRoLCBwYXJlbnQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuXG4gICAgICAgIC8vIElmIGEgYmFzZSBwYXRoIHdhcyBwcm92aWRlZCwgdXNlIGl0IGZvciByZXNvbHZpbmcgbG9jYWwgYnVuZGxlIHJlc291cmNlcyBvbmx5IGlmXG4gICAgICAgIC8vIHRoZSBiYXNlIHBhdGggaXMgYWJzb2x1dGUsIG9yIHRoaXMgYnVuZGxlJ3MgcGF0aCBpcyByZWxhdGl2ZVxuICAgICAgICBpZiAocGF0aCAmJiAoIVVSTHMuaXNSZWxhdGl2ZVVSTChwYXRoKSB8fCBVUkxzLmlzUmVsYXRpdmVVUkwodGhpcy51cmwpKSkge1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IFVSTHMucGF0aEZvclVSTCh0aGlzLnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhdGhfZm9yX3BhcmVudCA9IHBhdGggfHwgdGhpcy5wYXRoOyAvLyBmb3IgcmVzb2x2aW5nIHBhdGhzIHJlbGF0aXZlIHRvIGEgcGFyZW50IGJ1bmRsZVxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICAgICAgICAvLyBBbiBhbmNlc3RvciBidW5kbGUgbWF5IGJlIGEgY29udGFpbmVyIChlLmcuIHppcCBmaWxlKSB0aGF0IG5lZWRzIHRvIHJlc29sdmUgcmVsYXRpdmUgcGF0aHNcbiAgICAgICAgLy8gZm9yIGFueSBzY2VuZXMgaXQgY29udGFpbnMsIGUuZy4gYHJvb3QuemlwYCBoYXMgYSBgcm9vdC55YW1sYCB0aGF0IGluY2x1ZGVzIGEgYGZvbGRlci9jaGlsZC55YW1sYDpcbiAgICAgICAgLy8gcmVzb3VyY2VzIHdpdGhpbiBgY2hpbGQueWFtbGAgbXVzdCBiZSByZXNvbHZlZCB0aHJvdWdoIHRoZSBidW5kbGUgZm9yIGByb290LnppcGBcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMucGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGFyZW50LmlzQ29udGFpbmVyKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRSZXNvdXJjZSh0aGlzLnVybCk7XG4gICAgfVxuXG4gICAgLy8gSW5mbyBmb3IgcmV0cmlldmluZyBhIHNwZWNpZmljIHJlc291cmNlIGZyb20gdGhpcyBidW5kbGVcbiAgICAvLyB1cmw6IGZ1bGx5IHF1YWxpZmllZCBVUkwgdG8gcmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlIChlLmcuIHppcHMgd2lsbCB0cmFuc2Zvcm0gdGhpcyB0byBibG9iIFVSTClcbiAgICAvLyBwYXRoOiBvcmlnaW5hbCBwYXRoIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGJ1bmRsZSAoZm9yIHJlc29sdmluZyBwYXRocyB1cCB0aGUgYnVuZGxlIHRyZWUpXG4gICAgLy8gdHlwZTogZmlsZSBleHRlbnNpb24gKHVzZWQgZm9yIGRldGVybWluaW5nIGJ1bmRsZSB0eXBlLCBgeWFtbGAgb3IgYHppcGApXG4gICAgcmVzb3VyY2VGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsRm9yKHVybCksXG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGhGb3IodXJsKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZUZvcih1cmwpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdXJsRm9yKHVybCkge1xuICAgICAgICBpZiAoaXNHbG9iYWwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSAmJiB0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnVybEZvcih0aGlzLnBhdGhfZm9yX3BhcmVudCArIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFVSTHMuYWRkQmFzZVVSTCh1cmwsIHRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcGF0aEZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIFVSTHMucGF0aEZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIHR5cGVGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiBVUkxzLmV4dGVuc2lvbkZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBaaXBTY2VuZUJ1bmRsZSBleHRlbmRzIFNjZW5lQnVuZGxlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVybCwgcGF0aCwgcGFyZW50KSB7XG4gICAgICAgIHN1cGVyKHVybCwgcGF0aCwgcGFyZW50KTtcbiAgICAgICAgdGhpcy56aXAgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVzID0ge307XG4gICAgICAgIHRoaXMucm9vdCA9IG51bGw7XG4gICAgICAgIHRoaXMucGF0aCA9ICcnO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLnppcCA9IG5ldyBKU1ppcCgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuaW8odGhpcy51cmwsIDYwMDAwLCAnYXJyYXlidWZmZXInKVxuICAgICAgICAgICAgICAgIC50aGVuKGJvZHkgPT4gdGhpcy56aXAubG9hZEFzeW5jKGJvZHkpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucGFyc2VaaXBGaWxlcygpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubG9hZFJvb3QoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiBQcm9taXNlLnJlamVjdChlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXJsRm9yKHVybCkge1xuICAgICAgICBpZiAoaXNHbG9iYWwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXJsRm9yWmlwRmlsZShVUkxzLmZsYXR0ZW5SZWxhdGl2ZVVSTCh1cmwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIudXJsRm9yKHVybCk7XG4gICAgfVxuXG4gICAgdHlwZUZvcih1cmwpIHtcbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlRm9yWmlwRmlsZSh1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci50eXBlRm9yKHVybCk7XG4gICAgfVxuXG4gICAgbG9hZFJvb3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRSb290KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IGxvYWRSZXNvdXJjZSh0aGlzLnVybEZvclppcEZpbGUodGhpcy5yb290KSkpO1xuICAgIH1cblxuICAgIGZpbmRSb290KCkge1xuICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGEgc2luZ2xlIFlBTUwgZmlsZSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSB6aXBcbiAgICAgICAgY29uc3QgeWFtbHMgPSBPYmplY3Qua2V5cyh0aGlzLmZpbGVzKVxuICAgICAgICAgICAgLmZpbHRlcihwYXRoID0+IHRoaXMuZmlsZXNbcGF0aF0uZGVwdGggPT09IDApXG4gICAgICAgICAgICAuZmlsdGVyKHBhdGggPT4gVVJMcy5leHRlbnNpb25Gb3JVUkwocGF0aCkgPT09ICd5YW1sJyk7XG5cbiAgICAgICAgaWYgKHlhbWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0geWFtbHNbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyByb290IGZvdW5kXG4gICAgICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICAgICAgICBsZXQgbXNnID0gYENvdWxkIG5vdCBmaW5kIHJvb3Qgc2NlbmUgZm9yIGJ1bmRsZSAnJHt0aGlzLnVybH0nOiBgO1xuICAgICAgICAgICAgbXNnICs9IGBUaGUgemlwIGFyY2hpdmUncyByb290IGxldmVsIG11c3QgY29udGFpbiBhIHNpbmdsZSBzY2VuZSBmaWxlIHdpdGggdGhlICcueWFtbCcgZXh0ZW5zaW9uLiBgO1xuICAgICAgICAgICAgaWYgKHlhbWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYEZvdW5kIG11bHRpcGxlIFlBTUwgZmlsZXMgYXQgdGhlIHJvb3QgbGV2ZWw6ICR7eWFtbHMubWFwKHIgPT4gJ1xcJycgKyByICsgJ1xcJycgKS5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBGb3VuZCBOTyBZQU1MIGZpbGVzIGF0IHRoZSByb290IGxldmVsLmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoRXJyb3IobXNnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHBhcnNlWmlwRmlsZXMoKSB7XG4gICAgICAgIGxldCBwYXRocyA9IFtdO1xuICAgICAgICBsZXQgcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy56aXAuZm9yRWFjaCgocGF0aCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaWxlLmRpcikge1xuICAgICAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChmaWxlLmFzeW5jKCdhcnJheWJ1ZmZlcicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXVlKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gcGF0aHNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGRlcHRoID0gcGF0aC5zcGxpdCgnLycpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1twYXRoXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVVJMcy5leHRlbnNpb25Gb3JVUkwocGF0aCksXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXJsRm9yWmlwRmlsZShmaWxlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbGVzW2ZpbGVdKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXNbZmlsZV0udXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1tmaWxlXS51cmwgPSBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdGhpcy5maWxlc1tmaWxlXS5kYXRhXSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc1tmaWxlXS51cmw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0eXBlRm9yWmlwRmlsZShmaWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVzW2ZpbGVdICYmIHRoaXMuZmlsZXNbZmlsZV0udHlwZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50LCB0eXBlID0gbnVsbCkge1xuICAgIGlmICh0eXBlID09PSAnemlwJyB8fCAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgVVJMcy5leHRlbnNpb25Gb3JVUkwodXJsKSA9PT0gJ3ppcCcpKSB7XG4gICAgICAgIHJldHVybiBuZXcgWmlwU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50KTtcbn1cblxuLy8gUmVmZXJlbmNlcyBhIGdsb2JhbCBwcm9wZXJ0eT9cbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JhbCAodmFsKSB7XG4gICAgaWYgKHZhbCAmJiB2YWwuc2xpY2UoMCwgNykgPT09ICdnbG9iYWwuJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlc291cmNlIChib2R5KSB7XG4gICAgdmFyIGRhdGE7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8ganN5YW1sICdqc29uJyBvcHRpb24gYWxsb3dzIGR1cGxpY2F0ZSBrZXlzXG4gICAgICAgIC8vIEtlZXBpbmcgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBzaG91bGQgY29uc2lkZXIgbWlncmF0aW5nIHRvIHJlcXVpcmluZ1xuICAgICAgICAvLyB1bmlxdWUga2V5cywgYXMgdGhpcyBpcyBZQU1MIHNwZWMuIEJ1dCBUYW5ncmFtIEVTIGN1cnJlbnRseSBhY2NlcHRzIGR1cGUga2V5cyBhcyB3ZWxsLFxuICAgICAgICAvLyBzbyBzaG91bGQgY29uc2lkZXIgaG93IGJlc3QgdG8gdW5pZnkuXG4gICAgICAgIGRhdGEgPSB5YW1sLnNhZmVMb2FkKGJvZHksIHsganNvbjogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBsb2FkUmVzb3VyY2UgKHNvdXJjZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgVXRpbHMuaW8oc291cmNlKS50aGVuKChib2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBwYXJzZVJlc291cmNlKGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCB7Y3JlYXRlU2NlbmVCdW5kbGUsIGlzR2xvYmFsfSBmcm9tICcuL3NjZW5lX2J1bmRsZSc7XG5cbnZhciBTY2VuZUxvYWRlcjtcblxuZXhwb3J0IGRlZmF1bHQgU2NlbmVMb2FkZXIgPSB7XG5cbiAgICAvLyBMb2FkIHNjZW5lcyBkZWZpbml0aW9ucyBmcm9tIFVSTCAmIHByb3Byb2Nlc3NcbiAgICBsb2FkU2NlbmUodXJsLCBwYXRoID0gbnVsbCkge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRTY2VuZVJlY3Vyc2l2ZSh7IHVybCwgcGF0aCB9LCBudWxsLCBlcnJvcnMpLlxuICAgICAgICAgICAgdGhlbihyZXN1bHQgPT4gdGhpcy5maW5hbGl6ZShyZXN1bHQpKS5cbiAgICAgICAgICAgIHRoZW4oKHsgY29uZmlnLCBidW5kbGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJvb3Qgc2NlbmUgZmFpbGVkIHRvIGxvYWQsIHJlamVjdCB3aXRoIGZpcnN0IGVycm9yXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcnNbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzY2VuZSBsb2FkZWQsIGJ1dCBzb21lIGltcG9ydHMgaGFkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMuZm9yRWFjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBGYWlsZWQgdG8gaW1wb3J0IHNjZW5lOiAke2Vycm9yLnVybH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGU6ICdzY2VuZV9pbXBvcnQnLCBtZXNzYWdlLCBlcnJvciwgdXJsOiBlcnJvci51cmwgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBjb25maWcsIGJ1bmRsZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIExvYWRzIHNjZW5lIGZpbGVzIGZyb20gVVJMLCByZWN1cnNpdmVseSBsb2FkaW5nICdpbXBvcnQnIHNjZW5lc1xuICAgIC8vIE9wdGlvbmFsICppbml0aWFsKiBwYXRoIG9ubHkgKHdvbid0IGJlIHBhc3NlZCB0byByZWN1cnNpdmUgJ2ltcG9ydCcgY2FsbHMpXG4gICAgLy8gVXNlZnVsIGZvciBsb2FkaW5nIHJlc291cmNlcyBpbiBiYXNlIHNjZW5lIGZpbGUgZnJvbSBhIHNlcGFyYXRlIGxvY2F0aW9uXG4gICAgLy8gKGUuZy4gaW4gVGFuZ3JhbSBQbGF5LCB3aGVuIG1vZGlmaWVkIGxvY2FsIHNjZW5lIHNob3VsZCBzdGlsbCByZWZlciB0byBvcmlnaW5hbCByZXNvdXJjZSBVUkxzKVxuICAgIGxvYWRTY2VuZVJlY3Vyc2l2ZSh7IHVybCwgcGF0aCwgdHlwZSB9LCBwYXJlbnQsIGVycm9ycyA9IFtdKSB7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidW5kbGUgPSBjcmVhdGVTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCwgdHlwZSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1bmRsZS5sb2FkKCkudGhlbihjb25maWcgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbXBvcnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFjY2VwdCBzaW5nbGUgZW50cnkgb3IgYXJyYXlcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcuaW1wb3J0KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5pbXBvcnQgPSBbY29uZmlnLmltcG9ydF07IC8vIGNvbnZlcnQgdG8gYXJyYXlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBVUkxzIG9mIHNjZW5lcyB0byBpbXBvcnRcbiAgICAgICAgICAgIGxldCBpbXBvcnRzID0gW107XG4gICAgICAgICAgICBjb25maWcuaW1wb3J0LmZvckVhY2godXJsID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHNjZW5lIG9iamVjdHMgdG8gVVJMc1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkodXJsKV0pKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpbXBvcnRzLnB1c2goYnVuZGxlLnJlc291cmNlRm9yKHVybCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLmltcG9ydDsgLy8gZG9uJ3Qgd2FudCB0byBtZXJnZSB0aGlzIHByb3BlcnR5XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLlxuICAgICAgICAgICAgICAgIGFsbChpbXBvcnRzLm1hcChyZXNvdXJjZSA9PiB0aGlzLmxvYWRTY2VuZVJlY3Vyc2l2ZShyZXNvdXJjZSwgYnVuZGxlLCBlcnJvcnMpKSkuXG4gICAgICAgICAgICAgICAgICAgIHRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZmlncyA9IHJlc3VsdHMubWFwKHIgPT4gci5jb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCAuLi5jb25maWdzLCBjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIC8vIENvbGxlY3Qgc2NlbmUgbG9hZCBlcnJvcnMgYXMgd2UgZ29cbiAgICAgICAgICAgIGVycm9yLnVybCA9IHVybDtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIE5vcm1hbGl6ZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGFkanVzdCB3aXRoaW4gZWFjaCBsb2NhbCBzY2VuZSBmaWxlICh1c3VhbGx5IGJ5IHBhdGgpXG4gICAgbm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRGF0YVNvdXJjZXMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUZvbnRzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVUZXh0dXJlcyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHJldHVybiB7IGNvbmZpZywgYnVuZGxlIH07XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBmb3IgZGF0YSBzb3VyY2VcbiAgICBub3JtYWxpemVEYXRhU291cmNlcyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcuc291cmNlcyA9IGNvbmZpZy5zb3VyY2VzIHx8IHt9O1xuXG4gICAgICAgIGZvciAobGV0IHNuIGluIGNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURhdGFTb3VyY2UoY29uZmlnLnNvdXJjZXNbc25dLCBidW5kbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgbm9ybWFsaXplRGF0YVNvdXJjZShzb3VyY2UsIGJ1bmRsZSkge1xuICAgICAgICBzb3VyY2UudXJsID0gYnVuZGxlLnVybEZvcihzb3VyY2UudXJsKTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2Uuc2NyaXB0cykpIHtcbiAgICAgICAgICAgIHNvdXJjZS5zY3JpcHRzID0gc291cmNlLnNjcmlwdHMubWFwKHVybCA9PiBidW5kbGUudXJsRm9yKHVybCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGZvciBmb250c1xuICAgIG5vcm1hbGl6ZUZvbnRzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy5mb250cyA9IGNvbmZpZy5mb250cyB8fCB7fTtcblxuICAgICAgICBmb3IgKGxldCBmYW1pbHkgaW4gY29uZmlnLmZvbnRzKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcuZm9udHNbZmFtaWx5XSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuZm9udHNbZmFtaWx5XS5mb3JFYWNoKGZhY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmYWNlLnVybCA9IGZhY2UudXJsICYmIGJ1bmRsZS51cmxGb3IoZmFjZS51cmwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZhY2UgPSBjb25maWcuZm9udHNbZmFtaWx5XTtcbiAgICAgICAgICAgICAgICBmYWNlLnVybCA9IGZhY2UudXJsICYmIGJ1bmRsZS51cmxGb3IoZmFjZS51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGFuZCBjZW50cmFsaXplIHRleHR1cmUgZGVmaW5pdGlvbnMgZm9yIGEgc2NlbmUgb2JqZWN0XG4gICAgbm9ybWFsaXplVGV4dHVyZXMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLnRleHR1cmVzID0gY29uZmlnLnRleHR1cmVzIHx8IHt9O1xuXG4gICAgICAgIC8vIEFkZCBjdXJyZW50IHNjZW5lJ3MgYmFzZSBwYXRoIHRvIGdsb2JhbGx5IGRlZmluZWQgdGV4dHVyZXNcbiAgICAgICAgLy8gT25seSBhZGRzIHBhdGggZm9yIHRleHR1cmVzIHdpdGggcmVsYXRpdmUgVVJMcywgc28gdGV4dHVyZXMgaW4gaW1wb3J0ZWQgc2NlbmVzIGdldCB0aGUgYmFzZVxuICAgICAgICAvLyBwYXRoIG9mIHRoZWlyIGltbWVkaWF0ZSBzY2VuZSBmaWxlXG4gICAgICAgIGlmIChjb25maWcudGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRuIGluIGNvbmZpZy50ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gY29uZmlnLnRleHR1cmVzW3RuXTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZS51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS51cmwgPSBidW5kbGUudXJsRm9yKHRleHR1cmUudXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIFVSTHMgZm9yIGlubGluZSB0ZXh0dXJlc1xuICAgICAgICBpZiAoY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgc24gaW4gY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IGNvbmZpZy5zdHlsZXNbc25dO1xuXG4gICAgICAgICAgICAgICAgLy8gU3R5bGUgYHRleHR1cmVgXG4gICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSAmJiAhaXNHbG9iYWwodGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0dXJlID0gYnVuZGxlLnVybEZvcih0ZXgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJywgJ25vcm1hbCddLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbCBwcm9wZXJ0eSBoYXMgYSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUubWF0ZXJpYWxbcHJvcF0gIT0gbnVsbCAmJiBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSAmJiAhaXNHbG9iYWwodGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmUgPSBidW5kbGUudXJsRm9yKHRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNoYWRlciB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgR0xTTC5wYXJzZVVuaWZvcm1zKHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpLmZvckVhY2goKHt0eXBlLCB2YWx1ZSwga2V5LCB1bmlmb3Jtc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgYnkgVVJMIChzdHJpbmctbmFtZWQgdGV4dHVyZSBub3QgcmVmZXJlbmNpbmcgZXhpc3RpbmcgdGV4dHVyZSBkZWZpbml0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzYW1wbGVyMkQnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t2YWx1ZV0gJiYgIWlzR2xvYmFsKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW2tleV0gPSBidW5kbGUudXJsRm9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gU3Vic3RpdHV0ZXMgZ2xvYmFsIHNjZW5lIHByb3BlcnRpZXMgKHRob3NlIGRlZmluZWQgaW4gdGhlIGBjb25maWcuZ2xvYmFsYCBvYmplY3QpIGZvciBhbnkgc3R5bGUgdmFsdWVzXG4gICAgLy8gb2YgdGhlIGZvcm0gYGdsb2JhbC5gLCBmb3IgZXhhbXBsZSBgY29sb3I6IGdsb2JhbC5wYXJrX2NvbG9yYCB3b3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSAoaWYgYW55KVxuICAgIC8vIGRlZmluZWQgZm9yIHRoZSBgcGFya19jb2xvcmAgcHJvcGVydHkgaW4gYGNvbmZpZy5nbG9iYWwucGFya19jb2xvcmAuXG4gICAgYXBwbHlHbG9iYWxQcm9wZXJ0aWVzKGNvbmZpZywgYXBwbGllZCkge1xuICAgICAgICBpZiAoIWNvbmZpZy5nbG9iYWwgfHwgT2JqZWN0LmtleXMoY29uZmlnLmdsb2JhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnOyAvLyBubyBnbG9iYWwgcHJvcGVydGllcyB0byB0cmFuc2Zvcm1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHByb3BlcnRpZXMgZnJvbSBnbG9iYWxzXG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9ICc6JztcbiAgICAgICAgY29uc3QgcHJvcHMgPSBmbGF0dGVuUHJvcGVydGllcyhjb25maWcuZ2xvYmFsLCBzZXBhcmF0b3IpO1xuXG4gICAgICAgIC8vIFJlLWFwcGx5IHByZXZpb3VzbHkgYXBwbGllZCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIE5COiBhIGN1cnJlbnQgc2hvcnRjb21pbmcgaGVyZSBpcyB0aGF0IHlvdSBjYW5ub3QgXCJ1bi1saW5rXCIgYSB0YXJnZXQgcHJvcGVydHkgZnJvbSBhIGdsb2JhbFxuICAgICAgICAvLyBhdCBydW4tdGltZS4gT25jZSBhIGdsb2JhbCBwcm9wZXJ0eSBzdWJzdGl0dXRpb24gaGFzIGJlZW4gcmVjb3JkZXJkLCBpdCB3aWxsIGFsd2F5cyBiZSByZS1hcHBsaWVkXG4gICAgICAgIC8vIG9uIHN1YnNlcXVlbnQgc2NlbmUgdXBkYXRlcywgZXZlbiBpZiB0aGUgdGFyZ2V0IHByb3BlcnR5IHdhcyB1cGRhdGVkIHRvIGFub3RoZXIgbGl0ZXJhbCB2YWx1ZS5cbiAgICAgICAgLy8gVGhpcyBpcyB1bmxpa2VseSB0byBiZSBhIGNvbW1vbiBvY2N1cnJlbmNlIGFuIGFjY2VwdGFibGUgbGltaXRhdGlvbiBmb3Igbm93LlxuICAgICAgICBhcHBsaWVkLmZvckVhY2goKHsgcHJvcCwgdGFyZ2V0LCBrZXkgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgICAgICAgLy8gbG9nKCdpbmZvJywgYFJlLWFwcGx5aW5nICR7cHJvcH0gd2l0aCB2YWx1ZSAke3Byb3BzW3Byb3BdfSB0byBrZXkgJHtrZXl9IGluYCwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmluZCBhbmQgYXBwbHkgbmV3IHByb3BlcnRpZXNcbiAgICAgICAgZnVuY3Rpb24gYXBwbHlQcm9wcyAob2JqLCB0YXJnZXQsIGtleSkge1xuICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmdcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSAob2JqLnNsaWNlKDAsIDcpID09PSAnZ2xvYmFsLicpICYmIChvYmouc2xpY2UoNykucmVwbGFjZSgvXFwuL2csIHNlcGFyYXRvcikpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wICYmIHByb3BzW3Byb3BdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZWNvcmQgb2Ygd2hlcmUgcHJvcGVydHkgaXMgYXBwbGllZFxuICAgICAgICAgICAgICAgICAgICBhcHBsaWVkLnB1c2goeyBwcm9wLCB0YXJnZXQsIGtleSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICBvYmogPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqW3BdID0gYXBwbHlQcm9wcyhvYmpbcF0sIG9iaiwgcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcHBseVByb3BzKGNvbmZpZyk7XG4gICAgfSxcblxuICAgIC8vIE1vdmUgaW5saW5lIChVUkwgc3RyaW5nKSB0ZXh0dXJlcyB0byB0aGUgc2NlbmUncyB0b3AtbGV2ZWwgc2V0IG9mIHRleHR1cmVzIChjb25maWcudGV4dHVyZXMpLlxuICAgIC8vIFRoZXJlIGFyZSAzIHN1Y2ggY2FzZXMgb2YgdGV4dHVyZXM6XG4gICAgLy8gLSBpbiBhIHN0eWxlJ3MgYHRleHR1cmVgIHByb3BlcnR5XG4gICAgLy8gLSBpbiBhIHN0eWxlJ3MgYG1hdGVyaWFsYCBwcm9wZXJ0aWVzXG4gICAgLy8gLSBpbiBhIHN0eWxlJ3MgY3VzdG9tIHVuaWZvcm1zIChgc2hhZGVycy51bmlmb3Jtc2ApXG4gICAgaG9pc3RUZXh0dXJlcyAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzbiBpbiBjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gY29uZmlnLnN0eWxlc1tzbl07XG5cbiAgICAgICAgICAgICAgICAvLyBTdHlsZSBgdGV4dHVyZWBcbiAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUudGV4dHVyZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0ZXg7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXNHbG9iYWwodXJsKSA/IGB0ZXh0dXJlLSR7dXJsfWAgOiB1cmw7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1tuYW1lXSA9IHsgdXJsIH07XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleHR1cmUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJywgJ25vcm1hbCddLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbCBwcm9wZXJ0eSBoYXMgYSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUubWF0ZXJpYWxbcHJvcF0gIT0gbnVsbCAmJiBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpc0dsb2JhbCh1cmwpID8gYHRleHR1cmUtJHt1cmx9YCA6IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbbmFtZV0gPSB7IHVybCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmUgPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaGFkZXIgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc2hhZGVycyAmJiBzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIEdMU0wucGFyc2VVbmlmb3JtcyhzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKS5mb3JFYWNoKCh7dHlwZSwgdmFsdWUsIGtleSwgdW5pZm9ybXN9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0dXJlIGJ5IFVSTCAoc3RyaW5nLW5hbWVkIHRleHR1cmUgbm90IHJlZmVyZW5jaW5nIGV4aXN0aW5nIHRleHR1cmUgZGVmaW5pdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2FtcGxlcjJEJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXNHbG9iYWwodXJsKSA/IGB0ZXh0dXJlLSR7dXJsfWAgOiB1cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRleHR1cmVzW25hbWVdID0geyB1cmwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1trZXldID0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIE5vcm1hbGl6ZSBzb21lIHNjZW5lLXdpZGUgc2V0dGluZ3MgdGhhdCBhcHBseSB0byB0aGUgZmluYWwsIG1lcmdlZCBzY2VuZVxuICAgIGZpbmFsaXplKHsgY29uZmlnLCBidW5kbGUgfSkge1xuICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbmZpZy5zY2VuZSA9IGNvbmZpZy5zY2VuZSB8fCB7fTtcbiAgICAgICAgY29uZmlnLmNhbWVyYXMgPSBjb25maWcuY2FtZXJhcyB8fCB7fTtcbiAgICAgICAgY29uZmlnLmxpZ2h0cyA9IGNvbmZpZy5saWdodHMgfHwge307XG4gICAgICAgIGNvbmZpZy5zdHlsZXMgPSBjb25maWcuc3R5bGVzIHx8IHt9O1xuICAgICAgICBjb25maWcubGF5ZXJzID0gY29uZmlnLmxheWVycyB8fCB7fTtcblxuICAgICAgICAvLyBJZiBvbmx5IG9uZSBjYW1lcmEgc3BlY2lmaWVkLCBzZXQgaXQgYXMgZGVmYXVsdFxuICAgICAgICBpZiAoY29uZmlnLmNhbWVyYSkge1xuICAgICAgICAgICAgY29uZmlnLmNhbWVyYXMuZGVmYXVsdCA9IGNvbmZpZy5jYW1lcmE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBjYW1lcmFzIHNwZWNpZmllZCwgY3JlYXRlIG9uZVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLmNhbWVyYXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uZmlnLmNhbWVyYXMuZGVmYXVsdCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gbGlnaHRzIHNwZWNpZmllZCwgY3JlYXRlIGRlZmF1bHRcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5saWdodHMpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnLmxpZ2h0cykuZXZlcnkoaSA9PiBjb25maWcubGlnaHRzW2ldLnZpc2libGUgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgY29uZmlnLmxpZ2h0cy5kZWZhdWx0X2xpZ2h0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdkaXJlY3Rpb25hbCdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBjb25maWcsIGJ1bmRsZSB9O1xuICAgIH1cblxufTtcblxuLy8gRmxhdHRlbiBuZXN0ZWQgcHJvcGVydGllcyBmb3Igc2ltcGxlciBzdHJpbmcgbG9vay11cHNcbi8vIGUuZy4gZ2xvYmFsLmJhY2tncm91bmQuY29sb3IgLT4gJ2dsb2JhbDpiYWNrZ3JvdW5kOmNvbG9yJ1xuZnVuY3Rpb24gZmxhdHRlblByb3BlcnRpZXMgKG9iaiwgc2VwYXJhdG9yID0gJzonLCBwcmVmaXggPSBudWxsLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJlZml4ID0gcHJlZml4ID8gKHByZWZpeCArIHNlcGFyYXRvcikgOiAnJztcblxuICAgIGZvciAobGV0IHAgaW4gb2JqKSB7XG4gICAgICAgIGxldCBrZXkgPSBwcmVmaXggKyBwO1xuICAgICAgICBsZXQgdmFsID0gb2JqW3BdO1xuICAgICAgICBwcm9wc1trZXldID0gdmFsO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICBmbGF0dGVuUHJvcGVydGllcyh2YWwsIHNlcGFyYXRvciwga2V5LCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BzO1xufVxuXG5zdWJzY3JpYmVNaXhpbihTY2VuZUxvYWRlcik7XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vc291cmNlcy9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IHtTdHlsZU1hbmFnZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX21hbmFnZXInO1xuaW1wb3J0IHtwYXJzZUxheWVyc30gZnJvbSAnLi9zdHlsZXMvbGF5ZXInO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcblxuZXhwb3J0IHZhciBTY2VuZVdvcmtlciA9IHNlbGY7XG5cbi8vIFdvcmtlciBmdW5jdGlvbmFsaXR5IHdpbGwgb25seSBiZSBkZWZpbmVkIGluIHdvcmtlciB0aHJlYWRcbmlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG5cbk9iamVjdC5hc3NpZ24oc2VsZiwge1xuXG4gICAgRmVhdHVyZVNlbGVjdGlvbixcblxuICAgIHNvdXJjZXM6IHt9LFxuICAgIHN0eWxlczoge30sXG4gICAgbGF5ZXJzOiB7fSxcbiAgICB0aWxlczoge30sXG4gICAgb2JqZWN0czoge30sXG4gICAgY29uZmlnOiB7fSwgICAgIC8vIHJhdyBjb25maWcgKGUuZy4gZnVuY3Rpb25zLCBldGMuIG5vdCBleHBhbmRlZClcblxuICAgIC8vIEluaXRpYWxpemUgd29ya2VyXG4gICAgaW5pdCAoc2NlbmVfaWQsIHdvcmtlcl9pZCwgbnVtX3dvcmtlcnMsIGxvZ19sZXZlbCwgZGV2aWNlX3BpeGVsX3JhdGlvKSB7XG4gICAgICAgIHNlbGYuc2NlbmVfaWQgPSBzY2VuZV9pZDtcbiAgICAgICAgc2VsZi5fd29ya2VyX2lkID0gd29ya2VyX2lkO1xuICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gbnVtX3dvcmtlcnM7XG4gICAgICAgIGxvZy5zZXRMZXZlbChsb2dfbGV2ZWwpO1xuICAgICAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gPSBkZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIEZlYXR1cmVTZWxlY3Rpb24uc2V0UHJlZml4KHNlbGYuX3dvcmtlcl9pZCk7XG4gICAgICAgIHNlbGYuc3R5bGVfbWFuYWdlciA9IG5ldyBTdHlsZU1hbmFnZXIoKTtcbiAgICAgICAgcmV0dXJuIHdvcmtlcl9pZDtcbiAgICB9LFxuXG4gICAgLy8gU3RhcnRzIGEgY29uZmlnIHJlZnJlc2hcbiAgICB1cGRhdGVDb25maWcgKHsgY29uZmlnLCBnZW5lcmF0aW9uLCBpbnRyb3NwZWN0aW9uIH0pIHtcbiAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWcpO1xuXG4gICAgICAgIHNlbGYubGFzdF9jb25maWcgPSBtZXJnZU9iamVjdHMoe30sIHNlbGYuY29uZmlnKTtcbiAgICAgICAgc2VsZi5jb25maWcgPSBtZXJnZU9iamVjdHMoe30sIGNvbmZpZyk7XG4gICAgICAgIHNlbGYuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICAgIHNlbGYuaW50cm9zcGVjdGlvbiA9IGludHJvc3BlY3Rpb247XG5cbiAgICAgICAgLy8gRGF0YSBibG9jayBmdW5jdGlvbnMgYXJlIG5vdCBjb250ZXh0IHdyYXBwZWQgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3R5bGUgZnVuY3Rpb25zIGFyZVxuICAgICAgICAvLyBUT0RPOiBwcm9iYWJseSB3YW50IGEgY2xlYW5lciB3YXkgdG8gZXhjbHVkZSB0aGVzZVxuICAgICAgICBmb3IgKGxldCBsYXllciBpbiBjb25maWcubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmxheWVyc1tsYXllcl0pIHtcbiAgICAgICAgICAgICAgICBjb25maWcubGF5ZXJzW2xheWVyXS5kYXRhID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5sYXllcnNbbGF5ZXJdLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhwYW5kIGdsb2JhbCBwcm9wZXJ0aWVzXG4gICAgICAgIHNlbGYuZ2xvYmFsID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5nbG9iYWwpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBkYXRhIHNvdXJjZXNcbiAgICAgICAgc2VsZi5jcmVhdGVEYXRhU291cmNlcyhjb25maWcpO1xuXG4gICAgICAgIC8vIEV4cGFuZCBzdHlsZXNcbiAgICAgICAgY29uZmlnLnN0eWxlcyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuc3R5bGVzLCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuICAgICAgICBzZWxmLnN0eWxlcyA9IHNlbGYuc3R5bGVfbWFuYWdlci5idWlsZChjb25maWcuc3R5bGVzKTtcbiAgICAgICAgc2VsZi5zdHlsZV9tYW5hZ2VyLmluaXRTdHlsZXMoe1xuICAgICAgICAgICAgZ2VuZXJhdGlvbjogc2VsZi5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgc3R5bGVzOiBzZWxmLnN0eWxlcyxcbiAgICAgICAgICAgIHNvdXJjZXM6IHNlbGYuc291cmNlcyxcbiAgICAgICAgICAgIGludHJvc3BlY3Rpb246IHNlbGYuaW50cm9zcGVjdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQYXJzZSBlYWNoIHRvcC1sZXZlbCBsYXllciBhcyBhIHNlcGFyYXRlIHRyZWVcbiAgICAgICAgc2VsZi5sYXllcnMgPSBwYXJzZUxheWVycyhjb25maWcubGF5ZXJzLCBzZWxmLnN0eWxlX21hbmFnZXIuc3R5bGVzKTtcblxuICAgICAgICAvLyBTeW5jIHRldHh1cmUgaW5mbyBmcm9tIG1haW4gdGhyZWFkXG4gICAgICAgIHNlbGYuc3luY2luZ190ZXh0dXJlcyA9IHNlbGYuc3luY1RleHR1cmVzKGNvbmZpZy50ZXh0dXJlcyk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHByb21pc2UgZm9yIHdoZW4gY29uZmlnIHJlZnJlc2ggZmluaXNoZXNcbiAgICAgICAgc2VsZi5jb25maWd1cmluZyA9IHNlbGYuc3luY2luZ190ZXh0dXJlcy50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgdXBkYXRlZCBjb25maWdgKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIENyZWF0ZSBkYXRhIHNvdXJjZXMgYW5kIGNsZWFyIHRpbGUgY2FjaGUgaWYgbmVjZXNzYXJ5XG4gICAgY3JlYXRlRGF0YVNvdXJjZXMgKGNvbmZpZykge1xuICAgICAgICBjb25maWcuc291cmNlcyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuc291cmNlcyk7IC8vIHBhcnNlIG5ldyBzb3VyY2VzXG4gICAgICAgIHNlbGYuc291cmNlcyA9IHt9OyAvLyBjbGVhciBwcmV2aW91cyBzb3VyY2VzXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNvdXJjZSA9IERhdGFTb3VyY2UuY3JlYXRlKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZy5zb3VyY2VzW25hbWVdLCB7bmFtZX0pLCBzZWxmLnNvdXJjZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5zb3VyY2VzW25hbWVdID0gc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGlsZSBjYWNoZSBpZiBkYXRhIHNvdXJjZSBjb25maWcgY2hhbmdlZFxuICAgICAgICBpZiAoIXNlbGYuY29uZmlnLnNvdXJjZXMgfHxcbiAgICAgICAgICAgICFzZWxmLmxhc3RfY29uZmlnLnNvdXJjZXMgfHxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHNlbGYuY29uZmlnLnNvdXJjZXMpLnNvbWUocyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNlbGYuY29uZmlnLnNvdXJjZXNbc10pICE9PSBKU09OLnN0cmluZ2lmeShzZWxmLmxhc3RfY29uZmlnLnNvdXJjZXNbc10pO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHNlbGYudGlsZXMgPSB7fTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdoZW4gY29uZmlnIHJlZnJlc2ggaXMgZmluaXNoZWRcbiAgICBhd2FpdENvbmZpZ3VyYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gc2VsZi5jb25maWd1cmluZztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgYSB0aWxlOiBsb2FkIGZyb20gdGlsZSBzb3VyY2UgaWYgYnVpbGRpbmcgZm9yIGZpcnN0IHRpbWUsIG90aGVyd2lzZSByZWJ1aWxkIHdpdGggZXhpc3RpbmcgZGF0YVxuICAgIGJ1aWxkVGlsZSAoeyB0aWxlIH0pIHtcbiAgICAgICAgLy8gVGlsZSBjYWNoZWQ/XG4gICAgICAgIGlmIChzZWxmLmdldFRpbGUodGlsZS5rZXkpICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgbG9hZGluZz9cbiAgICAgICAgICAgIGlmIChzZWxmLmdldFRpbGUodGlsZS5rZXkpLmxvYWRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGlsZSBjYWNoZVxuICAgICAgICB0aWxlID0gc2VsZi50aWxlc1t0aWxlLmtleV0gPSBPYmplY3QuYXNzaWduKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkgfHwge30sIHRpbGUpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBjb25maWcgKHN0eWxlcywgZXRjLiksIHRoZW4gYnVpbGQgdGlsZVxuICAgICAgICByZXR1cm4gc2VsZi5hd2FpdENvbmZpZ3VyYXRpb24oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgYnVpbGRpbmcgdGhlIHRpbGVcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRlZCAhPT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRpbGUuZXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgc2VsZi5sb2FkVGlsZVNvdXJjZURhdGEodGlsZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5nZXRUaWxlKHRpbGUua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBzdG9wIHRpbGUgYnVpbGQgYWZ0ZXIgZGF0YSBzb3VyY2UgbG9hZCBiZWNhdXNlIHRpbGUgd2FzIHJlbW92ZWQ6ICR7dGlsZS5rZXl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBXYXJuIGFuZCBjb250aW51ZSBvbiBkYXRhIHNvdXJjZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICBpZiAodGlsZS5zb3VyY2VfZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYHRpbGUgbG9hZCBlcnJvcihzKSBmb3IgJHt0aWxlLmtleX06ICR7dGlsZS5zb3VyY2VfZGF0YS5lcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIFRpbGUuYnVpbGRHZW9tZXRyeSh0aWxlLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZXJyb3IgPSBlcnJvci5zdGFjaztcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIGB0aWxlIGxvYWQgZXJyb3IgZm9yICR7dGlsZS5rZXl9OiAke3RpbGUuZXJyb3J9YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBlcnJvciB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoYFRpbGVNYW5hZ2VyXyR7c2VsZi5zY2VuZV9pZH0uYnVpbGRUaWxlRXJyb3JgLCBUaWxlLnNsaWNlKHRpbGUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRpbGUgYWxyZWFkeSBsb2FkZWQsIGp1c3QgcmVidWlsZFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGB1c2VkIHdvcmtlciBjYWNoZSBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgLy8gQnVpbGQgZ2VvbWV0cnlcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBUaWxlLmJ1aWxkR2VvbWV0cnkodGlsZSwgc2VsZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgZXJyb3IgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IGVycm9yLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShgVGlsZU1hbmFnZXJfJHtzZWxmLnNjZW5lX2lkfS5idWlsZFRpbGVFcnJvcmAsIFRpbGUuc2xpY2UodGlsZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIExvYWQgdGhpcyB0aWxlJ3MgZGF0YSBzb3VyY2VcbiAgICBsb2FkVGlsZVNvdXJjZURhdGEgKHRpbGUpIHtcbiAgICAgICAgaWYgKHNlbGYuc291cmNlc1t0aWxlLnNvdXJjZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZXNbdGlsZS5zb3VyY2VdLmxvYWQodGlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aWxlLnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRpbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBzZWxmLnRpbGVzW2tleV07XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB0aWxlXG4gICAgcmVtb3ZlVGlsZSAoa2V5KSB7XG4gICAgICAgIHZhciB0aWxlID0gc2VsZi50aWxlc1trZXldO1xuXG4gICAgICAgIGlmICh0aWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENhbmNlbCBpZiBsb2FkaW5nXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBjYW5jZWwgdGlsZSBsb2FkIGZvciAke2tleX1gKTtcbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBUaWxlLmNhbmNlbCh0aWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIEZlYXR1cmVTZWxlY3Rpb24uY2xlYXJUaWxlKGtleSk7XG4gICAgICAgICAgICBkZWxldGUgc2VsZi50aWxlc1trZXldO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGByZW1vdmUgdGlsZSBmcm9tIGNhY2hlIGZvciAke2tleX1gKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBHZXQgYSBmZWF0dXJlIGZyb20gdGhlIHNlbGVjdGlvbiBtYXBcbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uICh7IGlkLCBrZXkgfSA9IHt9KSB7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBGZWF0dXJlU2VsZWN0aW9uLm1hcFtrZXldO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBmZWF0dXJlOiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5mZWF0dXJlKVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBSZXNldHMgdGhlIGZlYXR1cmUgc2VsZWN0aW9uIHN0YXRlXG4gICAgcmVzZXRGZWF0dXJlU2VsZWN0aW9uICgpIHtcbiAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5yZXNldCgpO1xuICAgIH0sXG5cbiAgICAvLyBTZWxlY3Rpb24gbWFwIHNpemUgZm9yIHRoaXMgd29ya2VyXG4gICAgZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUgKCkge1xuICAgICAgICByZXR1cm4gRmVhdHVyZVNlbGVjdGlvbi5nZXRNYXBTaXplKCk7XG4gICAgfSxcblxuICAgIC8vIFRleHR1cmUgaW5mbyBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSBtYWluIHRocmVhZCwgZS5nLiB3aWR0aC9oZWlnaHQsIHdoaWNoIHdlIG9ubHkga25vdyBhZnRlciB0aGUgdGV4dHVyZSBsb2Fkc1xuICAgIHN5bmNUZXh0dXJlcyAodGV4X2NvbmZpZykge1xuICAgICAgICBsZXQgdGV4dHVyZXMgPSBbXTtcbiAgICAgICAgaWYgKHRleF9jb25maWcpIHtcbiAgICAgICAgICAgIHRleHR1cmVzLnB1c2goLi4uT2JqZWN0LmtleXModGV4X2NvbmZpZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdzeW5jIHRleHR1cmVzIHRvIHdvcmtlcjonLCB0ZXh0dXJlcyk7XG4gICAgICAgIGlmICh0ZXh0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gVGV4dHVyZS5zeW5jVGV4dHVyZXNUb1dvcmtlcih0ZXh0dXJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBTeW5jIGRldmljZSBwaXhlbCByYXRpbyBmcm9tIG1haW4gdGhyZWFkXG4gICAgdXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyAoZGV2aWNlX3BpeGVsX3JhdGlvKSB7XG4gICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbztcbiAgICB9LFxuXG4gICAgLy8gUHJvZmlsaW5nIGhlbHBlcnNcbiAgICBwcm9maWxlIChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZShgd29ya2VyICR7c2VsZi5fd29ya2VyX2lkfTogJHtuYW1lfWApO1xuICAgIH0sXG5cbiAgICBwcm9maWxlRW5kIChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgd29ya2VyICR7c2VsZi5fd29ya2VyX2lkfTogJHtuYW1lfWApO1xuICAgIH1cblxufSk7XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ3NlbGYnLCBzZWxmKTtcblxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGZWF0dXJlU2VsZWN0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB3b3JrZXJzLCBsb2NrX2ZuKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy53b3JrZXJzID0gd29ya2VyczsgLy8gcG9vbCBvZiB3b3JrZXJzIHRvIHJlcXVlc3QgZmVhdHVyZSBsb29rLXVwcyBmcm9tLCBrZXllZCBieSBpZFxuICAgICAgICB0aGlzLl9sb2NrX2ZuID0gKHR5cGVvZiBsb2NrX2ZuID09PSAnZnVuY3Rpb24nKSAmJiBsb2NrX2ZuOyAvLyBpbmRpY2F0ZXMgaWYgc2FmZSB0byByZWFkL3dyaXRlIHNlbGVjdGlvbiBidWZmZXIgdGhpcyBmcmFtZVxuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICAvLyBTZWxlY3Rpb24gc3RhdGUgdHJhY2tpbmdcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyA9IHt9OyAvLyBwZW5kaW5nIHNlbGVjdGlvbiByZXF1ZXN0c1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSBudWxsOyAvLyBjdXJyZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuICAgICAgICB0aGlzLnJlYWRfZGVsYXkgPSAwOyAvLyBkZWxheSB0aW1lIGZyb20gc2VsZWN0aW9uIHJlbmRlciB0byBmcmFtZWJ1ZmZlciBzYW1wbGUsIHRvIGF2b2lkIENQVS9HUFUgc3luYyBsb2NrXG4gICAgICAgIHRoaXMucmVhZF9kZWxheV90aW1lciA9IG51bGw7IC8vIGN1cnJlbnQgdGltZXIgKHNldFRpbWVvdXQpIGZvciBkZWxheWVkIHNlbGVjdGlvbiByZWFkc1xuXG4gICAgICAgIHRoaXMucGl4ZWwgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgdGhpcy5waXhlbDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLnBpeGVsLmJ1ZmZlcik7XG5cbiAgICAgICAgLy8gRnJhbWUgYnVmZmVyIGZvciBzZWxlY3Rpb25cbiAgICAgICAgLy8gVE9ETzogaW5pdGlhdGUgbGF6aWx5IGluIGNhc2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuZmJvID0gdGhpcy5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG4gICAgICAgIHRoaXMuZmJvX3NpemUgPSB7IHdpZHRoOiAyNTYsIGhlaWdodDogMjU2IH07IC8vIFRPRE86IG1ha2UgY29uZmlndXJhYmxlIC8gYWRhcHRpdmUgYmFzZWQgb24gY2FudmFzIHNpemVcbiAgICAgICAgdGhpcy5mYm9fc2l6ZS5hc3BlY3QgPSB0aGlzLmZib19zaXplLndpZHRoIC8gdGhpcy5mYm9fc2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgLy8gVGV4dHVyZSBmb3IgdGhlIEZCTyBjb2xvciBhdHRhY2htZW50XG4gICAgICAgIHZhciBmYm9fdGV4dHVyZSA9IFRleHR1cmUuY3JlYXRlKCB0aGlzLmdsLCAnc2VsZWN0aW9uX2ZibycsIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIGZib190ZXh0dXJlLnNldERhdGEodGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQsIG51bGwsIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIHRoaXMuZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgdGhpcy5nbC5URVhUVVJFXzJELCBmYm9fdGV4dHVyZS50ZXh0dXJlLCAwKTtcblxuICAgICAgICAvLyBSZW5kZXJidWZmZXIgZm9yIHRoZSBGQk8gZGVwdGggYXR0YWNobWVudFxuICAgICAgICB2YXIgZmJvX2RlcHRoX3JiID0gdGhpcy5nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kUmVuZGVyYnVmZmVyKHRoaXMuZ2wuUkVOREVSQlVGRkVSLCBmYm9fZGVwdGhfcmIpO1xuICAgICAgICB0aGlzLmdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UodGhpcy5nbC5SRU5ERVJCVUZGRVIsIHRoaXMuZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmdsLkRFUFRIX0FUVEFDSE1FTlQsIHRoaXMuZ2wuUkVOREVSQlVGRkVSLCBmYm9fZGVwdGhfcmIpO1xuXG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmdsICYmIHRoaXMuZmJvKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZmJvKTtcbiAgICAgICAgICAgIHRoaXMuZmJvID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogZnJlZSB0ZXh0dXJlP1xuICAgIH1cblxuICAgIC8vIGV4dGVybmFsIGxvY2sgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGVuIGl0J3Mgc2FmZSB0byByZWFkL3dyaXRlIGZyb20gc2VsZWN0aW9uIGJ1ZmZlclxuICAgIGdldCBsb2NrZWQgKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX2xvY2tfZm4gJiYgdGhpcy5fbG9ja19mbigpKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBiaW5kKCkge1xuICAgICAgICAvLyBTd2l0Y2ggdG8gRkJPXG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcbiAgICAgICAgdGhpcy5nbC52aWV3cG9ydCgwLCAwLCB0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBmZWF0dXJlIHNlbGVjdGlvblxuICAgIC8vIFJ1bnMgYXN5bmNocm9ub3VzbHksIHNjaGVkdWxlcyBzZWxlY3Rpb24gYnVmZmVyIHRvIGJlIHVwZGF0ZWRcbiAgICBnZXRGZWF0dXJlQXQocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFF1ZXVlIHJlcXVlc3RzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiwgYW5kIHRoZXkgd2lsbCBiZSBwaWNrZWQgdXAgYnkgdGhlIHJlbmRlciBsb29wXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkID0gKHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQgKyAxKSB8fCAwO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0c1t0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCxcbiAgICAgICAgICAgICAgICBwb2ludCxcbiAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQW55IHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgcGVuZGluZ1JlcXVlc3RzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZXF1ZXN0cykubGVuZ3RoICYmIHRoaXMucmVxdWVzdHM7XG4gICAgfVxuXG4gICAgY2xlYXJQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5yZXF1ZXN0cykge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc2VudCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWplY3QgcmVxdWVzdCBzaW5jZSBpdCB3aWxsIG5ldmVyIGJlIGZ1bGZpbGxlZFxuICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBhIHJlYXNvbiBmb3IgcmVqZWN0aW9uP1xuICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QoeyByZXF1ZXN0IH0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWFkIHBlbmRpbmcgcmVzdWx0cyBmcm9tIHRoZSBzZWxlY3Rpb24gYnVmZmVyLiBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nIHRvIHNlbGVjdGlvbiBidWZmZXIuXG4gICAgcmVhZCgpIHtcbiAgICAgICAgLy8gRGVsYXkgcmVhZGluZyB0aGUgcGl4ZWwgcmVzdWx0IGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2suXG4gICAgICAgIC8vIENhbGxpbmcgcmVhZFBpeGVscyBzeW5jaHJvbm91c2x5IGNhdXNlZCBhIG1hc3NpdmUgcGVyZm9ybWFuY2UgaGl0LCBwcmVzdW1hYmx5IHNpbmNlIGl0XG4gICAgICAgIC8vIGZvcmNlZCB0aGlzIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHRoZSBHUFUgdG8gZmluaXNoIHJlbmRlcmluZyBhbmQgcmV0cmlldmUgdGhlIHRleHR1cmUgY29udGVudHMuXG4gICAgICAgIGlmICh0aGlzLnJlYWRfZGVsYXlfdGltZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZF9kZWxheV90aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2NrZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciByIGluIHRoaXMucmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbcl07XG5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgc2VsZWN0aW9uIG1hcCBhZ2FpbnN0IEZCT1xuICAgICAgICAgICAgICAgIGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVxdWVzdC5wb2ludC54ICogdGhpcy5mYm9fc2l6ZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKDEgLSByZXF1ZXN0LnBvaW50LnkpICogdGhpcy5mYm9fc2l6ZS5oZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICAxLCAxLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnBpeGVsKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9rZXkgPSAodGhpcy5waXhlbFswXSArICh0aGlzLnBpeGVsWzFdIDw8IDgpICsgKHRoaXMucGl4ZWxbMl0gPDwgMTYpICsgKHRoaXMucGl4ZWxbM10gPDwgMjQpKSA+Pj4gMDtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZlYXR1cmUgZm91bmQsIGFzayBhcHByb3ByaWF0ZSB3ZWIgd29ya2VyIHRvIGxvb2t1cCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlcl9pZCA9IHRoaXMucGl4ZWxbM107XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlcl9pZCAhPT0gMjU1KSB7IC8vIDI1NSBpbmRpY2F0ZXMgYW4gZW1wdHkgc2VsZWN0aW9uIGJ1ZmZlciBwaXhlbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXJzW3dvcmtlcl9pZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2Vyc1t3b3JrZXJfaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWxmLmdldEZlYXR1cmVTZWxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IHJlcXVlc3QuaWQsIGtleTogZmVhdHVyZV9rZXkgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIGZlYXR1cmUgZm91bmQsIGJ1dCBzdGlsbCBuZWVkIHRvIHJlc29sdmUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlYWQoeyBpZDogcmVxdWVzdC5pZCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuXG4gICAgICAgIH0sIHRoaXMucmVhZF9kZWxheSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGZpbmRzIGEgZmVhdHVyZSBpbiB0aGUgc2VsZWN0aW9uIGJ1ZmZlclxuICAgIGZpbmlzaFJlYWQgKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW21lc3NhZ2UuaWRdO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIkZlYXR1cmVTZWxlY3Rpb24uZmluaXNoUmVhZCgpOiBjb3VsZCBub3QgZmluZCBtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyByZXF1ZXN0IHdhcyBjbGVhcmVkIGJlZm9yZSBpdCByZXR1cm5lZFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBtZXNzYWdlLmZlYXR1cmU7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICgoZmVhdHVyZSAhPSBudWxsICYmIHRoaXMuZmVhdHVyZSA9PSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgPT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCkgfHxcbiAgICAgICAgICAgIChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5mZWF0dXJlKSkpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsgLy8gc3RvcmUgdGhlIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdC5yZXNvbHZlKHsgZmVhdHVyZSwgY2hhbmdlZCwgcmVxdWVzdCB9KTtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07IC8vIGRvbmUgcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3RcbiAgICB9XG5cblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgZ2VuZXJhdGlvblxuICAgIC8vIEVhY2ggd29ya2VyIHdpbGwgY3JlYXRlIGl0cyBvd24gaW5kZXBlbmRlbnQsICdsb2NhbCcgc2VsZWN0aW9uIG1hcFxuXG4gICAgLy8gQ3JlYXRlIGEgdW5pcXVlIDMyLWJpdCBjb2xvciB0byBpZGVudGlmeSBhIGZlYXR1cmVcbiAgICAvLyBXb3JrZXJzIGluZGVwZW5kZW50bHkgY3JlYXRlL21vZGlmeSBzZWxlY3Rpb24gY29sb3JzIGluIHRoZWlyIG93biB0aHJlYWRzLCBidXQgd2UgYWxzb1xuICAgIC8vIG5lZWQgdGhlIG1haW4gdGhyZWFkIHRvIGtub3cgd2hlcmUgZWFjaCBmZWF0dXJlIGNvbG9yIG9yaWdpbmF0ZWQuIFRvIGFjY29tcGxpc2ggdGhpcyxcbiAgICAvLyB3ZSBwYXJ0aXRpb24gdGhlIG1hcCBieSBzZXR0aW5nIHRoZSA0dGggY29tcG9uZW50IChhbHBoYSBjaGFubmVsKSB0byB0aGUgd29ya2VyJ3MgaWQuXG4gICAgc3RhdGljIG1ha2VFbnRyeSh0aWxlKSB7XG4gICAgICAgIC8vIDMyLWJpdCBjb2xvciBrZXlcbiAgICAgICAgdGhpcy5tYXBfZW50cnkrKztcbiAgICAgICAgdmFyIGlyID0gdGhpcy5tYXBfZW50cnkgJiAyNTU7XG4gICAgICAgIHZhciBpZyA9ICh0aGlzLm1hcF9lbnRyeSA+PiA4KSAmIDI1NTtcbiAgICAgICAgdmFyIGliID0gKHRoaXMubWFwX2VudHJ5ID4+IDE2KSAmIDI1NTtcbiAgICAgICAgdmFyIGlhID0gdGhpcy5tYXBfcHJlZml4O1xuICAgICAgICB2YXIgciA9IGlyIC8gMjU1O1xuICAgICAgICB2YXIgZyA9IGlnIC8gMjU1O1xuICAgICAgICB2YXIgYiA9IGliIC8gMjU1O1xuICAgICAgICB2YXIgYSA9IGlhIC8gMjU1O1xuICAgICAgICB2YXIga2V5ID0gKGlyICsgKGlnIDw8IDgpICsgKGliIDw8IDE2KSArIChpYSA8PCAyNCkpID4+PiAwOyAvLyBuZWVkIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHRvIGNvbnZlcnQgdG8gcG9zaXRpdmUgI1xuXG4gICAgICAgIHRoaXMubWFwW2tleV0gPSB7XG4gICAgICAgICAgICBjb2xvcjogW3IsIGcsIGIsIGFdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1hcF9zaXplKys7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aWxlLXNwZWNpZmljIHRyYWNraW5nIGluZm9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICAgICAgZW50cmllczogW10sICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9mIGZlYXR1cmUgZW50cmllcyBpbiB0aGlzIHRocmVhZFxuICAgICAgICAgICAgICAgIHRpbGU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnNldCBvZiB0aWxlIHByb3BlcnRpZXMgdG8gcGFzcyBiYWNrIHdpdGggZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBrZXk6IHRpbGUua2V5LFxuICAgICAgICAgICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aWxlLnN0eWxlX3pvb20sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGlsZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb246IHRpbGUuZ2VuZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XS5lbnRyaWVzLnB1c2goa2V5KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWFrZUNvbG9yKGZlYXR1cmUsIHRpbGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5tYWtlRW50cnkodGlsZSk7XG4gICAgICAgIHNlbGVjdG9yLmZlYXR1cmUgPSB7XG4gICAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgIHNvdXJjZV9uYW1lOiBjb250ZXh0LnNvdXJjZSxcbiAgICAgICAgICAgIHNvdXJjZV9sYXllcjogY29udGV4dC5sYXllcixcbiAgICAgICAgICAgIGxheWVyczogY29udGV4dC5sYXllcnMsXG4gICAgICAgICAgICB0aWxlOiB0aGlzLnRpbGVzW3RpbGUua2V5XS50aWxlXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmNvbG9yO1xuICAgIH1cblxuICAgIHN0YXRpYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuICAgICAgICB0aGlzLm1hcF9zaXplID0gMDtcbiAgICAgICAgdGhpcy5tYXBfZW50cnkgPSAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhclRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmZvckVhY2goayA9PiBkZWxldGUgdGhpcy5tYXBba10pO1xuICAgICAgICAgICAgdGhpcy5tYXBfc2l6ZSAtPSB0aGlzLnRpbGVzW2tleV0uZW50cmllcy5sZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50aWxlc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE1hcFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcF9zaXplO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRQcmVmaXgocHJlZml4KSB7XG4gICAgICAgIHRoaXMubWFwX3ByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbn1cblxuLy8gU3RhdGljIHByb3BlcnRpZXNcbkZlYXR1cmVTZWxlY3Rpb24ubWFwID0ge307ICAgLy8gdGhpcyB3aWxsIGJlIHVuaXF1ZSBwZXIgbW9kdWxlIGluc3RhbmNlIChzbyB1bmlxdWUgcGVyIHdvcmtlcilcbkZlYXR1cmVTZWxlY3Rpb24udGlsZXMgPSB7fTsgLy8gc2VsZWN0aW9uIGtleXMsIGJ5IHRpbGVcbkZlYXR1cmVTZWxlY3Rpb24ubWFwX3NpemUgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfZW50cnkgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfcHJlZml4ID0gMDsgLy8gc2V0IGJ5IHdvcmtlciB0byB3b3JrZXIgaWQgI1xuRmVhdHVyZVNlbGVjdGlvbi5kZWZhdWx0Q29sb3IgPSBbMCwgMCwgMCwgMV07XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUgKi9cbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCB7TWV0aG9kTm90SW1wbGVtZW50ZWR9IGZyb20gJy4uL3V0aWxzL2Vycm9ycyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuLi91dGlscy91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnLCBzb3VyY2VzKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOyAvLyBzYXZlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAvLyBmdWxsIHNldCBvZiBkYXRhIHNvdXJjZXMgVE9ETzogY2VudHJhbGl6ZSB0aGVzZSBsaWtlIHRleHR1cmVzP1xuICAgICAgICB0aGlzLmlkID0gY29uZmlnLmlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy5wYWRfc2NhbGUgPSBjb25maWcucGFkX3NjYWxlIHx8IDAuMDAwMTsgLy8gc2NhbGUgdGlsZSB1cCBieSBzbWFsbCBmYWN0b3IgdG8gY292ZXIgc2VhbXNcbiAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBudWxsOyAvLyB3aW5kaW5nIG9yZGVyIHdpbGwgYWRhcHQgdG8gZGF0YSBzb3VyY2VcbiAgICAgICAgdGhpcy5yYXN0ZXJzID0gW107IC8vIGF0dGFjaGVkIHJhc3RlciB0aWxlIHNvdXJjZXNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJhc3RlcnMpKSB7IC8vIGNvcHkgdW5pcXVlIHNldCBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAgICAgY29uZmlnLnJhc3RlcnMuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yYXN0ZXJzLmluZGV4T2YocikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmFzdGVycy5wdXNoKHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHNvdXJjZSBkYXRhXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gY29uZmlnLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgdGhpcy5leHRyYV9kYXRhID0gY29uZmlnLmV4dHJhX2RhdGE7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBzY3JpcHRzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGxvYWRlZCBhbG9uZ3NpZGUgdGhlIGxpYnJhcnkgd2hlbiB0aGUgd29ya2VycyBhcmUgaW5zdGFudGlhdGVkXG4gICAgICAgIHRoaXMuc2NyaXB0cyA9IGNvbmZpZy5zY3JpcHRzO1xuXG4gICAgICAgIC8vIG92ZXJ6b29tIHdpbGwgYXBwbHkgZm9yIHpvb21zIGhpZ2hlciB0aGFuIHRoaXNcbiAgICAgICAgdGhpcy5tYXhfem9vbSA9IChjb25maWcubWF4X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X3pvb20gOiBHZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb207XG5cbiAgICAgICAgLy8gbm8gdGlsZXMgd2lsbCBiZSByZXF1ZXN0ZWQgb3IgZGlzcGxheWVkIG91dHNpZGUgb2YgdGhlc2UgbWluL21heCB2YWx1ZXNcbiAgICAgICAgdGhpcy5taW5fZGlzcGxheV96b29tID0gKGNvbmZpZy5taW5fZGlzcGxheV96b29tICE9IG51bGwpID8gY29uZmlnLm1pbl9kaXNwbGF5X3pvb20gOiAwO1xuICAgICAgICB0aGlzLm1heF9kaXNwbGF5X3pvb20gPSAoY29uZmlnLm1heF9kaXNwbGF5X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X2Rpc3BsYXlfem9vbSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGlsZSBzb3VyY2UgYnkgdHlwZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBpZiAoRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0oc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvbiBjaGFuZ2VkXG4gICAgc3RhdGljIGNoYW5nZWQgKHNvdXJjZSwgcHJldl9zb3VyY2UpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXByZXZfc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXIgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UuY29uZmlnLCB7IGlkOiBudWxsIH0pOyAvLyBudWxsIG91dCBpZHMgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21wYXJlIHRoZW1cbiAgICAgICAgbGV0IHByZXYgPSBPYmplY3QuYXNzaWduKHt9LCBwcmV2X3NvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGN1cikgIT09IEpTT04uc3RyaW5naWZ5KHByZXYpO1xuICAgIH1cblxuICAgIC8vIE1lcmNhdG9yIHByb2plY3Rpb25cbiAgICBzdGF0aWMgcHJvamVjdERhdGEgKHNvdXJjZSkge1xuICAgICAgICB2YXIgdGltZXIgPSArbmV3IERhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKGNvb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSB4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlLmRlYnVnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZS5kZWJ1Zy5wcm9qZWN0aW9uID0gK25ldyBEYXRlKCkgLSB0aW1lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICBSZS1zY2FsZSBnZW9tZXRyaWVzIHdpdGhpbiBlYWNoIHNvdXJjZSB0byBpbnRlcm5hbCB0aWxlIHVuaXRzXG4gICAgKi9cbiAgICBzdGF0aWMgc2NhbGVEYXRhIChzb3VyY2UsIHtjb29yZHM6IHt6fSwgbWluLCBtYXh9KSB7XG4gICAgICAgIGxldCB1bml0c19wZXJfbWV0ZXIgPSBHZW8udW5pdHNQZXJNZXRlcih6KTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IChjb29yZFswXSAtIG1pbi54KSAqIHVuaXRzX3Blcl9tZXRlcjtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAoY29vcmRbMV0gLSBtaW4ueSkgKiB1bml0c19wZXJfbWV0ZXIgKiAtMTsgLy8gZmxpcCBjb29yZHMgcG9zaXRpdmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoZGVzdCkge1xuICAgICAgICBkZXN0LnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIGRlc3QucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIGRlc3QucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQoZGVzdCkudGhlbigoZGVzdCkgPT4ge1xuICAgICAgICAgICAgLy8gUG9zdC1wcm9jZXNzaW5nXG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciBpbiBkZXN0LnNvdXJjZV9kYXRhLmxheWVycykge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgR2VvLnRyYW5zZm9ybUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGNvb3JkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGlwIFkgY29vcmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAtY29vcmRbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbGlnaHRseSBzY2FsZSB1cCB0aWxlIHRvIGNvdmVyIHNlYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFkX3NjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gTWF0aC5yb3VuZChjb29yZFswXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IE1hdGgucm91bmQoY29vcmRbMV0gKiAoMSArIHRoaXMucGFkX3NjYWxlKSAtIChHZW8udGlsZV9zY2FsZSAqIHRoaXMucGFkX3NjYWxlLzIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGZpcnN0IGVuY291bnRlcmVkIHBvbHlnb24gd2luZGluZyBvcmRlciBhcyBkZWZhdWx0IGZvciBkYXRhIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0V2luZGluZyhmZWF0dXJlLmdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXN0LmRlZmF1bHRfd2luZGluZyA9IHRoaXMuZGVmYXVsdF93aW5kaW5nIHx8ICdDQ1cnO1xuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gICAgX2xvYWQoZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ19sb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgd2luZGluZyBmb3IgZGF0YSBzb3VyY2UgZnJvbSBmaXJzdCByaW5nIG9mIHByb3ZpZGVkIGdlb21ldHJ5XG4gICAgdXBkYXRlRGVmYXVsdFdpbmRpbmcgKGdlb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdF93aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChnZW9tLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZ2VvbS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRfd2luZGluZztcbiAgICB9XG5cbiAgICAvLyBBbGwgZGF0YSBzb3VyY2VzIHN1cHBvcnQgYSBtaW4gem9vbSwgdGlsZWQgc291cmNlcyBjYW4gc3ViY2xhc3MgZm9yIG1vcmUgc3BlY2lmaWMgbGltaXRzIChlLmcuIGJvdW5kaW5nIGJveClcbiAgICBpbmNsdWRlc1RpbGUgKGNvb3Jkcywgc3R5bGVfem9vbSkge1xuICAgICAgICAvLyBMaW1pdCBieSB0aGlzIGRhdGEgc291cmNlXG4gICAgICAgIGlmIChjb29yZHMueiA8IHRoaXMubWluX2Rpc3BsYXlfem9vbSB8fCAodGhpcy5tYXhfZGlzcGxheV96b29tICE9IG51bGwgJiYgc3R5bGVfem9vbSA+IHRoaXMubWF4X2Rpc3BsYXlfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGJ5IGFueSBkZXBlbmRlbnQgcmFzdGVyIHNvdXJjZXNcbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5yYXN0ZXJzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VfbmFtZSA9IHRoaXMucmFzdGVyc1tyXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW3NvdXJjZV9uYW1lXSAhPT0gdGhpcyAmJlxuICAgICAgICAgICAgICAgICF0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdLmluY2x1ZGVzVGlsZShjb29yZHMsIGNvb3Jkcy56KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGEgbmV3IGRhdGEgc291cmNlIHR5cGUsIHVuZGVyIGEgdHlwZSBuYW1lXG4gICAgc3RhdGljIHJlZ2lzdGVyKHR5cGVfY2xhc3MsIHR5cGVfbmFtZSkge1xuICAgICAgICBpZiAoIXR5cGVfY2xhc3MgfHwgIXR5cGVfbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRGF0YVNvdXJjZS50eXBlc1t0eXBlX25hbWVdID0gdHlwZV9jbGFzcztcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS50eXBlcyA9IHt9OyAvLyBzZXQgb2Ygc3VwcG9ydGVkIGRhdGEgc291cmNlIGNsYXNzZXMsIHJlZmVyZW5jZWQgYnkgdHlwZSBuYW1lXG5cblxuLyoqKiBHZW5lcmljIG5ldHdvcmsgbG9hZGluZyBzb3VyY2UgLSBhYnN0cmFjdCBjbGFzcyAqKiovXG5cbmxldCBuZXR3b3JrX3JlcXVlc3RfaWQgPSAwOyAvLyB1c2VkIHRvIG5hbWVzcGFjZSBVUkwgcmVxdWVzdHNcblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy51cmwgPSBVUkxzLmFkZFBhcmFtc1RvVVJMKHNvdXJjZS51cmwsIHNvdXJjZS51cmxfcGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJcIjsgLy8gdXNlIHRvIHNldCBleHBsaWNpdCBYSFIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLnVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTmV0d29yayBkYXRhIHNvdXJjZSBtdXN0IHByb3ZpZGUgYSBgdXJsYCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWQgKGRlc3QpIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCBkZXN0KTtcblxuICAgICAgICBsZXQgc291cmNlX2RhdGEgPSBkZXN0LnNvdXJjZV9kYXRhO1xuICAgICAgICBzb3VyY2VfZGF0YS51cmwgPSB1cmw7XG4gICAgICAgIGRlc3QuZGVidWcgPSBkZXN0LmRlYnVnIHx8IHt9O1xuICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcgbmV0d29yayBlcnJvcnNcbiAgICAgICAgICAgIC8vIHZhciBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMCwgdGhpcy5yZXNwb25zZV90eXBlKTtcbiAgICAgICAgICAgIC8vIGlmIChNYXRoLnJhbmRvbSgpIDwgLjcpIHtcbiAgICAgICAgICAgIC8vICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ2Zha2UgZGF0YSBzb3VyY2UgZXJyb3InKSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcblxuICAgICAgICAgICAgbGV0IHJlcXVlc3RfaWQgPSAobmV0d29ya19yZXF1ZXN0X2lkKyspICsgJy0nICsgdXJsO1xuICAgICAgICAgICAgbGV0IHByb21pc2UgPSBVdGlscy5pbyh1cmwsIDYwICogMTAwMCwgdGhpcy5yZXNwb25zZV90eXBlLCAnR0VUJywge30sIHJlcXVlc3RfaWQpO1xuICAgICAgICAgICAgc291cmNlX2RhdGEucmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7XG5cbiAgICAgICAgICAgIHByb21pc2UudGhlbigoYm9keSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucmVzcG9uc2Vfc2l6ZSA9IGJvZHkubGVuZ3RoIHx8IGJvZHkuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKSAtIGRlc3QuZGVidWcubmV0d29yaztcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnBhcnNpbmcgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlU291cmNlRGF0YShkZXN0LCBzb3VyY2VfZGF0YSwgYm9keSk7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLnBhcnNpbmc7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHNvdXJjZV9kYXRhLmVycm9yID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTsgLy8gcmVzb2x2ZSByZXF1ZXN0IGJ1dCBwYXNzIGFsb25nIGVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3ViLWNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6XG5cbiAgICBmb3JtYXRVcmwgKHVybF90ZW1wbGF0ZSwgZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ2Zvcm1hdFVybCcpO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAoZGVzdCwgc291cmNlLCByZXBvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgncGFyc2VTb3VyY2VEYXRhJyk7XG4gICAgfVxufVxuXG5cbi8qKiogR2VuZXJpYyBuZXR3b3JrIHRpbGUgbG9hZGluZyAtIGFic3RyYWN0IGNsYXNzICoqKi9cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtUaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFyc2VCb3VuZHMoc291cmNlKTtcblxuICAgICAgICAvLyBpbmRpY2F0ZXMgaWYgc291cmNlIHNob3VsZCBidWlsZCBnZW9tZXRyeSB0aWxlcywgZW5hYmxlZCBmb3Igc291cmNlcyByZWZlcmVuY2VkIGluIHRoZSBzY2VuZSdzIGxheWVycyxcbiAgICAgICAgLy8gYW5kIGxlZnQgZGlzYWJsZWQgZm9yIHNvdXJjZXMgdGhhdCBhcmUgbmV2ZXIgcmVmZXJlbmNlZCwgb3Igb25seSB1c2VkIGFzIHJhc3RlciB0ZXh0dXJlc1xuICAgICAgICB0aGlzLmJ1aWxkc19nZW9tZXRyeV90aWxlcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudG1zID0gKHNvdXJjZS50bXMgPT09IHRydWUpOyAvLyBvcHRpb25hbGx5IGZsaXAgdGlsZSBjb29yZHMgZm9yIFRNU1xuICAgICAgICB0aGlzLnVybF9ob3N0cyA9IG51bGw7XG4gICAgICAgIHZhciBob3N0X21hdGNoID0gdGhpcy51cmwubWF0Y2goL3tzOlxcWyhbXn0rXSspXFxdfS8pO1xuICAgICAgICBpZiAoaG9zdF9tYXRjaCAhPSBudWxsICYmIGhvc3RfbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy51cmxfaG9zdHMgPSBob3N0X21hdGNoWzFdLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB0aGlzLm5leHRfaG9zdCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYm91bmRzIGZyb20gc291cmNlIGNvbmZpZyBwYXJhbWV0ZXJzXG4gICAgcGFyc2VCb3VuZHMgKHNvdXJjZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UuYm91bmRzKSAmJiBzb3VyY2UuYm91bmRzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBzb3VyY2UuYm91bmRzO1xuICAgICAgICAgICAgbGV0IFt3LCBzLCBlLCBuXSA9IHRoaXMuYm91bmRzO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNfbWV0ZXJzID0ge1xuICAgICAgICAgICAgICAgIG1pbjogR2VvLmxhdExuZ1RvTWV0ZXJzKFt3LCBuXSksXG4gICAgICAgICAgICAgICAgbWF4OiBHZW8ubGF0TG5nVG9NZXRlcnMoW2UsIHNdKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmJvdW5kc190aWxlcyA9IHsgbWluOiB7fSwgbWF4OiB7fSB9OyAvLyBtYXggdGlsZSBib3VuZHMgcGVyIHpvb20gKGxhemlseSBldmFsdWF0ZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRpbGUgaXMgb3V0c2lkZSBkYXRhIHNvdXJjZSdzIGJvdW5kcywgdHJ1ZSBpZiB3aXRoaW5cbiAgICBjaGVja0JvdW5kcyAoY29vcmRzKSB7XG4gICAgICAgIC8vIENoZWNrIHRpbGUgYm91bmRzXG4gICAgICAgIGlmICh0aGlzLmJvdW5kcykge1xuICAgICAgICAgICAgY29vcmRzID0gR2VvLndyYXBUaWxlKGNvb3JkcywgeyB4OiB0cnVlIH0pO1xuXG4gICAgICAgICAgICBsZXQgbWluID0gdGhpcy5ib3VuZHNfdGlsZXMubWluW2Nvb3Jkcy56XTtcbiAgICAgICAgICAgIGlmICghbWluKSB7XG4gICAgICAgICAgICAgICAgbWluID0gdGhpcy5ib3VuZHNfdGlsZXMubWluW2Nvb3Jkcy56XSA9IEdlby50aWxlRm9yTWV0ZXJzKHRoaXMuYm91bmRzX21ldGVycy5taW4sIGNvb3Jkcy56KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG1heCA9IHRoaXMuYm91bmRzX3RpbGVzLm1heFtjb29yZHMuel07XG4gICAgICAgICAgICBpZiAoIW1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IHRoaXMuYm91bmRzX3RpbGVzLm1heFtjb29yZHMuel0gPSBHZW8udGlsZUZvck1ldGVycyh0aGlzLmJvdW5kc19tZXRlcnMubWF4LCBjb29yZHMueik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb29yZHMueCA8IG1pbi54IHx8IGNvb3Jkcy54ID4gbWF4LnggfHxcbiAgICAgICAgICAgICAgICBjb29yZHMueSA8IG1pbi55IHx8IGNvb3Jkcy55ID4gbWF4LnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaW5jbHVkZXNUaWxlIChjb29yZHMsIHN0eWxlX3pvb20pIHtcbiAgICAgICAgaWYgKCFzdXBlci5pbmNsdWRlc1RpbGUoY29vcmRzLCBzdHlsZV96b29tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZSBib3VuZHNcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQm91bmRzKGNvb3JkcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtYXRVcmwodXJsX3RlbXBsYXRlLCB0aWxlKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSBHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICBpZiAodGhpcy50bXMpIHtcbiAgICAgICAgICAgIGNvb3Jkcy55ID0gTWF0aC5wb3coMiwgY29vcmRzLnopIC0gMSAtIGNvb3Jkcy55OyAvLyBvcHRpb25hbGx5IGZsaXAgdGlsZSBjb29yZHMgZm9yIFRNU1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVybCA9IHVybF90ZW1wbGF0ZS5yZXBsYWNlKCd7eH0nLCBjb29yZHMueCkucmVwbGFjZSgne3l9JywgY29vcmRzLnkpLnJlcGxhY2UoJ3t6fScsIGNvb3Jkcy56KTtcblxuICAgICAgICBpZiAodGhpcy51cmxfaG9zdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL3tzOlxcWyhbXn0rXSspXFxdfS8sIHRoaXMudXJsX2hvc3RzW3RoaXMubmV4dF9ob3N0XSk7XG4gICAgICAgICAgICB0aGlzLm5leHRfaG9zdCA9ICh0aGlzLm5leHRfaG9zdCArIDEpICUgdGhpcy51cmxfaG9zdHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tzIGZvciB0aGUgeC95L3ogdGlsZSBwYXR0ZXJuIGluIFVSTCB0ZW1wbGF0ZVxuICAgIHVybEhhc1RpbGVQYXR0ZXJuKHVybCkge1xuICAgICAgICByZXR1cm4gdXJsICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7eH0nKSA+IC0xICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7eX0nKSA+IC0xICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7en0nKSA+IC0xO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrU291cmNlLCBOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQge2RlY29kZU11bHRpUG9seWdvbn0gZnJvbSAnLi9tdnQnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG4vLyBGb3IgdGlsaW5nIEdlb0pTT04gY2xpZW50LXNpZGVcbmltcG9ydCBnZW9qc29udnQgZnJvbSAnZ2VvanNvbi12dCc7XG5cbi8qKlxuIEdlb0pTT04gc3RhbmRhbG9uZSAobm9uLXRpbGVkKSBzb3VyY2VcbiBVc2VzIGdlb2pzb24tdnQgc3BsaXQgaW50byB0aWxlcyBjbGllbnQtc2lkZVxuKi9cblxuZXhwb3J0IGNsYXNzIEdlb0pTT05Tb3VyY2UgZXh0ZW5kcyBOZXR3b3JrU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB0aGlzLmxvYWRfZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMudGlsZV9pbmRleGVzID0ge307IC8vIGdlb2pzb24tdnQgdGlsZSBpbmRpY2VzLCBieSBsYXllciBuYW1lXG4gICAgICAgIHRoaXMubWF4X3pvb20gPSBNYXRoLm1heCh0aGlzLm1heF96b29tIHx8IDAsIDE1KTsgLy8gVE9ETzogbWF4IHpvb20gPCAxNSBjYXVzZXMgYXJ0aWZhY3RzL25vLWRyYXcgYXQgMjAsIGludmVzdGlnYXRlXG4gICAgICAgIHRoaXMucGFkX3NjYWxlID0gMDsgLy8gd2UgZG9uJ3Qgd2FudCBwYWRkaW5nIG9uIGF1dG8tdGlsZWQgc291cmNlc1xuICAgIH1cblxuICAgIF9sb2FkKGRlc3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkX2RhdGEgPSBzdXBlci5fbG9hZCh7IHNvdXJjZV9kYXRhOiB7IGxheWVyczoge30gfSB9KS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIGNvbnRpbnVlIG9uIGRhdGEgc291cmNlIGVycm9yXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc291cmNlX2RhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYGRhdGEgc291cmNlIGxvYWQgZXJyb3IocykgZm9yIHNvdXJjZSAnJHt0aGlzLm5hbWV9JywgVVJMICcke3RoaXMudXJsfSc6ICR7ZGF0YS5zb3VyY2VfZGF0YS5lcnJvcn1gKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbGF5ZXJzID0gZGF0YS5zb3VyY2VfZGF0YS5sYXllcnM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWxlX2luZGV4ZXNbbGF5ZXJfbmFtZV0gPSBnZW9qc29udnQobGF5ZXJzW2xheWVyX25hbWVdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heF96b29tLCAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2xlcmFuY2U6IDMsIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnQ6IEdlby50aWxlX3NjYWxlLCAvLyB0aWxlIGV4dGVudCAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiAwLjAwMDEgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRfZGF0YS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyX25hbWUgaW4gdGhpcy50aWxlX2luZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBkZXN0LnNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl9uYW1lXSA9IHRoaXMuZ2V0VGlsZUZlYXR1cmVzKGRlc3QsIGxheWVyX25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFRpbGVGZWF0dXJlcyh0aWxlLCBsYXllcl9uYW1lKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSBHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyByZXF1ZXN0IGEgcGFydGljdWxhciB0aWxlXG4gICAgICAgIGxldCB0ID0gdGhpcy50aWxlX2luZGV4ZXNbbGF5ZXJfbmFtZV0uZ2V0VGlsZShjb29yZHMueiwgY29vcmRzLngsIGNvb3Jkcy55KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGZyb20gTVZULXN0eWxlIEpTT04gc3RydWN0IHRvIEdlb0pTT05cbiAgICAgICAgbGV0IGNvbGxlY3Rpb247XG4gICAgICAgIGlmICh0ICYmIHQuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHQuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gdC5mZWF0dXJlc1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIEdlb0pTT04gZmVhdHVyZVxuICAgICAgICAgICAgICAgIGxldCBmID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS50YWdzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS5jb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkubWFwKGNvb3JkID0+IFtjb29yZFswXSwgY29vcmRbMV1dKTtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS50eXBlID0gJ011bHRpUG9pbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09IDIgfHwgZmVhdHVyZS50eXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5Lm1hcChyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nLm1hcChjb29yZCA9PiBbY29vcmRbMF0sIGNvb3JkWzFdXSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS50eXBlID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5ID0gZGVjb2RlTXVsdGlQb2x5Z29uKGYuZ2VvbWV0cnkpOyAvLyB1bi1mbGF0dGVuIHJpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5nZW9tZXRyeSA9PSBudWxsKSB7IC8vIHNraXAgcG9seXMgdGhhdCBjb3VsZG4ndCBiZSBkZWNvZGVkIChlLmcuIGRlZ2VuZXJhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cblxuICAgIGZvcm1hdFVybCAoZGVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy51cmw7XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBwYXJzZWRfcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgbGV0IGxheWVycyA9IHRoaXMuZ2V0TGF5ZXJzKHBhcnNlZF9yZXNwb25zZSk7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSB0aGlzLnByZXByb2Nlc3NMYXllcnMobGF5ZXJzKTtcbiAgICB9XG5cbiAgICBwcmVwcm9jZXNzTGF5ZXJzIChsYXllcnMpe1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbGF5ZXJzKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSBsYXllcnNba2V5XTtcbiAgICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc0ZlYXR1cmVzKGxheWVyLmZlYXR1cmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIGRhdGEgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhsYXllcnMpLmxlbmd0aCA9PT0gMSAmJiBsYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMuX2RlZmF1bHQgPSB0aGlzLnRyYW5zZm9ybShsYXllcnMuX2RlZmF1bHQsIHRoaXMuZXh0cmFfZGF0YSk7IC8vIHNpbmdsZS1sYXllclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzID0gdGhpcy50cmFuc2Zvcm0obGF5ZXJzLCB0aGlzLmV4dHJhX2RhdGEpOyAvLyBtdWx0aXBsZSBsYXllcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLy8gUHJlcHJvY2VzcyBmZWF0dXJlcy4gQ3VycmVudGx5IHVzZWQgdG8gYWRkIGEgbmV3IFwiY2VudHJvaWRcIiBmZWF0dXJlIGZvciBwb2x5Z29uIGxhYmVsaW5nXG4gICAgcHJlcHJvY2Vzc0ZlYXR1cmVzIChmZWF0dXJlcykge1xuICAgICAgICAvLyBEZWZpbmUgY2VudHJvaWRzIGZvciBwb2x5Z29ucyBmb3IgY2VudHJvaWQgbGFiZWwgcGxhY2VtZW50XG4gICAgICAgIC8vIEF2b2lkcyByZWR1bmRhbnQgbGFiZWwgcGxhY2VtZW50IGZvciBlYWNoIGdlbmVyYXRlZCB0aWxlIGF0IGhpZ2hlciB6b29tIGxldmVsc1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZ2VuZXJhdGVfbGFiZWxfY2VudHJvaWRzKXtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlc19jZW50cm9pZCA9IFtdO1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkX3Byb3BlcnRpZXMgPSB7XCJsYWJlbF9wbGFjZW1lbnRcIiA6IHRydWV9O1xuXG4gICAgICAgICAgICBmZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlcywgY2VudHJvaWRfZmVhdHVyZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkX2ZlYXR1cmUgPSBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uKGNvb3JkaW5hdGVzLCBmZWF0dXJlLnByb3BlcnRpZXMsIGNlbnRyb2lkX3Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNfY2VudHJvaWQucHVzaChjZW50cm9pZF9mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNlbnRyb2lkIGZlYXR1cmUgZm9yIGxhcmdlc3QgcG9seWdvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9hcmVhID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9hcmVhX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb29yZGluYXRlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJlYSA9IEdlby5wb2x5Z29uQXJlYShjb29yZGluYXRlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmVhID4gbWF4X2FyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYXJlYV9pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkX2ZlYXR1cmUgPSBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uKGNvb3JkaW5hdGVzW21heF9hcmVhX2luZGV4XSwgZmVhdHVyZS5wcm9wZXJ0aWVzLCBjZW50cm9pZF9wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzX2NlbnRyb2lkLnB1c2goY2VudHJvaWRfZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gYXBwZW5kIGNlbnRyb2lkIGZlYXR1cmVzIHRvIGZlYXR1cmVzIGFycmF5XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShmZWF0dXJlcywgZmVhdHVyZXNfY2VudHJvaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBzaW5nbGUgb3IgbXVsdGlwbGUgbGF5ZXJzIGluIHJldHVybmVkIGRhdGFcbiAgICBnZXRMYXllcnMgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9kZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbZGF0YV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfZGVmYXVsdDogZGF0YVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbi8qKlxuIEdlb0pTT04gdmVjdG9yIHRpbGVzXG4gQGNsYXNzIEdlb0pTT05UaWxlU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05UaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIFVSTCB0aWxlIHBhdHRlcm4sIGlmIG5vdCBmb3VuZCwgdHJlYXQgYXMgc3RhbmRhbG9uZSBHZW9KU09OL1RvcG9KU09OIG9iamVjdFxuICAgICAgICBpZiAoIXRoaXMudXJsSGFzVGlsZVBhdHRlcm4odGhpcy51cmwpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpbnN0YW5jZSB0eXBlIGZyb20gcGFyZW50IGNsYXNzXG4gICAgICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09ICdHZW9KU09OJykge1xuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgaW5zdGFuY2UgdHlwZVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2VvSlNPTlNvdXJjZShzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyBiYWNrIHRvIHBhcmVudCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnByZXBhcmVHZW9KU09OKGRhdGEsIHRpbGUsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHJlcGFyZUdlb0pTT04gKGRhdGEsIHRpbGUsIHNvdXJjZSkge1xuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy50cmFuc2Zvcm0oZGF0YSwgdGhpcy5leHRyYV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBHZW9KU09OU291cmNlLnByb3RvdHlwZS5nZXRMYXllcnMoZGF0YSk7XG5cbiAgICAgICAgLy8gQSBcInN5bnRoZXRpY1wiIHRpbGUgdGhhdCBhZGp1c3RzIHRoZSB0aWxlIG1pbiBhbmNob3IgdG8gYWNjb3VudCBmb3IgdGlsZSBsb25naXR1ZGUgd3JhcHBpbmdcbiAgICAgICAgbGV0IGFuY2hvciA9IHtcbiAgICAgICAgICAgIGNvb3JkczogdGlsZS5jb29yZHMsXG4gICAgICAgICAgICBtaW46IEdlby5tZXRlcnNGb3JUaWxlKEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pKVxuICAgICAgICB9O1xuXG4gICAgICAgIERhdGFTb3VyY2UucHJvamVjdERhdGEoc291cmNlKTsgLy8gbWVyY2F0b3IgcHJvamVjdGlvblxuICAgICAgICBEYXRhU291cmNlLnNjYWxlRGF0YShzb3VyY2UsIGFuY2hvcik7IC8vIHJlLXNjYWxlIGZyb20gbWV0ZXJzIHRvIGxvY2FsIHRpbGUgY29vcmRzXG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoR2VvSlNPTlRpbGVTb3VyY2UsICdHZW9KU09OJyk7ICAgICAgLy8gcHJlZmVyZWQgc2hvcnRlciBuYW1lXG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgY2VudHJvaWQgcG9pbnQgZmVhdHVyZSBmcm9tIHBvbHlnb24gY29vcmRpbmF0ZXMgYW5kIHByb3ZpZGVkIGZlYXR1cmUgbWV0YS1kYXRhXG5mdW5jdGlvbiBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uIChjb29yZGluYXRlcywgcHJvcGVydGllcywgbmV3UHJvcGVydGllcykge1xuICAgIGxldCBjZW50cm9pZCA9IEdlby5jZW50cm9pZChjb29yZGluYXRlcyk7XG5cbiAgICAvLyBjbG9uZSBwcm9wZXJ0aWVzIGFuZCBtaXhpeCBuZXdQcm9wZXJ0aWVzXG4gICAgbGV0IGNlbnRyb2lkX3Byb3BlcnRpZXMgPSB7fTtcbiAgICBPYmplY3QuYXNzaWduKGNlbnRyb2lkX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIHByb3BlcnRpZXM6IGNlbnRyb2lkX3Byb3BlcnRpZXMsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiBcIlBvaW50XCIsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY2VudHJvaWRcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuaW1wb3J0IFBiZiBmcm9tICdwYmYnO1xuaW1wb3J0IHtWZWN0b3JUaWxlLCBWZWN0b3JUaWxlRmVhdHVyZX0gZnJvbSAndmVjdG9yLXRpbGUnO1xuXG4vKipcbiBNYXBib3ggVmVjdG9yIFRpbGUgZm9ybWF0XG4gQGNsYXNzIE1WVFNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBNVlRTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VfdHlwZSA9IFwiYXJyYXlidWZmZXJcIjsgLy8gYmluYXJ5IGRhdGFcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgLy8gQ29udmVydCBNYXBib3ggdmVjdG9yIHRpbGUgdG8gR2VvSlNPTlxuICAgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBQYmYoZGF0YSk7XG4gICAgICAgIHNvdXJjZS5kYXRhID0gbmV3IFZlY3RvclRpbGUoYnVmZmVyKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMudG9HZW9KU09OKHNvdXJjZS5kYXRhKTtcblxuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy50cmFuc2Zvcm0oc291cmNlLmxheWVycywgdGhpcy5leHRyYV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBzb3VyY2UuZGF0YTsgLy8gY29tbWVudCBvdXQgdG8gc2F2ZSByYXcgZGF0YSBmb3IgZGVidWdnaW5nXG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGxheWVycy9mZWF0dXJlcyB1c2luZyBNYXBib3ggbGliIEFQSSwgY29udmVydCB0byBHZW9KU09OIGZlYXR1cmVzXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBrZXlzIGZvciBlYWNoIGxheWVyLCBlLmcuIHsgbGF5ZXI6IGdlb2pzb24gfVxuICAgIHRvR2VvSlNPTiAodGlsZSkge1xuICAgICAgICB2YXIgbGF5ZXJzID0ge307XG4gICAgICAgIGZvciAodmFyIGwgaW4gdGlsZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBsYXllciA9IHRpbGUubGF5ZXJzW2xdO1xuICAgICAgICAgICAgdmFyIHNjYWxlID0gR2VvLnRpbGVfc2NhbGUgLyBsYXllci5leHRlbnQ7XG4gICAgICAgICAgICB2YXIgbGF5ZXJfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgZj0wOyBmIDwgbGF5ZXIubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoZik7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlX2dlb2pzb24uZ2VvbWV0cnk7XG4gICAgICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5sb2FkR2VvbWV0cnkoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByPTA7IHIgPCBjb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGNvb3JkaW5hdGVzW3JdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCByaW5nLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueCAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueSAqIHNjYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG5cbiAgICAgICAgICAgICAgICBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ1BvaW50JztcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlc1swXVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IGRlY29kZU11bHRpUG9seWdvbihnZW9tZXRyeSk7IC8vIHVuLWZsYXR0ZW4gcmluZ3NcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXllcl9nZW9qc29uLmZlYXR1cmVzLnB1c2goZmVhdHVyZV9nZW9qc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxheWVyc1tsXSA9IGxheWVyX2dlb2pzb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbn1cblxuLy8gRGVjb2RlIG11bHRpcG9seWdvbnMsIHdoaWNoIGFyZSBlbmNvZGVkIGFzIGEgc2luZ2xlIHNldCBvZiByaW5nc1xuLy8gV2luZGluZyBvcmRlciBvZiBmaXJzdCByaW5nIGlzIGFzc3VtZWQgdG8gaW5kaWNhdGUgZXh0ZXJpb3IgcmluZyxcbi8vIHRoZSBvcHBvc2l0ZSB3aW5kaW5nIG9yZGVyIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYSBuZXcgcG9seWdvbi5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVNdWx0aVBvbHlnb24gKGdlb20pIHtcbiAgICBsZXQgcG9seXMgPSBbXTtcbiAgICBsZXQgcG9seSA9IFtdO1xuICAgIGxldCBvdXRlcl93aW5kaW5nO1xuICAgIGZvciAobGV0IHI9MDsgciA8IGdlb20uY29vcmRpbmF0ZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgbGV0IHJpbmcgPSBnZW9tLmNvb3JkaW5hdGVzW3JdO1xuICAgICAgICBsZXQgd2luZGluZyA9IEdlby5yaW5nV2luZGluZyhyaW5nKTtcbiAgICAgICAgaWYgKHdpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgemVyby1hcmVhIHJpbmdzXG4gICAgICAgIH1cblxuICAgICAgICBvdXRlcl93aW5kaW5nID0gb3V0ZXJfd2luZGluZyB8fCB3aW5kaW5nOyAvLyBhc3N1bWUgZmlyc3QgcmluZyBpbmRpY2F0ZXMgb3V0ZXIgcmluZyB3aW5kaW5nXG5cbiAgICAgICAgaWYgKHdpbmRpbmcgPT09IG91dGVyX3dpbmRpbmcgJiYgcG9seS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwb2x5cy5wdXNoKHBvbHkpO1xuICAgICAgICAgICAgcG9seSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHBvbHkucHVzaChyaW5nKTtcbiAgICB9XG4gICAgaWYgKHBvbHkubGVuZ3RoID4gMCkge1xuICAgICAgICBwb2x5cy5wdXNoKHBvbHkpO1xuICAgIH1cblxuICAgIC8vIFNpbmdsZSBvciBtdWx0aT9cbiAgICBpZiAocG9seXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGdlb20udHlwZSA9ICdQb2x5Z29uJztcbiAgICAgICAgZ2VvbS5jb29yZGluYXRlcyA9IHBvbHlzWzBdO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb2x5cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGdlb20udHlwZSA9ICdNdWx0aVBvbHlnb24nO1xuICAgICAgICBnZW9tLmNvb3JkaW5hdGVzID0gcG9seXM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnZW9tID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2VvbTtcbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihNVlRTb3VyY2UsICdNVlQnKTtcbiIsImltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vdGlsZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBjbGFzcyBSYXN0ZXJUaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMucmFzdGVycy5pbmRleE9mKHRoaXMubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJhc3RlcnMudW5zaGlmdCh0aGlzLm5hbWUpOyAvLyBhZGQgdGhpcyByYXN0ZXIgYXMgdGhlIGZpcnN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSBzb3VyY2UuZmlsdGVyaW5nOyAvLyBvcHRpb25hbCB0ZXh0dXJlIGZpbHRlcmluZyAobmVhcmVzdCwgbGluZWFyLCBtaXBtYXApXG5cbiAgICAgICAgLy8gc2F2ZSB0ZXh0dXJlIG9iamVjdHMgYnkgdGlsZSBrZXksIHNvIFVSTCByZW1haW5zIHN0YWJsZSBpZiB0aWxlIGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzLFxuICAgICAgICAvLyBlLmcuIGF2b2lkIHJlLWxvYWRpbmcgdGhlIHNhbWUgdGlsZSB0ZXh0dXJlIHVuZGVyIGEgZGlmZmVyZW50IHN1YmRvbWFpbiB3aGVuIHVzaW5nIHRpbGUgaG9zdHNcbiAgICAgICAgdGhpcy50ZXh0dXJlcyA9IHt9O1xuICAgIH1cblxuICAgIGxvYWQodGlsZSkge1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIHRpbGUucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIHRpbGUucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYSBzaW5nbGUgcXVhZCB0aGF0IGZpbGxzIHRoZSBlbnRpcmUgdGlsZVxuICAgICAgICBsZXQgc2NhbGUgPSBHZW8udGlsZV9zY2FsZTtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5sYXllcnMgPSB7XG4gICAgICAgICAgICBfZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlczogW1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMF0sIFtzY2FsZSwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NjYWxlLCAtc2NhbGVdLCBbMCwgLXNjYWxlXSwgWzAsIDBdXG4gICAgICAgICAgICAgICAgICAgICAgICBdXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7fVxuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGlsZS5kZWZhdWx0X3dpbmRpbmcgPSAnQ1cnO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0ZXh0dXJlIGluZm8gZm9yIGEgcmFzdGVyIHRpbGVcbiAgICB0aWxlVGV4dHVyZSAodGlsZSkge1xuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZXNba2V5XSkge1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKHRpbGUuY29vcmRzLCB0aGlzLm1heF96b29tKTtcbiAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmZvcm1hdFVybCh0aGlzLnVybCwgeyBjb29yZHMgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzW2tleV0gPSB7IHVybCwgZmlsdGVyaW5nOiB0aGlzLmZpbHRlcmluZywgY29vcmRzIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZXNba2V5XTtcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihSYXN0ZXJUaWxlU291cmNlLCAnUmFzdGVyJyk7XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCB7R2VvSlNPTlNvdXJjZSwgR2VvSlNPTlRpbGVTb3VyY2V9IGZyb20gJy4vZ2VvanNvbic7XG5cbmltcG9ydCAqIGFzIHRvcG9qc29uIGZyb20gJ3RvcG9qc29uLWNsaWVudCc7XG5cbi8qKlxuIFRvcG9KU09OIHN0YW5kYWxvbmUgKG5vbi10aWxlZCkgc291cmNlXG4gVXNlcyBnZW9qc29uLXZ0IHNwbGl0IGludG8gdGlsZXMgY2xpZW50LXNpZGVcbiovXG5cbmV4cG9ydCBjbGFzcyBUb3BvSlNPTlNvdXJjZSBleHRlbmRzIEdlb0pTT05Tb3VyY2Uge1xuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGRhdGEgPSB0aGlzLnRvR2VvSlNPTihkYXRhKTtcblxuICAgICAgICBsZXQgbGF5ZXJzID0gdGhpcy5nZXRMYXllcnMoZGF0YSk7XG4gICAgICAgIHN1cGVyLnByZXByb2Nlc3NMYXllcnMobGF5ZXJzKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IGxheWVycztcbiAgICB9XG5cbiAgICB0b0dlb0pTT04gKGRhdGEpIHtcbiAgICAgICAgLy8gU2luZ2xlIGxheWVyXG4gICAgICAgIGlmIChkYXRhLm9iamVjdHMgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGEub2JqZWN0cykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSBPYmplY3Qua2V5cyhkYXRhLm9iamVjdHMpWzBdO1xuICAgICAgICAgICAgZGF0YSA9IGdldFRvcG9KU09ORmVhdHVyZShkYXRhLCBkYXRhLm9iamVjdHNbbGF5ZXJdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNdWx0aXBsZSBsYXllcnNcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXJzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YS5vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzW2tleV0gPSBnZXRUb3BvSlNPTkZlYXR1cmUoZGF0YSwgZGF0YS5vYmplY3RzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YSA9IGxheWVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbn1cblxuZnVuY3Rpb24gZ2V0VG9wb0pTT05GZWF0dXJlICh0b3BvbG9neSwgb2JqZWN0KSB7XG4gICAgbGV0IGZlYXR1cmUgPSB0b3BvanNvbi5mZWF0dXJlKHRvcG9sb2d5LCBvYmplY3QpO1xuXG4gICAgLy8gQ29udmVydCBzaW5nbGUgZmVhdHVyZSB0byBhIGZlYXR1cmUgY29sbGVjdGlvblxuICAgIGlmIChmZWF0dXJlLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICBmZWF0dXJlID0ge1xuICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbZmVhdHVyZV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cblxuLyoqXG4gVG9wb0pTT04gdmVjdG9yIHRpbGVzXG4gQGNsYXNzIFRvcG9KU09OVGlsZVNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBUb3BvSlNPTlRpbGVTb3VyY2UgZXh0ZW5kcyBHZW9KU09OVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICAvLyBSZXBsYWNlIHdpdGggbm9uLXRpbGVkIHNvdXJjZSBpZiB0aWxlZCBzb3VyY2UgZmFpbGVkIHRvIGluc3RhbnRpYXRlXG4gICAgICAgIGlmICghdGhpcy51cmxIYXNUaWxlUGF0dGVybih0aGlzLnVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVG9wb0pTT05Tb3VyY2Uoc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBkYXRhID0gVG9wb0pTT05Tb3VyY2UucHJvdG90eXBlLnRvR2VvSlNPTihkYXRhKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlR2VvSlNPTihkYXRhLCB0aWxlLCBzb3VyY2UpO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKFRvcG9KU09OVGlsZVNvdXJjZSwgJ1RvcG9KU09OJyk7ICAgICAgICAvLyBwcmVmZXJlZCBzaG9ydGVyIG5hbWVcbiIsImZ1bmN0aW9uIG5vdE51bGwoeCkgIHsgcmV0dXJuIHggIT0gbnVsbDsgfVxuZnVuY3Rpb24gd3JhcCh4KSAgICAgeyByZXR1cm4gJygnICsgeCArICcpJzt9XG5cbmZ1bmN0aW9uIG1heWJlUXVvdGUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBsb29rVXAoa2V5KSB7XG4gICAgaWYgKGtleVswXSA9PT0gJyQnKSB7XG4gICAgICAgIHJldHVybiAnY29udGV4dFtcXCcnICsga2V5LnN1YnN0cmluZygxKSArICdcXCddJztcbiAgICB9XG4gICAgcmV0dXJuICdjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tcXCcnICsga2V5ICsgJ1xcJ10nO1xufVxuXG5mdW5jdGlvbiBudWxsVmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiAnIHRydWUgJztcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlFcXVhbChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobWF5YmVRdW90ZSh2YWx1ZSkgKyAnID09PSAnICsgbG9va1VwKGtleSkpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU9yKGtleSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWVzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gcHJvcGVydHlFcXVhbChrZXksIHgpOyB9KS5qb2luKCcgfHwgJykpO1xufVxuXG5mdW5jdGlvbiBwcmludE5lc3RlZCh2YWx1ZXMsIGpvaW5lcikge1xuICAgIHJldHVybiB3cmFwKHZhbHVlcy5maWx0ZXIobm90TnVsbCkubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB3cmFwKHguam9pbignICYmICcpKTtcbiAgICB9KS5qb2luKCcgJyArIGpvaW5lciArICcgJykpO1xufVxuXG5mdW5jdGlvbiBhbnkoXywgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApID8gcHJpbnROZXN0ZWQodmFsdWVzLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBwYXJzZUZpbHRlcih2LCBvcHRpb25zKTsgfSksICd8fCcpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBhbGwoXywgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApID8gcHJpbnROZXN0ZWQodmFsdWVzLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBwYXJzZUZpbHRlcih2LCBvcHRpb25zKTsgfSksICcmJicpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBub3Qoa2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKHBhcnNlRmlsdGVyKHZhbHVlLCBvcHRpb25zKS5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBub25lKGtleSwgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICchJyArIHdyYXAoYW55KG51bGwsIHZhbHVlcywgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU1hdGNoZXNCb29sZWFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChsb29rVXAoa2V5KSArICh2YWx1ZSA/ICcgIT0gJyA6ICcgPT0gJykgICsgJ251bGwnKTtcbn1cblxuZnVuY3Rpb24gcmFuZ2VNYXRjaChrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuICAgIHZhciB0cmFuc2Zvcm0gPSBvcHRpb25zICYmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZVRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgJiYgb3B0aW9ucy5yYW5nZVRyYW5zZm9ybTtcblxuICAgIGlmICh2YWx1ZXMubWF4KSB7XG4gICAgICAgIHZhciBtYXggPSB0cmFuc2Zvcm0gPyB0cmFuc2Zvcm0odmFsdWVzLm1heCkgOiB2YWx1ZXMubWF4O1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnIDwgJyArIG1heCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5taW4pIHtcbiAgICAgICAgdmFyIG1pbiA9IHRyYW5zZm9ybSA/IG1pbiA9IHRyYW5zZm9ybSh2YWx1ZXMubWluKSA6IHZhbHVlcy5taW47XG4gICAgICAgIGV4cHJlc3Npb25zLnB1c2goJycgKyBsb29rVXAoa2V5KSArICcgPj0gJyArIG1pbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXAoZXhwcmVzc2lvbnMuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgdmFyIGZpbHRlckFTVCA9IFtdO1xuXG4gICAgLy8gRnVuY3Rpb24gZmlsdGVyXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFt3cmFwKGZpbHRlci50b1N0cmluZygpICsgJyhjb250ZXh0KScpXTtcbiAgICB9XG4gICAgLy8gQXJyYXkgZmlsdGVyLCBpbXBsaWNpdCAnYW55J1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICByZXR1cm4gW2FueShudWxsLCBmaWx0ZXIsIG9wdGlvbnMpXTtcbiAgICB9XG4gICAgLy8gTnVsbCBmaWx0ZXIgb2JqZWN0XG4gICAgZWxzZSBpZiAoZmlsdGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFsndHJ1ZSddO1xuICAgIH1cblxuICAgIC8vIE9iamVjdCBmaWx0ZXIsIGUuZy4gaW1wbGljaXQgJ2FsbCdcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZpbHRlcik7XG4gICAgZm9yICh2YXIgaz0wOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1trXTtcblxuICAgICAgICB2YXIgdmFsdWUgPSBmaWx0ZXJba2V5XSxcbiAgICAgICAgICAgIHR5cGUgID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5RXF1YWwoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm90Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gobm90KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbnknKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbnkoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKGFsbChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vbmUoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eU9yKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUubWF4IHx8IHZhbHVlLm1pbikge1xuICAgICAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHJhbmdlTWF0Y2goa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG51bGxWYWx1ZShrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gUXVlcnkgc3l0bmF4OiAnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID09PSAwID8gWyd0cnVlJ10gOiBmaWx0ZXJBU1Q7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclRvU3RyaW5nKGZpbHRlckFTVCkge1xuICAgIHJldHVybiB3cmFwKGZpbHRlckFTVC5qb2luKCcgJiYgJykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKGZpbHRlciA9PSBudWxsKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9OyB9XG4gICAgLy8ganNoaW50IGV2aWw6IHRydWVcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ3JldHVybiAnICsgZmlsdGVyVG9TdHJpbmcocGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSkgKyAnOycpO1xufVxuIiwiaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHtidWlsZEZpbHRlcn0gZnJvbSAnLi9maWx0ZXInO1xuXG5leHBvcnQgY29uc3Qgd2hpdGVMaXN0ID0gWydmaWx0ZXInLCAnZHJhdycsICd2aXNpYmxlJywgJ2RhdGEnXTtcblxuZXhwb3J0IGNvbnN0IGxheWVyX2NhY2hlID0ge307XG5cbmZ1bmN0aW9uIGNhY2hlS2V5IChsYXllcnMpIHtcbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGsgPSBsYXllcnNbMF07XG4gICAgICAgIGZvciAodmFyIGk9MTsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgayArPSAnLycgKyBsYXllcnNbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaztcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyc1swXTtcbn1cblxuLy8gTWVyZ2UgbWF0Y2hpbmcgbGF5ZXIgdHJlZXMgaW50byBhIGZpbmFsIGRyYXcgZ3JvdXBcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRyZWVzKG1hdGNoaW5nVHJlZXMsIGdyb3VwKSB7XG4gICAgbGV0IGRyYXdzLCB0cmVlRGVwdGggPSAwO1xuXG4gICAgbGV0IGRyYXcgPSB7XG4gICAgICAgIHZpc2libGU6IHRydWUgLy8gdmlzaWJsZSBieSBkZWZhdWx0XG4gICAgfTtcblxuICAgIC8vIEZpbmQgZGVlcGVzdCB0cmVlXG4gICAgZm9yIChsZXQgdD0wOyB0IDwgbWF0Y2hpbmdUcmVlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICBpZiAobWF0Y2hpbmdUcmVlc1t0XS5sZW5ndGggPiB0cmVlRGVwdGgpIHtcbiAgICAgICAgICAgIHRyZWVEZXB0aCA9IG1hdGNoaW5nVHJlZXNbdF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gbGF5ZXJzIHRvIHBhcnNlXG4gICAgaWYgKHRyZWVEZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRyZWVzIGluIHBhcmFsbGVsXG4gICAgZm9yIChsZXQgeD0wOyB4IDwgdHJlZURlcHRoOyB4KyspIHtcbiAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHJlcXVlc3RlZCBkcmF3IGdyb3VwLCBmb3IgZWFjaCB0cmVlLCBhdCB0aGlzIGRlcHRoXG4gICAgICAgIGRyYXdzID0gbWF0Y2hpbmdUcmVlcy5tYXAodHJlZSA9PiB0cmVlW3hdICYmIHRyZWVbeF1bZ3JvdXBdKTtcbiAgICAgICAgaWYgKGRyYXdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IGJ5IGxheWVyIG5hbWUgYmVmb3JlIG1lcmdpbmcsIHNvIGxheWVycyBhcmUgYXBwbGllZCBkZXRlcm1pbmlzdGljYWxseVxuICAgICAgICAvLyB3aGVuIG11bHRpcGxlIGxheWVycyBtb2RpZnkgdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgICBkcmF3cy5zb3J0KChhLCBiKSA9PiAoYSAmJiBhLmxheWVyX25hbWUpID4gKGIgJiYgYi5sYXllcl9uYW1lKSA/IDEgOiAtMSk7XG5cbiAgICAgICAgLy8gTWVyZ2UgZHJhdyBvYmplY3RzXG4gICAgICAgIG1lcmdlT2JqZWN0cyhkcmF3LCAuLi5kcmF3cyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGxheWVyIG5hbWVzLCB0aGV5IHdlcmUgb25seSB1c2VkIHRyYW5zaWVudGx5IHRvIHNvcnQgYW5kIGNhbGN1bGF0ZSBmaW5hbCBsYXllclxuICAgICAgICAvLyAoZmluYWwgbWVyZ2VkIG5hbWVzIHdpbGwgbm90IGJlIGFjY3VyYXRlIHNpbmNlIG9ubHkgb25lIHRyZWUgY2FuIHdpbilcbiAgICAgICAgZGVsZXRlIGRyYXcubGF5ZXJfbmFtZTtcbiAgICB9XG5cbiAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIG5vdCB2aXNpYmxlXG4gICAgaWYgKGRyYXcudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYXc7XG59XG5cbmNvbnN0IGJsYWNrbGlzdCA9IFsnYW55JywgJ2FsbCcsICdub3QnLCAnbm9uZSddO1xuXG5jbGFzcyBMYXllciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IGxheWVyLCBuYW1lLCBwYXJlbnQsIGRyYXcsIHZpc2libGUsIGZpbHRlciB9KSB7XG4gICAgICAgIHRoaXMuaWQgPSBMYXllci5pZCsrO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGxheWVyO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5mdWxsX25hbWUgPSB0aGlzLnBhcmVudCA/ICh0aGlzLnBhcmVudC5mdWxsX25hbWUgKyAnOicgKyB0aGlzLm5hbWUpIDogdGhpcy5uYW1lO1xuICAgICAgICB0aGlzLmRyYXcgPSBkcmF3O1xuICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgdGhpcy5pc19idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlICE9PSB1bmRlZmluZWQgPyB2aXNpYmxlIDogKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnZpc2libGUpO1xuXG4gICAgICAgIC8vIERlbm9ybWFsaXplIGxheWVyIG5hbWUgdG8gZHJhdyBncm91cHNcbiAgICAgICAgaWYgKHRoaXMuZHJhdykge1xuICAgICAgICAgICAgZm9yIChsZXQgZ3JvdXAgaW4gdGhpcy5kcmF3KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhd1tncm91cF0gPT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5kcmF3W2dyb3VwXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgRHJhdyBncm91cCAnJHtncm91cH0nIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBtdXN0IGJlIGFuIG9iamVjdCwgYDtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGBidXQgd2FzIHNldCB0byBcXGAke2dyb3VwfTogJHt0aGlzLmRyYXdbZ3JvdXBdfVxcYCBpbnN0ZWFkYDtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG5cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZHJhd1tncm91cF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdbZ3JvdXBdLmxheWVyX25hbWUgPSB0aGlzLmZ1bGxfbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZCAoKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCBgQnVpbGRpbmcgbGF5ZXIgJyR7dGhpcy5mdWxsX25hbWV9J2ApO1xuICAgICAgICB0aGlzLmJ1aWxkRmlsdGVyKCk7XG4gICAgICAgIHRoaXMuYnVpbGREcmF3KCk7XG4gICAgICAgIHRoaXMuaXNfYnVpbHQgPSB0cnVlO1xuICAgIH1cblxuICAgIGJ1aWxkRHJhdygpIHtcbiAgICAgICAgdGhpcy5kcmF3ID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKHRoaXMuZHJhdywgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkRHJhdyA9IGNhbGN1bGF0ZURyYXcodGhpcyk7XG4gICAgfVxuXG4gICAgYnVpbGRGaWx0ZXIoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyX29yaWdpbmFsID0gdGhpcy5maWx0ZXI7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKHRoaXMuZmlsdGVyLCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuXG4gICAgICAgIGxldCB0eXBlID0gdHlwZW9mIHRoaXMuZmlsdGVyO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCAmJiB0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbHRlclxuICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIGZpbHRlciB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdCBvciBmdW5jdGlvbiwgYDtcbiAgICAgICAgICAgIG1zZyArPSBgYnV0IHdhcyBzZXQgdG8gXFxgZmlsdGVyOiAke3RoaXMuZmlsdGVyfVxcYCBpbnN0ZWFkYDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRab29tcygpO1xuICAgICAgICAgICAgdGhpcy5idWlsZFByb3BNYXRjaGVzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCAmJiAodHlwZW9mIHRoaXMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gYnVpbGRGaWx0ZXIodGhpcy5maWx0ZXIsIEZpbHRlck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgZmlsdGVyXG4gICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgXFxgZmlsdGVyOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyKX1cXGAgYDtcbiAgICAgICAgICAgIG1zZyArPSBgZmFpbGVkIHdpdGggZXJyb3IgJyR7ZS5tZXNzYWdlfScsIHN0YWNrIHRyYWNlOiAke2Uuc3RhY2t9YDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gWm9vbXMgb2Z0ZW4gY3VsbCBsYXJnZSBzd2F0aHMgb2YgdGhlIGxheWVyIHRyZWUsIHNvIHRoZXkgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGFuZCBhcmUgY2hlY2tlZCBmaXJzdFxuICAgIGJ1aWxkWm9vbXMoKSB7XG4gICAgICAgIGxldCB6b29tID0gdGhpcy5maWx0ZXIgJiYgdGhpcy5maWx0ZXIuJHpvb207XG4gICAgICAgIGxldCB6dHlwZSA9IHR5cGVvZiB6b29tO1xuICAgICAgICBpZiAoem9vbSAhPSBudWxsICYmIHp0eXBlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IGFjY2VsZXJhdGUgZnVuY3Rpb24tYmFzZWQgZmlsdGVyc1xuICAgICAgICAgICAgdGhpcy56b29tcyA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoenR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy56b29tc1t6b29tXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHpvb20pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgej0wOyB6IDwgem9vbS5sZW5ndGg7IHorKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pvb21bel1dID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh6dHlwZSA9PT0gJ29iamVjdCcgJiYgKHpvb20ubWluICE9IG51bGwgfHwgem9vbS5tYXggIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgem1pbiA9IHpvb20ubWluIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IHptYXggPSB6b29tLm1heCB8fCAyNTsgLy8gVE9ETzogcmVwbGFjZSBjb25zdGFudCBmb3IgbWF4IHBvc3NpYmxlIHpvb21cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6PXptaW47IHogPCB6bWF4OyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tc1t6XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXIuJHpvb207IC8vIGRvbid0IHByb2Nlc3Mgem9vbSB0aHJvdWdoIHVzdWFsIGdlbmVyaWMgZmlsdGVyIGxvZ2ljXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZFByb3BNYXRjaGVzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyIHx8IEFycmF5LmlzQXJyYXkodGhpcy5maWx0ZXIpIHx8IHR5cGVvZiB0aGlzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChibGFja2xpc3QuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLmZpbHRlcltrZXldO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIShhcnJheSB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChrZXlbMF0gPT09ICckJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb250ZXh0IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMgPSB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzLnB1c2goW2tleS5zdWJzdHJpbmcoMSksIGFycmF5ID8gdmFsIDogW3ZhbF1dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcyA9IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMucHVzaChba2V5LCBhcnJheSA/IHZhbCA6IFt2YWxdXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRvUHJvcE1hdGNoZXMgKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzW3JdO1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1ttYXRjaFswXV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IG1hdGNoWzFdLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlc1tyXTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gY29udGV4dFttYXRjaFswXV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IG1hdGNoWzFdLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGRvZXNNYXRjaCAoY29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNfYnVpbHQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHpvb20gcHJlLWZpbHRlcjogc2tpcCByZXN0IG9mIGZpbHRlciBpZiBvdXQgb2YgbGF5ZXIgem9vbSByYW5nZVxuICAgICAgICBpZiAodGhpcy56b29tcyAhPSBudWxsICYmICF0aGlzLnpvb21zW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRpcmVjdCBmZWF0dXJlIHByb3BlcnR5IG1hdGNoZXNcbiAgICAgICAgaWYgKCF0aGlzLmRvUHJvcE1hdGNoZXMoY29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFueSByZW1haW5pbmcgZmlsdGVyIChtb3JlIGNvbXBsZXggbWF0Y2hlcyBvciBkeW5hbWljIGZ1bmN0aW9uKVxuICAgICAgICBpZiAodGhpcy5maWx0ZXIgaW5zdGFuY2VvZiBGdW5jdGlvbil7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEZpbHRlciBmdW5jdGlvbiBlcnJvclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciB0aGlzICR7dGhpcy5mdWxsX25hbWV9OiBcXGBmaWx0ZXI6ICR7dGhpcy5maWx0ZXJfb3JpZ2luYWx9XFxgIGA7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBmYWlsZWQgd2l0aCBlcnJvciAnJHtlcnJvci5tZXNzYWdlfScsIHN0YWNrIHRyYWNlOiAke2Vycm9yLnN0YWNrfWA7XG4gICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1zZywgY29udGV4dC5mZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlciA9PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbkxheWVyLmlkID0gMDtcblxuXG5leHBvcnQgY2xhc3MgTGF5ZXJMZWFmIGV4dGVuZHMgTGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgdGhpcy5pc19sZWFmID0gdHJ1ZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIExheWVyVHJlZSBleHRlbmRzIExheWVyIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXNfdHJlZSA9IHRydWU7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gY29uZmlnLmxheWVycyB8fCBbXTtcbiAgICB9XG5cbiAgICBhZGRMYXllciAobGF5ZXIpIHtcbiAgICAgICAgdGhpcy5sYXllcnMucHVzaChsYXllcik7XG4gICAgfVxuXG4gICAgYnVpbGREcmF3R3JvdXBzIChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXllcnMgPSBbXSwgbGF5ZXJfaWRzID0gW107XG4gICAgICAgIG1hdGNoRmVhdHVyZShjb250ZXh0LCBbdGhpc10sIGxheWVycywgbGF5ZXJfaWRzKTtcblxuICAgICAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjYWNoZV9rZXkgPSBjYWNoZUtleShsYXllcl9pZHMpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGV2YWx1YXRlIGVhY2ggbGF5ZXIgY29tYmluYXRpb24gb25jZSAodW5kZWZpbmVkIG1lYW5zIG5vdCB5ZXQgZXZhbHVhdGVkLFxuICAgICAgICAgICAgLy8gbnVsbCBtZWFucyBldmFsdWF0ZWQgd2l0aCBubyBkcmF3IG9iamVjdClcbiAgICAgICAgICAgIGlmIChsYXllcl9jYWNoZVtjYWNoZV9rZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCB0aGUgdW5pcXVlIHZpc2libGUgZHJhdyBibG9ja3MgZm9yIHRoaXMgbGF5ZXIgdHJlZVxuICAgICAgICAgICAgICAgIGxldCBkcmF3X2dyb3VwcyA9IGxheWVycy5tYXAoeCA9PiB4ICYmIHgudmlzaWJsZSAhPT0gZmFsc2UgJiYgeC5jYWxjdWxhdGVkRHJhdyk7XG4gICAgICAgICAgICAgICAgbGV0IGRyYXdfa2V5cyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgZHJhd19ncm91cHMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxheWVyID0gZHJhd19ncm91cHNbcl07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGc9MDsgZyA8IGxheWVyLmxlbmd0aDsgZysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBsYXllcltnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfa2V5c1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGRyYXcgZ3JvdXBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkcmF3X2tleSBpbiBkcmF3X2tleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9IGxheWVyX2NhY2hlW2NhY2hlX2tleV0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldID0gbWVyZ2VUcmVlcyhkcmF3X2dyb3VwcywgZHJhd19rZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2F2ZSB0aGUgb25lcyB0aGF0IHdlcmVuJ3QgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XS5rZXkgPSBjYWNoZV9rZXkgKyAnLycgKyBkcmF3X2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldLmxheWVycyA9IGxheWVycy5tYXAoeCA9PiB4ICYmIHguZnVsbF9uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vIGxheWVycyBldmFsdWF0ZWRcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSAmJiBPYmplY3Qua2V5cyhsYXllcl9jYWNoZVtjYWNoZV9rZXldKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxheWVyX2NhY2hlW2NhY2hlX2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuY29uc3QgRmlsdGVyT3B0aW9ucyA9IHtcbiAgICAvLyBIYW5kbGUgdW5pdCBjb252ZXJzaW9ucyBvbiBmaWx0ZXIgcmFuZ2VzXG4gICAgcmFuZ2VUcmFuc2Zvcm0odmFsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpLnNsaWNlKC0zKSA9PT0gJ3B4MicpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtwYXJzZUZsb2F0KHZhbCl9ICogY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsX3NxYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGlzV2hpdGVMaXN0ZWQoa2V5KSB7XG4gICAgcmV0dXJuIHdoaXRlTGlzdC5pbmRleE9mKGtleSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFByb3BzKG9iaikge1xuICAgIGxldCB3aGl0ZUxpc3RlZCA9IHt9LCBub25XaGl0ZUxpc3RlZCA9IHt9O1xuXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoaXNXaGl0ZUxpc3RlZChrZXkpKSB7XG4gICAgICAgICAgICB3aGl0ZUxpc3RlZFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub25XaGl0ZUxpc3RlZFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt3aGl0ZUxpc3RlZCwgbm9uV2hpdGVMaXN0ZWRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRHJhdyhsYXllcikge1xuXG4gICAgbGV0IGRyYXcgID0gW107XG5cbiAgICBpZiAobGF5ZXIucGFyZW50KSB7XG4gICAgICAgIGxldCBjcyA9IGxheWVyLnBhcmVudC5jYWxjdWxhdGVkRHJhdyB8fCBbXTtcbiAgICAgICAgZHJhdy5wdXNoKC4uLmNzKTtcbiAgICB9XG5cbiAgICBkcmF3LnB1c2gobGF5ZXIuZHJhdyk7XG4gICAgcmV0dXJuIGRyYXc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVyVHJlZShuYW1lLCBsYXllciwgcGFyZW50LCBzdHlsZXMpIHtcblxuICAgIGxldCBwcm9wZXJ0aWVzID0geyBuYW1lLCBsYXllciwgcGFyZW50IH07XG4gICAgbGV0IFt3aGl0ZUxpc3RlZCwgbm9uV2hpdGVMaXN0ZWRdID0gZ3JvdXBQcm9wcyhsYXllcik7XG4gICAgbGV0IGVtcHR5ID0gaXNFbXB0eShub25XaGl0ZUxpc3RlZCk7XG4gICAgbGV0IENyZWF0ZTtcblxuICAgIGlmIChlbXB0eSAmJiBwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICBDcmVhdGUgPSBMYXllckxlYWY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgQ3JlYXRlID0gTGF5ZXJUcmVlO1xuICAgIH1cblxuICAgIGxldCByID0gbmV3IENyZWF0ZShPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIHdoaXRlTGlzdGVkKSk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5hZGRMYXllcihyKTtcbiAgICB9XG5cbiAgICBpZiAoIWVtcHR5KSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBub25XaGl0ZUxpc3RlZCkge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5ID0gbm9uV2hpdGVMaXN0ZWRba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHBhcnNlTGF5ZXJUcmVlKGtleSwgcHJvcGVydHksIHIsIHN0eWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEludmFsaWQgbGF5ZXJcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYExheWVyIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0OiBjYW5ub3QgY3JlYXRlIGxheWVyICcke2tleX06ICR7SlNPTi5zdHJpbmdpZnkocHJvcGVydHkpfSdgO1xuICAgICAgICAgICAgICAgIG1zZyArPSBgLCB1bmRlciBwYXJlbnQgbGF5ZXIgJyR7ci5mdWxsX25hbWV9Jy5gO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBhcmVudCBpcyBhIHN0eWxlIG5hbWUsIHRoaXMgbWF5IGJlIGFuIGluY29ycmVjdGx5IG5lc3RlZCBsYXllclxuICAgICAgICAgICAgICAgIGlmIChzdHlsZXNbci5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCBUaGUgcGFyZW50IG5hbWUgJyR7ci5uYW1lfScgaXMgYWxzbyB0aGUgbmFtZSBvZiBhIHN0eWxlLCBkaWQgeW91IG1lYW4gdG8gY3JlYXRlIGEgJ2RyYXcnIGdyb3VwYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgdW5kZXIgJyR7cGFyZW50Lm5hbWV9J2A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgaW5zdGVhZD9gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJzIChsYXllcnMsIHN0eWxlcykge1xuICAgIGxldCBsYXllcl90cmVlcyA9IHt9O1xuXG4gICAgZm9yIChsZXQga2V5IGluIGxheWVycykge1xuICAgICAgICBsZXQgbGF5ZXIgPSBsYXllcnNba2V5XTtcbiAgICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgICAgICBsYXllcl90cmVlc1trZXldID0gcGFyc2VMYXllclRyZWUoa2V5LCBsYXllciwgbnVsbCwgc3R5bGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcl90cmVlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmVhdHVyZShjb250ZXh0LCBsYXllcnMsIGNvbGxlY3RlZF9sYXllcnMsIGNvbGxlY3RlZF9sYXllcnNfaWRzKSB7XG4gICAgbGV0IG1hdGNoZWQgPSBmYWxzZTtcbiAgICBsZXQgY2hpbGRNYXRjaGVkID0gZmFsc2U7XG5cbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIGZvciAobGV0IHI9MDsgciA8IGxheWVycy5sZW5ndGg7IHIrKykge1xuICAgICAgICBsZXQgY3VycmVudCA9IGxheWVyc1tyXTtcblxuICAgICAgICBpZiAoY3VycmVudC5pc19sZWFmKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5kb2VzTWF0Y2goY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHMucHVzaChjdXJyZW50LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQuaXNfdHJlZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9lc01hdGNoKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBjaGlsZE1hdGNoZWQgPSBtYXRjaEZlYXR1cmUoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkc1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkTWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzLnB1c2goY3VycmVudC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWQ7XG59XG4iLCIvLyBSZW5kZXJzIGFuIGFycmF5IHNwZWNpZnlpbmcgYSBsaW5lIHBhdHRlcm4gb2YgYWx0ZXJuYXRpbmcgZGFzaGVzIGFuZCBzcGFjZXMsXG4vLyBzaW1pbGFyIHRvIGFuIFNWRyBgZGFzaGFycmF5YCBvciBDYW52YXMgc2V0TGluZURhc2goKSwgaW50byBhIGJ5dGUgYXJyYXkgb2YgUkdCQSBwaXhlbHNcbi8vIFJldHVybnM6XG4vLyB7XG4vLyAgICBwaXhlbDogcmVuZGVyZWQgaW1hZ2UgaW4gVWludDhBcnJheSBidWZmZXJcbi8vICAgIGxlbmd0aDogcGl4ZWwgbGVuZ3RoIG9mIHJlbmRlcmVkIGRhc2ggcGF0dGVybiAoc3VtIG9mIGFsbCBkYXNoZXMgYW5kIHNwYWNlcylcbi8vIH1cbi8vXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvU1ZHL3BhaW50aW5nLmh0bWwjU3Ryb2tlRGFzaGFycmF5UHJvcGVydHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NWRy9BdHRyaWJ1dGUvc3Ryb2tlLWRhc2hhcnJheVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC9zZXRMaW5lRGFzaFxuXG5jb25zdCBkZWZhdWx0X2Rhc2hfY29sb3IgPSBbMjU1LCAyNTUsIDI1NSwgMjU1XTtcbmNvbnN0IGRlZmF1bHRfYmFja2dyb3VuZF9jb2xvciA9IFswLCAwLCAwLCAwXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVuZGVyRGFzaEFycmF5IChwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBkYXNoX3BpeGVsID0gb3B0aW9ucy5kYXNoX2NvbG9yIHx8IGRlZmF1bHRfZGFzaF9jb2xvcjtcbiAgICBjb25zdCBiYWNrZ3JvdW5kX2NvbG9yID0gb3B0aW9ucy5iYWNrZ3JvdW5kX2NvbG9yIHx8IGRlZmF1bHRfYmFja2dyb3VuZF9jb2xvcjtcbiAgICBjb25zdCBkYXNoZXMgPSBwYXR0ZXJuO1xuICAgIGNvbnN0IHNjYWxlID0gb3B0aW9ucy5zY2FsZSB8fCAxO1xuXG4gICAgLy8gSWYgcGF0dGVybiBpcyBvZGQsIHJlcGVhdCBpdCB0byBtYWtlIGl0IGV2ZW4gKHNlZSBTVkcgc3BlYylcbiAgICBpZiAoZGFzaGVzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZGFzaGVzLCBkYXNoZXMpO1xuICAgIH1cblxuICAgIGxldCBkYXNoID0gdHJ1ZTtcbiAgICBsZXQgcGl4ZWxzID0gW107XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgZGFzaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gTWF0aC5mbG9vcihkYXNoZXNbaV0gKiBzY2FsZSk7XG4gICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNlZ21lbnQ7IHMrKykge1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocGl4ZWxzLCBkYXNoID8gZGFzaF9waXhlbCA6IGJhY2tncm91bmRfY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGRhc2ggPSAhZGFzaDsgLy8gYWx0ZXJuYXRlIGJldHdlZW4gZGFzaGVzIGFuZCBzcGFjZXNcbiAgICB9XG5cbiAgICBwaXhlbHMgPSBuZXcgVWludDhBcnJheShwaXhlbHMpOyAvLyBjb252ZXJ0IHRvIHR5cGVkIGFycmF5XG4gICAgY29uc3QgbGVuZ3RoID0gcGl4ZWxzLmxlbmd0aCAvIDQ7IC8vIG9uZSBSR0JBIGJ5dGUgc2VxdWVuY2VzIHRvIG9uZSBwaXhlbFxuXG4gICAgcmV0dXJuIHsgcGl4ZWxzLCBsZW5ndGggfTtcbn1cbiIsIi8vIExpbmUgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRQb2x5bGluZXN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvbHlsaW5lcyc7XG5pbXBvcnQgcmVuZGVyRGFzaEFycmF5IGZyb20gJy4vZGFzaGFycmF5JztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7c2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LCBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudH0gZnJvbSAnLi4vcG9seWdvbnMvcG9seWdvbnMnO1xuXG5leHBvcnQgdmFyIExpbmVzID0gT2JqZWN0LmNyZWF0ZShTdHlsZSk7XG5cbk9iamVjdC5hc3NpZ24oTGluZXMsIHtcbiAgICBuYW1lOiAnbGluZXMnLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHZlcnRleF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgZnJhZ21lbnRfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQsXG4gICAgc2VsZWN0aW9uOiB0cnVlLCAvLyB0dXJuIGZlYXR1cmUgc2VsZWN0aW9uIG9uXG5cbiAgICBpbml0KCkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzaWMgYXR0cmlidXRlcywgb3RoZXJzIGNhbiBiZSBhZGRlZCAoc2VlIHRleHR1cmUgVVZzIGJlbG93KVxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfZXh0cnVkZScsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFRlbGwgdGhlIHNoYWRlciB3ZSB3YW50IGEgb3JkZXIgaW4gdmVydGV4IGF0dHJpYnV0ZXMsIGFuZCB0byBleHRydWRlIGxpbmVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRVhUUlVERV9MSU5FUyA9IHRydWU7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgbGluZSB0ZXh0dXJlIG9yIGRhc2ggYXJyYXlcbiAgICAgICAgLy8gKGxhdHRlciB3aWxsIGJlIHJlbmRlcmVkIGF0IGNvbXBpbGUtdGltZSwgd2hlbiBHTCBjb250ZXh0IGF2YWlsYWJsZSlcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSB8fCB0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIHRoaXMudGV4Y29vcmRzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIHRleHR1cmUgVVZzXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVEVYVFVSRV9DT09SRFMgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBTY2FsaW5nIGZhY3RvciB0byBhZGQgcHJlY2lzaW9uIHRvIGxpbmUgdGV4dHVyZSBWIGNvb3JkaW5hdGUgcGFja2VkIGFzIG5vcm1hbGl6ZWQgc2hvcnRcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgPSAxO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZSAqIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggYXR0cmlidXRlIGZvciBVVnMgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBzaW5nbGUtYWxsb2NhdGVkIG9iamVjdCB1c2VkIGZvciBob2xkaW5nIG91dGxpbmUgc3R5bGUgYXMgaXQgaXMgcHJvY2Vzc2VkXG4gICAgICAgIC8vIFNlcGFyYXRlIGZyb20gdGhpcy5mZWF0dXJlX3N0eWxlIHNvIHRoYXQgb3V0bGluZSBwcm9wZXJ0aWVzIGRvIG5vdCBvdmVyd3JpdGUgY2FsY3VsYXRlZFxuICAgICAgICAvLyBpbmxpbmUgcHJvcGVydGllcyAob3V0bGluZSBjYWxsIGlzIG1hZGUgKndpdGhpbiogdGhlIGlubGluZSBjYWxsKVxuICAgICAgICB0aGlzLm91dGxpbmVfZmVhdHVyZV9zdHlsZSA9IHt9O1xuICAgICAgICB0aGlzLmlubGluZV9mZWF0dXJlX3N0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlOyAvLyBzYXZlIHJlZmVyZW5jZSB0byBtYWluIGNvbXB1dGVkIHN0eWxlIG9iamVjdFxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlX3NldHVwKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlTGluZVRleHR1cmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3R5bGUuY29tcGlsZVNldHVwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIC8vIE9wdGlvbmFsbHkgYXBwbHkgYSBkYXNoIGFycmF5IHBhdHRlcm4gdG8gdGhpcyBsaW5lXG4gICAgcGFyc2VMaW5lVGV4dHVyZSAoKSB7XG4gICAgICAgIC8vIFNwZWNpZnkgYSBsaW5lIHBhdHRlcm5cbiAgICAgICAgaWYgKHRoaXMuZGFzaCkge1xuICAgICAgICAgICAgLy8gT3B0aW9uYWwgYmFja2dyb3VuZCBjb2xvciBmb3IgZGFzaCBwYXR0ZXJuIChkZWZhdWx0cyB0cmFuc3BhcmVudClcbiAgICAgICAgICAgIGlmICh0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcih0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTElORV9CQUNLR1JPVU5EX0NPTE9SID1cbiAgICAgICAgICAgICAgICAgICAgYHZlYzMoJHt0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvci5zbGljZSgwLCAzKS5qb2luKCcsICcpfSlgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGp1c3QgdGV4Y29vcmQgc2NhbGUgdG8gYWxsb3cgZm9yIGRhc2ggcGF0dGVybnMgdGhhdCBhcmUgYSBmcmFjdGlvbiBvZiBsaW5lIHdpZHRoXG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFID0gMjA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9WX1NDQUxFX0FESlVTVCA9IEdlby50aWxlX3NjYWxlICogdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGxpbmUgcGF0dGVyblxuICAgICAgICAgICAgY29uc3QgZGFzaCA9IHJlbmRlckRhc2hBcnJheSh0aGlzLmRhc2gsIHsgc2NhbGU6IHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSAnXycgKyB0aGlzLm5hbWUgKyAnX2Rhc2hhcnJheSc7XG4gICAgICAgICAgICBUZXh0dXJlLmNyZWF0ZSh0aGlzLmdsLCB0aGlzLnRleHR1cmUsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXNoLnBpeGVscyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGRhc2gubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgICAgICAgIGZpbHRlcmluZzogJ25lYXJlc3QnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpZnkgYSBsaW5lIHRleHR1cmUgKGVpdGhlciBkaXJlY3RseSwgb3IgcmVuZGVyZWQgZGFzaCBwYXR0ZXJuIGZyb20gYWJvdmUpXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xJTkVfVEVYVFVSRSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9BTFBIQV9URVNUID0gMC41OyAvLyBwaXhlbHMgYmVsb3cgdGhpcyB0aHJlc2hvbGQgYXJlIHRyYW5zcGFyZW50XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMgPSB0aGlzLnNoYWRlcnMudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZV9yYXRpbyA9IDE7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsaW5lIHBhdHRlcm4gYXNwZWN0IHJhdGlvIGFmdGVyIHRleHR1cmUgbG9hZHNcbiAgICAgICAgICAgIFRleHR1cmUuZ2V0SW5mbyh0aGlzLnRleHR1cmUpLnRoZW4odGV4dHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZV9yYXRpbyA9IHRleHR1cmUuaGVpZ2h0IC8gdGV4dHVyZS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYXQgem9vbSBnaXZlbiBpbiBgY29udGV4dGBcbiAgICBjYWxjV2lkdGggKHdpZHRoLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAod2lkdGggJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkod2lkdGgsIGNvbnRleHQpKSB8fCAwO1xuICAgIH0sXG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYXQgbmV4dCB6b29tICh1c2VkIGZvciBsaW5lIHdpZHRoIGludGVycG9sYXRpb24pXG4gICAgY2FsY1dpZHRoTmV4dFpvb20gKHdpZHRoLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuem9vbSsrO1xuICAgICAgICBsZXQgdmFsID0gdGhpcy5jYWxjV2lkdGgod2lkdGgsIGNvbnRleHQpO1xuICAgICAgICBjb250ZXh0Lnpvb20tLTtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgX3BhcnNlRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG5cbiAgICAgICAgLy8gbGluZSB3aWR0aCBpbiBtZXRlcnNcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5jYWxjV2lkdGgoZHJhdy53aWR0aCwgY29udGV4dCk7XG4gICAgICAgIGlmICh3aWR0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBsaW5lcyB3aXRoIG5lZ2F0aXZlIHdpZHRoXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRfd2lkdGggPSB0aGlzLmNhbGNXaWR0aE5leHRab29tKGRyYXcubmV4dF93aWR0aCwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCh3aWR0aCA9PT0gMCAmJiBuZXh0X3dpZHRoID09PSAwKSB8fCBuZXh0X3dpZHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIGxpbmVzIHRoYXQgZG9uJ3QgaW50ZXJwb2xhdGUgdG8gYSBwb3NpdGl2ZSB2YWx1ZSBhdCBuZXh0IHpvb21cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gdW5pdHMgYW5kIHJlbGF0aXZlIGNoYW5nZSBmcm9tIHByZXZpb3VzIHpvb21cbiAgICAgICAgLy8gTkI6IG11bHRpcGx5IGJ5IDIgYmVjYXVzZSBhIGdpdmVuIHdpZHRoIGlzIHR3aWNlIGFzIGJpZyBpbiBzY3JlZW4gc3BhY2UgYXQgdGhlIG5leHQgem9vbVxuICAgICAgICBzdHlsZS53aWR0aCA9IHdpZHRoICogY29udGV4dC51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb207XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggPSAobmV4dF93aWR0aCAqIDIpIC0gd2lkdGg7XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggKj0gY29udGV4dC51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb207XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggLz0gMjsgLy8gTkI6IGRpdmlkZSBieSAyIGJlY2F1c2UgZXh0cnVzaW9uIHdpZHRoIGlzIGhhbHZlZCBpbiBidWlsZGVyIC0gcmVtb3ZlP1xuXG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoZWlnaHQgZGVmYXVsdHMgdG8gZmVhdHVyZSBoZWlnaHQsIGJ1dCBleHRydWRlIHN0eWxlIGNhbiBkeW5hbWljYWxseSBhZGp1c3QgaGVpZ2h0IGJ5IHJldHVybmluZyBhIG51bWJlciBvciBhcnJheSAoaW5zdGVhZCBvZiBhIGJvb2xlYW4pXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiB8fCAwLCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcbiAgICAgICAgc3R5bGUuaGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5oZWlnaHQ7XG4gICAgICAgIHN0eWxlLmV4dHJ1ZGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5leHRydWRlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3R5bGUuZXh0cnVkZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5leHRydWRlKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSYWlzZSBsaW5lIGhlaWdodCBpZiBleHRydWRlZFxuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSAmJiBzdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIHN0eWxlLnogKz0gc3R5bGUuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUueiAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAgICAgICAgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgc3R5bGUuaGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7XG5cbiAgICAgICAgc3R5bGUuY2FwID0gZHJhdy5jYXA7XG4gICAgICAgIHN0eWxlLmpvaW4gPSBkcmF3LmpvaW47XG4gICAgICAgIHN0eWxlLm1pdGVyX2xpbWl0ID0gZHJhdy5taXRlcl9saW1pdDtcbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGFuIG91dGxpbmUgc3R5bGVcbiAgICAgICAgLy8gUmV1c2FibGUgb3V0bGluZSBzdHlsZSBvYmplY3QsIG1hcmtlZCBhcyBhbHJlYWR5IHdyYXBwZWQgaW4gY2FjaGUgb2JqZWN0cyAocHJlcHJvY2Vzc2VkID0gdHJ1ZSlcbiAgICAgICAgc3R5bGUub3V0bGluZSA9IHN0eWxlLm91dGxpbmUgfHwgeyB3aWR0aDoge30sIG5leHRfd2lkdGg6IHt9LCBwcmVwcm9jZXNzZWQ6IHRydWUgfTtcblxuICAgICAgICBpZiAoZHJhdy5vdXRsaW5lICYmIGRyYXcub3V0bGluZS52aXNpYmxlICE9PSBmYWxzZSAmJiBkcmF3Lm91dGxpbmUuY29sb3IgJiYgZHJhdy5vdXRsaW5lLndpZHRoKSB7XG4gICAgICAgICAgICAvLyBvdXRsaW5lIHdpZHRoIGluIG1ldGVyc1xuICAgICAgICAgICAgLy8gTkI6IG11bHRpcGx5IGJ5IDIgYmVjYXVzZSBvdXRsaW5lIGlzIGFwcGxpZWQgb24gYm90aCBzaWRlcyBvZiBsaW5lXG4gICAgICAgICAgICBsZXQgb3V0bGluZV93aWR0aCA9IHRoaXMuY2FsY1dpZHRoKGRyYXcub3V0bGluZS53aWR0aCwgY29udGV4dCkgKiAyO1xuICAgICAgICAgICAgbGV0IG91dGxpbmVfbmV4dF93aWR0aCA9IHRoaXMuY2FsY1dpZHRoTmV4dFpvb20oZHJhdy5vdXRsaW5lLm5leHRfd2lkdGgsIGNvbnRleHQpICogMjtcblxuICAgICAgICAgICAgaWYgKChvdXRsaW5lX3dpZHRoID09PSAwICYmIG91dGxpbmVfbmV4dF93aWR0aCA9PT0gMCkgfHwgb3V0bGluZV93aWR0aCA8IDAgfHwgb3V0bGluZV9uZXh0X3dpZHRoIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgbGluZXMgdGhhdCBkb24ndCBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHplcm8gb3IgZ3JlYXRlciB3aWR0aFxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNYWludGFpbiBjb25zaXN0ZW50IG91dGxpbmUgd2lkdGggYXJvdW5kIHRoZSBsaW5lIGZpbGxcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gb3V0bGluZV93aWR0aCArIHdpZHRoO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG91dGxpbmVfbmV4dF93aWR0aCArIG5leHRfd2lkdGg7XG5cbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gZHJhdy5vdXRsaW5lLmNvbG9yO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY2FwID0gZHJhdy5vdXRsaW5lLmNhcCB8fCBkcmF3LmNhcDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmpvaW4gPSBkcmF3Lm91dGxpbmUuam9pbiB8fCBkcmF3LmpvaW47XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5taXRlcl9saW1pdCA9IGRyYXcub3V0bGluZS5taXRlcl9saW1pdCB8fCBkcmF3Lm1pdGVyX2xpbWl0O1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuc3R5bGUgPSBkcmF3Lm91dGxpbmUuc3R5bGUgfHwgdGhpcy5uYW1lO1xuXG4gICAgICAgICAgICAgICAgLy8gRXhwbGljaXRseSBkZWZpbmVkIG91dGxpbmUgb3JkZXIsIG9yIGluaGVyaXRlZCBmcm9tIGlubmVyIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoZHJhdy5vdXRsaW5lLm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSB0aGlzLnBhcnNlT3JkZXIoZHJhdy5vdXRsaW5lLm9yZGVyLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSBzdHlsZS5vcmRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBEb24ndCBsZXQgb3V0bGluZSBiZSBhYm92ZSBpbm5lciBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm91dGxpbmUub3JkZXIgPiBzdHlsZS5vcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gc3R5bGUub3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT3V0bGluZXMgYXJlIGFsd2F5cyBhdCBoYWxmLWxheWVyIGludGVydmFscyB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoIGlubmVyIGxpbmVzXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciAtPSAwLjU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgZHJhdy5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3LmNvbG9yKTtcbiAgICAgICAgZHJhdy53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgIGRyYXcubmV4dF93aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7IC8vIHdpZHRoIHdpbGwgYmUgY29tcHV0ZWQgZm9yIG5leHQgem9vbVxuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG5cbiAgICAgICAgaWYgKGRyYXcub3V0bGluZSkge1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS5jb2xvcik7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUubmV4dF93aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTsgLy8gd2lkdGggcmUtY29tcHV0ZWQgZm9yIG5leHQgem9vbVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS56IHx8IDA7XG5cbiAgICAgICAgLy8gbGF5ZXIgb3JkZXIgLSB3IGNvb3JkIG9mICdwb3NpdGlvbicgYXR0cmlidXRlIChmb3IgcGFja2luZyBlZmZpY2llbmN5KVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKTtcblxuICAgICAgICAvLyBleHRydXNpb24gdmVjdG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG5cbiAgICAgICAgLy8gc2NhbGluZyB0byBwcmV2aW91cyBhbmQgbmV4dCB6b29tXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5uZXh0X3dpZHRoO1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclswXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzFdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMl0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclszXSAqIDI1NTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzBdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMl0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzNdICogMjU1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRleHR1cmUgVVZzIHRvIHRlbXBsYXRlIG9ubHkgaWYgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRMaW5lcyhsaW5lcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIC8vIE91dGxpbmUgKGJ1aWxkIGZpcnN0IHNvIHRoYXQgYmxlbmRlZCBnZW9tZXRyeSB3aXRob3V0IGEgZGVwdGggdGVzdCBpcyBkcmF3biBmaXJzdC91bmRlciB0aGUgaW5uZXIgbGluZSlcbiAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0gdGhpcy5vdXRsaW5lX2ZlYXR1cmVfc3R5bGU7IC8vIHN3YXAgaW4gb3V0bGluZS1zcGVjaWZpYyBzdHlsZSBob2xkZXJcbiAgICAgICAgaWYgKHN0eWxlLm91dGxpbmUgJiYgc3R5bGUub3V0bGluZS5jb2xvciAhPSBudWxsICYmIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG91dGxpbmVfc3R5bGUgPSB0aGlzLnN0eWxlc1tzdHlsZS5vdXRsaW5lLnN0eWxlXTtcbiAgICAgICAgICAgIGlmIChvdXRsaW5lX3N0eWxlKSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZV9zdHlsZS5hZGRGZWF0dXJlKGNvbnRleHQuZmVhdHVyZSwgc3R5bGUub3V0bGluZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWluIGxpbmVcbiAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0gdGhpcy5pbmxpbmVfZmVhdHVyZV9zdHlsZTsgLy8gcmVzdG9yZSBjYWxjdWxhdGVkIHN0eWxlIGZvciBpbmxpbmVcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgYnVpbGRQb2x5bGluZXMoXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHN0eWxlLndpZHRoLFxuICAgICAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FwOiBzdHlsZS5jYXAsXG4gICAgICAgICAgICAgICAgam9pbjogc3R5bGUuam9pbixcbiAgICAgICAgICAgICAgICBtaXRlcl9saW1pdDogc3R5bGUubWl0ZXJfbGltaXQsXG4gICAgICAgICAgICAgICAgc2NhbGluZ19pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfZXh0cnVkZSxcbiAgICAgICAgICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZTogMjU2LCAvLyB2YWx1ZXMgaGF2ZSBhbiA4LWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF93aWR0aDogKHN0eWxlLndpZHRoIHx8IHN0eWxlLm5leHRfd2lkdGgpIC8gY29udGV4dC50aWxlLm92ZXJ6b29tMiwgLy8gVVZzIGNhbid0IGNhbGMgZm9yIHplcm8td2lkdGgsIHVzZSBuZXh0IHpvb20gd2lkdGggaW4gdGhhdCBjYXNlXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNSwgLy8gc2NhbGUgVVZzIHRvIHVuc2lnbmVkIHNob3J0c1xuICAgICAgICAgICAgICAgIGNsb3NlZF9wb2x5Z29uOiBvcHRpb25zICYmIG9wdGlvbnMuY2xvc2VkX3BvbHlnb24sXG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXM6ICFzdHlsZS50aWxlX2VkZ2VzICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5yZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlOiBHZW8udGlsZV9zY2FsZSAqIGNvbnRleHQudGlsZS5wYWRfc2NhbGUgKiA0XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICAvLyBSZW5kZXIgcG9seWdvbnMgYXMgaW5kaXZpZHVhbCBsaW5lc1xuICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgdGhpcy5idWlsZExpbmVzKHBvbHlnb25zW3BdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQsIHsgY2xvc2VkX3BvbHlnb246IHRydWUsIHJlbW92ZV90aWxlX2VkZ2VzOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcbiIsIi8vIFBvaW50ICsgdGV4dCBsYWJlbCByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBnbCBmcm9tICcuLi8uLi9nbC9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRRdWFkc0ZvclBvaW50c30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9pbnRzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi8uLi92ZWN0b3InO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9wb2ludCc7XG5pbXBvcnQgcGxhY2VQb2ludHNPbkxpbmUgZnJvbSAnLi4vLi4vbGFiZWxzL3BvaW50X3BsYWNlbWVudCc7XG5pbXBvcnQge1RleHRMYWJlbHN9IGZyb20gJy4uL3RleHQvdGV4dF9sYWJlbHMnO1xuaW1wb3J0IHtWSUVXX1BBTl9TTkFQX1RJTUV9IGZyb20gJy4uLy4uL3ZpZXcnO1xuaW1wb3J0IGRlYnVnU2V0dGluZ3MgZnJvbSAnLi4vLi4vdXRpbHMvZGVidWdfc2V0dGluZ3MnO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50c1ZlcnRleCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvaW50c192ZXJ0ZXguZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcG9pbnRzRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2ludHNfZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5cbmNvbnN0IFBMQUNFTUVOVCA9IExhYmVsUG9pbnQuUExBQ0VNRU5UO1xuXG5leHBvcnQgdmFyIFBvaW50cyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG4vLyBNaXhpbiB0ZXh0IGxhYmVsIG1ldGhvZHNcbk9iamVjdC5hc3NpZ24oUG9pbnRzLCBUZXh0TGFiZWxzKTtcblxuT2JqZWN0LmFzc2lnbihQb2ludHMsIHtcbiAgICBuYW1lOiAncG9pbnRzJyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICBjb2xsaXNpb246IHRydWUsICAvLyBzdHlsZSBpbmNsdWRlcyBhIGNvbGxpc2lvbiBwYXNzXG4gICAgYmxlbmQ6ICdvdmVybGF5JywgLy8gb3ZlcmxheXMgZHJhd24gb24gdG9wIG9mIGFsbCBvdGhlciBzdHlsZXMsIHdpdGggYmxlbmRpbmdcblxuICAgIGluaXQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNlIHNoYWRlcnNcbiAgICAgICAgdGhpcy52ZXJ0ZXhfc2hhZGVyX3NyYyA9IHNoYWRlclNyY19wb2ludHNWZXJ0ZXg7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRfc2hhZGVyX3NyYyA9IHNoYWRlclNyY19wb2ludHNGcmFnbWVudDtcblxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffc2hhcGUnLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9vZmZzZXQnLCBzaXplOiAyLCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcblxuICAgICAgICAvLyBJZiB3ZSdyZSBub3QgcmVuZGVyaW5nIGFzIG92ZXJsYXksIHdlIG5lZWQgYSBsYXllciBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKHRoaXMuYmxlbmQgIT09ICdvdmVybGF5Jykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5zdXJlIGEgbGFiZWwgdGV4dHVyZSBpcyBhbHdheXMgYm91bmQgKGF2b2lkIENocm9tZSAnbm8gdGV4dHVyZSBib3VuZCB0byB1bml0JyB3YXJuaW5ncylcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zID0gdGhpcy5zaGFkZXJzLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV9sYWJlbF90ZXh0dXJlID0gVGV4dHVyZS5kZWZhdWx0O1xuXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1BPSU5UX1RFWFRVUkUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsZSBkdWFsIHBvaW50L3RleHQgbW9kZVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9NVUxUSV9TQU1QTEVSID0gdHJ1ZTtcblxuICAgICAgICAvLyBGYWRlIG91dCB3aGVuIHRpbGUgaXMgem9vbWluZyBvdXQsIGUuZy4gYWN0aW5nIGFzIHByb3h5IHRpbGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUX1JBVEUgPSAyOyAvLyBmYWRlIGF0IDJ4LCBlLmcuIGZ1bGx5IHRyYW5zcGFyZW50IGF0IDAuNSB6b29tIGxldmVsIGF3YXlcblxuICAgICAgICAvLyBGYWRlIGluIChkZXBlbmRpbmcgb24gdGlsZSBwcm94eSBzdGF0dXMpXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLnN1cHByZXNzX2xhYmVsX2ZhZGVfaW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmFkZV9pbl90aW1lID0gMDtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDAuMTU7IC8vIHRpbWUgaW4gc2Vjb25kc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9JTl9SQVRFID0gMSAvIHRoaXMuZmFkZV9pbl90aW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU25hcCBwb2ludHMgdG8gcGl4ZWwgZ3JpZCBhZnRlciBwYW5uaW5nIHN0b3BcbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3Muc3VwcHJlc3NfbGFiZWxfc25hcF9hbmltYXRpb24gIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1ZJRVdfUEFOX1NOQVBfUkFURSA9IDEgLyBWSUVXX1BBTl9TTkFQX1RJTUU7IC8vIGludmVyc2UgdGltZSBpbiBzZWNvbmRzXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMgPSB0aGlzLm5hbWUrJy1wb2ludHMnO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0ID0gdGhpcy5uYW1lKyctdGV4dCc7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sXG5cbiAgICByZXNldCAoKSB7XG4gICAgICAgIHRoaXMucXVldWVzID0ge307XG4gICAgICAgIHRoaXMucmVzZXRUZXh0KCk7XG4gICAgICAgIHRoaXMudGV4dHVyZV9taXNzaW5nX3Nwcml0ZXMgPSB7fTsgLy8gdHJhY2sgd2hpY2ggbWlzc2luZyBzcHJpdGVzIHdlJ3ZlIGZvdW5kIChyZWR1Y2UgZHVwZSBsb2cgbWVzc2FnZXMpXG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHF1ZXVlIGZlYXR1cmVzIGluc3RlYWQgb2YgcHJvY2Vzc2luZyBpbW1lZGlhdGVseVxuICAgIGFkZEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRpbGUgPSBjb250ZXh0LnRpbGU7XG4gICAgICAgIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbGVkIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZSBmZWF0dXJlIHF1ZXVlIGlzIHBhcnNlZCxcbiAgICAgICAgLy8gYW5kIHdlIHdhbnQgdGhlIHByZXByb2Nlc3NpbmcgZG9uZSBiZWZvcmUgd2UgZXZhbHVhdGUgdGV4dCBzdHlsZSBiZWxvd1xuICAgICAgICBkcmF3ID0gdGhpcy5wcmVwcm9jZXNzKGRyYXcpO1xuICAgICAgICBpZiAoIWRyYXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHt9O1xuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBQb2ludCBzdHlsaW5nXG5cbiAgICAgICAgLy8gcmVxdWlyZSBjb2xvciBvciB0ZXh0dXJlXG4gICAgICAgIGlmICghc3R5bGUuY29sb3IgJiYgIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0aW9uYWwgc3ByaXRlXG4gICAgICAgIGxldCBzcHJpdGVfaW5mbztcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ByaXRlcygpKSB7XG4gICAgICAgICAgICBzcHJpdGVfaW5mbyA9IHRoaXMucGFyc2VTcHJpdGUoZHJhdywgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzcHJpdGVfaW5mby50ZXhjb29yZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwb2ludCBzaXplIGRlZmluZWQgZXhwbGljaXRseSwgb3IgZGVmYXVsdHMgdG8gc3ByaXRlIHNpemUsIG9yIGdlbmVyaWMgZmFsbGJhY2tcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuc2l6ZTtcbiAgICAgICAgaWYgKCFzdHlsZS5zaXplKSB7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gc3ByaXRlX2luZm8uc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSBbMTYsIDE2XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLnNpemUgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoc3R5bGUuc2l6ZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplIHdpbGwgYmUgc2NhbGVkIHRvIDE2LWJpdCBzaWduZWQgaW50LCBzbyBtYXggYWxsb3dlZCB3aWR0aCArIGhlaWdodCBvZiAyNTYgcGl4ZWxzXG4gICAgICAgIHN0eWxlLnNpemUgPSBbXG4gICAgICAgICAgICBNYXRoLm1pbihzdHlsZS5zaXplWzBdICE9IG51bGwgPyBzdHlsZS5zaXplWzBdIDogc3R5bGUuc2l6ZSwgMjU2KSxcbiAgICAgICAgICAgIE1hdGgubWluKHN0eWxlLnNpemVbMV0gIT0gbnVsbCA/IHN0eWxlLnNpemVbMV0gOiBzdHlsZS5zaXplLCAyNTYpXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWd5XG4gICAgICAgIHN0eWxlLnBsYWNlbWVudCA9IGRyYXcucGxhY2VtZW50O1xuICAgICAgICBzdHlsZS5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBTcGFjaW5nIHBhcmFtZXRlciAoaW4gcGl4ZWxzKSB0byBlcXVhbGx5IHNwYWNlIHBvaW50cyBhbG9uZyBhIGxpbmVcbiAgICAgICAgaWYgKHN0eWxlLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULlNQQUNFRCAmJiBkcmF3LnBsYWNlbWVudF9zcGFjaW5nKSB7XG4gICAgICAgICAgICBzdHlsZS5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuZ2xlIHBhcmFtZXRlciAoY2FuIGJlIGEgbnVtYmVyIG9yIHRoZSBzdHJpbmcgXCJhdXRvXCIpXG4gICAgICAgIHN0eWxlLmFuZ2xlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuYW5nbGUsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIHBvaW50cyBjYW4gYmUgcGxhY2VkIG9mZiB0aGUgZ3JvdW5kXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG5cbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgc3R5bGUuc2FtcGxlciA9IDA7IC8vIDAgPSBzcHJpdGVzXG5cbiAgICAgICAgdGhpcy5jb21wdXRlTGF5b3V0KHN0eWxlLCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyBUZXh0IHN0eWxpbmdcbiAgICAgICAgbGV0IHRmID1cbiAgICAgICAgICAgIGRyYXcudGV4dCAmJlxuICAgICAgICAgICAgZHJhdy50ZXh0LnZpc2libGUgIT09IGZhbHNlICYmIC8vIGV4cGxpY2l0bHkgaGFuZGxlIGB2aXNpYmxlYCBwcm9wZXJ0eSBmb3IgbmVzdGVkIHRleHRcbiAgICAgICAgICAgIHRoaXMucGFyc2VUZXh0RmVhdHVyZShmZWF0dXJlLCBkcmF3LnRleHQsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIGlmICh0Zikge1xuICAgICAgICAgICAgdGYubGF5b3V0LnBhcmVudCA9IHN0eWxlOyAvLyBwYXJlbnQgcG9pbnQgd2lsbCBhcHBseSBhZGRpdGlvbmFsIGFuY2hvci9vZmZzZXQgdG8gdGV4dFxuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBoYXZlIGEgZGVmYXVsdCBwcmlvcml0eSBvZiAwLjUgYmVsb3cgdGhlaXIgcGFyZW50IHBvaW50ICgrMC41LCBwcmlvcml0eSBpcyBsb3dlci1pcy1iZXR0ZXIpXG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBiZSBvdmVycmlkZW4sIGFzIGxvbmcgYXMgaXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICB0Zi5sYXlvdXQucHJpb3JpdHkgPSBkcmF3LnRleHQucHJpb3JpdHkgPyBNYXRoLm1heCh0Zi5sYXlvdXQucHJpb3JpdHksIHN0eWxlLnByaW9yaXR5ICsgMC41KSA6IChzdHlsZS5wcmlvcml0eSArIDAuNSk7XG5cbiAgICAgICAgICAgIC8vIFRleHQgbGFiZWxzIGF0dGFjaGVkIHRvIHBvaW50cyBzaG91bGQgbm90IGJlIG1vdmVkIGludG8gdGlsZVxuICAgICAgICAgICAgLy8gKHRoZXkgc2hvdWxkIHN0YXkgZml4ZWQgcmVsYXRpdmUgdG8gdGhlIHBvaW50KVxuICAgICAgICAgICAgdGYubGF5b3V0Lm1vdmVfaW50b190aWxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIENvbGxpc2lvbi5hZGRTdHlsZSh0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0aWxlLmtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWV1ZSB0aGUgZmVhdHVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0ucHVzaCh7XG4gICAgICAgICAgICBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCBzdHlsZSxcbiAgICAgICAgICAgIHRleHRfZmVhdHVyZTogdGZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCBjb2xsaXNpb24gbWFuYWdlclxuICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfcG9pbnRzLCB0aWxlLmtleSk7XG4gICAgfSxcblxuICAgIGhhc1Nwcml0ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmUgJiYgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdICYmIFRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzO1xuICAgIH0sXG5cbiAgICBnZXRTcHJpdGVJbmZvIChzcHJpdGUpIHtcbiAgICAgICAgbGV0IGluZm8gPSBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlc1tzcHJpdGVdICYmIFRleHR1cmUuZ2V0U3ByaXRlSW5mbyh0aGlzLnRleHR1cmUsIHNwcml0ZSk7XG4gICAgICAgIGlmIChzcHJpdGUgJiYgIWluZm8pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdKSB7IC8vIG9ubHkgbG9nIGVhY2ggbWlzc2luZyBzcHJpdGUgb25jZVxuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBjb3VsZCBub3QgZmluZCBzcHJpdGUgJyR7c3ByaXRlfScgZm9yIHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfSdgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH0sXG5cbiAgICBwYXJzZVNwcml0ZSAoZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgc3ByaXRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuc3ByaXRlLCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHNwcml0ZV9pbmZvID0gdGhpcy5nZXRTcHJpdGVJbmZvKHNwcml0ZSkgfHwgdGhpcy5nZXRTcHJpdGVJbmZvKGRyYXcuc3ByaXRlX2RlZmF1bHQpO1xuICAgICAgICByZXR1cm4gc3ByaXRlX2luZm87XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuICAgICAgICByZXR1cm4gU3R5bGUuc3RhcnREYXRhLmNhbGwodGhpcywgdGlsZSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZSAke3RoaXMubmFtZX06IHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXVlID0gdGhpcy5xdWV1ZXNbdGlsZS5rZXldO1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcblxuICAgICAgICAvLyBGb3IgZWFjaCBwb2ludCBmZWF0dXJlLCBjcmVhdGUgb25lIG9yIG1vcmUgbGFiZWxzXG4gICAgICAgIGxldCB0ZXh0X29ianMgPSBbXTtcbiAgICAgICAgbGV0IHBvaW50X29ianMgPSBbXTtcblxuICAgICAgICBxdWV1ZS5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gcS5zdHlsZTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlID0gcS5mZWF0dXJlO1xuICAgICAgICAgICAgbGV0IGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeTtcblxuICAgICAgICAgICAgbGV0IGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyhzdHlsZS5zaXplLCBnZW9tZXRyeSwgc3R5bGUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlX2xhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGZlYXR1cmVfbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBwb2ludF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIGRyYXc6IHEuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogcS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBvaW50X29ianMucHVzaChwb2ludF9vYmopO1xuXG4gICAgICAgICAgICAgICAgaWYgKHEudGV4dF9mZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X29iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLnRleHRfZmVhdHVyZS5kcmF3LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogcS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcS50ZXh0X2ZlYXR1cmUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfc2V0dGluZ3Nfa2V5OiBxLnRleHRfZmVhdHVyZS50ZXh0X3NldHRpbmdzX2tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dDogcS50ZXh0X2ZlYXR1cmUubGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VkOiBwb2ludF9vYmogICAvLyBsaW5rIHNvIHRleHQgb25seSByZW5kZXJzIHdoZW4gcGFyZW50IHBvaW50IGlzIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X29ianMucHVzaCh0ZXh0X29iaik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVW5sZXNzIHRleHQgZmVhdHVyZSBpcyBvcHRpb25hbCwgY3JlYXRlIGEgdHdvLXdheSBsaW5rIHNvIHRoYXQgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHdpbGwgb25seSByZW5kZXIgd2hlbiB0ZXh0IGlzIGFsc28gcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgIGlmICghcS5kcmF3LnRleHQub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X29iai5saW5rZWQgPSB0ZXh0X29iajsgLy8gdHdvLXdheSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENvbGxpZGUgYm90aCBwb2ludHMgYW5kIHRleHQsIHRoZW4gYnVpbGQgZmVhdHVyZXNcbiAgICAgICAgcmV0dXJuIFByb21pc2UuXG4gICAgICAgICAgICBhbGwoW1xuICAgICAgICAgICAgICAgIC8vIFBvaW50c1xuICAgICAgICAgICAgICAgIENvbGxpc2lvbi5jb2xsaWRlKHBvaW50X29ianMsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpLnRoZW4ocG9pbnRfb2JqcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50X29ianMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUubGFiZWwgPSBxLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyBMYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmVUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIHRleHRfb2JqcykuXG4gICAgICAgICAgICAgICAgICAgIHRoZW4obGFiZWxzID0+IHRoaXMuY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHModGlsZSwgdGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgbGFiZWxzKSlcbiAgICAgICAgICAgIF0pLnRoZW4oKFssIHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgbGFiZWxzXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVscyAmJiB0ZXh0cykge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBxdWV1ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XSAmJiB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgc3R5bGluZyBvYmplY3QgZXhwZWN0ZWQgYnkgU3R5bGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5sb2dpY2FsX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYW5nbGUgPSBxLmxhYmVsLmFuZ2xlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyID0gMTsgLy8gbm9uLTAgPSBsYWJlbHNcblxuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mcmVlVGV4dCh0aWxlKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB0aWxlIG1lc2hcbiAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUuZW5kRGF0YS5jYWxsKHRoaXMsIHRpbGUpLnRoZW4odGlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRpbGUtc3BlY2lmaWMgbGFiZWwgYXRsYXMgdG8gbWVzaCBhcyBhIHRleHR1cmUgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSAmJiB0aWxlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcyA9IHRpbGVfZGF0YS50ZXh0dXJlcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0ZXh0dXJlKTsgLy8gYXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcblxuICAgICAgICAvLyBTaXplICgxZCB2YWx1ZSBvciAyZCBhcnJheSlcbiAgICAgICAgZHJhdy5zaXplID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnNpemUsIHYgPT4gQXJyYXkuaXNBcnJheSh2KSA/IHYubWFwKHBhcnNlRmxvYXQpIDogcGFyc2VGbG9hdCh2KSk7XG5cbiAgICAgICAgLy8gT2Zmc2V0ICgyZCBhcnJheSlcbiAgICAgICAgZHJhdy5vZmZzZXQgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub2Zmc2V0LCB2ID0+IChBcnJheS5pc0FycmF5KHYpICYmIHYubWFwKHBhcnNlRmxvYXQpKSB8fCAwKTtcblxuICAgICAgICAvLyBCdWZmZXIgKDFkIHZhbHVlIG9yIDJkIGFycmF5LCBleHBhbmQgMWQgdG8gMmQpXG4gICAgICAgIGRyYXcuYnVmZmVyID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmJ1ZmZlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdiwgdl0pLm1hcChwYXJzZUZsb2F0KSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBlYXQgcnVsZXMgLSBubyByZXBlYXQgbGltaXRhdGlvbiBmb3IgcG9pbnRzIGJ5IGRlZmF1bHRcbiAgICAgICAgZHJhdy5yZXBlYXRfZGlzdGFuY2UgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucmVwZWF0X2Rpc3RhbmNlLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICAvLyBQbGFjZW1lbnQgc3RyYXRlZ2llc1xuICAgICAgICBkcmF3LnBsYWNlbWVudCA9IFBMQUNFTUVOVFtkcmF3LnBsYWNlbWVudCAmJiBkcmF3LnBsYWNlbWVudC50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgaWYgKGRyYXcucGxhY2VtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIGRyYXcucGxhY2VtZW50ID0gUExBQ0VNRU5ULlZFUlRFWDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRyYXcucGxhY2VtZW50X3NwYWNpbmcgPSBkcmF3LnBsYWNlbWVudF9zcGFjaW5nICE9IG51bGwgPyBkcmF3LnBsYWNlbWVudF9zcGFjaW5nIDogODA7IC8vIGRlZmF1bHQgc3BhY2luZ1xuICAgICAgICBkcmF3LnBsYWNlbWVudF9zcGFjaW5nID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvID0gZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyAhPSBudWxsID8gZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA6IDE7XG4gICAgICAgIGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8sIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZHJhdy5hbmdsZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGRyYXcuYW5nbGUgPSBkcmF3LmFuZ2xlICogTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRyYXcuYW5nbGUgPSBkcmF3LmFuZ2xlIHx8IDA7IC8vIGFuZ2xlIGNhbiBiZSBhIHN0cmluZyBsaWtlIFwiYXV0b1wiICh1c2UgYW5nbGUgb2YgZ2VvbWV0cnkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0IHN0eWxpbmdcbiAgICAgICAgZHJhdy50ZXh0ID0gdGhpcy5wcmVwcm9jZXNzVGV4dChkcmF3LnRleHQpOyAvLyB3aWxsIHJldHVybiBudWxsIGlmIHZhbGlkIHRleHQgc3R5bGluZyB3YXNuJ3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKGRyYXcudGV4dCkge1xuICAgICAgICAgICAgZHJhdy50ZXh0LmtleSA9IGRyYXcua2V5OyAvLyBjb3B5IGxheWVyIGtleSBmb3IgdXNlIGFzIGxhYmVsIHJlcGVhdCBncm91cFxuICAgICAgICAgICAgZHJhdy50ZXh0LnJlcGVhdF9ncm91cCA9IGRyYXcudGV4dC5yZXBlYXRfZ3JvdXAgfHwgZHJhdy5yZXBlYXRfZ3JvdXA7IC8vIGluaGVyaXQgcmVwZWF0IGdyb3VwIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGRyYXcudGV4dC5hbmNob3IgPSBkcmF3LnRleHQuYW5jaG9yIHx8IHRoaXMuZGVmYXVsdF9hbmNob3I7XG4gICAgICAgICAgICBkcmF3LnRleHQub3B0aW9uYWwgPSAodHlwZW9mIGRyYXcudGV4dC5vcHRpb25hbCA9PT0gJ2Jvb2xlYW4nKSA/IGRyYXcudGV4dC5vcHRpb25hbCA6IGZhbHNlOyAvLyBkZWZhdWx0IHRleHQgdG8gcmVxdWlyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBEZWZhdWx0IHRvIHRyeWluZyBhbGwgYW5jaG9yIHBsYWNlbWVudHNcbiAgICBkZWZhdWx0X2FuY2hvcjogWydib3R0b20nLCAndG9wJywgJ3JpZ2h0JywgJ2xlZnQnXSxcblxuICAgIC8vIENvbXB1dGUgbGFiZWwgbGF5b3V0LXJlbGF0ZWQgcHJvcGVydGllc1xuICAgIGNvbXB1dGVMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuICAgICAgICBsYXlvdXQuaWQgPSBmZWF0dXJlO1xuICAgICAgICBsYXlvdXQudW5pdHNfcGVyX3BpeGVsID0gdGlsZS51bml0c19wZXJfcGl4ZWwgfHwgMTtcblxuICAgICAgICAvLyBjb2xsaXNpb24gZmxhZ1xuICAgICAgICBsYXlvdXQuY29sbGlkZSA9IChkcmF3LmNvbGxpZGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IGZhbHNlO1xuXG4gICAgICAgIC8vIHBvaW50cyBzaG91bGQgbm90IG1vdmUgaW50byB0aWxlIGlmIG92ZXIgdGlsZSBib3VuZGFyeVxuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBsYWJlbCBhbmNob3JzIChwb2ludCBsYWJlbHMgb25seSlcbiAgICAgICAgLy8gbGFiZWwgcG9zaXRpb24gd2lsbCBiZSBhZGp1c3RlZCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLCByZWxhdGl2ZSB0byBpdHMgb3JpZ2luYWwgcG9pbnRcbiAgICAgICAgLy8gb25lIG9mOiBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRvcC1sZWZ0LCB0b3AtcmlnaHQsIGJvdHRvbS1sZWZ0LCBib3R0b20tcmlnaHRcbiAgICAgICAgbGF5b3V0LmFuY2hvciA9IGRyYXcuYW5jaG9yO1xuXG4gICAgICAgIC8vIGxhYmVsIG9mZnNldCBhbmQgYnVmZmVyIGluIHBpeGVsIChhcHBsaWVkIGluIHNjcmVlbiBzcGFjZSlcbiAgICAgICAgbGF5b3V0Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3Lm9mZnNldCwgY29udGV4dCkgfHwgU3R5bGVQYXJzZXIuemVyb1BhaXI7XG4gICAgICAgIGxheW91dC5idWZmZXIgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5idWZmZXIsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuXG4gICAgICAgIC8vIHJlcGVhdCBydWxlc1xuICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcucmVwZWF0X2Rpc3RhbmNlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgKj0gbGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkcmF3LnJlcGVhdF9ncm91cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnJlcGVhdF9ncm91cChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkcmF3LnJlcGVhdF9ncm91cCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5rZXk7IC8vIGRlZmF1bHQgdG8gdW5pcXVlIHNldCBvZiBtYXRjaGluZyBsYXllcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxhYmVsIHByaW9yaXR5IChsb3dlciBpcyBoaWdoZXIpXG4gICAgICAgIGxldCBwcmlvcml0eSA9IGRyYXcucHJpb3JpdHk7XG4gICAgICAgIGlmIChwcmlvcml0eSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByaW9yaXR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBwcmlvcml0eShjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByaW9yaXR5ID0gLTEgPj4+IDA7IC8vIGRlZmF1bHQgdG8gbWF4IHByaW9yaXR5IHZhbHVlIGlmIG5vbmUgc2V0XG4gICAgICAgIH1cbiAgICAgICAgbGF5b3V0LnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9LFxuXG4gICAgLy8gSW1wbGVtZW50cyBsYWJlbCBidWlsZGluZyBmb3IgVGV4dExhYmVscyBtaXhpblxuICAgIGJ1aWxkVGV4dExhYmVscyAodGlsZV9rZXksIGZlYXR1cmVfcXVldWUpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmPTA7IGYgPCBmZWF0dXJlX3F1ZXVlLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICBsZXQgZnEgPSBmZWF0dXJlX3F1ZXVlW2ZdO1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRoaXMudGV4dHNbdGlsZV9rZXldW2ZxLnRleHRfc2V0dGluZ3Nfa2V5XVtmcS50ZXh0XTtcbiAgICAgICAgICAgIGxldCBzaXplID0gdGV4dF9pbmZvLnNpemUuY29sbGlzaW9uX3NpemU7XG4gICAgICAgICAgICBmcS5sYWJlbCA9IG5ldyBMYWJlbFBvaW50KGZxLnBvaW50X2xhYmVsLnBvc2l0aW9uLCBzaXplLCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2goZnEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkcyBvbmUgb3IgbW9yZSBwb2ludCBsYWJlbHMgZm9yIGEgZ2VvbWV0cnlcbiAgICBidWlsZExhYmVscyAoc2l6ZSwgZ2VvbWV0cnksIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuXG4gICAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHtcbiAgICAgICAgICAgIGxldCBwb2ludHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50LCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUobGluZSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgbGluZXMubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tsbl07XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKGxpbmUsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBwb2x5Z29uIGNlbnRyb2lkIChvZiBvdXRlciByaW5nKVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhY2VtZW50ID09PSBQTEFDRU1FTlQuQ0VOVFJPSUQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBlYWNoIHBvbHlnb24gdmVydGV4IChhbGwgcmluZ3MpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgcmluZ3MubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShyaW5nc1tsbl0sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gocG9pbnRfbGFiZWxzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wbGFjZW1lbnQgPT09IFBMQUNFTUVOVC5DRU5UUk9JRCkge1xuICAgICAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5tdWx0aUNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvbHlzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBwb2x5cy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBwb2x5c1twXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IHJpbmdzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKHJpbmdzW2xuXSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgY29sb3IgPSBzdHlsZS5jb2xvciB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5jb2xvcjtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgMCwgeyBzaXplOiAyIH0pO1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIHN0eWxlLnogfHwgMCwgeyBzaXplOiAxLCBvZmZzZXQ6IDIgfSk7XG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpLCB7IHNpemU6IDEsIG9mZnNldDogMyB9KTtcblxuICAgICAgICAvLyBzY2FsaW5nIHZlY3RvciAtICh4LCB5KSBjb21wb25lbnRzIHBlciBwaXhlbCwgeiA9IGFuZ2xlLCB3ID0gc2NhbGluZyBmYWN0b3JcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffc2hhcGUnLCAwLCB7IHNpemU6IDQgfSk7XG5cbiAgICAgICAgLy8gdGV4dHVyZSBjb29yZHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfdGV4Y29vcmQnLCAwLCB7IHNpemU6IDIgfSk7XG5cbiAgICAgICAgLy8gb2Zmc2V0c1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9vZmZzZXQnLCAwLCB7IHNpemU6IDIgfSk7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfY29sb3InLCBWZWN0b3IubXVsdChjb2xvciwgMjU1KSwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NlbGVjdGlvbl9jb2xvcicsIFZlY3Rvci5tdWx0KHN0eWxlLnNlbGVjdGlvbl9jb2xvciwgMjU1KSwgeyBzaXplOiA0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZFF1YWQocG9pbnRzLCBzaXplLCBhbmdsZSwgc2FtcGxlciwgb2Zmc2V0LCB0ZXhjb29yZF9zY2FsZSwgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSkge1xuICAgICAgICBidWlsZFF1YWRzRm9yUG9pbnRzKFxuICAgICAgICAgICAgcG9pbnRzLFxuICAgICAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9wb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzaGFwZV9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfc2hhcGUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0X2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9vZmZzZXRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcXVhZDogc2l6ZSxcbiAgICAgICAgICAgICAgICBxdWFkX25vcm1hbGl6ZTogMjU2LCAgICAvLyB2YWx1ZXMgaGF2ZSBhbiA4LWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgICAgICBhbmdsZTogYW5nbGUgKiA0MDk2LCAgICAvLyB2YWx1ZXMgaGF2ZSBhIDEyLWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIHNoYXBlX3c6IHNhbXBsZXIsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBxdWFkIGZvciBwb2ludCBzcHJpdGVcbiAgICBidWlsZCAoc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IHN0eWxlLmxhYmVsO1xuICAgICAgICBpZiAobGFiZWwubnVtX3NlZ21lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMYWJlbChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBidWlsZExhYmVsIChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGxldCBhbmdsZSA9IGxhYmVsLmFuZ2xlIHx8IHN0eWxlLmFuZ2xlO1xuXG4gICAgICAgIHRoaXMuYnVpbGRRdWFkKFxuICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgc3R5bGUuc2l6ZSwgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGluIHBpeGVsc1xuICAgICAgICAgICAgYW5nbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZSBpbiByYWRpYW5zXG4gICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgIGxhYmVsLm9mZnNldCwgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGZyb20gY2VudGVyIGluIHBpeGVsc1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzLCAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWwubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgbGV0IGFuZ2xlID0gbGFiZWwuYW5nbGVbaV07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHN0eWxlLnNpemVbaV07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gbGFiZWwub2Zmc2V0c1tpXTtcbiAgICAgICAgICAgIGxldCB0ZXhjb29yZCA9IHN0eWxlLnRleGNvb3Jkc1tpXTtcblxuICAgICAgICAgICAgdGhpcy5idWlsZFF1YWQoXG4gICAgICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICBhbmdsZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZ2xlIGluIGRlZ3JlZXNcbiAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgICAgICBvZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBmcm9tIGNlbnRlciBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICB0ZXhjb29yZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgVVZzXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHBhc3MtdGhyb3VnaCB0byBnZW5lcmljIHBvaW50IGJ1aWxkZXJcbiAgICBidWlsZExpbmVzIChsaW5lcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2ludHMgKHBvaW50cywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyAocG9pbnRzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBtYWtlTWVzaCAodmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIEFkZCBsYWJlbCBmYWRlIHRpbWVcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHsgZmFkZV9pbl90aW1lOiB0aGlzLmZhZGVfaW5fdGltZSB9KTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLm1ha2VNZXNoLmNhbGwodGhpcywgdmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFBvbHlnb24gcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUG9seWdvbnMsIGJ1aWxkRXh0cnVkZWRQb2x5Z29uc30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9seWdvbnMnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9seWdvbnNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2x5Z29uc19mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IHZhciBQb2x5Z29ucyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG4vLyBleHBvcnQgc2hhZGVycyBmb3IgdXNlIGluIGxpbmVzLmpzXG5leHBvcnQge1xuICAgIHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudFxufTtcblxuT2JqZWN0LmFzc2lnbihQb2x5Z29ucywge1xuICAgIG5hbWU6ICdwb2x5Z29ucycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgdmVydGV4X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBmcmFnbWVudF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNpYyBhdHRyaWJ1dGVzLCBvdGhlcnMgY2FuIGJlIGFkZGVkIChzZWUgdGV4dHVyZSBVVnMgYmVsb3cpXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9ub3JtYWwnLCBzaXplOiAzLCB0eXBlOiBnbC5CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0sIC8vIGdldHMgcGFkZGVkIHRvIDQtYnl0ZXNcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBUZWxsIHRoZSBzaGFkZXIgd2UgaGF2ZSBhIG5vcm1hbCBhbmQgb3JkZXIgYXR0cmlidXRlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9OT1JNQUxfQVRUUklCVVRFID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0dXJlIFVWc1xuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1RFWFRVUkVfQ09PUkRTID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQWRkIHZlcnRleCBhdHRyaWJ1dGUgZm9yIFVWcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcbiAgICB9LFxuXG4gICAgX3BhcnNlRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG5cbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG4gICAgICAgIGlmICghc3R5bGUuY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56LCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcbiAgICAgICAgc3R5bGUueiAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuXG4gICAgICAgIHN0eWxlLmV4dHJ1ZGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5leHRydWRlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUpIHtcbiAgICAgICAgICAgIC8vIHVzZSBmZWF0dXJlJ3MgaGVpZ2h0IGFuZCBtaW5faGVpZ2h0IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmIChzdHlsZS5leHRydWRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5taW5faGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLm1pbl9oZWlnaHQ7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGV4cGxpY2l0IGhlaWdodCwgbm8gbWluX2hlaWdodFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHN0eWxlLmV4dHJ1ZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGV4cGxpY2l0IGhlaWdodCBhbmQgbWluX2hlaWdodFxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5leHRydWRlKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSBzdHlsZS5leHRydWRlWzBdO1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAgICAgICAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS56IHx8IDA7XG5cbiAgICAgICAgLy8gbGF5ZXIgb3JkZXIgLSB3IGNvb3JkIG9mICdwb3NpdGlvbicgYXR0cmlidXRlIChmb3IgcGFja2luZyBlZmZpY2llbmN5KVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKTtcblxuICAgICAgICAvLyBub3JtYWxcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMSAqIDEyNztcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMF0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzJdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbM10gKiAyNTU7XG5cbiAgICAgICAgLy8gc2VsZWN0aW9uIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclswXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMV0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzJdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclszXSAqIDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0ZXh0dXJlIFVWcyB0byB0ZW1wbGF0ZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzUsIC8vIHNjYWxlIFVWcyB0byB1bnNpZ25lZCBzaG9ydHNcbiAgICAgICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzOiAhc3R5bGUudGlsZV9lZGdlcyxcbiAgICAgICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2U6IEdlby50aWxlX3NjYWxlICogY29udGV4dC50aWxlLnBhZF9zY2FsZSAqIDQsXG4gICAgICAgICAgICB3aW5kaW5nOiBjb250ZXh0LndpbmRpbmdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFeHRydWRlZCBwb2x5Z29ucyAoZS5nLiAzRCBidWlsZGluZ3MpXG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlICYmIHN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgYnVpbGRFeHRydWRlZFBvbHlnb25zKFxuICAgICAgICAgICAgICAgIHBvbHlnb25zLFxuICAgICAgICAgICAgICAgIHN0eWxlLnosIHN0eWxlLmhlaWdodCwgc3R5bGUubWluX2hlaWdodCxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX25vcm1hbCxcbiAgICAgICAgICAgICAgICAxMjcsIC8vIHNjYWxlIG5vcm1hbHMgdG8gc2lnbmVkIGJ5dGVzXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWd1bGFyIHBvbHlnb25zXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVpbGRQb2x5Z29ucyhcbiAgICAgICAgICAgICAgICBwb2x5Z29ucyxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuIiwiLy8gUmFzdGVyIHRpbGUgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1BvbHlnb25zfSBmcm9tICcuLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5cbmV4cG9ydCBsZXQgUmFzdGVyU3R5bGUgPSBPYmplY3QuY3JlYXRlKFBvbHlnb25zKTtcblxuT2JqZWN0LmFzc2lnbihSYXN0ZXJTdHlsZSwge1xuICAgIG5hbWU6ICdyYXN0ZXInLFxuICAgIHN1cGVyOiBQb2x5Z29ucyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFJlcXVpcmVkIGZvciByYXN0ZXIgdGlsZXNcbiAgICAgICAgdGhpcy5yYXN0ZXIgPSB0aGlzLnJhc3RlciB8fCAnY29sb3InO1xuXG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gZmFsc2U7IC8vIHJhc3RlciBzdHlsZXMgY2FuJ3Qgc3VwcG9ydCBmZWF0dXJlIHNlbGVjdGlvblxuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICAvLyBSYXN0ZXIgdGlsZXMgZGVmYXVsdCB0byB3aGl0ZSB2ZXJ0ZXggY29sb3IsIGFzIHRoaXMgY29sb3Igd2lsbCB0aW50IHRoZSB1bmRlcmx5aW5nIHRleHR1cmVcbiAgICAgICAgZHJhdy5jb2xvciA9IGRyYXcuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgICAgIHJldHVybiB0aGlzLnN1cGVyLl9wcmVwcm9jZXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFJlbmRlcmluZyBzdHlsZXNcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4uL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWQk9NZXNoIGZyb20gJy4uL2dsL3Zib19tZXNoJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuLi9saWdodCc7XG5pbXBvcnQge1Jhc3RlclRpbGVTb3VyY2V9IGZyb20gJy4uL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3NlbGVjdGlvbl9mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19yYXN0ZXJzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9yYXN0ZXJzLmdsc2wnLCAndXRmOCcpO1xuXG4vLyBCYXNlIGNsYXNzXG5cbmV4cG9ydCB2YXIgU3R5bGUgPSB7XG4gICAgaW5pdCAoeyBnZW5lcmF0aW9uLCBzdHlsZXMsIHNvdXJjZXMgPSB7fSwgaW50cm9zcGVjdGlvbiB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsgICAgICAgICAgICAgICAvLyBzY2VuZSBnZW5lcmF0aW9uIGlkIHRoaXMgc3R5bGUgd2FzIGNyZWF0ZWQgZm9yXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGVzIGZvciBzY2VuZVxuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgc291cmNlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5kZWZpbmVzID0gKHRoaXMuaGFzT3duUHJvcGVydHkoJ2RlZmluZXMnKSAmJiB0aGlzLmRlZmluZXMpIHx8IHt9OyAvLyAjZGVmaW5lcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBzaGFkZXJzXG4gICAgICAgIHRoaXMuc2hhZGVycyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdzaGFkZXJzJykgJiYgdGhpcy5zaGFkZXJzKSB8fCB7fTsgLy8gc2hhZGVyIGN1c3RvbWl6YXRpb24gKHVuaWZvcm1zLCBkZWZpbmVzLCBibG9ja3MsIGV0Yy4pXG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGludHJvc3BlY3Rpb24gfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5pbnRyb3NwZWN0aW9uIHx8IGZhbHNlOyAgIC8vIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN0eWxlIHN1cHBvcnRzIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuY29tcGlsZV9zZXR1cCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0dXAgc3RlcHMgZm9yIHByb2dyYW0gY29tcGlsYXRpb25cbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTCBwcm9ncmFtIHJlZmVyZW5jZSAoZm9yIG1haW4gcmVuZGVyIHBhc3MpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsOyAgICAgICAgICAgICAgLy8gR0wgcHJvZ3JhbSByZWZlcmVuY2UgZm9yIGZlYXR1cmUgc2VsZWN0aW9uIHJlbmRlciBwYXNzXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHt9OyAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGUgZm9yIGZlYXR1cmUgY3VycmVudGx5IGJlaW5nIHBhcnNlZCwgc2hhcmVkIHRvIGxlc3NlbiBHQy9tZW1vcnkgdGhyYXNoXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlID0gW107ICAgICAgICAgICAgICAgICAgLy8gc2hhcmVkIHNpbmdsZS12ZXJ0ZXggdGVtcGxhdGUsIGZpbGxlZCBvdXQgYnkgZWFjaCBzdHlsZVxuICAgICAgICB0aGlzLnRpbGVfZGF0YSA9IHt9O1xuXG4gICAgICAgIC8vIFByb3ZpZGUgYSBob29rIGZvciB0aGlzIG9iamVjdCB0byBiZSBjYWxsZWQgZnJvbSB3b3JrZXIgdGhyZWFkc1xuICAgICAgICB0aGlzLm1haW5fdGhyZWFkX3RhcmdldCA9IFsnU3R5bGUnLCB0aGlzLm5hbWUsIHRoaXMuZ2VuZXJhdGlvbl0uam9pbignLycpO1xuICAgICAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5hZGRUYXJnZXQodGhpcy5tYWluX3RocmVhZF90YXJnZXQsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB3b3JsZCBjb29yZHMgdG8gd3JhcCBldmVyeSAxMDAsMDAwIG1ldGVycywgY2FuIHR1cm4gb2ZmIGJ5IHNldHRpbmcgdGhpcyB0byAnZmFsc2UnXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1dPUkxEX1BPU0lUSU9OX1dSQVAgPSAxMDAwMDA7XG5cbiAgICAgICAgLy8gQmxlbmRpbmdcbiAgICAgICAgdGhpcy5ibGVuZCA9IHRoaXMuYmxlbmQgfHwgJ29wYXF1ZSc7ICAgICAgICAvLyBkZWZhdWx0OiBvcGFxdWUgc3R5bGVzIGFyZSBkcmF3biBmaXJzdCwgd2l0aG91dCBibGVuZGluZ1xuICAgICAgICB0aGlzLmRlZmluZXNbYFRBTkdSQU1fQkxFTkRfJHt0aGlzLmJsZW5kLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5ibGVuZF9vcmRlciA9PSBudWxsKSB7IC8vIGNvbnRyb2xzIG9yZGVyIG9mIHJlbmRlcmluZyBmb3Igc3R5bGVzIHcvbm9uLW9wYXF1ZSBibGVuZGluZ1xuICAgICAgICAgICAgdGhpcy5ibGVuZF9vcmRlciA9IC0xOyAvLyBkZWZhdWx0cyB0byBmaXJzdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVTaGFkZXJCbG9jaygnc2V0dXAnKTsgLy8gY2xlYXIgYmVmb3JlIG1hdGVyaWFsIGluamVjdGlvblxuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBkZWZpbmVzIGl0cyBvd24gbWF0ZXJpYWwsIHJlcGxhY2UgdGhlIGluaGVyaXRlZCBtYXRlcmlhbCBpbnN0YW5jZVxuICAgICAgICBpZiAoISh0aGlzLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICBpZiAoIU1hdGVyaWFsLmlzVmFsaWQodGhpcy5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMubWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHRoaXMubWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuaW5qZWN0KHRoaXMpO1xuXG4gICAgICAgIC8vIFNldCBsaWdodGluZyBtb2RlOiBmcmFnbWVudCwgdmVydGV4LCBvciBub25lIChzcGVjaWZpZWQgYXMgJ2ZhbHNlJylcbiAgICAgICAgTGlnaHQuc2V0TW9kZSh0aGlzLmxpZ2h0aW5nLCB0aGlzKTtcblxuICAgICAgICAvLyBTZXR1cCByYXN0ZXIgc2FtcGxlcnMgaWYgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0dXBSYXN0ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbl9wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgIH0sXG5cbiAgICBiYXNlU3R5bGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlIHx8IHRoaXMubmFtZTtcbiAgICB9LFxuXG4gICAgZmlsbFZlcnRleFRlbXBsYXRlKGF0dHJpYnV0ZSwgdmFsdWUsIHsgc2l6ZSwgb2Zmc2V0IH0pIHtcbiAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PT0gdW5kZWZpbmVkKSA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBubyBpbmRleCBmb3VuZCBpbiB2ZXJ0ZXggbGF5b3V0IGZvciBhdHRyaWJ1dGUgJyR7YXR0cmlidXRlfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbHVlLmxlbmd0aCA+IGkgPyB2YWx1ZVtpXSA6IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaW5kZXggKyBpICsgb2Zmc2V0XSA9IHY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqKiBTdHlsZSBwYXJzaW5nIGFuZCBnZW9tZXRyeSBjb25zdHJ1Y3Rpb24gKioqL1xuXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gaG9sZCBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogbnVsbCxcbiAgICAgICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgICAgIHRleHR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IGhvbGRpbmcgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHZhciB0aWxlX2RhdGEgPSB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9jb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIE9ubHkga2VlcCBmaW5hbCBieXRlIGJ1ZmZlclxuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVuZCgpO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbGVtZW50X2J1ZmZlcjtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfYnVmZmVyOyAvLyBjb252ZXJ0IGZyb20gaW5zdGFuY2UgdG8gcmF3IHR5cGVkIGFycmF5XG5cbiAgICAgICAgICAgIC8vIExvYWQgcmFzdGVyIHRpbGVzIHBhc3NlZCBmcm9tIGRhdGEgc291cmNlXG4gICAgICAgICAgICAvLyBCbG9ja3MgbWVzaCBjb21wbGV0aW9uIHRvIGF2b2lkIGZsaWNrZXJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFzdGVyVGV4dHVyZXModGlsZSwgdGlsZV9kYXRhKS50aGVuKCgpID0+IHRpbGVfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBkb24ndCBzZW5kIHRpbGUgZGF0YSBiYWNrIGlmIGRvZXNuJ3QgaGF2ZSBnZW9tZXRyeVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhhcyBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZT9cbiAgICBoYXNEYXRhRm9yVGlsZSAodGlsZV9rZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGVfa2V5XSAhPSBudWxsO1xuICAgIH0sXG5cbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNraXAgZmVhdHVyZT9cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgZmVhdHVyZSBpbiB0aGlzIHJlbmRlciBzdHlsZT9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSA9IHRoaXMudmVydGV4X2xheW91dC5jcmVhdGVWZXJ0ZXhEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgc3R5bGUsIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGJ1aWxkR2VvbWV0cnkgKGdlb21ldHJ5LCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgICAgICBzdHlsZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm9yZGVyLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gKG9ubHkgaWYgc3R5bGUgc3VwcG9ydHMgaXQpXG4gICAgICAgICAgICB2YXIgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3R5bGUuaW50ZXJhY3RpdmUgPSB0aGlzLmludHJvc3BlY3Rpb24gfHwgZHJhdy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoc3R5bGUuaW50ZXJhY3RpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGlzIG1hcmtlZCBhcyBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24ubWFrZUNvbG9yKGZlYXR1cmUsIGNvbnRleHQudGlsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5fcGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU3R5bGUucGFyc2VGZWF0dXJlOiBzdHlsZSBwYXJzaW5nIGVycm9yJywgZmVhdHVyZSwgc3R5bGUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUHJlcHJvY2VzcyBmaXJzdCB0aW1lXG4gICAgICAgIGlmICghZHJhdy5wcmVwcm9jZXNzZWQpIHtcbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLl9wcmVwcm9jZXNzKGRyYXcpOyAvLyBvcHRpb25hbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJhdy5wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFuIG9yZGVyIHZhbHVlXG4gICAgcGFyc2VPcmRlciAob3JkZXIsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuY2FsY3VsYXRlT3JkZXIob3JkZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIGZpbmFsIHByZWNpc2lvbiBmb3IgaGFsZi1sYXllcnMgKGZvciBvdXRsaW5lcylcbiAgICBzY2FsZU9yZGVyIChvcmRlcikge1xuICAgICAgICByZXR1cm4gb3JkZXIgKiAyO1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhIGNvbG9yIG9mIGNob29zZSBhIGRlZmF1bHQgaWYgYWNjZXB0YWJsZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBjb2xvciBtaXNzaW5nXG4gICAgcGFyc2VDb2xvcihjb2xvciwgY29udGV4dCkge1xuICAgICAgICAvLyBOZWVkIGVpdGhlciBhIGNvbG9yLCBvciBhIHNoYWRlciBibG9jayBmb3IgJ2NvbG9yJyBvciAnZmlsdGVyJ1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShjb2xvciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcy5jb2xvciB8fCB0aGlzLnNoYWRlcnMuYmxvY2tzLmZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIHVudGlsIG92ZXJyaWRlblxuICAgIGJ1aWxkUG9seWdvbnMgKCkge30sXG4gICAgYnVpbGRMaW5lcyAoKSB7fSxcbiAgICBidWlsZFBvaW50cyAoKSB7fSxcblxuXG4gICAgLyoqKiBHTCBzdGF0ZSBhbmQgcmVuZGVyaW5nICoqKi9cblxuICAgIHNldEdMIChnbCkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMubWF4X3RleHR1cmVfc2l6ZSA9IFRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUodGhpcy5nbCk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWQk9NZXNoKHRoaXMuZ2wsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIHRoaXMudmVydGV4X2xheW91dCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIHJlbmRlciAobWVzaCkge1xuICAgICAgICByZXR1cm4gbWVzaC5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgcHJvZ3JhbSwgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeVxuICAgIGdldFByb2dyYW0gKGtleSA9ICdwcm9ncmFtJykge1xuICAgICAgICB0aGlzLmNvbXBpbGVTZXR1cCgpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzW2tleV07XG4gICAgICAgIGlmICghcHJvZ3JhbSB8fCBwcm9ncmFtLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb2dyYW0uY29tcGlsZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ29tcGlsaW5nIHN0eWxlICcke3RoaXMubmFtZX0nLCBwcm9ncmFtIGtleSAnJHtrZXl9J2ApO1xuICAgICAgICAgICAgcHJvZ3JhbS5jb21waWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfSxcblxuICAgIC8vIE9uZS10aW1lIHNldHVwIGZvciBjb21waWxpbmcgc3R5bGUncyBwcm9ncmFtc1xuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVfc2V0dXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMubmFtZX0gYmVjYXVzZSBubyBHTCBjb250ZXh0YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgZGVmaW5lcyAmIGZvciBzZWxlY3Rpb24gKG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzaW5jZSB0aGUgZmlyc3QgaXMgc3RvcmVkIGFzIGEgcmVmZXJlbmNlIGJ5IHRoZSBwcm9ncmFtKVxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbl9kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmaW5lcyk7XG4gICAgICAgICAgICBzZWxlY3Rpb25fZGVmaW5lcy5UQU5HUkFNX0ZFQVRVUkVfU0VMRUNUSU9OID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhbnkgY3VzdG9tIGNvZGUgYmxvY2tzLCB1bmlmb3JtIGRlcGVuZGVuY2llcywgZXRjLlxuICAgICAgICB2YXIgYmxvY2tzID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuYmxvY2tzKTtcbiAgICAgICAgdmFyIGJsb2NrX3Njb3BlcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blcyk7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMudW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEFjY2VwdCBhIHNpbmdsZSBleHRlbnNpb24sIG9yIGFuIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5leHRlbnNpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IFtleHRlbnNpb25zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBzaGFkZXJzXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGRlZmluZXMsXG4gICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlcyxcbiAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbmV3IFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHNoYWRlclNyY19zZWxlY3Rpb25GcmFnbWVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICh0aGlzLm5hbWUgKyAnIChzZWxlY3Rpb24pJyksXG4gICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IHNlbGVjdGlvbl9kZWZpbmVzLFxuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgICAgICBibG9ja19zY29wZXMsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaGFkZXIgYmxvY2tcbiAgICBhZGRTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3MgPSB0aGlzLnNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XS5wdXNoKGJsb2NrKTtcblxuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0ucHVzaChzY29wZSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhbGwgc2hhZGVyIGJsb2NrcyBmb3Iga2V5XG4gICAgcmVtb3ZlU2hhZGVyQmxvY2sgKGtleSkge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNoYWRlckJsb2NrKGtleSk7XG4gICAgICAgIHRoaXMuYWRkU2hhZGVyQmxvY2soa2V5LCBibG9jaywgc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvKiogVE9ETzogY291bGQgcHJvYmFibHkgY29tYmluZSBhbmQgZ2VuZXJhbGl6ZSB0aGlzIHdpdGggc2ltaWxhciBtZXRob2QgaW4gU2hhZGVyUHJvZ3JhbVxuICAgICAqIChsaXN0IG9mIGRlZmluZSBvYmplY3RzIHRoYXQgaW5oZXJpdCBmcm9tIGVhY2ggb3RoZXIpXG4gICAgICovXG4gICAgYnVpbGREZWZpbmVMaXN0ICgpIHtcbiAgICAgICAgLy8gQWRkIGFueSBjdXN0b20gZGVmaW5lcyB0byBidWlsdC1pbiBzdHlsZSBkZWZpbmVzXG4gICAgICAgIHZhciBkZWZpbmVzID0ge307IC8vIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYSBwcm90b3R5cGUgdmFsdWUgdGhhdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgc3R5bGVzXG4gICAgICAgIGlmICh0aGlzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMgIT0gbnVsbCAmJiB0aGlzLnNoYWRlcnMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGQgaW4gdGhpcy5zaGFkZXJzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5zaGFkZXJzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG5cbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lcyBpZiAncmFzdGVyJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgdmFsaWQgdmFsdWVcbiAgICBoYXNSYXN0ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIChbJ2NvbG9yJywgJ25vcm1hbCcsICdjdXN0b20nXS5pbmRleE9mKHRoaXMucmFzdGVyKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gU2V0dXAgcmFzdGVyIGFjY2VzcyBpbiBzaGFkZXJzXG4gICAgc2V0dXBSYXN0ZXJzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIHJhc3RlciB0ZXh0dXJlcyBhbmQgY29uZmlndXJlIGhvdyBmaXJzdCByYXN0ZXIgaXMgYXBwbGllZFxuICAgICAgICBpZiAodGhpcy5yYXN0ZXIgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX0NPTE9SID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhc3RlciA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX05PUk1BTCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBjdXN0b20gcmFzdGVyIChzYW1wbGVycyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGJ1dCBub3QgYXV0b21hdGljYWxseSBhcHBsaWVkKVxuXG4gICAgICAgIC8vIEEgZ2l2ZW4gc3R5bGUgbWF5IGJlIGJ1aWx0IHdpdGggbXVsdGlwbGUgZGF0YSBzb3VyY2VzLCBlYWNoIG9mIHdoaWNoIG1heSBhdHRhY2hcbiAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXMgKDAgdG8gTiwgd2hlcmUgTiBpcyB0aGUgbWF4IG51bWJlciBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgc2NlbmUpLiBUaGlzIG1lYW5zIHdlIGRvbid0IGtub3cgKndoaWNoKiBvciAqaG93IG1hbnkqIHJhc3RlcnMgd2lsbCBiZVxuICAgICAgICAvLyBib3VuZCBub3csIGF0IGluaXRpYWwgY29tcGlsZS10aW1lOyB3ZSBvbmx5IGtub3cgdGhpcyBhdCBnZW9tZXRyeSBidWlsZC10aW1lLiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gYmluZCBhcyBtYW55IHJhc3RlciBzb3VyY2VzIGFzIG5lZWRlZCwgd2UgZGVjbGFyZSBvdXIgdW5pZm9ybSBhcnJheXMgdG8gaG9sZFxuICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc291cmNlcy4gQXQgcmVuZGVyIHRpbWUsIG9ubHkgdGhlIG5lY2Vzc2FyeSBudW1iZXIgb2YgcmFzdGVyc1xuICAgICAgICAvLyBhcmUgYm91bmQgKHRoZSByZW1haW5pbmcgc2xvdHMgYXJlbid0IGludGVuZGVkIHRvIGJlIGFjY2Vzc2VkKS5cbiAgICAgICAgbGV0IG51bV9yYXN0ZXJfc291cmNlcyA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5zb3VyY2VzW3NdIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSlcbiAgICAgICAgICAgIC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTlVNX1JBU1RFUl9TT1VSQ0VTID0gYGludCgke251bV9yYXN0ZXJfc291cmNlc30pYDtcbiAgICAgICAgaWYgKG51bV9yYXN0ZXJfc291cmNlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBtb2RlbCBwb3NpdGlvbiBvZiB0aWxlJ3MgY29vcmRpbmF0ZSB6b29tIGZvciByYXN0ZXIgdGlsZSB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTU9ERUxfUE9TSVRJT05fQkFTRV9aT09NX1ZBUllJTkcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBVbmlmb3JtcyBhbmQgbWFjcm9zIGZvciByYXN0ZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVNoYWRlckJsb2NrKCdyYXN0ZXInLCBzaGFkZXJTcmNfcmFzdGVycywgJ1Jhc3RlcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIExvYWQgcmFzdGVyIHRpbGUgdGV4dHVyZXMgYW5kIHNldCB1bmlmb3Jtc1xuICAgIGJ1aWxkUmFzdGVyVGV4dHVyZXMgKHRpbGUsIHRpbGVfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlncyA9IHt9OyAvLyB0ZXh0dXJlIGNvbmZpZ3MgdG8gcGFzcyB0byB0ZXh0dXJlIGJ1aWxkZXIsIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuICAgICAgICBsZXQgaW5kZXggPSB7fTsgICAvLyBpbmRleCBpbnRvIHJhc3RlciBzYW1wbGVyIGFycmF5LCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcblxuICAgICAgICAvLyBUT0RPOiBkYXRhIHNvdXJjZSBjb3VsZCByZXRyaWV2ZSByYXN0ZXIgdGV4dHVyZSBVUkxzXG4gICAgICAgIHRpbGUucmFzdGVycy5tYXAociA9PiB0aGlzLnNvdXJjZXNbcl0pLmZpbHRlcih4ID0+IHgpLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gc291cmNlLnRpbGVUZXh0dXJlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NbY29uZmlnLnVybF0gPSBjb25maWc7XG4gICAgICAgICAgICAgICAgaW5kZXhbY29uZmlnLnVybF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHRleHR1cmVzIG9uIG1haW4gdGhyZWFkIGFuZCByZXR1cm4gd2hlbiBkb25lXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYmxvY2sgdGhlIGJ1aWxkaW5nIG9mIGEgcmFzdGVyIHRpbGUgbWVzaCB1bnRpbCBpdHMgdGV4dHVyZSBpcyBsb2FkZWQsXG4gICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcgd2hpbGUgbG9hZGluZyAodGV4dHVyZSB3aWxsIHJlbmRlciBhcyBibGFjaylcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmxvYWRUZXh0dXJlcycsIGNvbmZpZ3MpXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0dXJlcyB8fCB0ZXh0dXJlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dHVyZSB1bmlmb3JtcyAocmV0dXJuZWQgYWZ0ZXIgbG9hZGluZyBmcm9tIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBsZXQgdV9zYW1wbGVycyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9zaXplcyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfc2l6ZXMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X29mZnNldHMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX29mZnNldHMnXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCgoW3RuYW1lLCB0d2lkdGgsIHRoZWlnaHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhbdG5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFzdGVyX2Nvb3JkcyA9IGNvbmZpZ3NbdG5hbWVdLmNvb3JkczsgLy8gdGlsZSBjb29yZHMgb2YgcmFzdGVyIHRpbGVcblxuICAgICAgICAgICAgICAgICAgICB1X3NhbXBsZXJzW2ldID0gdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICB1X3NpemVzW2ldID0gW3R3aWR0aCwgdGhlaWdodF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGlsZSBnZW9tZXRyeSBtYXkgYmUgYXQgYSBoaWdoZXIgem9vbSB0aGFuIHRoZSByYXN0ZXIgdGlsZSB0ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhbiBvdmVyem9vbWVkIHJhc3RlciB0aWxlKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFzdGVyIHRleHR1cmUgVVZzIHRvIG9mZnNldCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgdGlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuY29vcmRzLnogPiByYXN0ZXJfY29vcmRzLnopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeiA9IHRpbGUuY29vcmRzLnogLSByYXN0ZXJfY29vcmRzLno7IC8vICMgb2YgbGV2ZWxzIHJhc3RlciBzb3VyY2UgaXMgb3Zlcnpvb21lZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6MiA9IE1hdGgucG93KDIsIGR6KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGlsZS5jb29yZHMueCAlIGR6MikgLyBkejIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR6MiAtIDEgLSAodGlsZS5jb29yZHMueSAlIGR6MikpIC8gZHoyLCAvLyBHTCB0ZXh0dXJlIGNvb3JkcyBhcmUgK1kgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8gZHoyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gWzAsIDAsIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWRcbiAgICBsb2FkVGV4dHVyZXMgKHRleHR1cmVzKSB7XG4gICAgICAgIC8vIE5COiBvbmx5IHJldHVybiBuYW1lIGFuZCBzaXplIG9mIHRleHR1cmVzIGxvYWRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGFjdHVhbCB0ZXh0dXJlIG9iamVjdHMgdG8gd29ya2VyXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGV4dHVyZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHRleHR1cmVzKS5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzW3RdICYmIFRleHR1cmUudGV4dHVyZXNbdF0ubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQucmV0YWluKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlcy5tYXAodCA9PiBbdC5uYW1lLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIGFueSBHTCBzdGF0ZSBmb3IgcmVuZGVyaW5nXG4gICAgc2V0dXAgKCkge1xuICAgICAgICB0aGlzLnNldFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuc2V0dXBQcm9ncmFtKFNoYWRlclByb2dyYW0uY3VycmVudCk7XG4gICAgfSxcblxuICAgIC8vIFNldCBzdHlsZSB1bmlmb3JtcyBvbiBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuICAgIHNldFVuaWZvcm1zICgpIHtcbiAgICAgICAgdmFyIHByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLCB0cnVlKTsgLy8gcmVzZXQgdGV4dHVyZSB1bml0IHRvIDBcbiAgICB9LFxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIHNldHRpbmdzIGJ5IGJsZW5kIG1vZGVcbiAgICByZW5kZXJfc3RhdGVzOiB7XG4gICAgICAgIG9wYXF1ZTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogdHJ1ZSB9LFxuICAgICAgICBhZGQ6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG11bHRpcGx5OiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBpbmxheTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgb3ZlcmxheTogeyBkZXB0aF90ZXN0OiBmYWxzZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH1cbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCBzb3J0IG9yZGVyIGZvciBibGVuZCBtb2Rlc1xuICAgIGRlZmF1bHRfYmxlbmRfb3JkZXJzOiB7XG4gICAgICAgIG9wYXF1ZTogMCxcbiAgICAgICAgYWRkOiAxLFxuICAgICAgICBtdWx0aXBseTogMixcbiAgICAgICAgaW5sYXk6IDMsXG4gICAgICAgIG92ZXJsYXk6IDRcbiAgICB9LFxuXG4gICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyBzdHlsZXMgYnkgYmxlbmRcbiAgICBibGVuZE9yZGVyU29ydCAoYSwgYikge1xuICAgICAgICAvLyBvcGFxdWUgYWx3YXlzIGNvbWVzIGZpcnN0XG4gICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyB8fCBiLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgaWYgKGEuYmxlbmQgPT09ICdvcGFxdWUnICYmIGIuYmxlbmQgPT09ICdvcGFxdWUnKSB7IC8vIGlmIGJvdGggYXJlIG9wYXF1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDE7IC8vIHVzZSBuYW1lIGFzIHRpZSBicmVha2VyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gb25seSBgYWAgd2FzIG9wYXF1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgYGJgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBleHBsaWNpdCBibGVuZCBvcmRlciBpZiBwb3NzaWJsZVxuICAgICAgICBpZiAoYS5ibGVuZF9vcmRlciA8IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmJsZW5kX29yZGVyID4gYi5ibGVuZF9vcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBibGVuZCBvcmRlcnMgYXJlIGVxdWFsLCB1c2UgZGVmYXVsdCBvcmRlciBieSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1thLmJsZW5kXSA8IFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2IuYmxlbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPiBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgc3R5bGVzXG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5pbXBvcnQge0xpbmVzfSBmcm9tICcuL2xpbmVzL2xpbmVzJztcbmltcG9ydCB7UG9pbnRzfSBmcm9tICcuL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IHtUZXh0U3R5bGV9IGZyb20gJy4vdGV4dC90ZXh0JztcbmltcG9ydCB7UmFzdGVyU3R5bGV9IGZyb20gJy4vcmFzdGVyL3Jhc3Rlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfYWNjZXNzb3JzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9hY2Nlc3NvcnMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfbGF5ZXJPcmRlciA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvbGF5ZXJfb3JkZXIuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2dsb2JhbHMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlcyA9IHt9O1xuXG4gICAgICAgIC8vIEFkZCBidWlsdC1pbiByZW5kZXJpbmcgc3R5bGVzXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2x5Z29ucykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoTGluZXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFBvaW50cykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoVGV4dFN0eWxlKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShSYXN0ZXJTdHlsZSkpO1xuICAgIH1cblxuICAgIC8vIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciBhbGwgc3R5bGVzXG4gICAgaW5pdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soJ2dsb2JhbCcpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdzZXR1cCcpO1xuXG4gICAgICAgIC8vIE1vZGVsIGFuZCB3b3JsZCBwb3NpdGlvbiBhY2Nlc3NvcnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2FjY2Vzc29ycyk7XG5cbiAgICAgICAgLy8gTGF5ZXIgcmUtb3JkZXJpbmcgZnVuY3Rpb25cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2xheWVyT3JkZXIpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIGdsb2JhbFxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyk7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gdmVydGV4IHNoYWRlciBzdXBwb3J0XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdzZXR1cCcsIHNoYWRlclNyY19zZWxlY3Rpb25WZXJ0ZXgpO1xuXG4gICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIGZsb2F0IGNvbXBhcmlzb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0VQU0lMT04gPSAwLjAwMDAxO1xuXG4gICAgICAgIC8vIE1pbmltdW0gZGVwdGggYnVmZmVyIHZhbHVlIHNlcGFyYXRpbmcgZWFjaCBgb3JkZXJgIHVuaXRcbiAgICAgICAgLy8gQXNzdW1lIG1pbiAxNi1iaXQgZGVwdGggYnVmZmVyLCBpbiBwcmFjdGljZSB1c2VzIDE0LWJpdHMsIDEgZXh0cmEgYml0IHRvIGhhbmRsZSB2aXJ0dWFsIGhhbGYtbGF5ZXJzXG4gICAgICAgIC8vIGZvciBvdXRsaW5lcyAoaW5zZXJ0ZWQgaW4gYmV0d2VlbiBsYXllcnMpLCBhbm90aGVyIGV4dHJhIGJpdCB0byBwcmV2ZW50IHByZWNpc2lvbiBsb3NzXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0xBWUVSX0RFTFRBID0gMSAvICgxIDw8IDE0KTtcblxuICAgICAgICAvLyBJbnRlcm5hbCB0aWxlIHNjYWxlXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX1RJTEVfU0NBTEUgPVxuICAgICAgICAgICAgYHZlYzMoJHtHZW8udGlsZV9zY2FsZX0uLCAke0dlby50aWxlX3NjYWxlfS4sIHVfbWV0ZXJzX3Blcl9waXhlbCAqICR7R2VvLnRpbGVfc2l6ZX0uKWA7XG5cbiAgICAgICAgLy8gSW5jcmVhc2VzIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9IRUlHSFRfU0NBTEUgPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYWxsIHN0eWxlcyBmb3IgYSBnaXZlbiBHTCBjb250ZXh0XG4gICAgZGVzdHJveSAoZ2wpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLmZvckVhY2goKF9uYW1lKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZU1hbmFnZXIuZGVzdHJveTogZGVzdHJveWluZyByZW5kZXIgc3R5bGUgJHtzdHlsZS5uYW1lfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBzdHlsZVxuICAgIHJlZ2lzdGVyIChzdHlsZSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLm5hbWVdID0gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc3R5bGVcbiAgICByZW1vdmUgKG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW25hbWVdO1xuICAgIH1cblxuICAgIG1peCAoc3R5bGUsIHN0eWxlcykge1xuICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkeSBhcHBsaWVkIG1peGlucyB0byB0aGlzIHN0eWxlXG4gICAgICAgIGlmIChzdHlsZS5taXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLm1peGVkID0ge307XG5cbiAgICAgICAgLy8gTWl4aW4gc291cmNlcywgaW4gb3JkZXJcbiAgICAgICAgbGV0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgaWYgKHN0eWxlLm1peCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCguLi5zdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlLm1peCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5tYXAoeCA9PiBzdHlsZXNbeF0pLmZpbHRlcih4ID0+IHggJiYgeCAhPT0gc3R5bGUpOyAvLyBUT0RPOiB3YXJuaW5nIG9uIHRyeWluZyB0byBtaXggaW50byBzZWxmXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0eWxlcyB3ZXJlIG1peGVkIGludG8gdGhpcyBvbmVcbiAgICAgICAgICAgIHNvdXJjZXMuZm9yRWFjaChzID0+IHN0eWxlLm1peGVkW3MubmFtZV0gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzLnB1c2goc3R5bGUpO1xuXG4gICAgICAgIC8vIEZsYWdzIC0gT1InZCwgdHJ1ZSBpZiBhbnkgc3R5bGUgaGFzIGl0IHNldFxuICAgICAgICBzdHlsZS5hbmltYXRlZCA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC5hbmltYXRlZCk7XG4gICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC50ZXhjb29yZHMpO1xuXG4gICAgICAgIC8vIE92ZXJ3cml0ZXMgLSBsYXN0IGRlZmluaXRpb24gd2luc1xuICAgICAgICBzdHlsZS5iYXNlID0gc291cmNlcy5tYXAoeCA9PiB4LmJhc2UpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5saWdodGluZyA9IHNvdXJjZXMubWFwKHggPT4geC5saWdodGluZykuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUudGV4dHVyZSA9IHNvdXJjZXMubWFwKHggPT4geC50ZXh0dXJlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUucmFzdGVyID0gc291cmNlcy5tYXAoeCA9PiB4LnJhc3RlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaCA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBpZiAoc291cmNlcy5zb21lKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKSkge1xuICAgICAgICAgICAgLy8gb25seSBtaXggYmxlbmQgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBsZXQgYmFzZSBzdHlsZSBjaG9vc2UgYmxlbmRpbmcgbW9kZVxuICAgICAgICAgICAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2sgZ2l2ZXMgcHJlZmVyZW5jZSB0byBiYXNlIHN0eWxlIHByb3RvdHlwZVxuICAgICAgICAgICAgc3R5bGUuYmxlbmQgPSBzb3VyY2VzLm1hcCh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuYmxlbmRfb3JkZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmxlbmRfb3JkZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG5cbiAgICAgICAgLy8gTWVyZ2VzIC0gcHJvcGVydHktc3BlY2lmaWMgcnVsZXMgZm9yIG1lcmdpbmcgdmFsdWVzXG4gICAgICAgIHN0eWxlLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpOyAvLyBpbnRlcm5hbCBkZWZpbmVzIChub3QgdXNlci1kZWZpbmVkKVxuICAgICAgICBzdHlsZS5tYXRlcmlhbCA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5tYXRlcmlhbCkuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIE1peCBzaGFkZXIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLm1peFNoYWRlcnMoc3R5bGUsIHN0eWxlcywgc291cmNlcyk7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBNaXggdGhlIHByb3BlcnRlcyBpbiB0aGUgXCJzaGFkZXJzXCIgYmxvY2tcbiAgICBtaXhTaGFkZXJzIChzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKSB7XG4gICAgICAgIGxldCBzaGFkZXJzID0ge307IC8vIG5ld2x5IG1peGVkIHNoYWRlcnMgcHJvcGVydGllc1xuICAgICAgICBsZXQgc2hhZGVyX21lcmdlcyA9IHNvdXJjZXMubWFwKHggPT4geC5zaGFkZXJzKS5maWx0ZXIoeCA9PiB4KTsgLy8ganVzdCB0aGUgc291cmNlIHN0eWxlcyB3aXRoIHNoYWRlciBwcm9wZXJ0aWVzXG5cbiAgICAgICAgLy8gRGVmaW5lc1xuICAgICAgICBzaGFkZXJzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zaGFkZXJfbWVyZ2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIFVuaWZvcm1zXG4gICAgICAgIHNoYWRlcnMudW5pZm9ybXMgPSB7fTsgIC8vIHVuaWZvcm1zIGZvciB0aGlzIHN0eWxlLCBib3RoIGV4cGxpY2l0bHkgZGVmaW5lZCwgYW5kIG1peGVkIGZyb20gb3RoZXIgc3R5bGVzXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zID0gKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3JtcykgfHwge307IC8vIHVuaWZvcm1zIGV4cGxpY2l0bHkgZGVmaW5lZCBieSAqdGhpcyogc3R5bGVcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIHN0eWxlIGVhY2ggdW5pZm9ybSBvcmlnaW5hdGVkIGZyb20gKHRoaXMgb25lLCBvciBhbmNlc3RvcilcblxuICAgICAgICAvLyBNaXggaW4gdW5pZm9ybXMgZnJvbSBhbmNlc3RvcnMsIHByb3ZpZGluZyBtZWFucyB0byBhY2Nlc3NcbiAgICAgICAgc291cmNlc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHguc2hhZGVycyAmJiB4LnNoYWRlcnMudW5pZm9ybXMpXG4gICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IGluIHguc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XSA9IHgubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoaXMgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXR0ZXIgcmV0dXJucyB2YWx1ZSBmb3IgdGhpcyBzdHlsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgYXNrcyBhcHByb3ByaWF0ZSBhbmNlc3RvciBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGVyIHNldHMgdGhlIHZhbHVlIGZvciB0aGlzIHN0eWxlICh3aGV0aGVyIHByZXZpb3VzbHkgcHJlc2VudCBpbiB0aGlzIHN0eWxlIG9yIG5vdClcbiAgICAgICAgICAgICAgICAgICAgLy8gTWltaWNzIEpTIHByb3RvdHlwZS9oYXNPd25Qcm9wZXJ0eSBiZWhhdmlvciwgYnV0IHdpdGggbXVsdGlwbGUgYW5jZXN0b3JzICh2aWEgbWl4aW5zKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hhZGVycy51bmlmb3JtcywgdSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gaXMgZXhwbGljaXRseSBkZWZpbmVkIG9uIHRoaXMgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGVycy5fdW5pZm9ybXNbdV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhZGVycy5fdW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gd2FzIG1peGVkIGZyb20gYW5vdGhlciBzdHlsZSwgZm9yd2FyZCByZXF1ZXN0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgY2hlY2sgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgcHJldmlvdXNseSBkZWZpbmVkIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zICE9PSBzaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3Jtc1t1XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dGVuc2lvbnM6IGJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZXh0ZW5zaW9uc1xuICAgICAgICBzaGFkZXJzLmV4dGVuc2lvbnMgPSBPYmplY3Qua2V5cyhzaGFkZXJfbWVyZ2VzXG4gICAgICAgICAgICAubWFwKHggPT4geC5leHRlbnNpb25zKVxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbY3VyXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmZvckVhY2goeCA9PiBwcmV2W3hdID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSwge30pIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2hhZGVyIGJsb2Nrc1xuICAgICAgICAvLyBNYXJrIGFsbCBzaGFkZXIgYmxvY2tzIGZvciB0aGUgdGFyZ2V0IHN0eWxlIGFzIG9yaWdpbmF0aW5nIHdpdGggaXRzIG93biBuYW1lXG4gICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzdHlsZS5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHN0eWxlLnNoYWRlcnMuYmxvY2tzW2tdO1xuICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goLi4uYmxvY2subWFwKCgpID0+IHN0eWxlLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2Ugc2hhZGVyIGJsb2Nrcywga2VlcGluZyB0cmFjayBvZiB3aGljaCBzdHlsZSBlYWNoIGJsb2NrIG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgICBsZXQgbWl4ZWQgPSB7fTsgLy8gYWxsIHNjb3BlcyBtaXhlZCBzbyBmYXJcbiAgICAgICAgc2hhZGVyX21lcmdlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzID0gc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgbGV0IG1peGVkX3NvdXJjZSA9IHt9OyAvLyBzY29wZXMgbWl4ZWQgZm9yIHRoaXMgc291cmNlIHN0eWxlXG5cbiAgICAgICAgICAgIGZvciAobGV0IHQgaW4gc291cmNlLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHNvdXJjZS5ibG9ja3NbdF07XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrX3Njb3BlID0gc291cmNlLmJsb2NrX3Njb3Blc1t0XTtcblxuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdID0gc2hhZGVycy5ibG9ja3NbdF0gfHwgW107XG4gICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0gPSBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplIG9uIGFycmF5cyAoYmxvY2sgY2FuIGJlIHNpbmdsZSBvciBtdWx0aS12YWx1ZSlcbiAgICAgICAgICAgICAgICBibG9jayA9IEFycmF5LmlzQXJyYXkoYmxvY2spID8gYmxvY2sgOiBbYmxvY2tdO1xuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlID0gQXJyYXkuaXNBcnJheShibG9ja19zY29wZSkgPyBibG9ja19zY29wZSA6IFtibG9ja19zY29wZV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCBibG9jay5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGJsb2NrcyB3ZSd2ZSBhbHJlYWR5IG1peGVkIGluIGZyb20gdGhlIHNhbWUgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwZWF0aW5nIHNjb3BlIGluZGljYXRlcyBhIGRpYW1vbmQgcGF0dGVybiB3aGVyZSBhIHN0eWxlIGlzIGJlaW5nIG1peGVkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlZFtibG9ja19zY29wZVtiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1peGVkX3NvdXJjZVtibG9ja19zY29wZVtiXV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdLnB1c2goYmxvY2tbYl0pO1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XS5wdXNoKGJsb2NrX3Njb3BlW2JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBzdHlsZXMgbWl4ZWQgaW4gZnJvbSB0aGlzIHNvdXJjZSAtIHRoZXkgY291bGQgYmUgbXVsdGktbGV2ZWwgYW5jZXN0b3JzLFxuICAgICAgICAgICAgLy8gYmV5b25kIHRoZSBmaXJzdC1sZXZlbCBcInBhcmVudHNcIiBkZWZpbmVkIGluIHRoaXMgc3R5bGUncyBgbWl4YCBsaXN0XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1peGVkLCBtaXhlZF9zb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLm1peGVkLCBtaXhlZCk7IC8vIGFkZCBhbGwgbmV3bHkgbWl4ZWQgc3R5bGVzXG5cbiAgICAgICAgc3R5bGUuc2hhZGVycyA9IHNoYWRlcnM7IC8vIGFzc2lnbiBiYWNrIHRvIHN0eWxlXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGVcbiAgICAvLyBuYW1lOiBuYW1lIG9mIG5ldyBzdHlsZVxuICAgIC8vIGNvbmZpZzogcHJvcGVydGllcyBvZiBuZXcgc3R5bGVcbiAgICAvLyBzdHlsZXM6IHdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdCAodXNlZCBmb3IgbWl4aW5nIGluIGV4aXN0aW5nIHN0eWxlcylcbiAgICBjcmVhdGUgKG5hbWUsIGNvbmZpZywgc3R5bGVzID0ge30pIHtcbiAgICAgICAgbGV0IHN0eWxlID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpOyAvLyBkZWVwIGNvcHlcbiAgICAgICAgc3R5bGUubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gU3R5bGUgbWl4aW5zXG4gICAgICAgIHN0eWxlID0gdGhpcy5taXgoc3R5bGUsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gSGFzIGJhc2Ugc3R5bGU/XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyYWJsZSAoaW5zdGFudGlhdGVkKSBzdHlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBydW4tdGltZSB1c2VcbiAgICAgICAgLy8gT3RoZXJzIGFyZSBpbnRlcm1lZGlhcnkvYWJzdHJhY3QsIHVzZWQgZHVyaW5nIHN0eWxlIGNvbXBvc2l0aW9uIGJ1dCBub3QgZXhlY3V0aW9uXG4gICAgICAgIGlmIChzdHlsZS5iYXNlICYmIHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSksIHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmJhc2UgPSBudWxsOyAvLyBudWxsIG91dCBpbnZhbGlkIGJhc2Ugc3R5bGVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHN0eWxlc1xuICAgIGJ1aWxkIChzdHlsZXMpIHtcbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgZGVwZW5kZW5jeSwgdGhlbiBidWlsZCB0aGVtXG4gICAgICAgIGxldCBzdHlsZV9kZXBzID0gT2JqZWN0LmtleXMoc3R5bGVzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IHRoaXMuaW5oZXJpdGFuY2VEZXB0aChhLCBzdHlsZXMpIC0gdGhpcy5pbmhlcml0YW5jZURlcHRoKGIsIHN0eWxlcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBPbmx5IGtlZXAgYnVpbHQtaW4gYmFzZSBzdHlsZXNcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlX3N0eWxlc1tzbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNbc25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHRcbiAgICAgICAgbGV0IHdzID0ge307XG4gICAgICAgIHN0eWxlX2RlcHMuZm9yRWFjaChzbmFtZSA9PiB7XG4gICAgICAgICAgICB3c1tzbmFtZV0gPSB0aGlzLmNyZWF0ZShzbmFtZSwgc3R5bGVzW3NuYW1lXSwgd3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgc3R5bGVzXG4gICAgaW5pdFN0eWxlcyAoc2NlbmUgPSB7fSkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGFsbFxuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLmluaXQoc2NlbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzdHlsZSBrZXkgaW4gYSBzZXQgb2Ygc3R5bGVzIHRvIGFkZCwgY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAgICBpbmhlcml0YW5jZURlcHRoIChrZXksIHN0eWxlcykge1xuICAgICAgICBsZXQgcGFyZW50cyA9IDA7XG5cbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNjZW5lIGRlZiBlcnJvciwgdHJ5aW5nIHRvIGV4dGVuZCBhIHN0eWxlIHRoYXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGVuZHMgd2hlbiB0aGlzIHN0eWxlIGlzbid0IG1peGluZyBpbiBhbnkgb3RoZXJzXG4gICAgICAgICAgICBpZiAoIXN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSBuZXh0IHBhcmVudCBzdHlsZVxuICAgICAgICAgICAgcGFyZW50cysrO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5taXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgbWl4aW5zLCBmaW5kIHRoZSBkZWVwZXN0IG9uZVxuICAgICAgICAgICAgICAgIHBhcmVudHMgKz0gTWF0aC5tYXgoLi4uc3R5bGUubWl4Lm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChzLCBzdHlsZXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHNpbmdsZSBtaXhpbiwgY29udGludWUgbG9vcCB1cCB0aGUgdHJlZVxuICAgICAgICAgICAgICAgIGtleSA9IHN0eWxlLm1peDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBwYXJzZUNTU0NvbG9yIGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuZXhwb3J0IHZhciBTdHlsZVBhcnNlciA9IHt9O1xuXG4vLyBXcmFwcyBzdHlsZSBmdW5jdGlvbnMgYW5kIHByb3ZpZGVzIGEgc2NvcGUgb2YgY29tbW9ubHkgYWNjZXNzaWJsZSBkYXRhOlxuLy8gLSBmZWF0dXJlOiB0aGUgJ3Byb3BlcnRpZXMnIG9mIHRoZSBmZWF0dXJlLCBlLmcuIGFjY2Vzc2VkIGFzICdmZWF0dXJlLm5hbWUnXG4vLyAtIGdsb2JhbDogdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgb24gdGhlIGBnbG9iYWxgIG9iamVjdCBpbiB0aGUgc2NlbmUgZmlsZVxuLy8gLSAkem9vbTogdGhlIGN1cnJlbnQgbWFwIHpvb20gbGV2ZWxcbi8vIC0gJGdlb21ldHJ5OiB0aGUgdHlwZSBvZiBnZW9tZXRyeSwgJ3BvaW50JywgJ2xpbmUnLCBvciAncG9seWdvbidcbi8vIC0gJG1ldGVyc19wZXJfcGl4ZWw6IGNvbnZlcnNpb24gZm9yIG1ldGVycy9waXhlbHMgYXQgY3VycmVudCBtYXAgem9vbVxuU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgZiA9IGBcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdmFyIGdsb2JhbCA9IGNvbnRleHQuZ2xvYmFsO1xuICAgICAgICB2YXIgJHpvb20gPSBjb250ZXh0Lnpvb207XG4gICAgICAgIHZhciAkbGF5ZXIgPSBjb250ZXh0LmxheWVyO1xuICAgICAgICB2YXIgJGdlb21ldHJ5ID0gY29udGV4dC5nZW9tZXRyeTtcbiAgICAgICAgdmFyICRtZXRlcnNfcGVyX3BpeGVsID0gY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIHZhciB2YWwgPSAoZnVuY3Rpb24oKXsgJHtmdW5jfSB9KCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSBudWxsOyAvLyBjb252ZXJ0IE5hTnMgdG8gbnVsbHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgYDtcbiAgICByZXR1cm4gZjtcbn07XG5cblxuLy8gU3R5bGUgcGFyc2luZ1xuXG5TdHlsZVBhcnNlci56ZXJvUGFpciA9IE9iamVjdC5mcmVlemUoWzAsIDBdKTsgLy8gc2luZ2xlIGFsbG9jYXRpb24gZm9yIHplcm8gdmFsdWVzIHRoYXQgd29uJ3QgYmUgbW9kaWZpZWRcblxuLy8gU3R5bGUgZGVmYXVsdHNcblN0eWxlUGFyc2VyLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yOiBbMSwgMSwgMSwgMV0sXG4gICAgd2lkdGg6IDEsXG4gICAgc2l6ZTogMSxcbiAgICBleHRydWRlOiBmYWxzZSxcbiAgICBoZWlnaHQ6IDIwLFxuICAgIG1pbl9oZWlnaHQ6IDAsXG4gICAgb3JkZXI6IDAsXG4gICAgejogMCxcbiAgICBtYXRlcmlhbDoge1xuICAgICAgICBhbWJpZW50OiAxLFxuICAgICAgICBkaWZmdXNlOiAxXG4gICAgfVxufTtcblxuLy8gU3R5bGUgbWFjcm9zXG5TdHlsZVBhcnNlci5tYWNyb3MgPSB7XG4gICAgLy8gcHNldWRvLXJhbmRvbSBjb2xvciBieSBnZW9tZXRyeSBpZFxuICAgICdTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMCAlIDEpLCAgICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAgJSAxKSwgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMDAwICUgMSksIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMVxuICAgICAgICBdO1xuICAgIH0sXG5cbiAgICAvLyByYW5kb20gY29sb3JcbiAgICAnU3R5bGUuY29sb3IucmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFswLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAxXTtcbiAgICB9XG59O1xuXG4vLyBBIGNvbnRleHQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHN0eWxlIHBhcnNpbmcgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYSBzY29wZSBvZiBjb21tb25seSB1c2VkIHZhbHVlc1xuU3R5bGVQYXJzZXIuZ2V0RmVhdHVyZVBhcnNlQ29udGV4dCA9IGZ1bmN0aW9uIChmZWF0dXJlLCB0aWxlLCBnbG9iYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB0aWxlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHpvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgZ2VvbWV0cnk6IEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGlsZS5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciA9IDg7IC8vIHZlcnRpY2FsIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyID0gNDsgLy8gdGV4dCBzdHlsaW5nIHN1Y2ggYXMgaXRhbGljIGVtcGhhc2lzIGlzIG5vdCBtZWFzdXJlZCBieSB0aGUgQ2FudmFzIEFQSSwgc28gcGFkZGluZyBpcyBuZWNlc3NhcnlcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICB0aGlzLnB4X3NpemUgPSBweF9zaXplO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoICogZHByO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIGxldCBkcHI7XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwge307XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAqIHRleHRfc2V0dGluZ3Muc3VwZXJzYW1wbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV93aWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dCgnICcpLndpZHRoIC8gZHByO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zcGFjZV93aWR0aCA9IHNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50cyA9IHNwbGl0TGFiZWxUZXh0KHRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2VnbWVudHMgPSBzZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50ID0gc2VnbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0gPSB0aGlzLnRleHRTaXplKHNlZ21lbnQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLm1pc3NlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5oaXRzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnB1c2goQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XS5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0gPSB0aGlzLnRleHRTaXplKHRleHQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCB0ZXh0IHNpemVzIGJhY2sgdG8gd29ya2VyIChrZWVwIGNvbXB1dGVkIHRleHQgbGluZSBpbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBtYWluIHRocmVhZCwgZm9yIGZ1dHVyZSByZW5kZXJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2l6ZSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0uc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRleHRzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlcyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRleHQgYmFzZWQgb24gY3VycmVudCBmb250IHN0eWxlXG4gICAgLy8gSW5jbHVkZXMgd29yZCB3cmFwcGluZywgcmV0dXJucyBzaXplIGluZm8gZm9yIHdob2xlIHRleHQgYmxvY2sgYW5kIGluZGl2aWR1YWwgbGluZXNcbiAgICB0ZXh0U2l6ZSAodGV4dCwge3RyYW5zZm9ybSwgdGV4dF93cmFwLCBtYXhfbGluZXMsIHN0cm9rZV93aWR0aCA9IDAsIHN1cGVyc2FtcGxlfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybSh0ZXh0LCB0cmFuc2Zvcm0pO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciAqIGRwcjtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG4gICAgICAgIGxldCBsZWFkaW5nID0gMiAqIGRwcjsgLy8gbWFrZSBjb25maWd1cmFibGUgYW5kL29yIHVzZSBDYW52YXMgVGV4dE1ldHJpY3Mgd2hlbiBhdmFpbGFibGVcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gdGhpcy5weF9zaXplICsgbGVhZGluZzsgLy8gcHhfc2l6ZSBhbHJlYWR5IGluIGRldmljZSBwaXhlbHNcblxuICAgICAgICAvLyBQYXJzZSBzdHJpbmcgaW50byBzZXJpZXMgb2YgbGluZXMgaWYgaXQgZXhjZWVkcyB0aGUgdGV4dCB3cmFwcGluZyB2YWx1ZSBvciBjb250YWlucyBsaW5lIGJyZWFrc1xuICAgICAgICBsZXQgbXVsdGlsaW5lID0gTXVsdGlMaW5lLnBhcnNlKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpO1xuXG4gICAgICAgIC8vIEZpbmFsIGRpbWVuc2lvbnMgb2YgdGV4dFxuICAgICAgICBsZXQgaGVpZ2h0ID0gbXVsdGlsaW5lLmhlaWdodDtcbiAgICAgICAgbGV0IHdpZHRoID0gbXVsdGlsaW5lLndpZHRoO1xuICAgICAgICBsZXQgbGluZXMgPSBtdWx0aWxpbmUubGluZXM7XG5cbiAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggLyBkcHIsXG4gICAgICAgICAgICBoZWlnaHQgLyBkcHJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggKyAyICogaG9yaXpvbnRhbF9idWZmZXIsXG4gICAgICAgICAgICBoZWlnaHQgKyAyICogdmVydGljYWxfYnVmZmVyXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGxvZ2ljYWxfc2l6ZSA9IFtcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVswXSAvIGRwcixcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVsxXSAvIGRwcixcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBSZXR1cm5zIGxpbmVzICh3L3Blci1saW5lIGluZm8gZm9yIGRyYXdpbmcpIGFuZCB0ZXh0J3Mgb3ZlcmFsbCBib3VuZGluZyBib3ggKyBjYW52YXMgc2l6ZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzaXplOiB7IGNvbGxpc2lvbl9zaXplLCB0ZXh0dXJlX3NpemUsIGxvZ2ljYWxfc2l6ZSwgbGluZV9oZWlnaHQgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIERyYXcgbXVsdGlwbGUgbGluZXMgb2YgdGV4dFxuICAgIGRyYXdUZXh0TXVsdGlMaW5lIChsaW5lcywgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSBzaXplLmxpbmVfaGVpZ2h0O1xuICAgICAgICBsZXQgaGVpZ2h0ID0geTtcbiAgICAgICAgZm9yIChsZXQgbGluZV9udW09MDsgbGluZV9udW0gPCBsaW5lcy5sZW5ndGg7IGxpbmVfbnVtKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbbGluZV9udW1dO1xuICAgICAgICAgICAgdGhpcy5kcmF3VGV4dExpbmUobGluZSwgW3gsIGhlaWdodF0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGgsIHRyYW5zZm9ybSwgYWxpZ24sIHN1cGVyc2FtcGxlIH0pO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAodGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyICsgc3Ryb2tlX3dpZHRoKTtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSBkcHIgKiB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyO1xuICAgICAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gc2l6ZS5jb2xsaXNpb25fc2l6ZTtcbiAgICAgICAgICAgIGxldCBsaW5lV2lkdGggPSAyO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnYmx1ZSc7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVJlY3QoeCArIGhvcml6b250YWxfYnVmZmVyLCB5ICsgdmVydGljYWxfYnVmZmVyLCBkcHIgKiBjb2xsaXNpb25fc2l6ZVswXSwgZHByICogY29sbGlzaW9uX3NpemVbMV0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3MuZHJhd19sYWJlbF90ZXh0dXJlX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICAvLyBzdHJva2UgaXMgYXBwbGllZCBpbnRlcm5hbGx5LCBzbyB0aGUgb3V0ZXIgYm9yZGVyIGlzIHRoZSBlZGdlIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlUmVjdCh4ICsgbGluZVdpZHRoLCB5ICsgbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMF0gLSAyICogbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMV0gLSAyICogbGluZVdpZHRoKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYXcgc2luZ2xlIGxpbmUgb2YgdGV4dCBhdCBzcGVjaWZpZWQgbG9jYXRpb24sIGFkanVzdGluZyBmb3IgYnVmZmVyIGFuZCBiYXNlbGluZVxuICAgIGRyYXdUZXh0TGluZSAobGluZSwgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgIGFsaWduID0gYWxpZ24gfHwgJ2NlbnRlcic7XG5cbiAgICAgICAgbGV0IHZlcnRpY2FsX2J1ZmZlciA9IHRoaXMudmVydGljYWxfdGV4dF9idWZmZXIgKiBkcHI7XG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBzaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gc2l6ZS5saW5lX2hlaWdodDtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG5cbiAgICAgICAgbGV0IHN0ciA9IHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtKGxpbmUudGV4dCwgdHJhbnNmb3JtKTtcblxuICAgICAgICAvLyBUZXh0IGFsaWdubWVudFxuICAgICAgICBsZXQgdHg7XG4gICAgICAgIGlmIChhbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICB0eCA9IHggKyBob3Jpem9udGFsX2J1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIHR4ID0geCArIHRleHR1cmVfc2l6ZVswXS8yIC0gbGluZS53aWR0aC8yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0gLSBsaW5lLndpZHRoIC0gaG9yaXpvbnRhbF9idWZmZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbiB0aGUgYWJzZW5jZSBvZiBiZXR0ZXIgQ2FudmFzIFRleHRNZXRyaWNzIChub3Qgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzIHlldCksXG4gICAgICAgIC8vIDAuNzUgYnVmZmVyIHByb2R1Y2VzIGEgYmV0dGVyIGFwcHJveGltYXRlIHZlcnRpY2FsIGNlbnRlcmluZyBvZiB0ZXh0XG4gICAgICAgIGxldCB0eSA9IHkgKyB2ZXJ0aWNhbF9idWZmZXIgKiAwLjc1ICsgbGluZV9oZWlnaHQ7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KHN0ciwgdHgsIHR5KTtcbiAgICB9XG5cbiAgICByYXN0ZXJpemUgKHRleHRzLCB0ZXh0dXJlX3NpemUsIHRpbGVfa2V5KSB7XG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0X2luZm9zW3RleHRdO1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gdGV4dF9pbmZvLnRleHRfc2V0dGluZ3M7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXQgZm9udCBvbiBmaXJzdCBvY2N1cmVuY2Ugb2YgbmV3IGZvbnQgc3R5bGVcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmRzID0gdGV4dF9pbmZvLnNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8udGV4Y29vcmRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZCA9IHdvcmRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleGNvb3JkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZCA9IENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlX3Bvc2l0aW9uID0gQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleHR1cmVfcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3dvcmRdLnNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3dvcmRdLmxpbmVzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE11bHRpTGluZShsaW5lLCB0ZXh0dXJlX3Bvc2l0aW9uLCBzaXplLCB0ZXh0X3NldHRpbmdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGNvb3JkID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkID0gdGV4Y29vcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby50ZXhjb29yZHMucHVzaCh0ZXhjb29yZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lcyA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0ubGluZXM7IC8vIGdldCBwcmV2aW91c2x5IGNvbXB1dGVkIGxpbmVzIG9mIHRleHRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdUZXh0TXVsdGlMaW5lKGxpbmVzLCB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sIHRleHRfaW5mby5zaXplLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiB0ZXh0X3NldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Vfd2lkdGg6IHRleHRfc2V0dGluZ3Muc3Ryb2tlX3dpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdGV4dF9zZXR0aW5ncy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJzYW1wbGU6IHRleHRfc2V0dGluZ3Muc3VwZXJzYW1wbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246IGFsaWduXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXhjb29yZHMgPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBsYWNlIHRleHQgbGFiZWxzIHdpdGhpbiBhbiBhdGxhcyBvZiB0aGUgZ2l2ZW4gbWF4IHNpemVcbiAgICBzZXRUZXh0dXJlVGV4dFBvc2l0aW9ucyAodGV4dHMsIG1heF90ZXh0dXJlX3NpemUsIHRpbGVfa2V5KSB7XG4gICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0pIHtcbiAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGNvbHVtbiB3aWR0aFxuICAgICAgICBsZXQgY29sdW1uX3dpZHRoID0gMDtcblxuICAgICAgICAvLyBMYXlvdXQgbGFiZWxzLCBzdGFja2VkIGluIGNvbHVtbnNcbiAgICAgICAgbGV0IGN4ID0gMCwgY3kgPSAwOyAvLyBjdXJyZW50IHgveSBwb3NpdGlvbiBpbiBhdGxhc1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDsgICAgIC8vIG92ZXJhbGwgYXRsYXMgaGVpZ2h0XG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXSkge1xuICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm9zID0gdGV4dHNbc3R5bGVdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRfaW5mby5zaXplLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZCA9IHRleHRfaW5mby5zZWdtZW50c1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplW2ldLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZVswXSA+IGNvbHVtbl93aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSBzaXplWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgKyBzaXplWzFdIDwgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgKz0gc2l6ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBjeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RhcnQgbmV3IGNvbHVtbiBpZiB0YWxsZXIgdGhhbiB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4ICs9IGNvbHVtbl93aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uOiB0ZXh0dXJlX3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyZWQgc2l6ZSBpcyBzYW1lIGZvciBhbGwgYWxpZ25tZW50c1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVbMF0gPiBjb2x1bW5fd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IHNpemVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgZWFjaCBhbGlnbm1lbnQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgc2VwYXJhdGVseVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhbGlnbiBpbiB0ZXh0X2luZm8uYWxpZ24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSArIHNpemVbMV0gPCBtYXhfdGV4dHVyZV9zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07IC8vIGFkZCBsYWJlbCB0byBjdXJyZW50IGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ICs9IHNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBzdGFydCBuZXcgY29sdW1uIGlmIHRhbGxlciB0aGFuIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeCArPSBjb2x1bW5fd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2N4ICsgY29sdW1uX3dpZHRoLCBoZWlnaHRdOyAvLyBvdmVyYWxsIGF0bGFzIHNpemVcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYmVmb3JlIHJhc3Rlcml6YXRpb25cbiAgICBhcHBseVRleHRUcmFuc2Zvcm0gKHRleHQsIHRyYW5zZm9ybSkge1xuICAgICAgICBpZiAodHJhbnNmb3JtID09PSAnY2FwaXRhbGl6ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcd1xcUyovZywgZnVuY3Rpb24gKHR4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAndXBwZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgZm9udCBDU1Mtc3R5bGUgc2l6ZSAoJzEycHgnLCAnMTRwdCcsICcxLjVlbScsIGV0Yy4pIHRvIHBpeGVsIHNpemUgKGFkanVzdGVkIGZvciBkZXZpY2UgcGl4ZWwgcmF0aW8pXG4gICAgLy8gRGVmYXVsdHMgdW5pdHMgdG8gcGl4ZWxzIGlmIG5vdCBzcGVjaWZpZWRcbiAgICBzdGF0aWMgZm9udFBpeGVsU2l6ZSAoc2l6ZSkge1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2l6ZSA9ICh0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycpID8gc2l6ZSA6IFN0cmluZyhzaXplKTsgLy8gbmVlZCBhIHN0cmluZyBmb3IgcmVnZXhcblxuICAgICAgICBsZXQgWywgcHhfc2l6ZSwgdW5pdHNdID0gc2l6ZS5tYXRjaChDYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSkgfHwgW107XG4gICAgICAgIHVuaXRzID0gdW5pdHMgfHwgJ3B4JztcblxuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAqPSAxNjtcbiAgICAgICAgfSBlbHNlIGlmICh1bml0cyA9PT0gXCJwdFwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDAuNzU7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwiJVwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDYuMjU7XG4gICAgICAgIH1cblxuICAgICAgICBweF9zaXplID0gcGFyc2VGbG9hdChweF9zaXplKTtcbiAgICAgICAgcHhfc2l6ZSAqPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBweF9zaXplO1xuICAgIH1cblxuICAgIGNsZWFyVGV4Y29vcmRDYWNoZSAodGlsZV9rZXkpIHtcbiAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0gPSB7fTtcbiAgICB9XG5cbn1cblxuLy8gRXh0cmFjdCBmb250IHNpemUgYW5kIHVuaXRzXG5DYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSA9IC8oKD86WzAtOV0qXFwuKT9bMC05XSspXFxzKihweHxwdHxlbXwlKT8vO1xuXG4vLyBDYWNoZSBzaXplcyBvZiByZW5kZXJlZCB0ZXh0XG5DYW52YXNUZXh0LnRleHRfY2FjaGUgPSB7fTsgLy8gYnkgdGV4dCBzdHlsZSwgdGhlbiB0ZXh0IHN0cmluZ1xuQ2FudmFzVGV4dC5jYWNoZV9zdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG5DYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlID0ge307XG5cbi8vIFJpZ2h0LXRvLWxlZnQgLyBiaS1kaXJlY3Rpb25hbCB0ZXh0IGhhbmRsaW5nXG4vLyBUYWtlbiBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTIwMDYwOTUvamF2YXNjcmlwdC1ob3ctdG8tY2hlY2staWYtY2hhcmFjdGVyLWlzLXJ0bCNhbnN3ZXItMTkxNDMyNTRcbmxldCBydGxSZWdFeCA9IC9eW15cXHUwNTkxLVxcdTA3RkZcXHUyMDBGXFx1MjAyQlxcdTIwMkVcXHVGQjFELVxcdUZERkRcXHVGRTcwLVxcdUZFRkNdKj9bXFx1MDU5MS1cXHUwN0ZGXFx1MjAwRlxcdTIwMkJcXHUyMDJFXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXS87XG5mdW5jdGlvbiBpc1JUTChzKXtcbiAgICByZXR1cm4gcnRsUmVnRXgudGVzdChzKTtcbn1cblxuZnVuY3Rpb24gcmVvcmRlcldvcmRzTFRSKHdvcmRzKSB7XG4gICAgbGV0IHdvcmRzX0xUUiA9IFtdO1xuICAgIGxldCB3b3Jkc19SVEwgPSBbXTtcblxuICAgIC8vIGxvb3AgdGhyb3VnaCB3b3JkcyBhbmQgcmUtb3JkZXIgUlRMIGdyb3VwcyBpbiByZXZlcnNlIG9yZGVyIChidXQgaW4gTFRSIHZpc3VhbCBvcmRlcilcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHN0ciA9IHdvcmRzW2ldO1xuICAgICAgICB2YXIgcnRsID0gaXNSVEwoc3RyKTtcbiAgICAgICAgaWYgKHJ0bCl7XG4gICAgICAgICAgICB3b3Jkc19SVEwucHVzaChzdHIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKHdvcmRzX1JUTC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICB3b3Jkc19MVFIucHVzaCh3b3Jkc19SVEwucG9wKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd29yZHNfTFRSLnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdoaWxlICh3b3Jkc19SVEwubGVuZ3RoID4gMCl7XG4gICAgICAgIHdvcmRzX0xUUi5wdXNoKHdvcmRzX1JUTC5wb3AoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmRzX0xUUjtcbn1cblxuLy8gU3BsaXR0aW5nIHN0cmF0ZWd5IGZvciBjaG9wcGluZyBhIGxhYmVsIGludG8gc2VnbWVudHNcbmZ1bmN0aW9uIHNwbGl0TGFiZWxUZXh0KHRleHQpe1xuICAgIGxldCB3b3JkcyA9IHRleHQuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4gcmVvcmRlcldvcmRzTFRSKHdvcmRzKTtcbn1cblxuLy8gUHJpdmF0ZSBjbGFzcyB0byBhcnJhbmdlIHRleHQgbGFiZWxzIGludG8gbXVsdGlwbGUgbGluZXMgYmFzZWQgb25cbi8vIFwidGV4dCB3cmFwXCIgYW5kIFwibWF4IGxpbmVcIiB2YWx1ZXNcbmNsYXNzIE11bHRpTGluZSB7XG4gICAgY29uc3RydWN0b3IgKGNvbnRleHQsIG1heF9saW5lcyA9IEluZmluaXR5LCB0ZXh0X3dyYXAgPSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG5cbiAgICAgICAgdGhpcy5lbGxpcHNpcyA9ICcuLi4nO1xuICAgICAgICB0aGlzLmVsbGlwc2lzX3dpZHRoID0gTWF0aC5jZWlsKGNvbnRleHQubWVhc3VyZVRleHQodGhpcy5lbGxpcHNpcykud2lkdGgpO1xuXG4gICAgICAgIHRoaXMubWF4X2xpbmVzID0gbWF4X2xpbmVzO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG5cbiAgICBjcmVhdGVMaW5lIChsaW5lX2hlaWdodCl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShsaW5lX2hlaWdodCwgdGhpcy50ZXh0X3dyYXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCAobGluZSl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIC8vIG1lYXN1cmUgbGluZSB3aWR0aFxuICAgICAgICAgICAgbGV0IGxpbmVfd2lkdGggPSB0aGlzLmNvbnRleHQubWVhc3VyZVRleHQobGluZS50ZXh0KS53aWR0aDtcbiAgICAgICAgICAgIGxpbmUud2lkdGggPSBsaW5lX3dpZHRoO1xuXG4gICAgICAgICAgICBpZiAobGluZV93aWR0aCA+IHRoaXMud2lkdGgpe1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBNYXRoLmNlaWwobGluZV93aWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCB0byBsaW5lcyBhbmQgaW5jcmVtZW50IGhlaWdodFxuICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgKz0gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxsaXBzaXMoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHB1c2hlcyB0byB0aGUgbGluZXMgYXJyYXkgYW5kIHJldHVybnMgYSBuZXcgbGluZSBpZiBwb3NzaWJsZSAoZmFsc2Ugb3RoZXJ3aXNlKVxuICAgIGFkdmFuY2UgKGxpbmUsIGxpbmVfaGVpZ2h0KSB7XG4gICAgICAgIGxldCBjYW5fcHVzaCA9IHRoaXMucHVzaChsaW5lKTtcbiAgICAgICAgaWYgKGNhbl9wdXNoKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRWxsaXBzaXMgKCl7XG4gICAgICAgIGxldCBsYXN0X2xpbmUgPSB0aGlzLmxpbmVzW3RoaXMubGluZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFzdF9saW5lLmFwcGVuZCh0aGlzLmVsbGlwc2lzKTtcbiAgICAgICAgbGFzdF9saW5lLndpZHRoICs9IHRoaXMuZWxsaXBzaXNfd2lkdGg7XG5cbiAgICAgICAgaWYgKGxhc3RfbGluZS53aWR0aCA+IHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBsYXN0X2xpbmUud2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5pc2ggKGxpbmUpe1xuICAgICAgICBpZiAobGluZSl7XG4gICAgICAgICAgICB0aGlzLnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVsbGlwc2lzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UgKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpIHtcbiAgICAgICAgLy8gV29yZCB3cmFwcGluZ1xuICAgICAgICAvLyBMaW5lIGJyZWFrcyBjYW4gYmUgY2F1c2VkIGJ5OlxuICAgICAgICAvLyAgLSBpbXBsaWNpdCBsaW5lIGJyZWFrIHdoZW4gYSBtYXhpbXVtIGNoYXJhY3RlciB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgcGVyIGxpbmUgKHRleHRfd3JhcClcbiAgICAgICAgLy8gIC0gZXhwbGljaXQgbGluZSBicmVhayBpbiB0aGUgbGFiZWwgdGV4dCAoXFxuKVxuICAgICAgICBsZXQgd29yZHM7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dF93cmFwID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgd29yZHMgPSBzdHIuc3BsaXQoJyAnKTsgLy8gc3BsaXQgd29yZHMgb24gc3BhY2VzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3b3JkcyA9IFtzdHJdOyAvLyBubyBtYXggbGluZSB3b3JkIHdyYXBwaW5nIChidXQgbmV3IGxpbmVzIHdpbGwgc3RpbGwgYmUgaW4gZWZmZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG11bHRpbGluZSA9IG5ldyBNdWx0aUxpbmUoY3R4LCBtYXhfbGluZXMsIHRleHRfd3JhcCk7XG4gICAgICAgIGxldCBsaW5lID0gbXVsdGlsaW5lLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuXG4gICAgICAgIC8vIEZpcnN0IGl0ZXJhdGUgb24gc3BhY2UtYnJlYWsgZ3JvdXBzICh3aWxsIGJlIG9uZSBpZiBtYXggbGluZSBsZW5ndGggb2ZmKSwgdGhlbiBpdGVyYXRlIG9uIGxpbmUtYnJlYWsgZ3JvdXBzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSB3b3Jkc1tpXS5zcGxpdCgnXFxuJyk7IC8vIHNwbGl0IG9uIGxpbmUgYnJlYWtzXG4gICAgICAgICAgICBsZXQgbmV3X2xpbmUgPSAoaSA9PT0gMCkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG49MDsgbiA8IGJyZWFrcy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgICAgIGlmICghbGluZSl7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB3b3JkID0gYnJlYWtzW25dLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmICghd29yZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc3BhY2VkX3dvcmQgPSAobmV3X2xpbmUpID8gd29yZCA6ICcgJyArIHdvcmQ7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBhZGRpbmcgY3VycmVudCB3b3JkIHdvdWxkIG92ZXJmbG93LCBhZGQgYSBuZXcgbGluZSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgLy8gZmlyc3Qgd29yZCAoaSA9PT0gMCkgYWx3YXlzIGFwcGVuZHNcbiAgICAgICAgICAgICAgICBpZiAodGV4dF93cmFwICYmIGkgPiAwICYmIGxpbmUuZXhjZWVkc1RleHR3cmFwKHNwYWNlZF93b3JkKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod29yZCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld19saW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHNwYWNlZF93b3JkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBsaW5lIGJyZWFrcyBwcmVzZW50LCBhZGQgbmV3IGxpbmUgKHVubGVzcyBvbiBsYXN0IGxpbmUpXG4gICAgICAgICAgICAgICAgaWYgKG4gPCBicmVha3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdfbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gd29yZHMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgICAgbXVsdGlsaW5lLmZpbmlzaChsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXVsdGlsaW5lO1xuICAgIH1cbn1cblxuLy8gQSBQcml2YXRlIGNsYXNzIHVzZWQgYnkgTXVsdGlMaW5lIHRvIGNvbnRhaW4gdGhlIGxvZ2ljIGZvciBhIHNpbmdsZSBsaW5lXG4vLyBpbmNsdWRpbmcgY2hhcmFjdGVyIGNvdW50LCB3aWR0aCwgaGVpZ2h0IGFuZCB0ZXh0XG5jbGFzcyBMaW5lIHtcbiAgICBjb25zdHJ1Y3RvciAoaGVpZ2h0ID0gMCwgdGV4dF93cmFwID0gMCl7XG4gICAgICAgIHRoaXMuY2hhcnMgPSAwO1xuICAgICAgICB0aGlzLnRleHQgPSAnJztcblxuICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQpO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICB9XG5cbiAgICBhcHBlbmQgKHRleHQpe1xuICAgICAgICB0aGlzLmNoYXJzICs9IHRleHQubGVuZ3RoO1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG5cbiAgICBleGNlZWRzVGV4dHdyYXAgKHRleHQpe1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggKyB0aGlzLmNoYXJzID4gdGhpcy50ZXh0X3dyYXA7XG4gICAgfVxufVxuIiwiLyogZ2xvYmFsIEZvbnRGYWNlICovXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEZvbnRGYWNlT2JzZXJ2ZXIgZnJvbSAnZm9udGZhY2VvYnNlcnZlcic7XG5cbmNvbnN0IEZvbnRNYW5hZ2VyID0ge1xuXG4gICAgLy8gRm9udCBkZXRlY3Rpb25cbiAgICBmb250c19sb2FkZWQ6IFByb21pc2UucmVzb2x2ZSgpLCAvLyByZXNvbHZlcyB3aGVuIGFsbCByZXF1ZXN0ZWQgZm9udHMgaGF2ZSBiZWVuIGRldGVjdGVkXG5cbiAgICAvLyBMb2FkIHNldCBvZiBjdXN0b20gZm9udCBmYWNlc1xuICAgIC8vIGBmb250c2AgaXMgYW4gb2JqZWN0IHdoZXJlIHRoZSBrZXkgaXMgYSBmb250IGZhbWlseSBuYW1lLCBhbmQgdGhlIHZhbHVlIGlzIG9uZSBvciBtb3JlIGZvbnQgZmFjZVxuICAgIC8vIGRlZmluaXRpb25zLiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHN1Y2ggb2JqZWN0cy5cbiAgICAvLyBJZiB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWUgJ2V4dGVybmFsJyBpcyB1c2VkLCBpdCBpbmRpY2F0ZXMgdGhlIHRoZSBmb250IHdpbGwgYmUgbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuXG4gICAgbG9hZEZvbnRzIChmb250cykge1xuICAgICAgICBpZiAoZm9udHMpIHtcbiAgICAgICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZmFtaWx5IGluIGZvbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZm9udHNbZmFtaWx5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9udHNbZmFtaWx5XS5mb3JFYWNoKGZhY2UgPT4gcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZhY2UpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHRoaXMubG9hZEZvbnRGYWNlKGZhbWlseSwgZm9udHNbZmFtaWx5XSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb250c19sb2FkZWQgPSBQcm9taXNlLmFsbChxdWV1ZS5maWx0ZXIoeCA9PiB4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udHNfbG9hZGVkO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkIGEgc2luZ2xlIGZvbnQgZmFjZVxuICAgIC8vIGBmYWNlYCBjb250YWlucyB0aGUgZm9udCBmYWNlIGRlZmluaXRpb24sIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYHdlaWdodGAsIGBzdHlsZWAsIGFuZCBgdXJsYC5cbiAgICAvLyBJZiB0aGUgYHVybGAgaXMgZGVmaW5lZCwgdGhlIGZvbnQgaXMgaW5qZWN0ZWQgaW50byB0aGUgZG9jdW1lbnQgYXMgYSBDU1MgZm9udC1mYWNlLlxuICAgIC8vIElmIHRoZSBvYmplY3QncyB2YWx1ZSBpcyB0aGUgc3BlY2lhbCBzdHJpbmcgJ2V4dGVybmFsJywgb3IgaWYgbm8gYHVybGAgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZm9udCBmYWNlXG4gICAgLy8gaXMgYXNzdW1lZCBpcyBhc3N1bWVkIHRvIGJlZW4gbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuIEluIGVpdGhlciBjYXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2VcbiAgICAvLyB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbnQgZmFjZSBoYXMgbG9hZGVkLCBvciB0aW1lcyBvdXQuXG4gICAgbG9hZEZvbnRGYWNlIChmYW1pbHksIGZhY2UpIHtcbiAgICAgICAgaWYgKGZhY2UgPT0gbnVsbCB8fCAodHlwZW9mIGZhY2UgIT09ICdvYmplY3QnICYmIGZhY2UgIT09ICdleHRlcm5hbCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IHsgZmFtaWx5IH07XG4gICAgICAgIGxldCBpbmplY3QgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGZhY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIGZhY2UpO1xuXG4gICAgICAgICAgICAvLyBJZiBVUkwgaXMgZGVmaW5lZCwgaW5qZWN0IGZvbnQgaW50byBkb2N1bWVudFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmYWNlLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbmplY3QgPSB0aGlzLmluamVjdEZvbnRGYWNlKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgZm9udCB0byBsb2FkXG4gICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBGb250RmFjZU9ic2VydmVyKGZhbWlseSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBpbmplY3QudGhlbigoKSA9PiBvYnNlcnZlci5sb2FkKCkpLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlcywgZm9udCBpcyBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBhdmFpbGFibGVgLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RzLCBmb250IGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBOT1QgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8vIExvYWRzIGEgZm9udCBmYWNlIHZpYSBlaXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEksIG9yIENTUyBpbmplY3Rpb25cbiAgICAvLyBUT0RPOiBjb25zaWRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBmb3JtYXQgVVJMcyBwZXIgZmFjZSwgdW5pY29kZSByYW5nZXNcbiAgICBpbmplY3RGb250RmFjZSAoeyBmYW1pbHksIHVybCwgd2VpZ2h0LCBzdHlsZSB9KSB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzX25hdGl2ZV9mb250X2xvYWRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID0gKHdpbmRvdy5Gb250RmFjZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgYmxvYiBVUkxzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmF0aXZlIEZvbnRGYWNlIEFQSSB3aWxsIGJlIHVzZWQgb3Igbm90LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgKmlzKiBzdXBwb3J0ZWQsIHRoZSBibG9iIFVSTCBpcyByZWFkIGludG8gYSByYXcgZGF0YSBhcnJheS5cbiAgICAgICAgLy8gTkI6IGl0J3MgaW5lZmZpY2llbnQgdG8gYmUgY29udmVydGluZyBibG9iIFVSTHMgaW50byB0eXBlZCBhcnJheXMgaGVyZSwgc2luY2UgdGhleSBvcmlnaW5hdGVkXG4gICAgICAgIC8vIGFzIHJhdyBkYXRhICpiZWZvcmUqIHRoZXkgd2VyZSBjb252ZXJ0ZWQgaW50byBibG9iIFVSTHMuIEhvd2V2ZXIsIHRoaXMgcHJvY2VzcyBzaG91bGQgYmUgZmFzdCBzaW5jZVxuICAgICAgICAvLyB0aGVzZSBhcmUgbmF0aXZlIGJyb3dzZXIgZnVuY3Rpb25zIGFuZCBhbGwgZGF0YSBpcyBsb2NhbCAobm8gbmV0d29yayByZXF1ZXN0KSwgYW5kIGl0IGtlZXBzIHRoZVxuICAgICAgICAvLyBsb2dpYyBzdHJlYW1saW5lZCBieSBhbGxvd2luZyB1cyB0byBjb250aW51ZSB0byB1c2UgYSBVUkwtYmFzZWQgaW50ZXJmYWNlIGZvciBhbGwgc2NlbmUgcmVzb3VyY2VzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgaXMgKm5vdCogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSBiYXNlNjQgZGF0YSBVUkwuXG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIHNlY3VyaXR5IHJlc3RyaWNpb25zIGluIHNvbWUgYnJvd3NlcnMuXG4gICAgICAgIC8vIEFsc28gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9icmFtc3RlaW4vZm9udGxvYWRlci9ibG9iLzU5OGU5Mzk5MTE3YmRjOTQ2ZmY3ODZmYTJjNTAwN2E2YmQ3ZDNiOWUvc3JjL2ZvbnRmYWNlLmpzI0wxNDUtTDE1M1xuICAgICAgICBsZXQgcHJlcHJvY2VzcyA9IFByb21pc2UucmVzb2x2ZSh1cmwpO1xuICAgICAgICBpZiAodXJsLnNsaWNlKDAsIDUpID09PSAnYmxvYjonKSB7XG4gICAgICAgICAgICBwcmVwcm9jZXNzID0gVXRpbHMuaW8odXJsLCA2MDAwMCwgJ2FycmF5YnVmZmVyJykudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBieXRlczsgLy8gdXNlIHJhdyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCcgKyBidG9hKHN0cik7IC8vIGJhc2U2NCBlbmNvZGUgYXMgZGF0YSBVUkxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmVwcm9jZXNzLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBGb250RmFjZSBBUElcbiAgICAgICAgICAgICAgICBsZXQgZmFjZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGFkZCBhcyBVUkxcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG5ldyBGb250RmFjZShmYW1pbHksIGB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KWAsIHsgd2VpZ2h0LCBzdHlsZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsgLy8gYWRkIGFzIGJpbmFyeSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBkYXRhLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChmYWNlKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0FkZGluZyBGb250RmFjZSB0byBkb2N1bWVudC5mb250czonLCBmYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBDU1MgaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgbGV0IGNzcyA9IGBcbiAgICAgICAgICAgICAgICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJyR7ZmFtaWx5fSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogJHt3ZWlnaHQgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zdHlsZTogJHtzdHlsZSB8fCAnbm9ybWFsJ307XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHVybCgke2VuY29kZVVSSShkYXRhKX0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgc3R5bGVfZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVfZWwpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLnNoZWV0Lmluc2VydFJ1bGUoY3NzLCAwKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0luamVjdGluZyBDU1MgZm9udCBmYWNlOicsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9udE1hbmFnZXI7XG4iLCIvLyBUZXh0IHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1BvaW50c30gZnJvbSAnLi4vcG9pbnRzL3BvaW50cyc7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX3BvaW50JztcbmltcG9ydCBMYWJlbExpbmUgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX2xpbmUnO1xuXG5leHBvcnQgbGV0IFRleHRTdHlsZSA9IE9iamVjdC5jcmVhdGUoUG9pbnRzKTtcblxuT2JqZWN0LmFzc2lnbihUZXh0U3R5bGUsIHtcbiAgICBuYW1lOiAndGV4dCcsXG4gICAgc3VwZXI6IFBvaW50cyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIFBvaW50IHN0eWxlIChwYXJlbnQgY2xhc3MpIHJlcXVpcmVzIHRleHR1cmluZyB0byBiZSB0dXJuZWQgb25cbiAgICAgICAgLy8gKGxhYmVscyBhcmUgYWx3YXlzIGRyYXduIHdpdGggdGV4dHVyZXMpXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1BPSU5UX1RFWFRVUkUgPSB0cnVlO1xuXG4gICAgICAgIC8vIERpc2FibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IGZhbHNlO1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IHVuLW11bHRpcGx5IGFscGhhLCBiZWNhdXNlIENhbnZhcyB0ZXh0IHJhc3Rlcml6YXRpb24gaXMgcHJlLW11bHRpcGxpZWRcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVU5NVUxUSVBMWV9BTFBIQSA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgdGV4dCB3aGVuIHRpbGUgaXMgem9vbWluZyBvdXQsIGUuZy4gYWN0aW5nIGFzIHByb3h5IHRpbGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUX1JBVEUgPSAyOyAvLyBmYWRlIGF0IDJ4LCBlLmcuIGZ1bGx5IHRyYW5zcGFyZW50IGF0IDAuNSB6b29tIGxldmVsIGF3YXlcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnF1ZXVlcyA9IHt9O1xuICAgICAgICB0aGlzLnJlc2V0VGV4dCgpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBxdWV1ZSBmZWF0dXJlcyBpbnN0ZWFkIG9mIHByb2Nlc3NpbmcgaW1tZWRpYXRlbHlcbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGxlZCBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZmVhdHVyZSBxdWV1ZSBpcyBwYXJzZWQsXG4gICAgICAgIC8vIGFuZCB3ZSB3YW50IHRoZSBwcmVwcm9jZXNzaW5nIGRvbmUgYmVmb3JlIHdlIGV2YWx1YXRlIHRleHQgc3R5bGUgYmVsb3dcbiAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHlwZSA9IGZlYXR1cmUuZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgZHJhdy5jYW5fYXJ0aWN1bGF0ZSA9ICh0eXBlID09PSBcIkxpbmVTdHJpbmdcIiB8fCB0eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKTtcblxuICAgICAgICAvLyBzdXBlcnNhbXBsZSB0ZXh0IHJlbmRlcmluZyBmb3IgYW5nbGVkIGxhYmVscywgdG8gaW1wcm92ZSBjbGFyaXR5XG4gICAgICAgIGRyYXcuc3VwZXJzYW1wbGVfdGV4dCA9ICh0eXBlID09PSBcIkxpbmVTdHJpbmdcIiB8fCB0eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKTtcblxuICAgICAgICBsZXQgcSA9IHRoaXMucGFyc2VUZXh0RmVhdHVyZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcbiAgICAgICAgaWYgKCFxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBxLmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgICBxLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBxLmxheW91dC52ZXJ0ZXggPSBmYWxzZTsgLy8gdmVydGV4IHBsYWNlbWVudCBvcHRpb24gbm90IGFwcGxpY2FibGUgdG8gc3RhbmRhbG9uZSBsYWJlbHNcblxuICAgICAgICAvLyBRdWV1ZSB0aGUgZmVhdHVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2gocSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCBjb2xsaXNpb24gbWFuYWdlclxuICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5uYW1lLCB0aWxlLmtleSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuICAgICAgICByZXR1cm4gU3R5bGUuc3RhcnREYXRhLmNhbGwodGhpcywgdGlsZSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLm5hbWUsIHRoaXMucXVldWVzW3RpbGUua2V5XSkuXG4gICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMubmFtZSwgbGFiZWxzKSkuXG4gICAgICAgICAgICB0aGVuKCh7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRleHRzO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHF1ZXVlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgc3R5bGluZyBvYmplY3QgZXhwZWN0ZWQgYnkgU3R5bGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxhYmVsID0gcS5sYWJlbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG9naWNhbCBzaXplcyBvZiBlYWNoIHNlZ21lbnQgaW50byBhbiBhcnJheSBmb3IgdGhlIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLm1hcChmdW5jdGlvbihzaXplKXsgcmV0dXJuIHNpemUubG9naWNhbF9zaXplOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLmxvZ2ljYWxfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hbmdsZSA9IHEubGFiZWwuYW5nbGUgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBTdHlsZS5hZGRGZWF0dXJlLmNhbGwodGhpcywgcS5mZWF0dXJlLCBxLmRyYXcsIHEuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZyZWVUZXh0KHRpbGUpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluaXNoIHRpbGUgbWVzaFxuICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZS5lbmREYXRhLmNhbGwodGhpcywgdGlsZSkudGhlbih0aWxlX2RhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggdGlsZS1zcGVjaWZpYyBsYWJlbCBhdGxhcyB0byBtZXNoIGFzIGEgdGV4dHVyZSB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlICYmIHRpbGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0ZXh0dXJlKTsgLy8gYXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aWxlX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBTZXRzIHVwIGNhY2hpbmcgZm9yIGRyYXcgcHJvcGVydGllc1xuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXByb2Nlc3NUZXh0KGRyYXcpO1xuICAgIH0sXG5cbiAgICAvLyBJbXBsZW1lbnRzIGxhYmVsIGJ1aWxkaW5nIGZvciBUZXh0TGFiZWxzIG1peGluXG4gICAgYnVpbGRUZXh0TGFiZWxzICh0aWxlX2tleSwgZmVhdHVyZV9xdWV1ZSkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG4gICAgICAgIGZvciAobGV0IGY9MDsgZiA8IGZlYXR1cmVfcXVldWUubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgIGxldCBmcSA9IGZlYXR1cmVfcXVldWVbZl07XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGhpcy50ZXh0c1t0aWxlX2tleV1bZnEudGV4dF9zZXR0aW5nc19rZXldW2ZxLnRleHRdO1xuICAgICAgICAgICAgbGV0IGZlYXR1cmVfbGFiZWxzO1xuICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZXMgPSB0ZXh0X2luZm8uc2l6ZS5tYXAoZnVuY3Rpb24oc2l6ZSl7IHJldHVybiBzaXplLmNvbGxpc2lvbl9zaXplOyB9KTtcbiAgICAgICAgICAgICAgICBmcS5sYXlvdXQuc3BhY2Vfd2lkdGggPSB0ZXh0X2luZm8uc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHNpemVzLCBmcS5mZWF0dXJlLmdlb21ldHJ5LCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHRleHRfaW5mby5zaXplLmNvbGxpc2lvbl9zaXplLCBmcS5mZWF0dXJlLmdlb21ldHJ5LCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlX2xhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmcWwgPSBPYmplY3QuY3JlYXRlKGZxKTtcbiAgICAgICAgICAgICAgICBmcWwubGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChmcWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkcyBvbmUgb3IgbW9yZSBsYWJlbHMgZm9yIGEgZ2VvbWV0cnlcbiAgICBidWlsZExhYmVscyAoc2l6ZSwgZ2VvbWV0cnksIGxheW91dCkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG5cbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZUxhYmVscyhnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lTGFiZWxzKGxpbmVzW2ldLCBzaXplLCBsYXlvdXQsIGxhYmVscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHtcbiAgICAgICAgICAgIGxldCBwb2ludHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQocG9pbnRzW2ldLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvbHlnb25cIikge1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBvbmUgb3IgbW9yZSBsYWJlbHMgZm9yIGEgbGluZSBnZW9tZXRyeVxuICAgIGJ1aWxkTGluZUxhYmVscyAobGluZSwgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpIHtcbiAgICAgICAgbGV0IHN1YmRpdiA9IE1hdGgubWluKGxheW91dC5zdWJkaXYsIGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgIGlmIChzdWJkaXYgPiAxKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgbXVsdGlwbGUgbGFiZWxzIGZvciBsaW5lLCB3aXRoIGVhY2ggYWxsb3R0ZWQgYSByYW5nZSBvZiBzZWdtZW50c1xuICAgICAgICAgICAgLy8gaW4gd2hpY2ggaXQgd2lsbCBhdHRlbXB0IHRvIHBsYWNlXG4gICAgICAgICAgICBsZXQgc2VnX3Blcl9kaXYgPSAobGluZS5sZW5ndGggLSAxKSAvIHN1YmRpdjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViZGl2OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9zdGFydCA9IE1hdGguZmxvb3IoaSAqIHNlZ19wZXJfZGl2KTtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9lbmQgPSBNYXRoLmZsb29yKChpICsgMSkgKiBzZWdfcGVyX2Rpdik7XG5cbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxMaW5lKHNpemUsIGxpbmUsIGxheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfZW5kID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbExpbmUoc2l6ZSwgbGluZSwgbGF5b3V0KTtcbiAgICAgICAgICAgIGlmICghbGFiZWwudGhyb3dfYXdheSl7XG4gICAgICAgICAgICAgICAgbGV0IGNob3Nlbl9sYWJlbCA9IHBsYWNlbWVudFN0cmF0ZWd5KGxhYmVsKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hvc2VuX2xhYmVsKXtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2goY2hvc2VuX2xhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuXG5jb25zdCBUQVJHRVRfU1RSQUlHSFQgPSAwLjQ7IC8vIE9wdGltaXN0aWMgdGFyZ2V0IHJhdGlvIGZvciBzdHJhaWdodCBsYWJlbHMgKGxhYmVsIGxlbmd0aCAvIGxpbmUgbGVuZ3RoKVxuY29uc3QgVEFSR0VUX0tJTktFRCA9IDAuNTsgLy8gT3B0aW1pc3RpYyB0YXJnZXQgcmF0aW8gZm9yIGtpbmtlZCBsYWJlbHMgKGxhYmVsIGxlbmd0aCAvIGxpbmUgbGVuZ3RoKVxuXG4vLyBQbGFjZSBsYWJlbHMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6XG4vLyAtIGNob29zZSB0aGUgYmVzdCBzdHJhaWdodCBsYWJlbCB0aGF0IHNhdGlzZmllcyB0aGUgb3B0aW1pc3RpYyBzdHJhaWdodCBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qga2lua2VkIGxhYmVsIHRoYXQgc2F0aXNmaWVzIHRoZSBvcHRpbWlzdGljIGtpbmtlZCBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qgc3RyYWlnaHQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgaXRzIGludGVybmFsIChsZXNzIG9wdGltaXN0aWMpIGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGNob29zZSB0aGUgYmVzdCBraW5rZWQgbGFiZWxzIHRoYXQgc2F0aXNmaWVzIGl0cyBpbnRlcm5hbCAobGVzcyBvcHRpbWlzdGljKSBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBkb24ndCBwbGFjZSBhIGxhYmVsXG5mdW5jdGlvbiBwbGFjZW1lbnRTdHJhdGVneShsYWJlbCl7XG4gICAgbGV0IGxhYmVsc19zdHJhaWdodCA9IFtdO1xuICAgIGxldCBsYWJlbHNfa2lua2VkID0gW107XG4gICAgbGV0IGJlc3Rfc3RyYWlnaHRfZml0bmVzcyA9IEluZmluaXR5O1xuICAgIGxldCBiZXN0X2tpbmtlZF9maXRuZXNzID0gSW5maW5pdHk7XG5cbiAgICAvLyBsb29wIHRocm91Z2ggYWxsIGxhYmVsc1xuICAgIHdoaWxlIChsYWJlbCAmJiAhbGFiZWwudGhyb3dfYXdheSkge1xuICAgICAgICBpZiAobGFiZWwua2lua19pbmRleCA+IDApe1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgYXJ0aWN1bGF0ZWQgbGFiZWwgaXMgYWJvdmUgbG93ZXN0IGN1dG9mZlxuICAgICAgICAgICAgaWYgKGxhYmVsLmZpdG5lc3MgPCBiZXN0X2tpbmtlZF9maXRuZXNzKXtcbiAgICAgICAgICAgICAgICBiZXN0X2tpbmtlZF9maXRuZXNzID0gbGFiZWwuZml0bmVzcztcbiAgICAgICAgICAgICAgICBsYWJlbHNfa2lua2VkLnVuc2hpZnQobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgc3RyYWlnaHQgbGFiZWwgaXMgYWJvdmUgbG93ZXN0IHN0cmFpZ2h0IGN1dG9mZlxuICAgICAgICAgICAgaWYgKGxhYmVsLmZpdG5lc3MgPCBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3Mpe1xuICAgICAgICAgICAgICAgIGJlc3Rfc3RyYWlnaHRfZml0bmVzcyA9IGxhYmVsLmZpdG5lc3M7XG4gICAgICAgICAgICAgICAgbGFiZWxzX3N0cmFpZ2h0LnVuc2hpZnQobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFiZWwgPSBMYWJlbExpbmUubmV4dExhYmVsKGxhYmVsKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdF9zdHJhaWdodCA9IGxhYmVsc19zdHJhaWdodFswXTtcbiAgICBsZXQgYmVzdF9raW5rZWQgPSBsYWJlbHNfa2lua2VkWzBdO1xuXG4gICAgaWYgKGxhYmVsc19zdHJhaWdodC5sZW5ndGggJiYgYmVzdF9zdHJhaWdodC5maXRuZXNzIDwgVEFSR0VUX1NUUkFJR0hUKXtcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBiZXN0IHN0cmFpZ2h0IHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgdGhlIHN0cmljdGVyIHN0cmFpZ2h0IGN1dG9mZlxuICAgICAgICByZXR1cm4gYmVzdF9zdHJhaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAobGFiZWxzX2tpbmtlZC5sZW5ndGggJiYgYmVzdF9raW5rZWQuZml0bmVzcyA8IFRBUkdFVF9LSU5LRUQpe1xuICAgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qga2lua2VkIHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgdGhlIHN0cmljdGVyIGtpbmtlZCBjdXRvZmZcbiAgICAgICAgcmV0dXJuIGJlc3Rfa2lua2VkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHJldHVybiBiZXN0IG9mIHdoYXQncyBsZWZ0IChpZiBhbnkpXG4gICAgICAgIHJldHVybiBiZXN0X3N0cmFpZ2h0IHx8IGJlc3Rfa2lua2VkO1xuICAgIH1cbn1cblxuVGV4dFN0eWxlLnRleHR1cmVfaWQgPSAwOyAvLyBuYW1lc3BhY2VzIHBlci10aWxlIGxhYmVsIHRleHR1cmVzXG4iLCIvLyBUZXh0IGxhYmVsIHJlbmRlcmluZyBtZXRob2RzLCBjYW4gYmUgbWl4ZWQgaW50byBhIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4uLy4uL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uLy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBUZXh0U2V0dGluZ3MgZnJvbSAnLi4vdGV4dC90ZXh0X3NldHRpbmdzJztcbmltcG9ydCBDYW52YXNUZXh0IGZyb20gJy4uL3RleHQvY2FudmFzX3RleHQnO1xuXG4vLyBuYW1lc3BhY2VzIGxhYmVsIHRleHR1cmVzIChlbnN1cmVzIG5ldyB0ZXh0dXJlIG5hbWUgd2hlbiBhIHRpbGUgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMpXG5sZXQgdGV4dF90ZXh0dXJlX2lkID0gMDtcblxuZXhwb3J0IGNvbnN0IFRleHRMYWJlbHMgPSB7XG5cbiAgICByZXNldFRleHQgKCkge1xuICAgICAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbmV3IENhbnZhc1RleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRzID0ge307IC8vIHVuaXF1ZSB0ZXh0cywgZ3JvdXBlZCBieSB0aWxlLCBieSBzdHlsZVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZyZWVUZXh0ICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRleHRzW3RpbGUua2V5XTtcbiAgICB9LFxuXG4gICAgcGFyc2VUZXh0RmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICAvLyBDb21wdXRlIGxhYmVsIHRleHRcbiAgICAgICAgbGV0IHRleHQgPSB0aGlzLnBhcnNlVGV4dFNvdXJjZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBubyB0ZXh0IGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgdGV4dCBzdHlsZSBhbmQgbGF5b3V0IHNldHRpbmdzIGZvciB0aGlzIGZlYXR1cmUgbGFiZWxcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSBUZXh0U2V0dGluZ3MuY29tcHV0ZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gVGV4dFNldHRpbmdzLmtleSh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgbGV0IGxheW91dCA9IHRoaXMuY29tcHV0ZVRleHRMYXlvdXQoe30sIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUsIHRleHQsIHRleHRfc2V0dGluZ3MpO1xuXG4gICAgICAgIC8vIGZpcnN0IGxhYmVsIGluIHRpbGUsIG9yIHdpdGggdGhpcyBzdHlsZT9cbiAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0aGlzLnRleHRzW3RpbGUua2V5XSB8fCB7fTtcbiAgICAgICAgbGV0IHNpemVzID0gdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldID0gdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldIHx8IHt9O1xuXG4gICAgICAgIC8vIHVuaXF1ZSB0ZXh0IHN0cmluZ3MsIGdyb3VwZWQgYnkgdGV4dCBkcmF3aW5nIHN0eWxlXG4gICAgICAgIGlmICghc2l6ZXNbdGV4dF0pIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGxhYmVsIHdpdGggdGhpcyB0ZXh0L3N0eWxlL3RpbGUgY29tYmluYXRpb24sIG1ha2UgYSBuZXcgbGFiZWwgZW50cnlcbiAgICAgICAgICAgIHNpemVzW3RleHRdID0ge1xuICAgICAgICAgICAgICAgIHRleHRfc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgcmVmOiAwIC8vICMgb2YgdGltZXMgdGhpcyB0ZXh0L3N0eWxlIGNvbWJvIGFwcGVhcnMgaW4gdGlsZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkcmF3LCB0ZXh0LCB0ZXh0X3NldHRpbmdzX2tleSwgbGF5b3V0XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIENvbXB1dGUgdGhlIGxhYmVsIHRleHQsIGRlZmF1bHQgaXMgdmFsdWUgb2YgZmVhdHVyZS5wcm9wZXJ0aWVzLm5hbWVcbiAgICAvLyAtIFN0cmluZyB2YWx1ZSBpbmRpY2F0ZXMgYSBmZWF0dXJlIHByb3BlcnR5IGxvb2stdXAsIGUuZy4gYHNob3J0X25hbWVgIG1lYW5zIHVzZSBmZWF0dXJlLnByb3BlcnRpZXMuc2hvcnRfbmFtZVxuICAgIC8vIC0gRnVuY3Rpb24gd2lsbCB1c2UgdGhlIHJldHVybiB2YWx1ZSBhcyB0aGUgbGFiZWwgdGV4dCAoZm9yIGN1c3RvbSBsYWJlbHMpXG4gICAgLy8gLSBBcnJheSAob2Ygc3RyaW5ncyBhbmQvb3IgZnVuY3Rpb25zKSBkZWZpbmVzIGEgbGlzdCBvZiBmYWxsYmFja3MsIGV2YWx1YXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHJ1bGVzLFxuICAgIC8vICAgd2l0aCB0aGUgZmlyc3Qgbm9uLW51bGwgdmFsdWUgdXNlZCBhcyB0aGUgbGFiZWwgdGV4dFxuICAgIC8vICAgZS5nLiBgW25hbWU6ZXMsIG5hbWU6ZW4sIG5hbWVdYCBwcmVmZXJzIFNwYW5pc2ggbmFtZXMsIGZvbGxvd2VkIGJ5IEVuZ2xpc2gsIGFuZCBsYXN0IHRoZSBkZWZhdWx0IGxvY2FsIG5hbWVcbiAgICBwYXJzZVRleHRTb3VyY2UgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgIGxldCBzb3VyY2UgPSBkcmF3LnRleHRfc291cmNlIHx8ICduYW1lJztcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2UubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtzXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGZlYXR1cmUucHJvcGVydGllc1tzb3VyY2Vbc11dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZVtzXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gc291cmNlW3NdKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGlmIHdlIGZvdW5kIGEgdGV4dCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGV4dCA9IGZlYXR1cmUucHJvcGVydGllc1tzb3VyY2VdO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRleHQgPSBzb3VyY2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcblxuICAgIHByZXBhcmVUZXh0TGFiZWxzICh0aWxlLCBjb2xsaXNpb25fZ3JvdXAsIHF1ZXVlKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRleHRzW3RpbGUua2V5XXx8e30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCBjYWxsIHRvIG1haW4gdGhyZWFkLCBhc2sgZm9yIHRleHQgcGl4ZWwgc2l6ZXNcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmNhbGNUZXh0U2l6ZXMnLCB0aGlzLnRleHRzW3RpbGUua2V5XSkudGhlbih0ZXh0cyA9PiB7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZSAke3RoaXMubmFtZX06IHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1jYWxjVGV4dFNpemVzKClgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGV4dHM7XG4gICAgICAgICAgICBpZiAoIXRleHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRleHRMYWJlbHModGlsZS5rZXksIHF1ZXVlKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzICh0aWxlLCBjb2xsaXNpb25fZ3JvdXAsIGxhYmVscykge1xuICAgICAgICBpZiAoIWxhYmVscykge1xuICAgICAgICAgICAgQ29sbGlzaW9uLmNvbGxpZGUoe30sIGNvbGxpc2lvbl9ncm91cCwgdGlsZS5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQ29sbGlzaW9uLmNvbGxpZGUobGFiZWxzLCBjb2xsaXNpb25fZ3JvdXAsIHRpbGUua2V5KS50aGVuKGxhYmVscyA9PiB7XG4gICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LWNvbGxpZGUoKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0cyA9IHRoaXMudGV4dHNbdGlsZS5rZXldO1xuICAgICAgICAgICAgdGhpcy5jdWxsVGV4dFN0eWxlcyh0ZXh0cywgbGFiZWxzKTtcblxuICAgICAgICAgICAgLy8gc2V0IGFsaWdubWVudHNcbiAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XSAmJiB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcbiAgICAgICAgICAgICAgICBpZiAoIXRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduID0gdGV4dF9pbmZvLmFsaWduIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gc2Vjb25kIGNhbGwgdG8gbWFpbiB0aHJlYWQsIGZvciByYXN0ZXJpemluZyB0aGUgc2V0IG9mIHRleHRzXG4gICAgICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0KycucmFzdGVyaXplVGV4dHMnLCB0aWxlLmtleSwgdGV4dHMpLnRoZW4oKHsgdGV4dHMsIHRleHR1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LXJhc3Rlcml6ZVRleHRzKClgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHVudXNlZCB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9ucyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByYXN0ZXJpemF0aW9uXG4gICAgY3VsbFRleHRTdHlsZXModGV4dHMsIGxhYmVscykge1xuICAgICAgICAvLyBDb3VudCBob3cgbWFueSB0aW1lcyBlYWNoIHRleHQvc3R5bGUgY29tYmluYXRpb24gaXMgdXNlZFxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICAgICAgICAgIHRleHRzW2xhYmVsLnRleHRfc2V0dGluZ3Nfa2V5XVtsYWJlbC50ZXh0XS5yZWYrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9ucyB0aGF0IGhhdmUgbm8gdmlzaWJsZSBsYWJlbHNcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dHNbc3R5bGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gbGFiZWxzIGZvciB0aGlzIHRleHRcbiAgICAgICAgICAgICAgICBpZiAodGV4dHNbc3R5bGVdW3RleHRdLnJlZiA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRleHRzW3N0eWxlXVt0ZXh0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgLy8gbm8gbGFiZWxzIGZvciB0aGlzIHN0eWxlXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGV4dHNbc3R5bGVdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGV4dHNbc3R5bGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIHRleHQgc3RyaW5nLFxuICAgIC8vIHdlcmUgaXQgdG8gYmUgcmVuZGVyZWQuIFRoaXMgaW5mbyBpcyB0aGVuIHVzZWQgdG8gcGVyZm9ybSBpbml0aWFsIGxhYmVsIGN1bGxpbmcsICpiZWZvcmUqXG4gICAgLy8gbGFiZWxzIGFyZSBhY3R1YWxseSByZW5kZXJlZC5cbiAgICBjYWxjVGV4dFNpemVzICh0ZXh0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMudGV4dFNpemVzKHRleHRzKTtcbiAgICB9LFxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBjcmVhdGUgYXRsYXMgb2YgbGFiZWxzIGZvciBhIHRpbGVcbiAgICByYXN0ZXJpemVUZXh0cyAodGlsZV9rZXksIHRleHRzKSB7XG4gICAgICAgIGxldCBjYW52YXMgPSBuZXcgQ2FudmFzVGV4dCgpO1xuICAgICAgICBjYW52YXMuY2xlYXJUZXhjb29yZENhY2hlKHRpbGVfa2V5KTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gY2FudmFzLnNldFRleHR1cmVUZXh0UG9zaXRpb25zKHRleHRzLCB0aGlzLm1heF90ZXh0dXJlX3NpemUsIHRpbGVfa2V5KTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0ZXh0IHN1bW1hcnkgZm9yIHRpbGUgJHt0aWxlX2tleX06IGZpdHMgaW4gJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4YCk7XG5cbiAgICAgICAgLy8gZml0cyBpbiBtYXggdGV4dHVyZSBzaXplP1xuICAgICAgICBpZiAodGV4dHVyZV9zaXplWzBdIDwgdGhpcy5tYXhfdGV4dHVyZV9zaXplICYmIHRleHR1cmVfc2l6ZVsxXSA8IHRoaXMubWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIGNhbnZhcyBzaXplICYgcmFzdGVyaXplIGFsbCB0aGUgdGV4dCBzdHJpbmdzIHdlIG5lZWRcbiAgICAgICAgICAgIGNhbnZhcy5yZXNpemUoLi4udGV4dHVyZV9zaXplKTtcbiAgICAgICAgICAgIGNhbnZhcy5yYXN0ZXJpemUodGV4dHMsIHRleHR1cmVfc2l6ZSwgdGlsZV9rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFtcbiAgICAgICAgICAgICAgICBgTGFiZWwgYXRsYXMgZm9yIHRpbGUgJHt0aWxlX2tleX0gaXMgJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4LCBgLFxuICAgICAgICAgICAgICAgIGBidXQgbWF4IEdMIHRleHR1cmUgc2l6ZSBpcyAke3RoaXMubWF4X3RleHR1cmVfc2l6ZX14JHt0aGlzLm1heF90ZXh0dXJlX3NpemV9cHhgXS5qb2luKCcnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGUgYSB0ZXh0dXJlXG4gICAgICAgIGxldCB0ID0gJ2xhYmVscy0nICsgdGlsZV9rZXkgKyAnLScgKyAodGV4dF90ZXh0dXJlX2lkKyspO1xuICAgICAgICBUZXh0dXJlLmNyZWF0ZSh0aGlzLmdsLCB0LCB7XG4gICAgICAgICAgICBlbGVtZW50OiBjYW52YXMuY2FudmFzLFxuICAgICAgICAgICAgZmlsdGVyaW5nOiAnbGluZWFyJyxcbiAgICAgICAgICAgIFVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgVGV4dHVyZS5yZXRhaW4odCk7XG5cbiAgICAgICAgcmV0dXJuIHsgdGV4dHMsIHRleHR1cmU6IHQgfTsgLy8gdGV4dHVyZSBpcyByZXR1cm5lZCBieSBuYW1lIChub3QgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIHByZXByb2Nlc3NUZXh0IChkcmF3KSB7XG4gICAgICAgIC8vIEZvbnQgc2V0dGluZ3MgYXJlIHJlcXVpcmVkXG4gICAgICAgIGlmICghZHJhdyB8fCAhZHJhdy5mb250IHx8IHR5cGVvZiBkcmF3LmZvbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb2xvcnNcbiAgICAgICAgZHJhdy5mb250LmZpbGwgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5maWxsKTtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UpIHtcbiAgICAgICAgICAgIGRyYXcuZm9udC5zdHJva2UuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zdHJva2UuY29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBmb250IGFuZCB0ZXh0IHN0cm9rZSBzaXplc1xuICAgICAgICBkcmF3LmZvbnQucHhfc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnNpemUgfHwgVGV4dFNldHRpbmdzLmRlZmF1bHRzLnNpemUsIENhbnZhc1RleHQuZm9udFBpeGVsU2l6ZSk7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2Uud2lkdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgZHJhdy5mb250LnN0cm9rZS53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgcGFyc2VGbG9hdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPZmZzZXQgKDJkIGFycmF5KVxuICAgICAgICBkcmF3Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vZmZzZXQsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgJiYgdi5tYXAocGFyc2VGbG9hdCkpIHx8IDApO1xuXG4gICAgICAgIC8vIEJ1ZmZlciAoMWQgdmFsdWUgb3Igb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuYnVmZmVyID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmJ1ZmZlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdiwgdl0pLm1hcChwYXJzZUZsb2F0KSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBlYXQgcnVsZXMgLSBmb3IgdGV4dCBsYWJlbHMsIGRlZmF1bHRzIHRvIHRpbGUgc2l6ZVxuICAgICAgICBkcmF3LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5yZXBlYXRfZGlzdGFuY2UgfHwgR2VvLnRpbGVfc2l6ZSwgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIEFkZGl0aW9uYWwgdGV4dC1zcGVjaWZpYyBsYXlvdXQgc2V0dGluZ3NcbiAgICBjb21wdXRlVGV4dExheW91dCAodGFyZ2V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlLCB0ZXh0LCB0ZXh0X3NldHRpbmdzKSB7XG4gICAgICAgIGxldCBsYXlvdXQgPSB0YXJnZXQgfHwge307XG5cbiAgICAgICAgLy8gY29tbW9uIHNldHRpbmdzIHcvcG9pbnRzXG4gICAgICAgIGxheW91dCA9IHRoaXMuY29tcHV0ZUxheW91dChsYXlvdXQsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIC8vIHRpbGUgYm91bmRhcnkgaGFuZGxpbmdcbiAgICAgICAgbGF5b3V0LmN1bGxfZnJvbV90aWxlID0gKGRyYXcuY3VsbF9mcm9tX3RpbGUgIT0gbnVsbCkgPyBkcmF3LmN1bGxfZnJvbV90aWxlIDogdHJ1ZTtcblxuICAgICAgICAvLyBzdGFuZGFsb25lIHRleHQgY2FuIG1vdmUgaW50byB0aWxlIGlmIHNwZWNpZmllZFxuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSAoZHJhdy5tb3ZlX2ludG9fdGlsZSAhPSBudWxsKSA/IGRyYXcubW92ZV9pbnRvX3RpbGUgOiB0cnVlO1xuXG4gICAgICAgIC8vIHJlcGVhdCBydWxlcyBpbmNsdWRlIHRoZSB0ZXh0XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwICs9ICcvJyArIHRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXggbnVtYmVyIG9mIHN1YmRpdmlzaW9ucyB0byB0cnlcbiAgICAgICAgbGF5b3V0LnN1YmRpdiA9IHRpbGUub3Zlcnpvb20yO1xuXG4gICAgICAgIGxheW91dC5hbGlnbiA9IGRyYXcuYWxpZ247XG5cbiAgICAgICAgLy8gdXNlZCB0byBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGxheW91dC5pdGFsaWMgPSAodGV4dF9zZXR0aW5ncy5zdHlsZSAhPT0gJ25vcm1hbCcpO1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5cbnZhciBUZXh0U2V0dGluZ3M7XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRTZXR0aW5ncyA9IHtcblxuICAgIC8vIEEga2V5IGZvciBncm91cGluZyBhbGwgbGFiZWxzIG9mIHRoZSBzYW1lIHRleHQgc3R5bGUgKGUuZy4gc2FtZSBDYW52YXMgc3RhdGUsIHRvIG1pbmltaXplIHN0YXRlIGNoYW5nZXMpXG4gICAga2V5IChzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc2V0dGluZ3Muc3R5bGUsXG4gICAgICAgICAgICBzZXR0aW5ncy53ZWlnaHQsXG4gICAgICAgICAgICBzZXR0aW5ncy5mYW1pbHksXG4gICAgICAgICAgICBzZXR0aW5ncy5weF9zaXplLFxuICAgICAgICAgICAgc2V0dGluZ3MuZmlsbCxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRleHRfd3JhcCxcbiAgICAgICAgICAgIHNldHRpbmdzLm1heF9saW5lcyxcbiAgICAgICAgICAgIHNldHRpbmdzLnN1cGVyc2FtcGxlLFxuICAgICAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvXG4gICAgICAgIF0uam9pbignLycpO1xuICAgIH0sXG5cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBzdHlsZTogJ25vcm1hbCcsXG4gICAgICAgIHdlaWdodDogbnVsbCxcbiAgICAgICAgc2l6ZTogJzEycHgnLFxuICAgICAgICBweF9zaXplOiAxMixcbiAgICAgICAgZmFtaWx5OiAnSGVsdmV0aWNhJyxcbiAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgdGV4dF93cmFwOiAxNSxcbiAgICAgICAgbWF4X2xpbmVzOiA1LFxuICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHN0cm9rZTogbnVsbCxcbiAgICAgICAgc3Ryb2tlX3dpZHRoOiAwXG4gICAgfSxcblxuICAgIGNvbXB1dGUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHN0eWxlID0ge307XG5cbiAgICAgICAgZHJhdy5mb250ID0gZHJhdy5mb250IHx8IHRoaXMuZGVmYXVsdHM7XG5cbiAgICAgICAgLy8gTGluZVN0cmluZyBsYWJlbHMgY2FuIGFydGljdWxhdGUgd2hpbGUgcG9pbnQgbGFiZWxzIGNhbm5vdC4gTmVlZGVkIGZvciBmdXR1cmUgdGV4dHVyZSBjb29yZGluYXRlIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgc3R5bGUuY2FuX2FydGljdWxhdGUgPSBkcmF3LmNhbl9hcnRpY3VsYXRlO1xuXG4gICAgICAgIC8vIFVzZSBmaWxsIGlmIHNwZWNpZmllZCwgb3IgZGVmYXVsdFxuICAgICAgICBzdHlsZS5maWxsID0gKGRyYXcuZm9udC5maWxsICYmIFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LmZpbGwsIGNvbnRleHQpKSkgfHwgdGhpcy5kZWZhdWx0cy5maWxsO1xuXG4gICAgICAgIC8vIEZvbnQgcHJvcGVydGllcyBhcmUgbW9kZWxlZCBhZnRlciBDU1MgbmFtZXM6XG4gICAgICAgIC8vIC0gZmFtaWx5OiBIZWx2ZXRpY2EsIEZ1dHVyYSwgZXRjLlxuICAgICAgICAvLyAtIHNpemU6IGluIHB0LCBweCwgb3IgZW1cbiAgICAgICAgLy8gLSBzdHlsZTogbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcbiAgICAgICAgLy8gLSB3ZWlnaHQ6IG5vcm1hbCwgYm9sZCwgZXRjLlxuICAgICAgICAvLyAtIHRyYW5zZm9ybTogY2FwaXRhbGl6ZSwgdXBwZXJjYXNlLCBsb3dlcmNhc2VcbiAgICAgICAgc3R5bGUuc3R5bGUgPSBkcmF3LmZvbnQuc3R5bGUgfHwgdGhpcy5kZWZhdWx0cy5zdHlsZTtcbiAgICAgICAgc3R5bGUud2VpZ2h0ID0gZHJhdy5mb250LndlaWdodCB8fCB0aGlzLmRlZmF1bHRzLndlaWdodDtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5mYW1pbHkpIHtcbiAgICAgICAgICAgIHN0eWxlLmZhbWlseSA9IGRyYXcuZm9udC5mYW1pbHk7XG4gICAgICAgICAgICBpZiAoc3R5bGUuZmFtaWx5ICE9PSB0aGlzLmRlZmF1bHRzLmZhbWlseSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmZhbWlseSArPSAnLCAnICsgdGhpcy5kZWZhdWx0cy5mYW1pbHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5mYW1pbHkgPSB0aGlzLmRlZmF1bHRzLmZhbWlseTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IGRyYXcuZm9udC50cmFuc2Zvcm07XG5cbiAgICAgICAgLy8gb3JpZ2luYWwgc2l6ZSAobm90IGN1cnJlbnRseSB1c2VkLCBidXQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcpXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LmZvbnQuc2l6ZSB8fCB0aGlzLmRlZmF1bHRzLnNpemU7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlZCBwaXhlbCBzaXplXG4gICAgICAgIHN0eWxlLnN1cGVyc2FtcGxlID0gZHJhdy5zdXBlcnNhbXBsZV90ZXh0ID8gMS41IDogMTsgLy8gb3B0aW9uYWxseSByZW5kZXIgdGV4dCBhdCAxNTAlIHRvIGltcHJvdmUgY2xhcml0eVxuICAgICAgICBzdHlsZS5weF9zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5weF9zaXplLCBjb250ZXh0KSAqIHN0eWxlLnN1cGVyc2FtcGxlO1xuXG4gICAgICAgIC8vIFVzZSBzdHJva2UgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2UuY29sb3IpIHtcbiAgICAgICAgICAgIHN0eWxlLnN0cm9rZSA9IFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS5jb2xvciwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2UpO1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlX3dpZHRoID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5zdHJva2Uud2lkdGgsIGNvbnRleHQpIHx8IHRoaXMuZGVmYXVsdHMuc3Ryb2tlX3dpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUuZm9udF9jc3MgPSB0aGlzLmZvbnRDU1Moc3R5bGUpO1xuXG4gICAgICAgIC8vIFdvcmQgd3JhcCBhbmQgdGV4dCBhbGlnbm1lbnRcbiAgICAgICAgLy8gTm90IGEgZm9udCBwcm9wZXJ0aWVzLCBidXQgYWZmZWN0IGF0bGFzIG9mIHVuaXF1ZSB0ZXh0IHRleHR1cmVzXG4gICAgICAgIGxldCB0ZXh0X3dyYXAgPSBkcmF3LnRleHRfd3JhcDsgLy8gdXNlIGV4cGxpY2l0bHkgc2V0IHZhbHVlXG5cbiAgICAgICAgaWYgKHRleHRfd3JhcCA9PSBudWxsICYmIEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSAhPT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvLyBwb2ludCBsYWJlbHMgKGZvciBwb2ludCBhbmQgcG9seWdvbiBmZWF0dXJlcykgaGF2ZSB3b3JkIHdyYXAgb24gdy9kZWZhdWx0IG1heCBsZW5ndGgsXG4gICAgICAgICAgICAvLyBsaW5lIGxhYmVscyBkZWZhdWx0IG9mZlxuICAgICAgICAgICAgdGV4dF93cmFwID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldHRpbmcgdG8gJ3RydWUnIGNhdXNlcyBkZWZhdWx0IHdyYXAgdmFsdWUgdG8gYmUgdXNlZFxuICAgICAgICBpZiAodGV4dF93cmFwID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0aGlzLmRlZmF1bHRzLnRleHRfd3JhcDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG5cbiAgICAgICAgLy8gbWF4X2xpbmVzIHNldHRpbmcgdG8gdHJ1bmNhdGUgdmVyeSBsb25nIGxhYmVscyB3aXRoIGFuIGVsbGlwc2lzXG4gICAgICAgIHN0eWxlLm1heF9saW5lcyA9IGRyYXcubWF4X2xpbmVzIHx8IHRoaXMuZGVmYXVsdHMubWF4X2xpbmVzO1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgQ1NTLXN0eWxlIGZvbnQgc3RyaW5nICh0byBzZXQgQ2FudmFzIGRyYXcgc3RhdGUpXG4gICAgZm9udENTUyAoeyBzdHlsZSwgd2VpZ2h0LCBweF9zaXplLCBmYW1pbHkgfSkge1xuICAgICAgICByZXR1cm4gW3N0eWxlLCB3ZWlnaHQsIHB4X3NpemUgKyAncHgnLCBmYW1pbHldXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geCkgLy8gcmVtb3ZlIG51bGwgcHJvcHNcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5pbXBvcnQge21hdDQsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZSB7XG5cbiAgICAvKipcbiAgICAgICAgVGlsZVxuICAgICAgICBAY29uc3RydWN0b3JcbiAgICAgICAgUmVxdWlyZWQgcHJvcGVydGllczpcbiAgICAgICAgY29vcmRzOiBvYmplY3Qgd2l0aCB7eCwgeSwgen0gcHJvcGVydGllcyBpZGVudGlmeWluZyB0aWxlIGNvb3JkaW5hdGUgbG9jYXRpb25cbiAgICAgICAgd29ya2VyOiB3ZWIgd29ya2VyIHRvIGhhbmRsZSB0aWxlIGNvbnN0cnVjdGlvblxuICAgICovXG4gICAgY29uc3RydWN0b3IoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSwgd29ya2VyLCB2aWV3IH0pIHtcbiAgICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnByb3hpZWRfYXMgPSBudWxsO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IHt9O1xuXG4gICAgICAgIHRoaXMuY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCB0aGlzLnNvdXJjZS5tYXhfem9vbSk7XG4gICAgICAgIHRoaXMuc3R5bGVfem9vbSA9IHN0eWxlX3pvb207IC8vIHpvb20gbGV2ZWwgdG8gYmUgdXNlZCBmb3Igc3R5bGluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tID0gTWF0aC5tYXgodGhpcy5zdHlsZV96b29tIC0gdGhpcy5jb29yZHMueiwgMCk7IC8vIG51bWJlciBvZiBsZXZlbHMgb2Ygb3Zlcnpvb21pbmdcbiAgICAgICAgdGhpcy5vdmVyem9vbTIgPSBNYXRoLnBvdygyLCB0aGlzLm92ZXJ6b29tKTtcbiAgICAgICAgdGhpcy5rZXkgPSBUaWxlLmtleSh0aGlzLmNvb3JkcywgdGhpcy5zb3VyY2UsIHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWluID0gR2VvLm1ldGVyc0ZvclRpbGUodGhpcy5jb29yZHMpO1xuICAgICAgICB0aGlzLm1heCA9IEdlby5tZXRlcnNGb3JUaWxlKHt4OiB0aGlzLmNvb3Jkcy54ICsgMSwgeTogdGhpcy5jb29yZHMueSArIDEsIHo6IHRoaXMuY29vcmRzLnogfSksXG4gICAgICAgIHRoaXMuc3BhbiA9IHsgeDogKHRoaXMubWF4LnggLSB0aGlzLm1pbi54KSwgeTogKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KSB9O1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHsgc3c6IHsgeDogdGhpcy5taW4ueCwgeTogdGhpcy5tYXgueSB9LCBuZTogeyB4OiB0aGlzLm1heC54LCB5OiB0aGlzLm1pbi55IH0gfTtcbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IDA7XG5cbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbF9zcSA9IHRoaXMubWV0ZXJzX3Blcl9waXhlbCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdGhpcy51bml0c19wZXJfcGl4ZWwgPSBHZW8udW5pdHNfcGVyX3BpeGVsIC8gdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuICAgICAgICB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSA9IEdlby51bml0c1Blck1ldGVyKHRoaXMuY29vcmRzLnopICogdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuXG4gICAgICAgIHRoaXMubWVzaGVzID0ge307IC8vIHJlbmRlcmFibGUgVkJPIG1lc2hlcyBrZXllZCBieSBzdHlsZVxuICAgICAgICB0aGlzLnRleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHRoYXQgdGhlIHRpbGUgb3ducyAobGFiZWxzLCBldGMuKVxuICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHJldGFpbmVkIGJ5IHRoZSB0aWxlIGluIHRoZSBwcmV2aW91cyBidWlsZCBnZW5lcmF0aW9uXG4gICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107IC8vIG1lc2hlcyB0aGF0IGhhdmUgYmVlbiBidWlsdCBzbyBmYXIgaW4gY3VycmVudCBidWlsZCBnZW5lcmF0aW9uXG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZShzcGVjKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmQoYykge1xuICAgICAgICByZXR1cm4ge3g6IGMueCwgeTogYy55LCB6OiBjLnosIGtleTogVGlsZS5jb29yZEtleShjKX07XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkS2V5KHt4LCB5LCB6fSkge1xuICAgICAgICByZXR1cm4geCArICcvJyArIHkgKyAnLycgKyB6O1xuICAgIH1cblxuICAgIHN0YXRpYyBrZXkgKGNvb3Jkcywgc291cmNlLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKGNvb3Jkcywgc291cmNlLm1heF96b29tKTtcbiAgICAgICAgaWYgKGNvb3Jkcy55IDwgMCB8fCBjb29yZHMueSA+PSAoMSA8PCBjb29yZHMueikgfHwgY29vcmRzLnogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGN1bGwgdGlsZXMgb3V0IG9mIHJhbmdlICh4IHdpbGwgd3JhcClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3NvdXJjZS5uYW1lLCBzdHlsZV96b29tLCBjb29yZHMueCwgY29vcmRzLnksIGNvb3Jkcy56XS5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHosIGtleX0sIHpvb20pIHtcbiAgICAgICAgaWYgKHogIT09IHpvb20pIHtcbiAgICAgICAgICAgIGxldCB6c2NhbGUgPSBNYXRoLnBvdygyLCB6IC0gem9vbSk7XG4gICAgICAgICAgICB4ID0gTWF0aC5mbG9vcih4IC8genNjYWxlKTtcbiAgICAgICAgICAgIHkgPSBNYXRoLmZsb29yKHkgLyB6c2NhbGUpO1xuICAgICAgICAgICAgeiA9IHpvb207XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZVdpdGhNYXhab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pIHtcbiAgICAgICAgaWYgKG1heF96b29tICE9PSB1bmRlZmluZWQgJiYgeiA+IG1heF96b29tKSB7XG4gICAgICAgICAgICByZXR1cm4gVGlsZS5jb29yZGluYXRlQXRab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkKHt4LCB5LCB6fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoaWxkcmVuRm9yQ29vcmRpbmF0ZSh7eCwgeSwgeiwga2V5fSkge1xuICAgICAgICBpZiAoIVRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgeCAqPSAyO1xuICAgICAgICAgICAgeSAqPSAyO1xuICAgICAgICAgICAgVGlsZS5jb29yZF9jaGlsZHJlbltrZXldID0gW1xuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHksICAgICAgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHksICAgICAgen0pLFxuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHk6IHkrMSwgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHk6IHkrMSwgen0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV07XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGRlc2NlbmRhbnQpIHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQueiA+IHBhcmVudC56KSB7XG4gICAgICAgICAgICBsZXQge3gsIHl9ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGRlc2NlbmRhbnQsIHBhcmVudC56KTtcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50LnggPT09IHggJiYgcGFyZW50LnkgPT09IHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGEgc2V0IG9mIHRpbGUgaW5zdGFuY2VzICh3aGljaCBhbHJlYWR5IGhhdmUgYSBkaXN0YW5jZSBmcm9tIGNlbnRlciB0aWxlIGNvbXB1dGVkKVxuICAgIHN0YXRpYyBzb3J0KHRpbGVzKSB7XG4gICAgICAgIHJldHVybiB0aWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBhLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgbGV0IGJkID0gYi5jZW50ZXJfZGlzdDtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRpbGVcbiAgICBmcmVlUmVzb3VyY2VzICgpIHtcbiAgICAgICAgZm9yIChsZXQgbSBpbiB0aGlzLm1lc2hlcykge1xuICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzaGVzID0ge307XG5cbiAgICAgICAgdGhpcy50ZXh0dXJlcy5mb3JFYWNoKHQgPT4gVGV4dHVyZS5yZWxlYXNlKHQpKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMuZm9yRWFjaCh0ID0+IFRleHR1cmUucmVsZWFzZSh0KSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYucmVtb3ZlVGlsZScsIHRoaXMua2V5KTtcbiAgICAgICAgdGhpcy5mcmVlUmVzb3VyY2VzKCk7XG4gICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBidWlsZEFzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLm5hbWUsXG4gICAgICAgICAgICBjb29yZHM6IHRoaXMuY29vcmRzLFxuICAgICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICB1bml0c19wZXJfcGl4ZWw6IHRoaXMudW5pdHNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbF9zcTogdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxLFxuICAgICAgICAgICAgdW5pdHNfcGVyX21ldGVyX292ZXJ6b29tOiB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSxcbiAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMuc3R5bGVfem9vbSxcbiAgICAgICAgICAgIG92ZXJ6b29tOiB0aGlzLm92ZXJ6b29tLFxuICAgICAgICAgICAgb3Zlcnpvb20yOiB0aGlzLm92ZXJ6b29tMixcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd29ya2VyTWVzc2FnZSAoLi4ubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VyLCAuLi5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICBidWlsZChnZW5lcmF0aW9uLCB7IGZhZGVfaW4gPSB0cnVlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSBmYWRlX2luO1xuICAgICAgICBpZiAoIXRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYuYnVpbGRUaWxlJywgeyB0aWxlOiB0aGlzLmJ1aWxkQXNNZXNzYWdlKCkgfSkuY2F0Y2goZSA9PiB7IHRocm93IGU7IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBDYWxsZWQgb24gd29ya2VyIHRvIGNhbmNlbCBsb2FkaW5nXG4gICAgICAgIFN0YXRpYyBtZXRob2QgYmVjYXVzZSB0aGUgd29ya2VyIG9ubHkgaGFzIG9iamVjdCByZXByZXNlbnRhdGlvbnMgb2YgdGlsZSBkYXRhLCB0aGVyZSBpcyBub1xuICAgICAgICB0aWxlIGluc3RhbmNlIGNyZWF0ZWQgeWV0LlxuICAgICovXG4gICAgc3RhdGljIGNhbmNlbCh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aWxlLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhICYmIHRpbGUuc291cmNlX2RhdGEucmVxdWVzdF9pZCkge1xuICAgICAgICAgICAgICAgIFV0aWxzLmNhbmNlbFJlcXVlc3QodGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0X2lkKTsgLy8gY2FuY2VsIHBlbmRpbmcgdGlsZSBuZXR3b3JrIHJlcXVlc3RcbiAgICAgICAgICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLnJlcXVlc3RfaWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBnZW9tZXRyeSBmb3IgdGlsZSAtIGNhbGxlZCBieSB3ZWIgd29ya2VyXG4gICAgLy8gUmV0dXJucyBhIHNldCBvZiB0aWxlIGtleXMgdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgbWFpbiB0aHJlYWQgKHNvIHRoYXQgd2UgY2FuIG1pbmltaXplIGRhdGEgZXhjaGFuZ2UgYmV0d2VlbiB3b3JrZXIgYW5kIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBidWlsZEdlb21ldHJ5ICh0aWxlLCB7IHNjZW5lX2lkLCBsYXllcnMsIHN0eWxlcywgZ2xvYmFsIH0pIHtcbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKTtcbiAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcyA9IDA7XG5cbiAgICAgICAgbGV0IGRhdGEgPSB0aWxlLnNvdXJjZV9kYXRhO1xuXG4gICAgICAgIENvbGxpc2lvbi5zdGFydFRpbGUodGlsZS5rZXkpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgZWFjaCB0b3AtbGV2ZWwgbGF5ZXJcbiAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IGxheWVyc1tsYXllcl9uYW1lXTtcbiAgICAgICAgICAgIC8vIFNraXAgbGF5ZXJzIHdpdGggbm8gZGF0YSBzb3VyY2UgZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsYXllciB8fCAhbGF5ZXIuY29uZmlnLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgTGF5ZXIgJHtsYXllcl9uYW1lfSB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2VvbWV0cnkgZGF0YSBzb3VyY2UgYW5kIHdpbGwgbm90IGJlIHJlbmRlcmVkLmApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTb3VyY2UgbmFtZXMgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgIGlmIChsYXllci5jb25maWcuZGF0YS5zb3VyY2UgIT09IHRpbGUuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCBkYXRhIGZvciBvbmUgb3IgbW9yZSBsYXllcnMgZnJvbSBzb3VyY2VcbiAgICAgICAgICAgIGxldCBzb3VyY2VfbGF5ZXJzID0gVGlsZS5nZXREYXRhRm9yU291cmNlKGRhdGEsIGxheWVyLmNvbmZpZy5kYXRhLCBsYXllcl9uYW1lKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGZlYXR1cmVzIGluIGxheWVyXG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2VfbGF5ZXJzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllciA9IHNvdXJjZV9sYXllcnNbc107XG4gICAgICAgICAgICAgICAgbGV0IGdlb20gPSBzb3VyY2VfbGF5ZXIuZ2VvbTtcbiAgICAgICAgICAgICAgICBpZiAoIWdlb20pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZiA9IDA7IGYgPCBnZW9tLmZlYXR1cmVzLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmZWF0dXJlID0gZ2VvbS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZmVhdHVyZXMgdy9vIGdlb21ldHJ5ICh2YWxpZCBHZW9KU09OKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBTdHlsZVBhcnNlci5nZXRGZWF0dXJlUGFyc2VDb250ZXh0KGZlYXR1cmUsIHRpbGUsIGdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud2luZGluZyA9IHRpbGUuZGVmYXVsdF93aW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNvdXJjZSA9IHRpbGUuc291cmNlOyAgICAgICAgLy8gYWRkIGRhdGEgc291cmNlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sYXllciA9IHNvdXJjZV9sYXllci5sYXllcjsgIC8vIGFkZCBkYXRhIHNvdXJjZSBsYXllciBuYW1lXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGRyYXcgZ3JvdXBzIGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRyYXdfZ3JvdXBzID0gbGF5ZXIuYnVpbGREcmF3R3JvdXBzKGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciBkcmF3IGdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBkcmF3X2dyb3Vwc1tncm91cF9uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JvdXAudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZV9uYW1lID0gZ3JvdXAuc3R5bGUgfHwgZ3JvdXBfbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1tzdHlsZV9uYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZSAnJHtzdHlsZV9uYW1lfScgbm90IGZvdW5kLCBza2lwcGluZyBsYXllciAnJHtsYXllcl9uYW1lfSc6YCwgZ3JvdXAsIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVycyA9IGdyb3VwLmxheWVyczsgIC8vIGFkZCBtYXRjaGluZyBkcmF3IGxheWVyc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hZGRGZWF0dXJlKGZlYXR1cmUsIGdyb3VwLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZGVidWcuZmVhdHVyZXMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKSAtIHRpbGUuZGVidWcucmVuZGVyaW5nO1xuXG4gICAgICAgIC8vIFNlbmQgc3R5bGVzIGJhY2sgdG8gbWFpbiB0aHJlYWQgYXMgdGhleSBmaW5pc2ggYnVpbGRpbmcsIGluIHR3byBncm91cHM6IGNvbGxpc2lvbiB2cy4gbm9uLWNvbGxpc2lvblxuICAgICAgICBsZXQgdGlsZV9zdHlsZXMgPSB0aGlzLnN0eWxlc0ZvclRpbGUodGlsZS5rZXksIHN0eWxlcykubWFwKHMgPT4gc3R5bGVzW3NdKTtcbiAgICAgICAgVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gc3R5bGUuY29sbGlzaW9uID8gJ2NvbGxpc2lvbicgOiAnbm9uLWNvbGxpc2lvbicpO1xuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiBzdHlsZS5uYW1lKTsgLy8gY2FsbCBmb3IgZWFjaCBzdHlsZVxuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiAnc3R5bGVzJyk7IC8vIGFsbCBzdHlsZXMgaW4gc2luZ2xlIGNhbGwgKHByZXZpb3VzIGJlaGF2aW9yKVxuICAgIH1cblxuICAgIHN0YXRpYyBzdHlsZXNGb3JUaWxlICh0aWxlX2tleSwgc3R5bGVzKSB7XG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzIGluIHN0eWxlcykge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1tzXS5oYXNEYXRhRm9yVGlsZSh0aWxlX2tleSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlX3N0eWxlcy5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlX3N0eWxlcztcbiAgICB9XG5cbiAgICAvLyBTZW5kIGdyb3VwcyBvZiBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgKGFzIHRoZXkgZmluaXNoIGJ1aWxkaW5nKSxcbiAgICAvLyBncm91cGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgIHN0YXRpYyBzZW5kU3R5bGVHcm91cHModGlsZSwgc3R5bGVzLCB7IHNjZW5lX2lkIH0sIGdyb3VwX2J5KSB7XG4gICAgICAgIC8vIEdyb3VwIHN0eWxlc1xuICAgICAgICBsZXQgZ3JvdXBzID0ge307XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdyb3VwX25hbWUgPSBncm91cF9ieShzKTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3Vwc1tncm91cF9uYW1lXSB8fCBbXTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXS5wdXNoKHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7IHN0YXJ0OiB0cnVlIH07XG4gICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cF9uYW1lXTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGdyb3VwLm1hcChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZS5lbmREYXRhKHRpbGUpLnRoZW4oc3R5bGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhW3N0eWxlLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogc3R5bGVfZGF0YS52ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzOiBzdHlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHN0eWxlX2RhdGEudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzOiBzdHlsZV9kYXRhLnRleHR1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYEZpbmlzaGVkIHN0eWxlIGdyb3VwICcke2dyb3VwX25hbWV9JyBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGdyb3VwIGFuZCBjaGVjayBpZiBhbGwgZ3JvdXBzIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5ldmVyeShnID0+IGdyb3Vwc1tnXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgbWVzaGVzIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHsgdGlsZTogVGlsZS5zbGljZSh0aWxlLCBbJ21lc2hfZGF0YSddKSwgcHJvZ3Jlc3MgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9OyAvLyByZXNldCBzbyBlYWNoIGdyb3VwIHNlbmRzIHNlcGFyYXRlIHNldCBvZiBzdHlsZSBtZXNoZXNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBidWlsZCwgcmV0dXJuIGVtcHR5IHRpbGUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgVGlsZU1hbmFnZXJfJHtzY2VuZV9pZH0uYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUpLCBwcm9ncmVzczogeyBzdGFydDogdHJ1ZSwgZG9uZTogdHJ1ZSB9IH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBSZXRyaWV2ZXMgZ2VvbWV0cnkgZnJvbSBhIHRpbGUgYWNjb3JkaW5nIHRvIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvblxuICAgICAgICBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aDpcbiAgICAgICAgICAgIGxheWVyOiBzb3VyY2UgbGF5ZXIgbmFtZVxuICAgICAgICAgICAgZ2VvbTogR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvblxuICAgICovXG4gICAgc3RhdGljIGdldERhdGFGb3JTb3VyY2UgKHNvdXJjZV9kYXRhLCBzb3VyY2VfY29uZmlnLCBkZWZhdWx0X2xheWVyID0gbnVsbCkge1xuICAgICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgICAgaWYgKHNvdXJjZV9jb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHNvdXJjZSBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGlmICghc291cmNlX2NvbmZpZy5sYXllciAmJiBzb3VyY2VfZGF0YS5sYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHJlcXVlc3RlZCBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIGRlZmF1bHRfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBkZWZhdWx0X2xheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbZGVmYXVsdF9sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IG5hbWUsIHVzZSBpdFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZV9jb25maWcubGF5ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXllcjogc291cmNlX2NvbmZpZy5sYXllcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW3NvdXJjZV9jb25maWcubGF5ZXJdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBsYXllcnMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCBjb21iaW5lIHRoZW1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlX2NvbmZpZy5sYXllcikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfY29uZmlnLmxheWVyLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXSAmJiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nXG4gICAgICAgZm9yIGEgc2luZ2xlIHRpbGUuXG4gICAgKi9cbiAgICBidWlsZE1lc2hlcyhzdHlsZXMsIHByb2dyZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1Z1xuICAgICAgICB0aGlzLmRlYnVnLmdlb21ldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgVkJPc1xuICAgICAgICBsZXQgbWVzaGVzID0ge30sIHRleHR1cmVzID0gW107IC8vIG5ldyBkYXRhIHRvIGJlIGFkZGVkIHRvIHRpbGVcbiAgICAgICAgbGV0IG1lc2hfZGF0YSA9IHRoaXMubWVzaF9kYXRhO1xuICAgICAgICBpZiAobWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIG1lc2hfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2RhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgKz0gbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3R5bGVzW3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ291bGQgbm90IGNyZWF0ZSBtZXNoIGJlY2F1c2Ugc3R5bGUgJyR7c30nIG5vdCBmb3VuZCwgZm9yIHRpbGUgJHt0aGlzLmtleX0sIGFib3J0aW5nIHRpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc2hlc1tzXSA9IHN0eWxlc1tzXS5tYWtlTWVzaChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEsIG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMsIG1lc2hfZGF0YVtzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyArPSBtZXNoZXNbc10uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVzXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmFsaWQgZm9yIGEgc2luZ2xlIHRleHR1cmUgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIG11bHRpcGxlIHN0eWxlc1xuICAgICAgICAgICAgICAgIC8vIChlLmcuIHNhbWUgcmFzdGVyIHRleHR1cmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgc291cmNlcykuIFRoaXMgbWVhbnMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIG1heSBiZSBhZGRlZCB0byB0aGUgdGlsZSdzIHRleHR1cmUgbGlzdCBtb3JlIHRoYW4gb25jZSwgd2hpY2ggZW5zdXJlc1xuICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgcHJvcGVybHkgcmVsZWFzZWQgKHRvIG1hdGNoIGl0cyByZXRhaW4gY291bnQpLlxuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5tZXNoX2RhdGFbc10udGV4dHVyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5tZXNoX2RhdGE7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFja2luZyBmb3IgdGhpcyB0aWxlIGdlbmVyYXRpb25cbiAgICAgICAgaWYgKHByb2dyZXNzLnN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLm5ld19tZXNoX3N0eWxlcyA9IFtdOyAvLyBrZWVwIHRyYWNrIG9mIHdoaWNoIG1lc2hlcyB3ZXJlIGJ1aWx0IGFzIHBhcnQgb2YgY3VycmVudCBnZW5lcmF0aW9uXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gWy4uLnRoaXMudGV4dHVyZXNdOyAvLyBjb3B5IG9sZCBsaXN0IG9mIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgbWVzaGVzXG4gICAgICAgIGZvciAobGV0IG0gaW4gbWVzaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNoZXNbbV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7IC8vIGZyZWUgb2xkIG1lc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWVzaGVzW21dID0gbWVzaGVzW21dOyAvLyBzZXQgbmV3IG1lc2hcbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzLnB1c2gobSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgdGV4dHVyZXNcbiAgICAgICAgdGhpcy50ZXh0dXJlcy5wdXNoKC4uLnRleHR1cmVzKTtcblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgLy8gUmVsZWFzZSB1bi1yZXBsYWNlZCBtZXNoZXMgKGV4aXN0aW5nIGluIHByZXZpb3VzIGdlbmVyYXRpb24sIGJ1dCB3ZXJlbid0IGJ1aWx0IGZvciB0aGlzIG9uZSlcbiAgICAgICAgICAgIGZvciAobGV0IG0gaW4gdGhpcy5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXdfbWVzaF9zdHlsZXMuaW5kZXhPZihtKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107XG5cbiAgICAgICAgICAgIC8vIFJlbGVhc2Ugb2xkIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnLmdlb21fcmF0aW8gPSAodGhpcy5kZWJ1Zy5nZW9tZXRyaWVzIC8gdGhpcy5kZWJ1Zy5mZWF0dXJlcykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgIHRoaXMucHJpbnREZWJ1ZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcsIGJ1dCB0aWxlIGhhcyBzaW5jZSBiZWVuIGRpc2NhcmRlZFxuICAgICAgICBGcmVlcyByZXNvdXJjZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHRpbGUgb2JqZWN0LlxuICAgICAgICBTdGF0aWMgbWV0aG9kIGJlY2F1c2UgdGhlIHRpbGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMgKHRoZSB0aWxlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdvcmtlciBpcyBwYXNzZWQgaW5zdGVhZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgYWJvcnRCdWlsZCAodGlsZSkge1xuICAgICAgICAvLyBSZWxlYXNlcyBtZXNoZXNcbiAgICAgICAgaWYgKHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmVzID0gdGlsZS5tZXNoX2RhdGFbc10udGV4dHVyZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgcmVsZWFzaW5nIHRleHR1cmUgJHt0fSBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcmVsYXRpdmUgdG8gdmlld1xuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB0aGlzLmNvb3JkcztcbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgdGhpcy52aWV3LmNlbnRlci50aWxlLnopO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VudGVyX2Rpc3QgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGNvb3Jkcy54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gY29vcmRzLnkpO1xuICAgIH1cblxuICAgIC8vIFNldCBhcyBhIHByb3h5IHRpbGUgZm9yIGFub3RoZXIgdGlsZVxuICAgIHNldFByb3h5Rm9yICh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSB0aGlzLnByb3h5X2ZvciB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZm9yLnB1c2godGlsZSk7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMTsgLy8gZHJhdyBwcm94aWVzIGEgaGFsZi1sYXllciBiYWNrIChvcmRlciBpcyBzY2FsZWQgMnggdG8gYXZvaWQgaW50ZWdlciB0cnVuY2F0aW9uKVxuICAgICAgICAgICAgdGlsZS5wcm94aWVkX2FzID0gKHRpbGUuc3R5bGVfem9vbSA+IHRoaXMuc3R5bGVfem9vbSA/ICdjaGlsZCcgOiAncGFyZW50Jyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm94eSB0aWxlcyBvbmx5IG5lZWQgdG8gcmVuZGVyIGEgc3BlY2lmaWMgc3R5bGUgaWYgYW55IG9mIHRoZSB0aWxlcyB0aGV5IGFyZSBwcm94eWluZyAqZm9yKlxuICAgIC8vIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB0aGF0IHN0eWxlIHlldC4gSWYgYWxsIHByb3hpZWQgdGlsZXMgKmhhdmUqIGRhdGEgZm9yIHRoYXQgc3R5bGUsIHRoZW4gaXQnc1xuICAgIC8vIHNhZmUgdG8gaGlkZSB0aGUgcHJveHkgdGlsZSdzIHZlcnNpb24uXG4gICAgc2hvdWxkUHJveHlGb3JTdHlsZSAoc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByb3h5X2ZvciB8fCB0aGlzLnByb3h5X2Zvci5zb21lKHQgPT4gdC5tZXNoZXNbc3R5bGVdID09IG51bGwpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtb2RlbCBtYXRyaXggYW5kIHRpbGUgdW5pZm9ybXNcbiAgICBzZXR1cFByb2dyYW0gKHsgbW9kZWwsIG1vZGVsMzIgfSwgcHJvZ3JhbSkge1xuICAgICAgICAvLyBUaWxlIG9yaWdpblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzRmdicsICd1X3RpbGVfb3JpZ2luJywgW3RoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMuc3R5bGVfem9vbSwgdGhpcy5jb29yZHMuel0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGlsZV9wcm94eV9kZXB0aCcsIHRoaXMucHJveHlfZGVwdGgpO1xuXG4gICAgICAgIC8vIE1vZGVsIC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB3b3JsZCBzcGFjZSAobWV0ZXJzLCBhYnNvbHV0ZSBtZXJjYXRvciBwb3NpdGlvbilcbiAgICAgICAgbWF0NC5pZGVudGl0eShtb2RlbCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMubWluLngsIHRoaXMubWluLnksIDApKTtcbiAgICAgICAgbWF0NC5zY2FsZShtb2RlbCwgbW9kZWwsIHZlYzMuZnJvbVZhbHVlcyh0aGlzLnNwYW4ueCAvIEdlby50aWxlX3NjYWxlLCAtMSAqIHRoaXMuc3Bhbi55IC8gR2VvLnRpbGVfc2NhbGUsIDEpKTsgLy8gc2NhbGUgdGlsZSBsb2NhbCBjb29yZHMgdG8gbWV0ZXJzXG4gICAgICAgIG1hdDQuY29weShtb2RlbDMyLCBtb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWwnLCBtb2RlbDMyKTtcblxuICAgICAgICAvLyBGYWRlIGluIGxhYmVscyBhY2NvcmRpbmcgdG8gcHJveHkgc3RhdHVzLCBhdm9pZGluZyBcImZsaWNrZXJpbmdcIiB3aGVyZVxuICAgICAgICAvLyBsYWJlbHMgcXVpY2tseSBnbyBmcm9tIGludmlzaWJsZSBiYWNrIHRvIHZpc2libGVcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3RpbGVfZmFkZV9pbicsIHRoaXMuZmFkZV9pbiAmJiB0aGlzLnByb3hpZWRfYXMgIT09ICdjaGlsZCcpO1xuICAgIH1cblxuICAgIC8vIFNsaWNlIGEgc3Vic2V0IG9mIGtleXMgb3V0IG9mIGEgdGlsZVxuICAgIC8vIEluY2x1ZGVzIGEgbWluaW11bSBzZXQgb2YgcHJlLWRlZmluZWQga2V5cyBmb3IgbG9hZCBzdGF0ZSwgZGVidWcuIGV0Yy5cbiAgICAvLyBXZSB1c2UgdGhpcyB0byBzZW5kIGEgc3Vic2V0IG9mIHRoZSB0aWxlIGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkLCB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeSBkYXRhIHRyYW5zZmVyXG4gICAgLy8gKGUuZy4gdmVyeSBsYXJnZSBpdGVtcyBsaWtlIGZlYXR1cmUgZ2VvbWV0cnkgYXJlIG5vdCBuZWVkZWQgb24gdGhlIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBzbGljZSAodGlsZSwga2V5cykge1xuICAgICAgICBsZXQga2VlcCA9IFtcbiAgICAgICAgICAgICdrZXknLFxuICAgICAgICAgICAgJ2xvYWRpbmcnLFxuICAgICAgICAgICAgJ2xvYWRlZCcsXG4gICAgICAgICAgICAnZ2VuZXJhdGlvbicsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgJ2RlYnVnJ1xuICAgICAgICBdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAga2VlcC5wdXNoKC4uLmtleXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIHRpbGUgc3Vic2V0XG4gICAgICAgIHZhciB0aWxlX3N1YnNldCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBrPTA7IGsgPCBrZWVwLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZWVwW2tdO1xuICAgICAgICAgICAgdGlsZV9zdWJzZXRba2V5XSA9IHRpbGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aWxlX3N1YnNldDtcbiAgICB9XG5cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3RoZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdrZXknKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gb3RoZXJba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcmludERlYnVnICgpIHtcbiAgICAgICAgbG9nKCdkZWJ1ZycsIGBUaWxlOiBkZWJ1ZyBmb3IgJHt0aGlzLmtleX06IFsgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kZWJ1Zyl9IF1gKTtcbiAgICB9XG5cbn1cblxuVGlsZS5jb29yZF9jaGlsZHJlbiA9IHt9OyAvLyBvbmx5IGFsbG9jYXRlIGNoaWxkcmVuIGNvb3JkaW5hdGVzIG9uY2UgcGVyIGNvb3JkaW5hdGVcbiIsImltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgVGlsZVB5cmFtaWQgZnJvbSAnLi90aWxlX3B5cmFtaWQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yKHsgc2NlbmUsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5weXJhbWlkID0gbmV3IFRpbGVQeXJhbWlkKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gW107XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydUaWxlTWFuYWdlcicsIHRoaXMuc2NlbmUuaWRdLmpvaW4oJ18nKTtcbiAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHRpbGUuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICB9XG5cbiAgICBrZWVwVGlsZSh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldID0gdGlsZTtcbiAgICAgICAgdGhpcy5weXJhbWlkLmFkZFRpbGUodGlsZSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvcmdldFRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLnB5cmFtaWQucmVtb3ZlVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RvcChrZXkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHNpbmdsZSB0aWxlXG4gICAgcmVtb3ZlVGlsZShrZXkpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlIHVubG9hZCBmb3IgJHtrZXl9YCk7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvLyBSdW4gYSBmdW5jdGlvbiBvbiBlYWNoIHRpbGVcbiAgICBmb3JFYWNoVGlsZShmdW5jKSB7XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgZnVuYyh0aGlzLnRpbGVzW3RdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IHBhc3MgYSBmaWx0ZXIgY29uZGl0aW9uXG4gICAgcmVtb3ZlVGlsZXMoZmlsdGVyKSB7XG4gICAgICAgIGxldCByZW1vdmVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAoZmlsdGVyKHRpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgcmVtb3ZlX3RpbGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gcmVtb3ZlX3RpbGVzW3JdO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlc0ZvclZpZXcoKSB7XG4gICAgICAgIC8vIEZpbmQgdmlzaWJsZSB0aWxlcyBhbmQgbG9hZCBuZXcgb25lc1xuICAgICAgICBsZXQgcHJldl9jb29yZHMgPSBPYmplY3Qua2V5cyh0aGlzLnZpc2libGVfY29vcmRzKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICBsZXQgdGlsZV9jb29yZHMgPSB0aGlzLnZpZXcuZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGlsZV9jb29yZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHRpbGVfY29vcmRzW2NdO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZUNvb3JkaW5hdGUoY29vcmRzKTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHNbY29vcmRzLmtleV0gPSBjb29yZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB2aXNpYmxlIGNvb3JkcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRPRE86IG1vdmUgdG8gYSBuZXcgdmlldyBtYW5hZ2VyIG9iamVjdFxuICAgICAgICBsZXQgbmV3X2Nvb3JkcyA9IE9iamVjdC5rZXlzKHRoaXMudmlzaWJsZV9jb29yZHMpO1xuICAgICAgICBsZXQgY29vcmRzX2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHByZXZfY29vcmRzLmxlbmd0aCAhPT0gbmV3X2Nvb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByZXZfY29vcmRzLnNvcnQoKTtcbiAgICAgICAgICAgIG5ld19jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgaWYgKCFwcmV2X2Nvb3Jkcy5ldmVyeSgoYywgaSkgPT4gbmV3X2Nvb3Jkc1tpXSA9PT0gYykpIHtcbiAgICAgICAgICAgICAgICBjb29yZHNfY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlU3RhdGVzICgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgICAgIHRpbGUudXBkYXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9hZFF1ZXVlZENvb3JkaW5hdGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUHJveHlUaWxlcygpO1xuICAgICAgICB0aGlzLnZpZXcucHJ1bmVUaWxlc0ZvclZpZXcoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSZW5kZXJhYmxlVGlsZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdHlsZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQcm94eVRpbGVzICgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgcHJveGllc1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4gdGlsZS5zZXRQcm94eUZvcihudWxsKSk7XG5cbiAgICAgICAgbGV0IHByb3h5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSAmJiAhdGlsZS5idWlsdCAmJiB0aWxlLmNvb3Jkcy56ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnB5cmFtaWQuZ2V0QW5jZXN0b3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy5weXJhbWlkLmdldERlc2NlbmRhbnRzKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkZXNjZW5kYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHNbaV0uc2V0UHJveHlGb3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5KHRpbGUpIHtcbiAgICAgICAgdGlsZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aWxlLnN0eWxlX3pvb20gPT09IHRoaXMudmlldy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVfY29vcmRzW3RpbGUuY29vcmRzLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYnJ1dGUgZm9yY2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy52aXNpYmxlX2Nvb3Jkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGlsZS5pc0Rlc2NlbmRhbnQodGlsZS5jb29yZHMsIHRoaXMudmlzaWJsZV9jb29yZHNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZW4ndCB2aXNpYmxlLCBhbmQgZmxhZyByZW1haW5pbmcgdmlzaWJsZSBvbmVzIHRvIGJlIHVwZGF0ZWQgKGZvciBsb2FkaW5nLCBwcm94eSwgZXRjLilcbiAgICBwcnVuZVRvVmlzaWJsZVRpbGVzICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUaWxlcyh0aWxlID0+ICF0aWxlLnZpc2libGUpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVUaWxlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmFibGVfdGlsZXM7XG4gICAgfVxuXG4gICAgdXBkYXRlUmVuZGVyYWJsZVRpbGVzKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmIHRpbGUubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJhYmxlX3RpbGVzLnB1c2godGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICB9XG5cbiAgICBnZXRBY3RpdmVTdHlsZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfc3R5bGVzO1xuICAgIH1cblxuICAgIHVwZGF0ZUFjdGl2ZVN0eWxlcyAoKSB7XG4gICAgICAgIGxldCB0aWxlcyA9IHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICAgICAgbGV0IGFjdGl2ZSA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCB0aWxlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aWxlc1t0XTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRpbGUubWVzaGVzKS5mb3JFYWNoKHMgPT4gYWN0aXZlW3NdID0gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gT2JqZWN0LmtleXMoYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlX3N0eWxlcztcbiAgICB9XG5cbiAgICBpc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5zb21lKGsgPT4gdGhpcy50aWxlc1trXS52aXNpYmxlICYmICF0aGlzLnRpbGVzW2tdLmJ1aWx0KTtcbiAgICB9XG5cbiAgICAvLyBRdWV1ZSBhIHRpbGUgZm9yIGxvYWRcbiAgICBxdWV1ZUNvb3JkaW5hdGUoY29vcmRzKSB7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkc1t0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoXSA9IGNvb3JkcztcbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCBxdWV1ZWQgdGlsZXNcbiAgICBsb2FkUXVldWVkQ29vcmRpbmF0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IHF1ZXVlZCB0aWxlcyBmcm9tIGNlbnRlciB0aWxlXG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGEueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGEueSk7XG4gICAgICAgICAgICBsZXQgYmQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGIueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGIueSk7XG4gICAgICAgICAgICByZXR1cm4gKGJkID4gYWQgPyAtMSA6IChiZCA9PT0gYWQgPyAwIDogMSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLmZvckVhY2goY29vcmRzID0+IHRoaXMubG9hZENvb3JkaW5hdGUoY29vcmRzKSk7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHRpbGVzIHRvIGNvdmVyIGEgZ2l2ZW4gbG9naWNhbCB0aWxlIGNvb3JkaW5hdGVcbiAgICBsb2FkQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBub3QgYXQgY3VycmVudCBzY2VuZSB6b29tXG4gICAgICAgIGlmIChjb29yZHMueiAhPT0gdGhpcy52aWV3LmNlbnRlci50aWxlLnopIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBuZWNlc3NhcnkgdGlsZXMgZm9yIGVhY2ggc291cmNlXG4gICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zY2VuZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zY2VuZS5zb3VyY2VzW3NdO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBzb3VyY2Ugc2hvdWxkIGJ1aWxkIHRoaXMgdGlsZVxuICAgICAgICAgICAgaWYgKCFzb3VyY2UuYnVpbGRzX2dlb21ldHJ5X3RpbGVzIHx8ICFzb3VyY2UuaW5jbHVkZXNUaWxlKGNvb3JkcywgdGhpcy52aWV3LnRpbGVfem9vbSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGtleSA9IFRpbGUua2V5KGNvb3Jkcywgc291cmNlLCB0aGlzLnZpZXcudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmIChrZXkgJiYgIXRoaXMuaGFzVGlsZShrZXkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbGUgPSBUaWxlLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IHRoaXMuc2NlbmUuZ2V0V29ya2VyRm9yRGF0YVNvdXJjZShzb3VyY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aGlzLnZpZXcuc3R5bGVab29tKGNvb3Jkcy56KSxcbiAgICAgICAgICAgICAgICAgICAgdmlldzogdGhpcy52aWV3XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtlZXBUaWxlKHRpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRUaWxlKHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCBhbmQgYnVpbGQgYSBsaXN0IG9mIHRpbGVzXG4gICAgYnVpbGRUaWxlcyh0aWxlcykge1xuICAgICAgICBUaWxlLnNvcnQodGlsZXMpLmZvckVhY2godGlsZSA9PiB0aGlzLmJ1aWxkVGlsZSh0aWxlKSk7XG4gICAgICAgIHRoaXMuY2hlY2tCdWlsZFF1ZXVlKCk7XG4gICAgfVxuXG4gICAgYnVpbGRUaWxlKHRpbGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50aWxlQnVpbGRTdGFydCh0aWxlLmtleSk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgdGlsZS5idWlsZCh0aGlzLnNjZW5lLmdlbmVyYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIGEgd2ViIHdvcmtlciBjb21wbGV0ZXMgcHJvY2Vzc2luZyBmb3IgYSBzaW5nbGUgdGlsZSAoaW5pdGlhbCBsb2FkLCBvciByZWJ1aWxkKVxuICAgIGJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCh7IHRpbGUsIHByb2dyZXNzIH0pIHtcbiAgICAgICAgLy8gUmVtb3ZlZCB0aGlzIHRpbGUgZHVyaW5nIGxvYWQ/XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW3RpbGUua2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYGRpc2NhcmRlZCB0aWxlICR7dGlsZS5rZXl9IGluIFRpbGVNYW5hZ2VyLmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCBiZWNhdXNlIHByZXZpb3VzbHkgcmVtb3ZlZGApO1xuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbHQgd2l0aCBhbiBvdXRkYXRlZCBzY2VuZSBjb25maWd1cmF0aW9uP1xuICAgICAgICBlbHNlIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuc2NlbmUuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBkaXNjYXJkZWQgdGlsZSAke3RpbGUua2V5fSBpbiBUaWxlTWFuYWdlci5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQgYmVjYXVzZSBidWlsdCB3aXRoIGAgK1xuICAgICAgICAgICAgICAgIGBzY2VuZSBjb25maWcgZ2VuICR7dGlsZS5nZW5lcmF0aW9ufSwgY3VycmVudCAke3RoaXMuc2NlbmUuZ2VuZXJhdGlvbn1gKTtcbiAgICAgICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRpbGUgd2l0aCBwcm9wZXJ0aWVzIGZyb20gd29ya2VyXG4gICAgICAgICAgICBpZiAodGhpcy50aWxlc1t0aWxlLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1t0aWxlLmtleV0ubWVyZ2UodGlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5idWlsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpbGUuYnVpbGRNZXNoZXModGhpcy5zY2VuZS5zdHlsZXMsIHByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKHRpbGUua2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgZW5jb3VudGVycyBhbiBlcnJvciBidWlsZGluZyBhIHRpbGVcbiAgICBidWlsZFRpbGVFcnJvcih0aWxlKSB7XG4gICAgICAgIGxvZygnZXJyb3InLCBgRXJyb3IgYnVpbGRpbmcgdGlsZSAke3RpbGUua2V5fTpgLCB0aWxlLmVycm9yKTtcbiAgICAgICAgdGhpcy5mb3JnZXRUaWxlKHRpbGUua2V5KTtcbiAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICB0aWxlQnVpbGRTdGFydChrZXkpIHtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IHRoaXMuYnVpbGRpbmdfdGlsZXMgfHwge307XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XSA9IHRydWU7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RhcnQgZm9yICR7a2V5fTogJHtPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgdGlsZUJ1aWxkU3RvcChrZXkpIHtcbiAgICAgICAgLy8gRG9uZSBidWlsZGluZz9cbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmdfdGlsZXMpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RvcCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1aWxkaW5nX3RpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLmNoZWNrQnVpbGRRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3RhdHVzIG9mIHRpbGUgYnVpbGRpbmcgcXVldWUgYW5kIG5vdGlmeSBzY2VuZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICBjaGVja0J1aWxkUXVldWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWlsZGluZ190aWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS50aWxlTWFuYWdlckJ1aWxkRG9uZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VtIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSB7XG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdICE9IG51bGwgJiYgKHR5cGVvZiBmaWx0ZXIgIT09ICdmdW5jdGlvbicgfHwgZmlsdGVyKHRoaXMudGlsZXNbdF0pID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHN1bSArPSB0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgLy8gQXZlcmFnZSBvZiBhIGRlYnVnIHByb3BlcnR5IGFjcm9zcyB0aWxlc1xuICAgIGdldERlYnVnQXZlcmFnZShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSAvIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aDtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZVB5cmFtaWQge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29vcmRzID0ge307XG4gICAgICAgIHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGggPSAzOyAvLyAjIG9mIGxldmVscyB0byBzZWFyY2ggdXAvZG93biBmb3IgcHJveHkgdGlsZXNcbiAgICAgICAgdGhpcy5tYXhfcHJveHlfYW5jZXN0b3JfZGVwdGggPSA1O1xuICAgIH1cblxuICAgIHNvdXJjZVRpbGVzKGNvb3JkLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0gJiZcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0uc291cmNlcyAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzW3NvdXJjZS5uYW1lXSk7XG4gICAgfVxuXG4gICAgYWRkVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIEFkZCB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBsZXQgY29vcmQgPSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICBpZiAoIWNvb3JkKSB7XG4gICAgICAgICAgICBjb29yZCA9IHRoaXMuY29vcmRzW2tleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvb3JkLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvb3JkLnNvdXJjZXMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSkge1xuICAgICAgICAgICAgY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV1bdGlsZS5zdHlsZV96b29tXSA9IHRpbGU7XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCB1cCA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3Jkcywgeik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29vcmRzW3VwLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1t1cC5rZXldID0geyBkZXNjZW5kYW50czogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb29yZHNbdXAua2V5XS5kZXNjZW5kYW50cysrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyh0aWxlLmNvb3JkcywgdGlsZS5zb3VyY2UpO1xuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuXG4gICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2VfdGlsZXNbdGlsZS5zdHlsZV96b29tXTtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzb3VyY2VfdGlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzb3VyY2VcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1trZXldLmRlc2NlbmRhbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgd2hvbGUgY29vcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCBkb3duID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB6KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0gJiYgdGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cy0tO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMgPT09IDAgJiYgIXRoaXMuY29vcmRzW2Rvd24ua2V5XS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1tkb3duLmtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QW5jZXN0b3IgKHsgY29vcmRzLCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgPSAxKSB7XG4gICAgICAgIGlmIChsZXZlbCA+IHRoaXMubWF4X3Byb3h5X2FuY2VzdG9yX2RlcHRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID4gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjb29yZHMsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gLSAxOyB6ID49IHNvdXJjZS5tYXhfem9vbTsgei0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZV90aWxlc1t6XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgrK2xldmVsID4gdGhpcy5tYXhfcHJveHlfYW5jZXN0b3JfZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlX3pvb20gPSBzb3VyY2UubWF4X3pvb207XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlcyBhdCBuZXh0IHpvb20gdXBcbiAgICAgICAgc3R5bGVfem9vbS0tO1xuICAgICAgICBsZXQgcGFyZW50ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgY29vcmRzLnogLSAxKTtcbiAgICAgICAgbGV0IHBhcmVudF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMocGFyZW50LCBzb3VyY2UpO1xuICAgICAgICBpZiAocGFyZW50X3RpbGVzICYmIHBhcmVudF90aWxlc1tzdHlsZV96b29tXSAmJiBwYXJlbnRfdGlsZXNbc3R5bGVfem9vbV0ubG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50X3RpbGVzW3N0eWxlX3pvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpZG4ndCBmaW5kIGFuY2VzdG9yLCB0cnkgbmV4dCBsZXZlbFxuICAgICAgICBpZiAocGFyZW50LnogPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbmNlc3Rvcih7IGNvb3JkczogcGFyZW50LCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERlc2NlbmRhbnRzICh7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlIH0sIGxldmVsID0gMSkge1xuICAgICAgICBsZXQgZGVzY2VuZGFudHMgPSBbXTtcblxuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID49IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY29vcmRzLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzZWFyY2hfbWF4X3pvb20gPSBNYXRoLm1heChHZW8uZGVmYXVsdF92aWV3X21heF96b29tLCBzdHlsZV96b29tICsgdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gKyAxOyB6IDw9IHNlYXJjaF9tYXhfem9vbTsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChzb3VyY2VfdGlsZXNbel0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZXMgYXQgbmV4dCB6b29tIGRvd25cbiAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldICYmIHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgc3R5bGVfem9vbSsrO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBUaWxlLmNoaWxkcmVuRm9yQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2NdO1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY2hpbGQsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkX3RpbGVzICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgY2hpbGQsIHRyeSBuZXh0IGxldmVsXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPD0gdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCAmJiBjaGlsZC56IDw9IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKC4uLnRoaXMuZ2V0RGVzY2VuZGFudHMoeyBjb29yZHM6IGNoaWxkLCBzb3VyY2UsIHN0eWxlX3pvb20gfSwgbGV2ZWwgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGRyYXdzIGEgYmx1ZSByZWN0YW5nbGUgYm9yZGVyIGFyb3VuZCB0aGUgY29sbGlzaW9uIGJveCBvZiBhIGxhYmVsXG4gICAgZHJhd19sYWJlbF9jb2xsaXNpb25fYm94ZXM6IGZhbHNlLFxuICAgIC8vIGRyYXdzIGEgZ3JlZW4gcmVjdGFuZ2xlIGJvcmRlciB3aXRoaW4gdGhlIHRleHR1cmUgYm94IG9mIGEgbGFiZWxcbiAgICBkcmF3X2xhYmVsX3RleHR1cmVfYm94ZXM6IGZhbHNlLFxuICAgIC8vIHN1cHByZXNlcyBmYWRlLWluIG9mIGxhYmVsc1xuICAgIHN1cHByZXNzX2xhYmVsX2ZhZGVfaW46IGZhbHNlLFxuICAgIC8vIHN1cHByZXNzIGFuaW1hdG9uIG9mIGxhYmVsIHNuYXAgdG8gcGl4ZWwgZ3JpZFxuICAgIHN1cHByZXNzX2xhYmVsX3NuYXBfYW5pbWF0aW9uOiBmYWxzZVxufTtcbiIsIlxuXG5leHBvcnQgY2xhc3MgTWV0aG9kTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgICAgPSAnTWV0aG9kTm90SW1wbGVtZW50ZWQnO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnTWV0aG9kICcgKyBtZXRob2ROYW1lICsgJyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzJztcbiAgICB9XG59XG4iLCIvLyBQYXJ0aWFsIGltcG9ydCBvZiBnbC1tYXRyaXggdmlhIG1vZHVsYXJpemVkIHN0YWNrLWdsIGZvcmtzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFja2dsXG5cbi8vIHZlYzNcblxuLy8gU3Vic3RpdHV0ZSA2NC1iaXQgdmVyc2lvblxuLy8gV2UgbmVlZCB0aGUgZXh0cmEgcHJlY2lzaW9uIHdoZW4gbXVsdGlwbHlpbmcgbWF0cmljZXMgdy9tZXJjYXRvciBwcm9qZWN0ZWQgdmFsdWVzXG5jb25zdCB2ZWMzID0ge1xuICAgIGZyb21WYWx1ZXMgKHgsIHksIHopIHtcbiAgICAgICAgdmFyIG91dCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XG4gICAgICAgIG91dFswXSA9IHg7XG4gICAgICAgIG91dFsxXSA9IHk7XG4gICAgICAgIG91dFsyXSA9IHo7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufTtcblxuXG4vLyBtYXQzXG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQzX25vcm1hbEZyb21NYXQ0fSBmcm9tICdnbC1tYXQzL25vcm1hbC1mcm9tLW1hdDQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfaW52ZXJ0fSBmcm9tICdnbC1tYXQzL2ludmVydCc7XG5cbmNvbnN0IG1hdDMgPSB7XG4gICAgbm9ybWFsRnJvbU1hdDQ6IG1hdDNfbm9ybWFsRnJvbU1hdDQsXG4gICAgaW52ZXJ0OiBtYXQzX2ludmVydFxufTtcblxuXG4vLyBtYXQ0XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X211bHRpcGx5fSBmcm9tICdnbC1tYXQ0L211bHRpcGx5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3RyYW5zbGF0ZX0gZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfc2NhbGV9IGZyb20gJ2dsLW1hdDQvc2NhbGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfcGVyc3BlY3RpdmV9IGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbG9va0F0fSBmcm9tICdnbC1tYXQ0L2xvb2tBdCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9pZGVudGl0eX0gZnJvbSAnZ2wtbWF0NC9pZGVudGl0eSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9jb3B5fSBmcm9tICdnbC1tYXQ0L2NvcHknO1xuXG5jb25zdCBtYXQ0ID0ge1xuICAgIG11bHRpcGx5OiBtYXQ0X211bHRpcGx5LFxuICAgIHRyYW5zbGF0ZTogbWF0NF90cmFuc2xhdGUsXG4gICAgc2NhbGU6IG1hdDRfc2NhbGUsXG4gICAgcGVyc3BlY3RpdmU6IG1hdDRfcGVyc3BlY3RpdmUsXG4gICAgbG9va0F0OiBtYXQ0X2xvb2tBdCxcbiAgICBpZGVudGl0eTogbWF0NF9pZGVudGl0eSxcbiAgICBjb3B5OiBtYXQ0X2NvcHlcbn07XG5cblxuZXhwb3J0IHt2ZWMzLCBtYXQzLCBtYXQ0fTtcbiIsImltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcblxuY29uc3QgTEVWRUxTID0ge1xuICAgIHNpbGVudDogLTEsXG4gICAgZXJyb3I6IDAsXG4gICAgd2FybjogMSxcbiAgICBpbmZvOiAyLFxuICAgIGRlYnVnOiAzLFxuICAgIHRyYWNlOiA0XG59O1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbmZ1bmN0aW9uIG1ldGhvZEZvckxldmVsIChsZXZlbCkge1xuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICBtZXRob2RzW2xldmVsXSA9IG1ldGhvZHNbbGV2ZWxdIHx8IChjb25zb2xlW2xldmVsXSA/IGNvbnNvbGVbbGV2ZWxdIDogY29uc29sZS5sb2cpLmJpbmQoY29uc29sZSk7XG4gICAgICAgIHJldHVybiBtZXRob2RzW2xldmVsXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZyAobXNnX2xldmVsLCAuLi5tc2cpIHtcbiAgICBpZiAoTEVWRUxTW21zZ19sZXZlbF0gPD0gTEVWRUxTW2xvZy5sZXZlbF0pIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIC8vIFByb3h5IHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ19sb2dQcm94eScsIG1zZ19sZXZlbCwgLi4ubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsb2dnZXIgPSBtZXRob2RGb3JMZXZlbChtc2dfbGV2ZWwpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSB0byBjb25zb2xlIChvbiBtYWluIHRocmVhZClcbiAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgVGFuZ3JhbSAke3ZlcnNpb259IFske21zZ19sZXZlbH1dOiAke21zZ1swXX1gLCAuLi5tc2cuc2xpY2UoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sb2cubGV2ZWwgPSAnaW5mbyc7XG5sb2cud29ya2VycyA9IG51bGw7XG5cbmxvZy5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIGxvZy5sZXZlbCA9IGxldmVsO1xuXG4gICAgaWYgKFRocmVhZC5pc19tYWluICYmIEFycmF5LmlzQXJyYXkobG9nLndvcmtlcnMpKSB7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShsb2cud29ya2VycywgJ19sb2dTZXRMZXZlbFByb3h5JywgbGV2ZWwpO1xuICAgIH1cbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIGxvZy5zZXRXb3JrZXJzID0gZnVuY3Rpb24gKHdvcmtlcnMpIHtcbiAgICAgICAgbG9nLndvcmtlcnMgPSB3b3JrZXJzO1xuICAgIH07XG5cblxufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdfbG9nUHJveHknLCBsb2cpOyAgICAgICAgICAgICAgICAgICAvLyBwcm94eSBsb2cgbWVzc2FnZXMgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWRcbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dTZXRMZXZlbFByb3h5JywgbG9nLnNldExldmVsKTsgIC8vIHByb3h5IGxvZyBsZXZlbCBzZXR0aW5nIGZyb20gbWFpbiB0byB3b3JrZXIgdGhyZWFkXG4iLCIvKiBnbG9iYWwgTWVkaWFSZWNvcmRlciAqL1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge2NyZWF0ZU9iamVjdFVSTH0gZnJvbSAnLi91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVkaWFDYXB0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIHNldENhbnZhcyAoY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90LCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNjcmVlbnNob3QgZGF0YSB3aGVuIGF2YWlsYWJsZVxuICAgIHNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTsgLy8gb25seSBjYXB0dXJlIG9uZSBzY3JlZW5zaG90IGF0IGEgdGltZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2lsbCByZXNvbHZlIG9uY2UgcmVuZGVyaW5nIGlzIGNvbXBsZXRlIGFuZCByZW5kZXIgYnVmZmVyIGlzIGNhcHR1cmVkXG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGFmdGVyIHJlbmRlcmluZywgY2FwdHVyZXMgcmVuZGVyIGJ1ZmZlciBhbmQgcmVzb2x2ZXMgcHJvbWlzZSB3aXRoIHRoZSBpbWFnZSBkYXRhXG4gICAgY29tcGxldGVTY3JlZW5zaG90ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVfc2NyZWVuc2hvdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgZGF0YSBVUkwsIGNvbnZlcnQgdG8gYmxvYlxuICAgICAgICAgICAgLy8gU3RyaXAgaG9zdC9taW1ldHlwZS9ldGMuLCBjb252ZXJ0IGJhc2U2NCB0byBiaW5hcnkgd2l0aG91dCBVVEYtOCBtYW5nbGluZ1xuICAgICAgICAgICAgLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS91bmNvbmVkLzQzNzA4MjJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXRvYih1cmwuc2xpY2UoMjIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB3aXRoIHNjcmVlbnNob3QgZGF0YVxuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICdwbmcnIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXJ0cyBjYXB0dXJpbmcgYSB2aWRlbyBzdHJlYW0gZnJvbSB0aGUgY2FudmFzXG4gICAgc3RhcnRWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5NZWRpYVJlY29yZGVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmNhbnZhcyB8fCB0eXBlb2YgdGhpcy5jYW52YXMuY2FwdHVyZVN0cmVhbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgKENhbnZhcy5jYXB0dXJlU3RyZWFtIGFuZC9vciBNZWRpYVJlY29yZGVyIEFQSXMpIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlcicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgYWxyZWFkeSBpbiBwcm9ncmVzcywgY2FsbCBTY2VuZS5zdG9wVmlkZW9DYXB0dXJlKCkgZmlyc3QnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNhcHR1cmVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjYXAgPSB0aGlzLnZpZGVvX2NhcHR1cmUgPSB7fTtcbiAgICAgICAgICAgIGNhcC5jaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGNhcC5zdHJlYW0gPSB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtKCk7XG4gICAgICAgICAgICBjYXAub3B0aW9ucyA9IHsgbWltZVR5cGU6ICd2aWRlby93ZWJtJyB9OyAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIGZvcm1hdCBvcHRpb25zXG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihjYXAuc3RyZWFtLCBjYXAub3B0aW9ucyk7XG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICBjYXAuY2h1bmtzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RvcHBlZCByZWNvcmRpbmc/IENyZWF0ZSB0aGUgZmluYWwgY2FwdHVyZSBmaWxlIGJsb2JcbiAgICAgICAgICAgICAgICBpZiAoY2FwLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihjYXAuY2h1bmtzLCB7IHR5cGU6IGNhcC5vcHRpb25zLm1pbWVUeXBlIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIGFsbCBzdHJlYW0gdHJhY2tzLCBhbmQgc2V0IG9iamVjdHMgdG8gbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYWNrcyA9IGNhcC5zdHJlYW0uZ2V0VHJhY2tzKCkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCh0cmFjayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcC5zdHJlYW0ucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FwLnN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FwLnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICd3ZWJtJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FwLm1lZGlhX3JlY29yZGVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgJ1NjZW5lIHZpZGVvIGNhcHR1cmUgZmFpbGVkJywgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3RvcHMgY2FwdHVyaW5nIGEgdmlkZW8gc3RyZWFtIGZyb20gdGhlIGNhbnZhcywgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2aWRlbyB3aGVuIGF2YWlsYWJsZVxuICAgIHN0b3BWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ05vIHNjZW5lIHZpZGVvIGNhcHR1cmUgaW4gcHJvZ3Jlc3MsIGNhbGwgU2NlbmUuc3RhcnRWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gZmluYWwgc3RyZWFtIGlzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nXG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5tZWRpYV9yZWNvcmRlci5zdG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW9fY2FwdHVyZS5wcm9taXNlO1xuICAgIH1cblxufVxuIiwiLy8gRGVlcC9yZWN1cnNpdmUgbWVyZ2Ugb2Ygb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgaW50byBhIGRlc3RpbmF0aW9uIG9iamVjdFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzIChkZXN0LCAuLi5zb3VyY2VzKSB7XG4gICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICBsZXQgc291cmNlID0gc291cmNlc1tzXTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2UgdGhlIHNvdXJjZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCBpcyBhIGEgbm9uLW51bGwga2V5L3ZhbHVlIG9iamVjdFxuICAgICAgICAgICAgLy8gKGUuZy4gZG9uJ3QgbWVyZ2UgYXJyYXlzLCB0aG9zZSBhcmUgdHJlYXRlZCBhcyBzY2FsYXIgdmFsdWVzOyBudWxsIHZhbHVlcyB3aWxsIG92ZXJ3cml0ZS9lcmFzZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlKVxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3Rba2V5XSAhPT0gbnVsbCAmJiB0eXBlb2YgZGVzdFtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkZXN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyhkZXN0W2tleV0sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyh7fSwgdmFsdWUpOyAvLyBkZXN0aW5hdGlvbiBub3QgYW4gb2JqZWN0LCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlIGlmIHRoZSBzb3VyY2UgcHJvcGVydHkgaXM6IGEgc2NhbGFyIChudW1iZXIvc3RyaW5nKSxcbiAgICAgICAgICAgIC8vIGFuIGFycmF5LCBvciBhIG51bGwgdmFsdWVcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBzb3VyY2UgcHJvcGVydGllcyBhcmUgaWdub3JlZFxuICAgICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG4iLCJpbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9CQiB7XG5cbiAgICBjb25zdHJ1Y3RvciAoeCwgeSwgYSwgdywgaCkge1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IFt3LCBoXTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGE7XG4gICAgICAgIHRoaXMuY2VudHJvaWQgPSBbeCwgeV07XG4gICAgICAgIHRoaXMucXVhZCA9IFtdO1xuICAgICAgICB0aGlzLmF4ZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIG1vdmUgKHB4LCBweSkge1xuICAgIFx0dGhpcy5jZW50cm9pZCA9IFtweCwgcHldO1xuXG4gICAgXHR0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGdldEV4dGVudCAoKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IGFhYmIgPSBbaW5mLCBpbmYsIC1pbmYsIC1pbmZdO1xuXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgYWFiYlswXSA9IE1hdGgubWluKHRoaXMucXVhZFtpXVswXSwgYWFiYlswXSk7XG4gICAgICAgICAgICBhYWJiWzFdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzFdLCBhYWJiWzFdKTtcbiAgICAgICAgICAgIGFhYmJbMl0gPSBNYXRoLm1heCh0aGlzLnF1YWRbaV1bMF0sIGFhYmJbMl0pO1xuICAgICAgICAgICAgYWFiYlszXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVsxXSwgYWFiYlszXSk7XG4gICAgXHR9XG5cbiAgICBcdHJldHVybiBhYWJiO1xuICAgIH1cblxuICAgIHBlcnBBeGVzICgpIHtcbiAgICBcdHRoaXMuYXhlc1swXSA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnN1Yih0aGlzLnF1YWRbMl0sIHRoaXMucXVhZFszXSkpO1xuICAgIFx0dGhpcy5heGVzWzFdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzFdKSk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICBcdGxldCB4ID0gWyBNYXRoLmNvcyh0aGlzLmFuZ2xlKSwgTWF0aC5zaW4odGhpcy5hbmdsZSldO1xuICAgIFx0bGV0IHkgPSBbLU1hdGguc2luKHRoaXMuYW5nbGUpLCBNYXRoLmNvcyh0aGlzLmFuZ2xlKV07XG5cbiAgICBcdHggPSBWZWN0b3IubXVsdCh4LCB0aGlzLmRpbWVuc2lvblswXSAvIDIuMCk7XG4gICAgXHR5ID0gVmVjdG9yLm11bHQoeSwgdGhpcy5kaW1lbnNpb25bMV0gLyAyLjApO1xuXG4gICAgXHR0aGlzLnF1YWRbMF0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1sZWZ0XG4gICAgXHR0aGlzLnF1YWRbMV0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzJdID0gVmVjdG9yLmFkZChWZWN0b3IuYWRkKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzNdID0gVmVjdG9yLmFkZChWZWN0b3Iuc3ViKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1sZWZ0XG5cbiAgICBcdHRoaXMucGVycEF4ZXMoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvamVjdFRvQXhpcyAob2JiLCBheGlzKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IG1pbiA9IGluZjtcbiAgICBcdGxldCBtYXggPSAtaW5mO1xuXG4gICAgXHRsZXQgcXVhZCA9IG9iYi5xdWFkO1xuXG4gICAgXHQvLyBmb3IgZWFjaCBheGlzLCBwcm9qZWN0IG9iYiBxdWFkIHRvIGl0IGFuZCBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlc1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgIGxldCBkID0gIFZlY3Rvci5kb3QocXVhZFtpXSwgYXhpcyk7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGQpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBkKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIFttaW4sIG1heF07XG4gICAgfVxuXG4gICAgc3RhdGljIGF4aXNDb2xsaWRlIChvYmJfYSwgb2JiX2IsIGF4ZXMpIHtcbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgXHRcdGxldCBhX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYSwgYXhlc1tpXSk7XG4gICAgXHRcdGxldCBiX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYiwgYXhlc1tpXSk7XG5cbiAgICBcdFx0aWYgKGJfcHJvalswXSA+IGFfcHJvalsxXSB8fCBiX3Byb2pbMV0gPCBhX3Byb2pbMF0pIHtcbiAgICBcdFx0XHRyZXR1cm4gZmFsc2U7XG4gICAgXHRcdH1cbiAgICBcdH1cbiAgICBcdHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcnNlY3Qob2JiX2EsIG9iYl9iKSB7XG4gICAgXHRyZXR1cm4gT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2EuYXhlcykgJiYgT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2IuYXhlcyk7XG4gICAgfVxuXG59XG5cbiIsIi8vIFByb21pc2VzIHBvbHlmaWxsXG5pbXBvcnQgJ2NvcmUtanMvZXM2L3Byb21pc2UnO1xuXG4vLyBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZXNlIHNwZWNpZmljIGNhc2VzLlxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH0pKCk7XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3Vic2NyaWJlTWl4aW4gKHRhcmdldCkge1xuXG4gICAgbGV0IGxpc3RlbmVycyA9IFtdO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XG5cbiAgICAgICAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1bnN1YnNjcmliZUFsbCgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXIoZXZlbnQsIC4uLmRhdGEpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyW2V2ZW50XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJbZXZlbnRdKC4uLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBDYXVnaHQgZXhjZXB0aW9uIGluIGxpc3RlbmVyIGZvciBldmVudCAnJHtldmVudH0nOmAsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGFzU3Vic2NyaWJlcnNGb3IoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBoYXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyW2V2ZW50XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBoYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGhhcztcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbn1cbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbi8vIE1hcmsgdGhyZWFkIGFzIG1haW4gb3Igd29ya2VyXG5jb25zdCBUaHJlYWQgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgVGhyZWFkO1xuXG50cnkge1xuICAgIGlmICh3aW5kb3cuZG9jdW1lbnQgIT09IEhUTUxEb2N1bWVudCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgVGhyZWFkLmlzX3dvcmtlciA9IGZhbHNlO1xuICAgICAgICBUaHJlYWQuaXNfbWFpbiAgID0gdHJ1ZTtcbiAgICB9XG59XG5jYXRjaCAoZSkge1xuICAgIGlmIChzZWxmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgVGhyZWFkLmlzX3dvcmtlciA9IHRydWU7XG4gICAgICAgIFRocmVhZC5pc19tYWluICAgPSBmYWxzZTtcblxuICAgICAgICAvLyBQYXRjaCBmb3IgM3JkIHBhcnR5IGxpYnMgdGhhdCByZXF1aXJlIHRoZXNlIGdsb2JhbHMgdG8gYmUgcHJlc2VudC4gU3BlY2lmaWNhbGx5LCBGb250RmFjZU9ic2VydmVyLlxuICAgICAgICAvLyBCcml0dGxlIHNvbHV0aW9uIGJ1dCBhbGxvd3MgdGhhdCBsaWJyYXJ5IHRvIGxvYWQgb24gd29ya2VyIHRocmVhZHMuXG4gICAgICAgIHNlbGYud2luZG93ID0geyBkb2N1bWVudDoge30gfTtcbiAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYud2luZG93LmRvY3VtZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuXG4vLyBBZGQgYSBiYXNlIFVSTCBmb3Igc2NoZW1lbGVzcyBvciBwcm90b2NvbC1sZXNzIFVSTHNcbi8vIERlZmF1bHRzIHRvIGFkZGluZyBjdXJyZW50IHdpbmRvdyBwcm90b2NvbCBhbmQgYmFzZSwgb3IgYWRkcyBhIGN1c3RvbSBiYXNlIGlmIHNwZWNpZmllZFxuLy8gTWF5YmUgdXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzIGlmIG1vcmUgcm9idXN0IGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gYWRkQmFzZVVSTCAodXJsLCBiYXNlKSB7XG4gICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNjaGVtZWxlc3MsIGFkZCBwcm90b2NvbFxuICAgIGlmICh1cmwuc3Vic3RyKDAsIDIpID09PSAnLy8nKSB7XG4gICAgICAgIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArIHVybDtcbiAgICB9XG4gICAgLy8gTm8gaHR0cChzKSBvciBkYXRhLCBhZGQgYmFzZVxuICAgIGVsc2UgaWYgKHVybC5zZWFyY2goL14oaHR0cHxodHRwc3xkYXRhfGJsb2IpOi8pIDwgMCkge1xuICAgICAgICB2YXIgcmVsYXRpdmUgPSAodXJsWzBdICE9PSAnLycpO1xuICAgICAgICB2YXIgYmFzZV9pbmZvO1xuICAgICAgICBpZiAoYmFzZSkge1xuICAgICAgICAgICAgYmFzZV9pbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOyAvLyB1c2UgYSB0ZW1wb3JhcnkgZWxlbWVudCB0byBwYXJzZSBVUkxcbiAgICAgICAgICAgIGJhc2VfaW5mby5ocmVmID0gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VfaW5mbyA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xuICAgICAgICAgICAgbGV0IHBhdGggPSBwYXRoRm9yVVJMKGJhc2VfaW5mby5ocmVmKTtcbiAgICAgICAgICAgIHVybCA9IHBhdGggKyB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBFYXN5IHdheVxuICAgICAgICAgICAgaWYgKGJhc2VfaW5mby5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICB1cmwgPSBiYXNlX2luZm8ub3JpZ2luICsgJy8nICsgdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFyZCB3YXkgKElFMTEpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luID0gdXJsLm1hdGNoKC9eKChodHRwfGh0dHBzfGRhdGF8YmxvYik6XFwvXFwvW15cXC9dKlxcLykvKTtcbiAgICAgICAgICAgICAgICBvcmlnaW4gPSAob3JpZ2luICYmIG9yaWdpbi5sZW5ndGggPiAxKSA/IG9yaWdpblswXSA6ICcnO1xuICAgICAgICAgICAgICAgIHVybCA9IG9yaWdpbiArIHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZvclVSTCAodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIHVybC5zZWFyY2goL14oZGF0YXxibG9iKTovKSA9PT0gLTEpIHtcbiAgICAgICAgbGV0IHFzID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICAgICAgaWYgKHFzID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgcXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhhc2ggPSB1cmwuaW5kZXhPZignIycpO1xuICAgICAgICBpZiAoaGFzaCA+IC0xKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyKDAsIGhhc2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVybC5zdWJzdHIoMCwgdXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKSB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaW9uRm9yVVJMICh1cmwpIHtcbiAgICB1cmwgPSB1cmwuc3BsaXQoJy8nKS5wb3AoKTtcbiAgICBsZXQgbGFzdF9kb3QgPSB1cmwubGFzdEluZGV4T2YoJy4nKTtcbiAgICBpZiAobGFzdF9kb3QgPiAtMSkge1xuICAgICAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhsYXN0X2RvdCArIDEpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsYXRpdmVVUkwgKHVybCkge1xuICAgIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAhKHVybC5zZWFyY2goL14oaHR0cHxodHRwc3xkYXRhfGJsb2IpOi8pID4gLTEgfHwgdXJsLnN1YnN0cigwLCAyKSA9PT0gJy8vJyk7XG59XG5cbi8vIFJlc29sdmVzICcuLycgYW5kICcuLi8nIGNvbXBvbmVudHMgZnJvbSByZWxhdGl2ZSBwYXRoLCB0byBnZXQgYSBcImZsYXR0ZW5lZFwiIHBhdGhcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuUmVsYXRpdmVVUkwgKHVybCkge1xuICAgIGxldCBkaXJzID0gKHVybCB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICBmb3IgKGxldCBkID0gMTsgZCA8IGRpcnMubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgaWYgKGRpcnNbZF0gPT09ICcuJykge1xuICAgICAgICAgICAgZGlycy5zcGxpY2UoZCwgMSk7XG4gICAgICAgICAgICBkLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlyc1tkXSA9PT0gJy4uJykge1xuICAgICAgICAgICAgZCA9IGQgKyAwO1xuICAgICAgICAgICAgZGlycy5zcGxpY2UoZC0xLCAyKTtcbiAgICAgICAgICAgIGQtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlycy5qb2luKCcvJyk7XG59XG5cbi8vIEFkZCBhIHNldCBvZiBxdWVyeSBzdHJpbmcgcGFyYW1zIHRvIGEgVVJMXG4vLyBwYXJhbXM6IGhhc2ggb2Yga2V5L3ZhbHVlIHBhaXJzIG9mIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzXG5leHBvcnQgZnVuY3Rpb24gYWRkUGFyYW1zVG9VUkwgKHVybCwgcGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMgfHwgT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICB2YXIgcXNfaW5kZXggPSB1cmwuaW5kZXhPZignPycpO1xuICAgIHZhciBoYXNoX2luZGV4ID0gdXJsLmluZGV4T2YoJyMnKTtcblxuICAgIC8vIFNhdmUgYW5kIHRyaW0gaGFzaFxuICAgIHZhciBoYXNoID0gJyc7XG4gICAgaWYgKGhhc2hfaW5kZXggPiAtMSkge1xuICAgICAgICBoYXNoID0gdXJsLnNsaWNlKGhhc2hfaW5kZXgpO1xuICAgICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaF9pbmRleCk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgcXVlcnkgc3RyaW5nXG4gICAgaWYgKHFzX2luZGV4ID09PSAtMSkge1xuICAgICAgICBxc19pbmRleCA9IHVybC5sZW5ndGg7XG4gICAgICAgIHVybCArPSAnPyc7XG4gICAgfVxuICAgIHFzX2luZGV4Kys7IC8vIGFkdmFuY2VkIHBhc3QgJz8nXG5cbiAgICAvLyBCdWlsZCBxdWVyeSBzdHJpbmcgcGFyYW1zXG4gICAgdmFyIHVybF9wYXJhbXMgPSAnJztcbiAgICBmb3IgKHZhciBwIGluIHBhcmFtcykge1xuICAgICAgICB1cmxfcGFyYW1zICs9IGAke3B9PSR7cGFyYW1zW3BdfSZgO1xuICAgIH1cblxuICAgIC8vIEluc2VydCBuZXcgcXVlcnkgc3RyaW5nIHBhcmFtcyBhbmQgcmVzdG9yZSBoYXNoXG4gICAgLy8gTk9URTogZG9lc24ndCByZXBsYWNlIGFueSB2YWx1ZXMgYWxyZWFkeSBwcmVzZW50IG9uIHF1ZXJ5IHN0cmluZywganVzdCBpbnNlcnRzIGR1cGUgdmFsdWVzXG4gICAgdXJsID0gdXJsLnNsaWNlKDAsIHFzX2luZGV4KSArIHVybF9wYXJhbXMgKyB1cmwuc2xpY2UocXNfaW5kZXgpICsgaGFzaDtcblxuICAgIHJldHVybiB1cmw7XG59XG5cbi8vIFBvbHlmaWxsIChmb3IgU2FmYXJpIGNvbXBhdGliaWxpdHkpXG5sZXQgX2NyZWF0ZU9iamVjdFVSTDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwgKHVybCkge1xuICAgIGlmIChfY3JlYXRlT2JqZWN0VVJMID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX2NyZWF0ZU9iamVjdFVSTCA9ICh3aW5kb3cuVVJMICYmIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKSB8fCAod2luZG93LndlYmtpdFVSTCAmJiB3aW5kb3cud2Via2l0VVJMLmNyZWF0ZU9iamVjdFVSTCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfY3JlYXRlT2JqZWN0VVJMICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfY3JlYXRlT2JqZWN0VVJMID0gbnVsbDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCAob3IgdmVuZG9yIHByZWZpeCkgbm90IGZvdW5kLCB1bmFibGUgdG8gY3JlYXRlIGxvY2FsIGJsb2IgVVJMc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF9jcmVhdGVPYmplY3RVUkwpIHtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVPYmplY3RVUkwodXJsKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuXG4vLyBHZXQgVVJMIHRoYXQgdGhlIGN1cnJlbnQgc2NyaXB0IHdhcyBsb2FkZWQgZnJvbVxuLy8gSWYgY3VycmVudFNjcmlwdCBpcyBub3QgYXZhaWxhYmxlLCBsb29wcyB0aHJvdWdoIDxzY3JpcHQ+IGVsZW1lbnRzIHNlYXJjaGluZyBmb3IgYSBsaXN0IG9mIHByb3ZpZGVkIHBhdGhzXG4vLyBlLmcuIGZpbmRDdXJyZW50VVJMKCd0YW5ncmFtLmRlYnVnLmpzJywgJ3RhbmdyYW0ubWluLmpzJyk7XG5leHBvcnQgZnVuY3Rpb24gZmluZEN1cnJlbnRVUkwgKC4uLnBhdGhzKSB7XG4gICAgLy8gRmluZCBjdXJyZW50bHkgZXhlY3V0aW5nIHNjcmlwdFxuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0O1xuICAgIGlmIChzY3JpcHQpIHtcbiAgICAgICAgcmV0dXJuIHNjcmlwdC5zcmM7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF0aHMpKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIG9uIGxvb3BpbmcgdGhyb3VnaCA8c2NyaXB0PiBlbGVtZW50cyBpZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG4gICAgICAgIGZvciAodmFyIHM9MDsgcyA8IHNjcmlwdHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHBhdGhzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcmlwdHNbc10uc3JjLmluZGV4T2YocGF0aHNbcF0pID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0c1tzXS5zcmM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy8gTWlzY2VsbGFuZW91cyB1dGlsaXRpZXNcbi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbnZhciBVdGlscztcbmV4cG9ydCBkZWZhdWx0IFV0aWxzID0ge307XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ1V0aWxzJywgVXRpbHMpO1xuXG4vLyBCYXNpYyBTYWZhcmkgZGV0ZWN0aW9uXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc5NDQ0NjAvZGV0ZWN0LXNhZmFyaS1icm93c2VyXG5VdGlscy5pc1NhZmFyaSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cbi8vIEJhc2ljIElFMTEgb3IgRWRnZSBkZXRlY3Rpb25cblV0aWxzLmlzTWljcm9zb2Z0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKFRyaWRlbnRcXC83LjB8RWRnZVsgL10oXFxkK1tcXC5cXGRdKykpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cblV0aWxzLl9yZXF1ZXN0cyA9IHt9OyAgICAgICAvLyBYSFIgcmVxdWVzdHMgb24gY3VycmVudCB0aHJlYWRcblV0aWxzLl9wcm94eV9yZXF1ZXN0cyA9IHt9OyAvLyBYSFIgcmVxdWVzdHMgcHJveGllZCB0byBtYWluIHRocmVhZFxuXG4vLyBgcmVxdWVzdF9rZXlgIGlzIGEgdXNlci1wcm92aWRlZCBrZXkgdGhhdCBjYW4gYmUgbGF0ZXIgdXNlZCB0byBjYW5jZWwgdGhlIHJlcXVlc3RcblV0aWxzLmlvID0gZnVuY3Rpb24gKHVybCwgdGltZW91dCA9IDYwMDAwLCByZXNwb25zZVR5cGUgPSAndGV4dCcsIG1ldGhvZCA9ICdHRVQnLCBoZWFkZXJzID0ge30sIHJlcXVlc3Rfa2V5ID0gbnVsbCwgcHJveHkgPSBmYWxzZSkge1xuICAgIGlmIChUaHJlYWQuaXNfd29ya2VyICYmIFV0aWxzLmlzTWljcm9zb2Z0KCkpIHtcbiAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJRTExIGFuZCBFZGdlIHdpbGwgaGFuZyB3ZWIgd29ya2VycyB3aGVuIHBlcmZvcm1pbmcgWEhSIHJlcXVlc3RzXG4gICAgICAgIC8vIFRoZXNlIHJlcXVlc3RzIGNhbiBiZSBwcm94aWVkIHRocm91Z2ggdGhlIG1haW4gdGhyZWFkXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzk1NDU4NjYvXG4gICAgICAgIGxvZygnZGVidWcnLCAnUHJveHlpbmcgcmVxdWVzdCBmb3IgVVJMIHRvIHdvcmtlcicsIHVybCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3Rfa2V5KSB7XG4gICAgICAgICAgICBVdGlscy5fcHJveHlfcmVxdWVzdHNbcmVxdWVzdF9rZXldID0gdHJ1ZTsgLy8gbWFyayBhcyBwcm94aWVkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVXRpbHMuaW8nLCB1cmwsIHRpbWVvdXQsIHJlc3BvbnNlVHlwZSwgbWV0aG9kLCBoZWFkZXJzLCByZXF1ZXN0X2tleSwgdHJ1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXF1ZXN0LnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7XG4gICAgICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoWyd0ZXh0JywgJ2pzb24nXS5pbmRleE9mKHJlcXVlc3QucmVzcG9uc2VUeXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1JlcXVlc3QgZXJyb3Igd2l0aCBhIHN0YXR1cyBvZiAnICsgcmVxdWVzdC5zdGF0dXNUZXh0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldnQpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1RoZXJlIHdhcyBhIG5ldHdvcmsgZXJyb3InICsgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0Lm9udGltZW91dCA9IChldnQpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ3RpbWVvdXQgJysgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdF9rZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgVXRpbHMuX3JlcXVlc3RzW3JlcXVlc3Rfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3h5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyhyZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0X2tleSkge1xuICAgICAgICAgICAgVXRpbHMuX3JlcXVlc3RzW3JlcXVlc3Rfa2V5XSA9IHJlcXVlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59O1xuXG4vLyDDh2FuY2VsIGEgcGVuZGluZyBuZXR3b3JrIHJlcXVlc3QgYnkgdXNlci1wcm92aWRlZCByZXF1ZXN0IGtleVxuVXRpbHMuY2FuY2VsUmVxdWVzdCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvLyBDaGVjayBmb3IgYSByZXF1ZXN0IHRoYXQgd2FzIHByb3hpZWQgdG8gdGhlIG1haW4gdGhyZWFkXG4gICAgaWYgKFRocmVhZC5pc193b3JrZXIgJiYgVXRpbHMuX3Byb3h5X3JlcXVlc3RzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVXRpbHMuY2FuY2VsUmVxdWVzdCcsIGtleSk7IC8vIGZvcndhcmQgdG8gbWFpbiB0aHJlYWRcbiAgICB9XG5cbiAgICBsZXQgcmVxID0gVXRpbHMuX3JlcXVlc3RzW2tleV07XG4gICAgaWYgKHJlcSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYENhbmNlbGxpbmcgbmV0d29yayByZXF1ZXN0IGtleSAnJHtrZXl9J2ApO1xuICAgICAgICBVdGlscy5fcmVxdWVzdHNba2V5XS5hYm9ydCgpO1xuICAgICAgICBkZWxldGUgVXRpbHMuX3JlcXVlc3RzW2tleV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsb2coJ3RyYWNlJywgYENvdWxkIG5vdCBmaW5kIG5ldHdvcmsgcmVxdWVzdCBrZXkgJyR7a2V5fSdgKTtcbiAgICB9XG59O1xuXG4vLyBOZWVkZWQgZm9yIG9sZGVyIGJyb3dzZXJzIHRoYXQgc3RpbGwgc3VwcG9ydCBXZWJHTCAoU2FmYXJpIDYgZXRjLilcblV0aWxzLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID1cbiAgICAgICAgICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIDEwMDAgLzYwKTtcbiAgICAgICAgICAgIH07XG4gICAgfVxufTtcblxuLy8gU3RyaW5naWZ5IGFuIG9iamVjdCBpbnRvIEpTT04sIGJ1dCBjb252ZXJ0IGZ1bmN0aW9ucyB0byBzdHJpbmdzXG5VdGlscy5zZXJpYWxpemVXaXRoRnVuY3Rpb25zID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrLCB2KSB7XG4gICAgICAgIC8vIENvbnZlcnQgZnVuY3Rpb25zIHRvIHN0cmluZ3NcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59O1xuXG4vLyBSZWN1cnNpdmVseSBwYXJzZSBhbiBvYmplY3QsIGF0dGVtcHRpbmcgdG8gY29udmVydCBzdHJpbmcgcHJvcGVydGllcyB0aGF0IGxvb2sgbGlrZSBmdW5jdGlvbnMgYmFjayBpbnRvIGZ1bmN0aW9uc1xuVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zID0gZnVuY3Rpb24ob2JqLCB3cmFwKSB7XG4gICAgLy8gQ29udmVydCBzdHJpbmdcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqID0gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihvYmosIHdyYXApO1xuICAgIH1cbiAgICAvLyBMb29wIHRocm91Z2ggb2JqZWN0IHByb3BlcnRpZXNcbiAgICBlbHNlIGlmIChvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgb2JqW3BdID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKG9ialtwXSwgd3JhcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIENvbnZlcnQgc3RyaW5nIGJhY2sgaW50byBhIGZ1bmN0aW9uXG5VdGlscy5zdHJpbmdUb0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsLCB3cmFwKSB7XG4gICAgLy8gUGFyc2UgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCBib2R5XG4gICAgbGV0IGZtYXRjaCA9XG4gICAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgdmFsLm1hdGNoKC9eXFxzKmZ1bmN0aW9uW14oXSpcXCgoW14pXSopXFwpXFxzKj9cXHsoW1xcc1xcU10qKVxcfSQvbSk7XG5cbiAgICBpZiAoZm1hdGNoICYmIGZtYXRjaC5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgc3JjID0gZm1hdGNoWzJdO1xuICAgICAgICAgICAgbGV0IGFyZ3MgPSBmbWF0Y2hbMV0ubGVuZ3RoID4gMCAmJiBmbWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBhcmdzID0gYXJncy5sZW5ndGggPiAwID8gYXJncyA6IFsnY29udGV4dCddOyAvLyBkZWZhdWx0IHRvIHNpbmdsZSAnY29udGV4dCcgYXJndW1lbnRcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3cmFwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbiguLi5hcmdzLCB3cmFwKHNyYykpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oLi4uYXJncywgc3JjKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGZhbGwtYmFjayB0byBvcmlnaW5hbCB2YWx1ZSBpZiBwYXJzaW5nIGZhaWxlZFxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gRGVmYXVsdCB0byBhbGxvd2luZyBoaWdoIHBpeGVsIGRlbnNpdHlcbi8vIFJldHVybnMgdHJ1ZSBpZiBkaXNwbGF5IGRlbnNpdHkgY2hhbmdlZFxuVXRpbHMudXNlX2hpZ2hfZGVuc2l0eV9kaXNwbGF5ID0gdHJ1ZTtcblV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHByZXYgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gKFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgfHwgMTtcbiAgICByZXR1cm4gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICE9PSBwcmV2O1xufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xufVxuXG4vLyBVc2VkIGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBwb3dlci1vZi0yIGFuZCBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuLy8gVmlhOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyMjQ3L3dlYmdsLXdhaXQtZm9yLXRleHR1cmUtdG8tbG9hZFxuVXRpbHMuaXNQb3dlck9mMiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmICh2YWx1ZSAtIDEpKSA9PT0gMDtcbn07XG5cbi8vIEludGVycG9sYXRlICd4JyBhbG9uZyBhIHNlcmllcyBvZiBjb250cm9sIHBvaW50c1xuLy8gJ3BvaW50cycgaXMgYW4gYXJyYXkgb2YgY29udHJvbCBwb2ludHMgaW4gdGhlIGZvcm0gW3gsIHldXG4vL1xuLy8gRXhhbXBsZTpcbi8vICAgICBDb250cm9sIHBvaW50czpcbi8vICAgICAgICAgWzAsIDVdOiAgd2hlbiB4PTAsIHk9NVxuLy8gICAgICAgICBbNCwgMTBdOiB3aGVuIHg9NCwgeT0xMFxuLy9cbi8vICAgICBVdGlscy5pbnRlcnBvbGF0ZSgyLCBbWzAsIDVdLCBbNCwgMTBdXSk7XG4vLyAgICAgLT4gY29tcHV0ZXMgeD0yLCBoYWxmd2F5IGJldHdlZW4geD0wIGFuZCB4PTQ6ICgxMCAtIDUpIC8gMiArNVxuLy8gICAgIC0+IHJldHVybnMgNy41XG4vL1xuLy8gVE9ETzogYWRkIG90aGVyIGludGVycG9sYXRpb24gbWV0aG9kcyBiZXNpZGVzIGxpbmVhclxuLy9cblV0aWxzLmludGVycG9sYXRlID0gZnVuY3Rpb24oeCwgcG9pbnRzLCB0cmFuc2Zvcm0pIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgcmVzZW1ibGUgYSBsaXN0IG9mIGNvbnRyb2wgcG9pbnRzLCBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSB8fCAhQXJyYXkuaXNBcnJheShwb2ludHNbMF0pKSB7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuXG4gICAgdmFyIHgxLCB4MiwgZCwgeSwgeTEsIHkyO1xuXG4gICAgLy8gTWluIGJvdW5kc1xuICAgIGlmICh4IDw9IHBvaW50c1swXVswXSkge1xuICAgICAgICB5ID0gcG9pbnRzWzBdWzFdO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgeSA9IHRyYW5zZm9ybSh5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXggYm91bmRzXG4gICAgZWxzZSBpZiAoeCA+PSBwb2ludHNbcG9pbnRzLmxlbmd0aC0xXVswXSkge1xuICAgICAgICB5ID0gcG9pbnRzW3BvaW50cy5sZW5ndGgtMV1bMV07XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB5ID0gdHJhbnNmb3JtKHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZpbmQgd2hpY2ggY29udHJvbCBwb2ludHMgeCBpcyBiZXR3ZWVuXG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGk9MDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh4ID49IHBvaW50c1tpXVswXSAmJiB4IDwgcG9pbnRzW2krMV1bMF0pIHtcbiAgICAgICAgICAgICAgICAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAgICAgIHgxID0gcG9pbnRzW2ldWzBdO1xuICAgICAgICAgICAgICAgIHgyID0gcG9pbnRzW2krMV1bMF07XG5cbiAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwb2ludHNbaV1bMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0wOyBjIDwgcG9pbnRzW2ldWzFdLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gdHJhbnNmb3JtKHBvaW50c1tpXVsxXVtjXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB0cmFuc2Zvcm0ocG9pbnRzW2krMV1bMV1bY10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB5MiAtIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbY10gPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBwb2ludHNbaSsxXVsxXVtjXSAtIHBvaW50c1tpXVsxXVtjXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5W2NdID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgcG9pbnRzW2ldWzFdW2NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSB2YWx1ZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB0cmFuc2Zvcm0ocG9pbnRzW2ldWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gdHJhbnNmb3JtKHBvaW50c1tpKzFdWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB5MiAtIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHkxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHBvaW50c1tpKzFdWzFdIC0gcG9pbnRzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHBvaW50c1tpXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geTtcbn07XG5cblV0aWxzLnRvQ1NTQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICBpZiAoY29sb3JbM10gPT09IDEpIHsgLy8gZnVsbCBvcGFjaXR5XG4gICAgICAgIHJldHVybiBgcmdiKCR7Y29sb3Iuc2xpY2UoMCwgMykubWFwKGMgPT4gTWF0aC5yb3VuZChjICogMjU1KSkuam9pbignLCAnKX0pYDtcbiAgICB9XG4gICAgLy8gUkdCIGlzIGJldHdlZW4gWzAsIDI1NV0gb3BhY2l0eSBpcyBiZXR3ZWVuIFswLCAxXVxuICAgIHJldHVybiBgcmdiYSgke2NvbG9yLm1hcCgoYywgaSkgPT4gKGkgPCAzICYmIE1hdGgucm91bmQoYyAqIDI1NSkpIHx8IGMpLmpvaW4oJywgJyl9KWA7XG59O1xuXG5VdGlscy5wb2ludEluVGlsZSA9IGZ1bmN0aW9uIChwb2ludCkge1xuICAgIHJldHVybiBwb2ludFswXSA+PSAwICYmwqBwb2ludFsxXSA+IC1HZW8udGlsZV9zY2FsZSAmJiBwb2ludFswXSA8IEdlby50aWxlX3NjYWxlICYmIHBvaW50WzFdIDw9IDA7XG59O1xuIiwibGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmxldCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uLy4uL3BhY2thZ2UuanNvbicsICd1dGY4JykpO1xubGV0IHZlcnNpb247XG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uID0gJ3YnICsgcGtnLnZlcnNpb247XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG4vLyBXb3JrZXJCcm9rZXIgcm91dGVzIG1lc3NhZ2VzIGJldHdlZW4gd2ViIHdvcmtlcnMgYW5kIHRoZSBtYWluIHRocmVhZCwgYWxsb3dpbmcgZm9yIHNpbXBsZXJcbi8vIGFzeW5jIGNvZGUgdmlhIHByb21pc2VzLiBFeGFtcGxlIHVzYWdlOlxuLy9cbi8vIEluIHdlYiB3b3JrZXIsIHJlZ2lzdGVyIHNlbGYgYXMgYSBjYWxsYWJsZSBcInRhcmdldFwiLCBhbmQgZGVmaW5lIGEgbWV0aG9kOlxuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdzZWxmJywgc2VsZik7XG4vL1xuLy8gICAgIHNlbGYuc3F1YXJlID0gZnVuY3Rpb24gKHgpIHtcbi8vICAgICAgICAgcmV0dXJuIHggKiB4O1xuLy8gICAgIH07XG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGludm9rZSB0aGF0IG1ldGhvZCBhbmQgcmVjZWl2ZSB0aGUgcmVzdWx0IChpZiBhbnkpIGFzIGEgcHJvbWlzZS5cbi8vXG4vLyAgICAgd29ya2VyID0gbmV3IFdvcmtlciguLi4pO1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuc3F1YXJlJywgNSkudGhlbihmdW5jdGlvbih5KSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHkpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgMjVcbi8vXG4vLyBBc3luYyBjb2RlOlxuLy9cbi8vIEZvciBzeW5jaHJvbm91cyBjb2RlIHRoYXQgbXVzdCBwYXNzIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBtYWluIHRocmVhZCwgdGhlIGZ1bmN0aW9uIGNhbiBzaW1wbHlcbi8vIHJldHVybiBhbiBpbW1lZGlhdGUgdmFsdWUgKHNlZSBleGFtcGxlIGFib3ZlKS4gRm9yIGNhc2VzIHdoZXJlIHRoZSB3b3JrZXIgbWV0aG9kIG5lZWRzIHRvIHJ1blxuLy8gYXN5bmNocm9ub3VzIGNvZGUsIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgcHJvbWlzZSwgYW5kIHRoZSByZXNvbHZlZCBvciByZWplY3RlZCB2YWx1ZSB3aWxsXG4vLyBiZSBzZW50IGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIHdoZW4gdGhlIHByb21pc2UgaXMgZnVsZmlsbGVkLlxuLy9cbi8vIEVycm9yIGhhbmRsaW5nOlxuLy9cbi8vIElmIHRoZSB3b3JrZXIgbWV0aG9kIGVpdGhlciB0aHJvd3MgYW4gZXJyb3IsIG9yIHJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQsIGl0IHdpbGwgYmVcbi8vIHNlbnQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgYXMgYSBwcm9taXNlIHJlamVjdGlvbi4gVGhlc2UgdHdvIGV4YW1wbGVzIGFyZSBlcXVpdmFsZW50OlxuLy9cbi8vICAgICBJbiB3b3JrZXIsIHRocm93aW5nIGFuIGVycm9yOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGluIHdvcmtlciEnKTtcbi8vICAgICAgICAgfTtcbi8vXG4vLyAgICAgSW4gd29ya2VyLCByZXR1cm5pbmcgYSByZWplY3RlZCBwcm9taXNlOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdlcnJvciBpbiB3b3JrZXIhJykpO1xuLy8gICAgICAgICB9O1xuLy9cbi8vICAgICBJbiBtYWluIHRocmVhZCwgYm90aCBlcnJvcnMgYXJlIHJlY2VpdmVkIGFzIGEgcHJvbWlzZSByZWplY3Rpb246XG4vL1xuLy8gICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5icm9rZW4nKS50aGVuKFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Y2Nlc3MhJyk7XG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IhJywgZXJyb3IpO1xuLy8gICAgICAgICAgICAgfSk7XG4vL1xuLy8gICAgICAgICAtPiBwcmludHMgJ2Vycm9yISBlcnJvciBpbiB3b3JrZXInXG4vL1xuLy8gQ2FsbGluZyBmcm9tIHdvcmtlciB0byBtYWluIHRocmVhZDpcbi8vXG4vLyBUaGUgc2FtZSBzdHlsZSBvZiBjYWxscyBjYW4gYmUgbWFkZSAqZnJvbSogYSB3ZWIgd29ya2VyLCB0byB0aGUgbWFpbiB0aHJlYWQuIFRoZSBBUEkgaXMgdGhlIHNhbWVcbi8vIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCwgJ3dvcmtlcicsIGlzIG5vdCBuZWVkZWQgZm9yIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgpLFxuLy8gc2luY2UgdGhlIG1haW4gdGhyZWFkIGlzIHRoZSBpbXBsaWNpdCB0YXJnZXQuXG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGRlZmluZSBhIG1ldGhvZCBhbmQgcmVnaXN0ZXIgaXQ6XG4vL1xuLy8gICAgIHZhciBnZW9tZXRyeSA9IHtcbi8vICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbih4LCB5KSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCgnZ2VvbWV0cnknLCBnZW9tZXRyeSk7XG4vL1xuLy8gSW4gd29ya2VyIHRocmVhZCk6XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnZ2VvbWV0cnkubGVuZ3RoJywgMywgNCkudGhlbihmdW5jdGlvbihkKSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKGQpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgNVxuLy9cblxuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxudmFyIFdvcmtlckJyb2tlcjtcbmV4cG9ydCBkZWZhdWx0IFdvcmtlckJyb2tlciA9IHt9O1xuXG4vLyBHbG9iYWwgbGlzdCBvZiBhbGwgd29ya2VyIG1lc3NhZ2VzXG4vLyBVbmlxdWVseSB0cmFja3MgZXZlcnkgY2FsbCBtYWRlIGJldHdlZW4gbWFpbiB0aHJlYWQgYW5kIGEgd29ya2VyXG52YXIgbWVzc2FnZV9pZCA9IDA7XG52YXIgbWVzc2FnZXMgPSB7fTtcblxuLy8gUmVnaXN0ZXIgYW4gb2JqZWN0IHRvIHJlY2VpdmUgY2FsbHMgZnJvbSBvdGhlciB0aHJlYWRcbnZhciB0YXJnZXRzID0ge307XG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0ID0gZnVuY3Rpb24gKG5hbWUsIHRhcmdldCkge1xuICAgIHRhcmdldHNbbmFtZV0gPSB0YXJnZXQ7XG59O1xuXG4vLyBHaXZlbiBhIGRvdC1ub3RhdGlvbi1zdHlsZSBtZXRob2QgbmFtZSwgZS5nLiAnT2JqZWN0Lm9iamVjdC5tZXRob2QnLFxuLy8gZmluZCB0aGUgb2JqZWN0IHRvIGNhbGwgdGhlIG1ldGhvZCBvbiBmcm9tIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgdGFyZ2V0c1xuZnVuY3Rpb24gZmluZFRhcmdldCAobWV0aG9kKSB7XG4gICAgdmFyIGNoYWluID0gW107XG4gICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNoYWluID0gbWV0aG9kLnNwbGl0KCcuJyk7XG4gICAgICAgIG1ldGhvZCA9IGNoYWluLnBvcCgpO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzO1xuXG4gICAgZm9yIChsZXQgbT0wOyBtIDwgY2hhaW4ubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgaWYgKHRhcmdldFtjaGFpblttXV0pIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtjaGFpblttXV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21ldGhvZCwgdGFyZ2V0XTtcbn1cblxuLy8gTWFpbiB0aHJlYWQ6XG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gd29ya2VycywgYW5kIG9wdGlvbmFsbHkgcmVjZWl2ZSBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2Vcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHdvcmtlcnMsIGFuZCBvcHRpb25hbGx5IHNlbmQgYW4gYXN5bmMgcmVzcG9uc2UgYmFjayBhcyBhIHByb21pc2VcbmZ1bmN0aW9uIHNldHVwTWFpblRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byBhIHdvcmtlciwgYW5kIG9wdGlvbmFsbHkgZ2V0IGFuIGFzeW5jIHJlc3BvbnNlXG4gICAgLy8gQXJndW1lbnRzOlxuICAgIC8vICAgLSB3b3JrZXI6IG9uZSBvciBtb3JlIHdlYiB3b3JrZXIgaW5zdGFuY2VzIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKHNpbmdsZSB2YWx1ZSBvciBhcnJheSlcbiAgICAvLyAgIC0gbWV0aG9kOiB0aGUgbWV0aG9kIHdpdGggdGhpcyBuYW1lLCBzcGVjaWZpZWQgd2l0aCBkb3Qtbm90YXRpb24sIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgd29ya2VyXG4gICAgLy8gICAtIG1lc3NhZ2U6IHNwcmVhZCBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGhcbiAgICAvLyBSZXR1cm5zOlxuICAgIC8vICAgLSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBpZiB0aGUgd29ya2VyIG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgKGNvdWxkIGJlIGltbWVkaWF0ZWx5LCBvciBhc3luYylcbiAgICAvL1xuICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSA9IGZ1bmN0aW9uICh3b3JrZXIsIG1ldGhvZCwgLi4ubWVzc2FnZSkge1xuICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIHdvcmtlciBzcGVjaWZpZWQsIHBvc3QgdG8gbXVsdGlwbGVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod29ya2VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHdvcmtlci5tYXAodyA9PiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodywgbWV0aG9kLCAuLi5tZXNzYWdlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBzdGF0ZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlX2lkXSA9IHsgbWV0aG9kLCBtZXNzYWdlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VbMF0gaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSBtZXNzYWdlWzBdLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVswXS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnbWFpbl9zZW5kJywgICAgICAvLyBtYXJrIG1lc3NhZ2UgYXMgbWV0aG9kIGludm9jYXRpb24gZnJvbSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBmdW5jdGlvbiBvZiB0aGlzIG5hbWUgd2l0aGluIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGF5bG9hZFxuICAgICAgICB9O1xuXG4gICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byB3b3JrZXIgdGhyZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZXNzYWdlX2lkKys7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYSB3b3JrZXIgdG8gY29tbXVuaWNhdGUgd2l0aCAtIGVhY2ggd29ya2VyIG11c3QgYmUgcmVnaXN0ZXJlZCBmcm9tIHRoZSBtYWluIHRocmVhZFxuICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIgPSBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgIGlmICghKHdvcmtlciBpbnN0YW5jZW9mIFdvcmtlcikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBhZGQgbm9uLVdvcmtlciBvYmplY3RgLCB3b3JrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBXb3JrZXJCcm9rZXJNYWluVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBtYXliZURlY29kZShldmVudC5kYXRhKTtcbiAgICAgICAgICAgIGxldCBpZCA9IGRhdGEubWVzc2FnZV9pZDtcblxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSB3b3JrZXIsIGFuZCBmdWxmaWxsIHRoYXQgbWVzc2FnZSdzIHByb21pc2VcbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZXNvbHZlKGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGluaXRpYXRpbmcgYSBjYWxsIGZyb20gdGhlIHdvcmtlciwgZGlzcGF0Y2ggdGhlbSxcbiAgICAgICAgICAgIC8vIGFuZCBzZW5kIGFueSByZXR1cm4gdmFsdWUgYmFjayB0byB0aGUgd29ya2VyXG4gICAgICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSAmIHJldHVybiBjYWxsIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfc2VuZCcgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlcXVlc3RlZCBtZXRob2QgYW5kIHNhdmUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhciBbbWV0aG9kX25hbWUsIHRhcmdldF0gPSBmaW5kVGFyZ2V0KGRhdGEubWV0aG9kKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkIG9uIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG9iamVjdCBoYXMgbm8gbWV0aG9kIHdpdGggdGhhdCBuYW1lYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRhcmdldCwgZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaHJvd24gZXJyb3JzIHdpbGwgYmUgcGFzc2VkIGJhY2sgKGluIHN0cmluZyBmb3JtKSB0byB3b3JrZXJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIHdvcmtlclxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSB2YWx1ZS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIGZvciBkZWJ1Z2dpbmdcbiAgICBXb3JrZXJCcm9rZXIuZ2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICB9O1xuXG4gICAgV29ya2VyQnJva2VyLmdldE1lc3NhZ2VJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VfaWQ7XG4gICAgfTtcblxufVxuXG4vLyBXb3JrZXIgdGhyZWFkczpcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSBzZW5kIGFuIGFzeW5jIHJlc3BvbnNlIGJhY2sgYXMgYSBwcm9taXNlXG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IHJlY2VpdmUgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG5mdW5jdGlvbiBzZXR1cFdvcmtlclRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byB0aGUgbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IGdldCBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2VcbiAgICAvLyBBcmd1bWVudHM6XG4gICAgLy8gICAtIG1ldGhvZDogdGhlIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSwgc3BlY2lmaWVkIHdpdGggZG90LW5vdGF0aW9uLCB3aWxsIGJlIGludm9rZWQgb24gdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gICAtIG1lc3NhZ2U6IGFycmF5IG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICAgIC8vIFJldHVybnM6XG4gICAgLy8gICAtIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIGlmIHRoZSBtYWluIHRocmVhZCBtZXRob2QgcmV0dXJucyBhIHZhbHVlIChjb3VsZCBiZSBpbW1lZGlhdGVseSwgb3IgYXN5bmMpXG4gICAgLy9cbiAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAobWV0aG9kLCAuLi5tZXNzYWdlKSB7XG4gICAgICAgIC8vIFRyYWNrIHN0YXRlIG9mIHRoaXMgbWVzc2FnZVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VfaWRdID0geyBtZXRob2QsIG1lc3NhZ2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICB9KTtcblxuICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPT09IDEgJiYgbWVzc2FnZVswXSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IG1lc3NhZ2VbMF0udHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfc2VuZCcsICAgIC8vIG1hcmsgbWVzc2FnZSBhcyBtZXRob2QgaW52b2NhdGlvbiBmcm9tIHdvcmtlclxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBtZXRob2Qgb2YgdGhpcyBuYW1lIG9uIHRoZSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXlsb2FkXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZV9pZCsrO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gV29ya2VyQnJva2VyV29ya2VyVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgZGF0YSA9IG1heWJlRGVjb2RlKGV2ZW50LmRhdGEpO1xuICAgICAgICBsZXQgaWQgPSBkYXRhLm1lc3NhZ2VfaWQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSBtYWluIHRocmVhZCwgYW5kIGZ1bGZpbGwgdGhhdCBtZXNzYWdlJ3MgcHJvbWlzZVxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9yZXBseScpIHtcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZWplY3QoZGF0YS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVzb2x2ZShkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtYWluIHRocmVhZCwgZGlzcGF0Y2ggdGhlbSwgYW5kIHNlbmQgYmFjayBhIHJlcGx5XG4gICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlICYgcmV0dXJuIGNhbGwgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9zZW5kJyAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSByZXF1ZXN0ZWQgd29ya2VyIG1ldGhvZCBhbmQgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB2YXIgW21ldGhvZF9uYW1lLCB0YXJnZXRdID0gZmluZFRhcmdldChkYXRhLm1ldGhvZCk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugbm8gb2JqZWN0IHdpdGggdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQgb24gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcblxuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IGJlY2F1c2Ugd29ya2VyIGhhcyBubyBtZXRob2Qgd2l0aCB0aGF0IG5hbWVgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0YXJnZXQsIGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhyb3duIGVycm9ycyB3aWxsIGJlIHBhc3NlZCBiYWNrIChpbiBzdHJpbmcgZm9ybSkgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHZhbHVlLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxufVxuXG4vLyBTcGVjaWFsIHZhbHVlIHdyYXBwZXIsIHRvIGluZGljYXRlIHRoYXQgd2Ugd2FudCB0byBmaW5kIGFuZCBpbmNsdWRlIHRyYW5zZmVyYWJsZSBvYmplY3RzIGluIHRoZSBtZXNzYWdlXG5Xb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMgPSBmdW5jdGlvbiAoLi4udmFsdWUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm4gbmV3IFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyguLi52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudHJhbnNmZXJhYmxlcyA9IGZpbmRUcmFuc2ZlcmFibGVzKHRoaXMudmFsdWUpO1xufTtcblxuLy8gQnVpbGQgYSBsaXN0IG9mIHRyYW5zZmVyYWJsZSBvYmplY3RzIGZyb20gYSBzb3VyY2Ugb2JqZWN0XG4vLyBSZXR1cm5zIGEgbGlzdCBvZiBpbmZvIGFib3V0IGVhY2ggdHJhbnNmZXJhYmxlOlxuLy8gICAtIG9iamVjdDogdGhlIGFjdHVhbCB0cmFuc2ZlcmFibGUgb2JqZWN0XG4vLyAgIC0gcGFyZW50OiB0aGUgcGFyZW50IG9iamVjdCB0aGF0IHRoZSB0cmFuc2ZlcmFibGUgaXMgYSBwcm9wZXJ0eSBvZiAoaWYgYW55KVxuLy8gICAtIHByb3BlcnR5OiB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgdHJhbnNmZXJhYmxlIG9uIHRoZSBwYXJlbnQgb2JqZWN0IChpZiBhbnkpXG4vLyBUT0RPOiBhZGQgb3B0aW9uIGluIGNhc2UgeW91IERPTidUIHdhbnQgdG8gdHJhbnNmZXIgb2JqZWN0c1xuZnVuY3Rpb24gZmluZFRyYW5zZmVyYWJsZXMoc291cmNlLCBwYXJlbnQgPSBudWxsLCBwcm9wZXJ0eSA9IG51bGwsIGxpc3QgPSBbXSkge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIC8vIENoZWNrIGVhY2ggYXJyYXkgZWxlbWVudFxuICAgICAgICBzb3VyY2UuZm9yRWFjaCgoeCwgaSkgPT4gZmluZFRyYW5zZmVyYWJsZXMoeCwgc291cmNlLCBpLCBsaXN0KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIElzIHRoZSBvYmplY3QgYSB0cmFuc2ZlcmFibGUgYXJyYXkgYnVmZmVyP1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IG9iamVjdDogc291cmNlLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9yIGxvb2tzIGxpa2UgYSB0eXBlZCBhcnJheSAoaGFzIGFuIGFycmF5IGJ1ZmZlciBwcm9wZXJ0eSk/XG4gICAgICAgIGVsc2UgaWYgKHNvdXJjZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgbGlzdC5wdXNoKHsgb2JqZWN0OiBzb3VyY2UuYnVmZmVyLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBlYWNoIHByb3BlcnR5XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBmaW5kVHJhbnNmZXJhYmxlcyhzb3VyY2VbcHJvcF0sIHNvdXJjZSwgcHJvcCwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIFJlbW92ZSBuZXV0ZXJlZCB0cmFuc2ZlcmFibGVzIGZyb20gcGFyZW50IG9iamVjdHMsIGFzIHRoZXkgc2hvdWxkIG5vIGxvbmdlciBiZSBhY2Nlc3NlZCBhZnRlciB0cmFuc2ZlclxuZnVuY3Rpb24gZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0cmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyYW5zZmVyYWJsZXMuZmlsdGVyKHQgPT4gdC5wYXJlbnQgJiYgdC5wcm9wZXJ0eSkuZm9yRWFjaCh0ID0+IGRlbGV0ZSB0LnBhcmVudFt0LnByb3BlcnR5XSk7XG59XG5cbi8vIE1lc3NhZ2UgcGF5bG9hZCBjYW4gYmUgc3RyaW5naWZpZWQgZm9yIGZhc3RlciB0cmFuc2ZlciwgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB0cmFuc2ZlcmFibGUgb2JqZWN0c1xuZnVuY3Rpb24gbWF5YmVFbmNvZGUgKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpIHtcbiAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cblxuLy8gUGFyc2Ugc3RyaW5naWZpZWQgbWVzc2FnZSBwYXlsb2FkXG5mdW5jdGlvbiBtYXliZURlY29kZSAoZGF0YSkge1xuICAgIHJldHVybiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGEpO1xufVxuXG4vLyBTZXR1cCB0aGlzIHRocmVhZCBhcyBhcHByb3ByaWF0ZVxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgc2V0dXBNYWluVGhyZWFkKCk7XG59XG5cbmlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgc2V0dXBXb3JrZXJUaHJlYWQoKTtcbn1cbiIsIi8qKiogVmVjdG9yIGZ1bmN0aW9ucyAtIHZlY3RvcnMgcHJvdmlkZWQgYXMgW3gsIHksIHpdIGFycmF5cyAqKiovXG5cbnZhciBWZWN0b3I7XG5leHBvcnQgZGVmYXVsdCBWZWN0b3IgPSB7fTtcblxuVmVjdG9yLnNldCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIFYgPSBbXTtcbiAgICB2YXIgbGltID0gdi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBWW2ldID0gdltpXTtcbiAgICB9XG4gICAgcmV0dXJuIFY7XG59O1xuXG5WZWN0b3IubmVnID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgViA9IFtdO1xuICAgIHZhciBsaW0gPSB2Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIFZbaV0gPSB2W2ldICogLTE7XG4gICAgfVxuICAgIHJldHVybiBWO1xufTtcblxuLy8gQWRkaXRpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5hZGQgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICB2W2ldID0gdjFbaV0gKyB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBTdWJzdHJhY3Rpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5zdWIgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIHZbaV0gPSB2MVtpXSAtIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cblZlY3Rvci5zaWduZWRfYXJlYSA9IGZ1bmN0aW9uICh2MSwgdjIsIHYzKSB7XG4gICAgcmV0dXJuICh2MlswXS12MVswXSkqKHYzWzFdLXYxWzFdKSAtICh2M1swXS12MVswXSkqKHYyWzFdLXYxWzFdKTtcbn07XG5cbi8vIE11bHRpcGxpY2F0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IubXVsdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBsZW4gPSB2MS5sZW5ndGgsXG4gICAgICAgIGk7XG5cbiAgICBpZiAodHlwZW9mIHYyID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBNdWxpdHBseSBieSBzY2FsYXJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gKiB2MjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTXVsdGlwbHkgdHdvIHZlY3RvcnNcbiAgICAgICAgbGVuID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldICogdjJbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBEaXZpc2lvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRpdiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBpO1xuICAgIGlmKHR5cGVvZiB2MiA9PT0gJ251bWJlcicpe1xuICAgICAgICAvLyBEaXZpZGUgYnkgc2NhbGFyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpdmlkZSB0byB2ZWN0b3JzXG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIEdldCAyRCBwZXJwZW5kaWN1bGFyXG5WZWN0b3IucGVycCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICByZXR1cm4gWyB2MlsxXSAtIHYxWzFdLFxuICAgICAgICAgICAgIHYxWzBdIC0gdjJbMF0gXTtcbn07XG5cbi8vIEdldCAyRCB2ZWN0b3Igcm90YXRlZFxuVmVjdG9yLnJvdCA9IGZ1bmN0aW9uICh2LCBhKSB7XG4gICAgdmFyIGMgPSBNYXRoLmNvcyhhKTtcbiAgICB2YXIgcyA9IE1hdGguc2luKGEpO1xuICAgIHJldHVybiBbdlswXSAqIGMgLSB2WzFdICogcyxcbiAgICAgICAgICAgIHZbMF0gKiBzICsgdlsxXSAqIGNdO1xufTtcblxuLy8gR2V0IDJEIGhlYWRpbmcgYW5nbGVcblZlY3Rvci5hbmdsZSA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LHgpO1xufTtcblxuLy8gR2V0IGFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvcnNcblZlY3Rvci5hbmdsZUJldHdlZW4gPSBmdW5jdGlvbihBLCBCKXtcbiAgICB2YXIgZGVsdGEgPSBWZWN0b3IuZG90KEEsIEIpO1xuICAgIGlmIChkZWx0YSA8IC0xKSB7XG4gICAgICAgIGRlbHRhID0gLTE7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmFjb3MoZGVsdGEpO1xufTtcblxuLy8gQ29tcGFyZSB0d28gcG9pbnRzXG5WZWN0b3IuaXNFcXVhbCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbGVuID0gdjEubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHYxW2ldICE9PSB2MltpXSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBWZWN0b3IgbGVuZ3RoIHNxdWFyZWRcblZlY3Rvci5sZW5ndGhTcSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiAodlswXSp2WzBdICsgdlsxXSp2WzFdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodi5sZW5ndGggPj0gMykge1xuICAgICAgICByZXR1cm4gKHZbMF0qdlswXSArIHZbMV0qdlsxXSArIHZbMl0qdlsyXSk7XG4gICAgfVxuICAgIHJldHVybiAwO1xufTtcblxuLy8gVmVjdG9yIGxlbmd0aFxuVmVjdG9yLmxlbmd0aCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChWZWN0b3IubGVuZ3RoU3EodikpO1xufTtcblxuLy8gTm9ybWFsaXplIGEgdmVjdG9yXG5WZWN0b3Iubm9ybWFsaXplID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgZDtcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgfSBlbHNlIGlmICh2Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGQgPSB2WzBdKnZbMF0gKyB2WzFdKnZbMV0gKyB2WzJdKnZbMl07XG4gICAgICAgIGQgPSBNYXRoLnNxcnQoZCk7XG5cbiAgICAgICAgaWYgKGQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbdlswXSAvIGQsIHZbMV0gLyBkLCB2WzJdIC8gZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFswLCAwLCAwXTtcbn07XG5cbi8vIENyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5jcm9zcyAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgKHYxWzFdICogdjJbMl0pIC0gKHYxWzJdICogdjJbMV0pLFxuICAgICAgICAodjFbMl0gKiB2MlswXSkgLSAodjFbMF0gKiB2MlsyXSksXG4gICAgICAgICh2MVswXSAqIHYyWzFdKSAtICh2MVsxXSAqIHYyWzBdKVxuICAgIF07XG59O1xuXG4vLyBEb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRvdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCwgdjIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIG4gKz0gdjFbaV0gKiB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG59O1xuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IENhbWVyYSBmcm9tICcuL2NhbWVyYSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBjb25zdCBWSUVXX1BBTl9TTkFQX1RJTUUgPSAwLjU7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuXG4gICAgY29uc3RydWN0b3IgKHNjZW5lLCBvcHRpb25zKSB7XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaWNlcygpO1xuXG4gICAgICAgIHRoaXMuem9vbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucGFubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhbm5pbmdfc3RvcF9hdCA9IDA7XG4gICAgICAgIHRoaXMucGFuX3NuYXBfdGltZXIgPSAwO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b29tX2RpcmVjdGlvbiA9IDA7XG5cbiAgICAgICAgLy8gU2l6ZSBvZiB2aWV3cG9ydCBpbiBDU1MgcGl4ZWxzLCBkZXZpY2UgcGl4ZWxzLCBhbmQgbWVyY2F0b3IgbWV0ZXJzXG4gICAgICAgIHRoaXMuc2l6ZSA9IHtcbiAgICAgICAgICAgIGNzczoge30sXG4gICAgICAgICAgICBkZXZpY2U6IHt9LFxuICAgICAgICAgICAgbWV0ZXJzOiB7fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzcGVjdCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5idWZmZXIgPSAwO1xuICAgICAgICB0aGlzLmNvbnRpbnVvdXNfem9vbSA9ICh0eXBlb2Ygb3B0aW9ucy5jb250aW51b3VzWm9vbSA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnMuY29udGludW91c1pvb20gOiB0cnVlO1xuICAgICAgICB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWwgPSAwOyAvLyBsZXZlbC1vZi1kZXRhaWwgZG93bnNhbXBsaW5nIHRvIGFwcGx5IHRvIHRpbGUgbG9hZGluZ1xuICAgICAgICB0aGlzLnByZXNlcnZlX3RpbGVzX3dpdGhpbl96b29tID0gMTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RhdGUgYmVmb3JlIHNjZW5lIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjYW1lcmFcbiAgICBjcmVhdGVDYW1lcmEgKCkge1xuICAgICAgICBsZXQgYWN0aXZlX2NhbWVyYSA9IHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGlmIChhY3RpdmVfY2FtZXJhKSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYSA9IENhbWVyYS5jcmVhdGUoYWN0aXZlX2NhbWVyYSwgdGhpcywgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1thY3RpdmVfY2FtZXJhXSk7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGVWaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnICYmIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbWVyYSBzZXQgYXMgYWN0aXZlLCB1c2UgZmlyc3Qgb25lXG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXMubGVuZ3RoICYmIGtleXNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSBhbmQgcmVjb21waWxlIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEgKG5hbWUpIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXS5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDbGVhciBwcmV2aW91c2x5IGFjdGl2ZSBjYW1lcmFcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09IG5hbWUgJiYgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1twcmV2XSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW3ByZXZdLmFjdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2NlbmUudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlKCk7XG4gICAgICAgIHRoaXMucGFuX3NuYXBfdGltZXIgPSAoKCtuZXcgRGF0ZSgpKSAtIHRoaXMucGFubmluZ19zdG9wX2F0KSAvIDEwMDA7XG4gICAgfVxuXG4gICAgLy8gU2V0IGxvZ2ljYWwgcGl4ZWwgc2l6ZSBvZiB2aWV3cG9ydFxuICAgIHNldFZpZXdwb3J0U2l6ZSAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLnNpemUuY3NzID0geyB3aWR0aCwgaGVpZ2h0IH07XG4gICAgICAgIHRoaXMuc2l6ZS5kZXZpY2UgPSB7XG4gICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLndpZHRoICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLmhlaWdodCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3BlY3QgPSB0aGlzLnNpemUuY3NzLndpZHRoIC8gdGhpcy5zaXplLmNzcy5oZWlnaHQ7XG4gICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBtYXAgdmlldywgY2FuIGJlIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBsYXQvbG5nIGFuZC9vciB6b29tXG4gICAgc2V0VmlldyAoeyBsbmcsIGxhdCwgem9vbSB9ID0ge30pIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZXQgY2VudGVyXG4gICAgICAgIGlmICh0eXBlb2YgbG5nID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNlbnRlciB8fCBsbmcgIT09IHRoaXMuY2VudGVyLmxuZyB8fCBsYXQgIT09IHRoaXMuY2VudGVyLmxhdCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyID0geyBsbmc6IEdlby53cmFwTG5nKGxuZyksIGxhdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHpvb21cbiAgICAgICAgaWYgKHR5cGVvZiB6b29tID09PSAnbnVtYmVyJyAmJiB6b29tICE9PSB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRab29tKHpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuXG4gICAgc2V0Wm9vbSAoem9vbSkge1xuICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RfdGlsZV96b29tID0gdGhpcy50aWxlX3pvb207XG4gICAgICAgIGxldCB0aWxlX3pvb20gPSB0aGlzLnRpbGVab29tKHpvb20pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGludW91c196b29tKSB7XG4gICAgICAgICAgICB6b29tID0gdGlsZV96b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGVfem9vbSAhPT0gbGFzdF90aWxlX3pvb20pIHtcbiAgICAgICAgICAgIHRoaXMuem9vbV9kaXJlY3Rpb24gPSB0aWxlX3pvb20gPiBsYXN0X3RpbGVfem9vbSA/IDEgOiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnRpbGVfem9vbSA9IHRpbGVfem9vbTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICBzdGFydFpvb20gKCkge1xuICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaG9vc2UgdGhlIGJhc2Ugem9vbSBsZXZlbCB0byB1c2UgZm9yIGEgZ2l2ZW4gZnJhY3Rpb25hbCB6b29tXG4gICAgYmFzZVpvb20gKHpvb20pIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioem9vbSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGEgZ2l2ZW4gdmlldyB6b29tLCB3aGF0IHRpbGUgem9vbSBzaG91bGQgYmUgbG9hZGVkP1xuICAgIHRpbGVab29tICh2aWV3X3pvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVpvb20odmlld196b29tKSAtIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgYSBnaXZlbiB0aWxlIHpvb20sIHdoYXQgc3R5bGUgem9vbSBzaG91bGQgYmUgdXNlZD9cbiAgICBzdHlsZVpvb20gKHRpbGVfem9vbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlWm9vbSh0aWxlX3pvb20pICsgdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsO1xuICAgIH1cblxuICAgIHNldFBhbm5pbmcgKHBhbm5pbmcpIHtcbiAgICAgICAgdGhpcy5wYW5uaW5nID0gcGFubmluZztcbiAgICAgICAgaWYgKCF0aGlzLnBhbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucGFubmluZ19zdG9wX2F0ID0gKCtuZXcgRGF0ZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlYWR5ICgpIHtcbiAgICAgICAgLy8gVE9ETzogYmV0dGVyIGNvbmNlcHQgb2YgXCJyZWFkaW5lc3NcIiBzdGF0ZT9cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemUuY3NzLndpZHRoICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuem9vbSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHZpZXdwb3J0IGJvdW5kcyBiYXNlZCBvbiBjdXJyZW50IGNlbnRlciBhbmQgem9vbVxuICAgIHVwZGF0ZUJvdW5kcyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy56b29tKTtcblxuICAgICAgICAvLyBTaXplIG9mIHRoZSBoYWxmLXZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdGhpcy5zaXplLm1ldGVycyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc2l6ZS5jc3Mud2lkdGggKiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICB5OiB0aGlzLnNpemUuY3NzLmhlaWdodCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENlbnRlciBvZiB2aWV3cG9ydCBpbiBtZXRlcnMsIGFuZCB0aWxlXG4gICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoW3RoaXMuY2VudGVyLmxuZywgdGhpcy5jZW50ZXIubGF0XSk7XG4gICAgICAgIHRoaXMuY2VudGVyLm1ldGVycyA9IHsgeCwgeSB9O1xuXG4gICAgICAgIHRoaXMuY2VudGVyLnRpbGUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55XSwgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgIC8vIEJvdW5kcyBpbiBtZXRlcnNcbiAgICAgICAgdGhpcy5ib3VuZHMgPSB7XG4gICAgICAgICAgICBzdzoge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54IC0gdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSAtIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZToge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54ICsgdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSArIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ21vdmUnKTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7IC8vIFRPRE8gYXV0b21hdGUgdmlhIG1vdmUgZXZlbnQ/XG4gICAgfVxuXG4gICAgZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuYm91bmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgeiA9IHRoaXMudGlsZV96b29tO1xuICAgICAgICBsZXQgc3cgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMuc3cueCwgdGhpcy5ib3VuZHMuc3cueV0sIHopO1xuICAgICAgICBsZXQgbmUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMubmUueCwgdGhpcy5ib3VuZHMubmUueV0sIHopO1xuXG4gICAgICAgIGxldCBjb29yZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IHN3LnggLSB0aGlzLmJ1ZmZlcjsgeCA8PSBuZS54ICsgdGhpcy5idWZmZXI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IG5lLnkgLSB0aGlzLmJ1ZmZlcjsgeSA8PSBzdy55ICsgdGhpcy5idWZmZXI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKFRpbGUuY29vcmQoeyB4LCB5LCB6IH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0b28gZmFyIG91dHNpZGUgb2Ygdmlld1xuICAgIHBydW5lVGlsZXNGb3JWaWV3ICgpIHtcbiAgICAgICAgLy8gVE9ETzogd2lsbCB0aGlzIGZ1bmN0aW9uIGV2ZXIgYmUgY2FsbGVkIHdoZW4gdmlldyBpc24ndCByZWFkeT9cbiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZSBhIHNwZWNpZmllZCAjIG9mIHRpbGVzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0IGJvcmRlclxuICAgICAgICBsZXQgYm9yZGVyX3RpbGVzID0gW1xuICAgICAgICAgICAgTWF0aC5jZWlsKChNYXRoLmZsb29yKHRoaXMuc2l6ZS5jc3Mud2lkdGggLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMiksXG4gICAgICAgICAgICBNYXRoLmNlaWwoKE1hdGguZmxvb3IodGhpcy5zaXplLmNzcy5oZWlnaHQgLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMilcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlIHx8IHRpbGUucHJveHlfZm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGlsZXMgb3V0c2lkZSBnaXZlbiB6b29tIHRoYXQgYXJlIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgJiYgdGlsZS5zdHlsZV96b29tICE9PSB0aGlzLnRpbGVfem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIGlmIHRvbyBmYXIgZnJvbSBjdXJyZW50IHpvb21cbiAgICAgICAgICAgIGxldCB6ZGlmZiA9IE1hdGguYWJzKHRpbGUuc3R5bGVfem9vbSAtIHRoaXMudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmICh6ZGlmZiA+IHRoaXMucHJlc2VydmVfdGlsZXNfd2l0aGluX3pvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHRpbGVzIGF0IGRpZmZlcmVudCB6b29tc1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIHRpbGVzIG91dHNpZGUgYW4gYXJlYSBzdXJyb3VuZGluZyB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZHMueCAtIHRoaXMuY2VudGVyLnRpbGUueCkgLSBib3JkZXJfdGlsZXNbMF0gPiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmlldzogcmVtb3ZlIHRpbGUgJHt0aWxlLmtleX0gKGFzICR7Y29vcmRzLnh9LyR7Y29vcmRzLnl9LyR7dGhpcy50aWxlX3pvb219KSBmb3IgYmVpbmcgdG9vIGZhciBvdXQgb2YgdmlzaWJsZSBhcmVhICoqKmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoY29vcmRzLnkgLSB0aGlzLmNlbnRlci50aWxlLnkpIC0gYm9yZGVyX3RpbGVzWzFdID4gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZpZXc6IHJlbW92ZSB0aWxlICR7dGlsZS5rZXl9IChhcyAke2Nvb3Jkcy54fS8ke2Nvb3Jkcy55fS8ke3RoaXMudGlsZV96b29tfSkgZm9yIGJlaW5nIHRvbyBmYXIgb3V0IG9mIHZpc2libGUgYXJlYSAqKipgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb2NhdGUgbW9kZWwtdmlldyBtYXRyaWNlc1xuICAgIC8vIDY0LWJpdCB2ZXJzaW9ucyBhcmUgZm9yIENQVSBjYWxjdWF0aW9uc1xuICAgIC8vIDMyLWJpdCB2ZXJzaW9ucyBhcmUgZG93bnNhbXBsZWQgYW5kIHNlbnQgdG8gR1BVXG4gICAgY3JlYXRlTWF0cmljZXMgKCkge1xuICAgICAgICB0aGlzLm1hdHJpY2VzID0ge307XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWwgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbDMyID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWxfdmlldyA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsX3ZpZXczMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm5vcm1hbCA9IG5ldyBGbG9hdDY0QXJyYXkoOSk7XG4gICAgICAgIHRoaXMubWF0cmljZXMubm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IG1vZGVsL3ZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlcyBmb3IgYSB0aWxlXG4gICAgc2V0dXBUaWxlICh0aWxlLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgLy8gVE9ETzogY2FsYyB0aGVzZSBvbmNlIHBlciB0aWxlIChjdXJyZW50bHkgYmVpbmcgbmVlZGxlc3NseSByZS1jYWxjdWxhdGVkIHBlci10aWxlLXBlci1zdHlsZSlcbiAgICAgICAgdGlsZS5zZXR1cFByb2dyYW0odGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG5cbiAgICAgICAgLy8gTW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgICAgIHRoaXMuY2FtZXJhLnNldHVwTWF0cmljZXModGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGdlbmVyYWwgdW5pZm9ybXMgdGhhdCBtdXN0IGJlIHVwZGF0ZWQgb25jZSBwZXIgcHJvZ3JhbVxuICAgIHNldHVwUHJvZ3JhbSAocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3Jlc29sdXRpb24nLCBbdGhpcy5zaXplLmRldmljZS53aWR0aCwgdGhpcy5zaXplLmRldmljZS5oZWlnaHRdKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXBfcG9zaXRpb24nLCBbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55LCB0aGlzLnpvb21dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21ldGVyc19wZXJfcGl4ZWwnLCB0aGlzLm1ldGVyc19wZXJfcGl4ZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3ZpZXdfcGFuX3NuYXBfdGltZXInLCB0aGlzLnBhbl9zbmFwX3RpbWVyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3ZpZXdfcGFubmluZycsIHRoaXMucGFubmluZyk7XG5cbiAgICAgICAgdGhpcy5jYW1lcmEuc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgIH1cblxuICAgIC8vIFZpZXcgcmVxdWlyZXMgc29tZSBhbmltYXRpb24sIHN1Y2ggYXMgYWZ0ZXIgcGFubmluZyBzdG9wc1xuICAgIGlzQW5pbWF0aW5nICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnBhbl9zbmFwX3RpbWVyIDw9IFZJRVdfUEFOX1NOQVBfVElNRSk7XG4gICAgfVxuXG59XG4iXX0= diff --git a/dist/tangram.min.js b/dist/tangram.min.js index b1e364283..fded16298 100644 --- a/dist/tangram.min.js +++ b/dist/tangram.min.js @@ -9,10 +9,10 @@ for(0===s&&(c=138,f=3),n=0;r>=n;n++)if(i=s,s=t[2*(n+1)+1],!(++a }return o(t,e),u(t,[{key:"constrainCamera",value:function(e){var t=e.view_height,r=e.height,n=e.focal_length,i=e.fov;return r?(n=2*r/t,i=2*Math.atan(1/n)):(n?i=2*Math.atan(1/n):i&&(i=i*Math.PI/180,n=1/Math.tan(i/2)),r=t/2*n),{view_height:t,height:r,focal_length:n,fov:i}}},{key:"updateMatrices",value:function(){var e=this.view.size.css.height*this.view.meters_per_pixel,t=this.constrainCamera({view_height:e,focal_length:c.default.interpolate(this.view.zoom,this.focal_length),fov:c.default.interpolate(this.view.zoom,this.fov)}),r=t.height,n=t.fov,i=[this.view.center.meters.x,this.view.center.meters.y,r];this.position_meters=i,d.mat4.lookAt(this.view_matrix,d.vec3.fromValues(i[0],i[1],0),d.vec3.fromValues(i[0],i[1],-1),d.vec3.fromValues(0,1,0)),d.mat4.perspective(this.projection_matrix,n,this.view.aspect,1,2*r),this.vanishing_point_skew[0]=this.vanishing_point[0]/this.view.size.css.width,this.vanishing_point_skew[1]=this.vanishing_point[1]/this.view.size.css.height,this.projection_matrix[8]=2*-this.vanishing_point_skew[0],this.projection_matrix[9]=2*-this.vanishing_point_skew[1],d.mat4.translate(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(e/2*this.view.aspect*2*-this.vanishing_point_skew[0],e/2*2*-this.vanishing_point_skew[1],0)),d.mat4.translate(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(0,0,-r))}},{key:"update",value:function(){a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this),this.updateMatrices()}},{key:"setupProgram",value:function(e){e.uniform("Matrix4fv","u_projection",this.projection_matrix),e.uniform("3f","u_eye",[0,0,this.position_meters[2]]),e.uniform("2fv","u_vanishing_point",this.vanishing_point_skew)}}]),t}(p),m=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="isometric",o.axis=n.axis||{x:0,y:1},2===o.axis.length&&(o.axis={x:o.axis[0],y:o.axis[1]}),o.position_meters=null,o.viewport_height=null,o.view_matrix=new Float64Array(16),o.projection_matrix=new Float32Array(16),h.default.replaceBlock("camera","\n uniform mat4 u_projection;\n uniform vec3 u_eye;\n uniform vec2 u_vanishing_point;\n\n void cameraProjection (inout vec4 position) {\n position = u_projection * position;\n // position.xy += position.z * u_isometric_axis;\n\n // Reverse z for depth buffer so up is negative,\n // and scale down values so objects higher than one screen height will not get clipped\n // pull forward slightly to avoid going past far clipping plane\n position.z = -position.z / 100. + 1. - 0.001;\n }"),o}return o(t,e),u(t,[{key:"update",value:function(){a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this),this.viewport_height=this.view.size.css.height*this.view.meters_per_pixel;var e=[this.view.center.meters.x,this.view.center.meters.y,this.viewport_height];this.position_meters=e,d.mat4.identity(this.view_matrix),d.mat4.translate(this.view_matrix,this.view_matrix,d.vec3.fromValues(-e[0],-e[1],0)),d.mat4.identity(this.projection_matrix),this.projection_matrix[8]=this.axis.x/this.view.aspect,this.projection_matrix[9]=this.axis.y,d.mat4.scale(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(2/this.view.size.meters.x,2/this.view.size.meters.y,2/this.view.size.meters.y))}},{key:"setupProgram",value:function(e){e.uniform("Matrix4fv","u_projection",this.projection_matrix),e.uniform("3fv","u_eye",[0,0,this.viewport_height]),e.uniform("2fv","u_vanishing_point",[0,0])}}]),t}(p),g=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="flat",o}return o(t,e),u(t,[{key:"update",value:function(){this.axis.x=0,this.axis.y=0,a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this)}}]),t}(m)},{"./gl/shader_program":205,"./utils/gl-matrix":254,"./utils/utils":263}],199:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=function(){function e(e,t){var r=[],n=!0,i=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,o=u}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();r.default=n={},n.default_source_max_zoom=18,n.default_view_max_zoom=20,n.tile_size=256,n.half_circumference_meters=20037508.342789244,n.circumference_meters=2*n.half_circumference_meters,n.min_zoom_meters_per_pixel=n.circumference_meters/n.tile_size;var o=[];n.metersPerPixel=function(e){return o[e]=o[e]||n.min_zoom_meters_per_pixel/Math.pow(2,e),o[e]};var s=[];n.metersPerTile=function(e){return s[e]=s[e]||n.circumference_meters/Math.pow(2,e),s[e]},n.tile_scale=4096,n.units_per_pixel=n.tile_scale/n.tile_size,n.height_scale=16;var a=[];n.unitsPerMeter=function(e){return a[e]=a[e]||n.tile_scale/(n.tile_size*n.metersPerPixel(e)),a[e]},n.metersForTile=function(e){return{x:e.x*n.circumference_meters/Math.pow(2,e.z)-n.half_circumference_meters,y:-(e.y*n.circumference_meters/Math.pow(2,e.z)-n.half_circumference_meters)}},n.tileForMeters=function(e,t){var r=i(e,2),o=r[0],s=r[1];return{x:Math.floor((o+n.half_circumference_meters)/(n.circumference_meters/Math.pow(2,t))),y:Math.floor((-s+n.half_circumference_meters)/(n.circumference_meters/Math.pow(2,t))),z:t}},n.wrapTile=function(e){var t=e.x,r=e.y,n=e.z,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{x:!0,y:!1},o=(1<180||-180>e)&&(e=((e+180)%360+360)%360-180),e},n.transformGeometry=function(e,t){null!=e&&("Point"===e.type?t(e.coordinates):"LineString"===e.type||"MultiPoint"===e.type?e.coordinates.forEach(t):"Polygon"===e.type||"MultiLineString"===e.type?e.coordinates.forEach(function(e){return e.forEach(t)}):"MultiPolygon"===e.type&&e.coordinates.forEach(function(e){e.forEach(function(e){return e.forEach(t)})}))},n.boxIntersect=function(e,t){return!(t.sw.x>e.ne.x||t.ne.xe.ne.y||t.ne.ys;s++){var a=e[0][s];a[0]r&&(r=a[0]),a[1]>i&&(i=a[1])}return[t,n,r,i]},n.geometryType=function(e){return"Polygon"===e||"MultiPolygon"===e?"polygon":"LineString"===e||"MultiLineString"===e?"line":"Point"===e||"MultiPoint"===e?"point":void 0},n.centroid=function(e){for(var t=0,r=0,n=0,i=e[0],o=i.length,s=0,a=o-1;o>s;a=s,s++){var u=i[s],l=i[a],c=u[1]*l[0]-l[1]*u[0];t+=(u[0]+l[0])*c,r+=(u[1]+l[1])*c,n+=3*c}return[t/n,r/n]},n.multiCentroid=function(e){for(var t=e.length,r=[0,0],i=0;in;n++){var i=e[n],o=e[n+1];t+=i[0]*o[1]-o[0]*i[1]}return t+=e[r-1][0]*e[0][1]-e[0][0]*e[r-1][1]},n.polygonRingArea=function(e){return Math.abs(n.signedPolygonRingAreaSum(e))/2},n.polygonArea=function(e){return n.polygonRingArea(e[0])},n.multiPolygonArea=function(e){for(var t=0,r=0;r0?"CW":0>t?"CCW":void 0}},{}],200:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;r.default=n={},n.BYTE=5120,n.UNSIGNED_BYTE=5121,n.SHORT=5122,n.UNSIGNED_SHORT=5123,n.INT=5124,n.UNSIGNED_INT=5125,n.FLOAT=5126},{}],201:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;r.default=n={};var i=0;n.getContext=function(e,t){var r=!1;null==e&&(e=document.createElement("canvas"),e.style.position="absolute",e.style.top=0,e.style.left=0,e.style.zIndex=-1,document.body.appendChild(e),r=!0);var o=e.getContext("webgl",t)||e.getContext("experimental-webgl",t);if(!o)throw new Error("Couldn't create WebGL context.");return o._tangram_id=i++,r?(n.resize(o,window.innerWidth,window.innerHeight,t.device_pixel_ratio),window.addEventListener("resize",function(){n.resize(o,window.innerWidth,window.innerHeight,t.device_pixel_ratio)})):n.resize(o,parseFloat(e.style.width),parseFloat(e.style.height),t.device_pixel_ratio),o},n.resize=function(e,t,r,n){n=n||window.devicePixelRatio||1,e.canvas.style.width=t+"px",e.canvas.style.height=r+"px",e.canvas.width=Math.round(t*n),e.canvas.height=Math.round(r*n),e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,e.canvas.width,e.canvas.height)}},{}],202:[function(e,t,r){"use strict";function n(e,t){var r=i.filter(function(t){return t[0]===e})[0];return r=r&&r[1],r||(i.push([e,{}]),r=i[i.length-1][1]),r[t]||(r[t]=e.getExtension(t)),r[t]}Object.defineProperty(r,"__esModule",{value:!0}),r.default=n;var i=[]},{}],203:[function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t=2&&o.length<=4?t.push({type:"vec"+o.length,method:o.length+"fv",name:r,value:o,key:i,uniforms:e}):o.length>4&&t.push({type:"float[]",method:"1fv",name:r+"[0]",value:o,key:i,uniforms:e});else if("string"==typeof o[0])for(n=0;n=2&&o[0].length<=4)for(n=0;n=2&&t.length<=4?r="vec"+t.length:(r="float",n=t.length):"string"==typeof t[0]&&(r="sampler2D",n=t.length):"boolean"==typeof t?r="bool":"string"==typeof t&&(r="sampler2D");var i="";return i+=r+" "+e,n&&(i+="["+n+"]"),i+=";\n"},i.defineUniform=function(e,t){return"uniform "+i.defineVariable(e,t)},i.isUniformDefined=function(e,t){var r=new RegExp("uniform[^;]+(?:{[\\s\\S]*})?[^;]*\\b"+e+"\\b","g");return t.match(r)?!0:!1},i.isSymbolReferenced=function(e,t){var r=new RegExp("\\b"+e+"\\b","g");return t.search(r)>=0?!0:!1},i.expandVec3=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=void 0;if(Array.isArray(e)){if(2!==e.length)return e;r=[].concat(n(e),[t]).map(parseFloat)}else r=[e,e,e].map(parseFloat);return r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0},i.expandVec4=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=void 0;if(Array.isArray(e)){if(3!==e.length)return e;r=[].concat(n(e),[t]).map(parseFloat)}else r=[e,e,e,t].map(parseFloat);return r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0}},{}],204:[function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r0?"precision highp float;\n":"precision mediump float;\n",i.TANGRAM_VERTEX_SHADER=!0,i.TANGRAM_FRAGMENT_SHADER=!1,this.computed_vertex_source=f+e.buildDefineString(i)+this.computed_vertex_source,i.TANGRAM_VERTEX_SHADER=!1,i.TANGRAM_FRAGMENT_SHADER=!0,this.computed_fragment_source=e.buildExtensionString(n)+f+e.buildDefineString(i)+this.computed_fragment_source,this.computed_vertex_source=this.computed_vertex_source.replace(b,""),this.computed_fragment_source=this.computed_fragment_source.replace(b,"");try{this.program=e.updateProgram(this.gl,this.program,this.computed_vertex_source,this.computed_fragment_source),this.compiled=!0,this.compiling=!1}catch(d){throw this.program=null,this.compiled=!1,this.compiling=!1,this.error=d,("vertex"===d.type||"fragment"===d.type)&&(this.shader_errors=d.errors,this.shader_errors.forEach(function(e){e.type=d.type,e.block=t.block(d.type,e.line)})),new Error("ShaderProgram.compile(): program "+this.id+" ("+this.name+") error:",d)}this.use(),this.refreshUniforms(),this.refreshAttributes()}},{key:"buildDefineList",value:function(){var t,r={};for(t in e.defines)r[t]=e.defines[t];for(t in this.defines)r[t]=this.defines[t];return r}},{key:"buildShaderBlockList",value:function(){var t=void 0,r={};for(t in e.blocks)if(r[t]=[],Array.isArray(e.blocks[t])){var n;(n=r[t]).push.apply(n,i(e.blocks[t].map(function(e,r){return{key:t,source:e,num:r,scope:"ShaderProgram"}})))}else r[t]=[{key:t,source:e.blocks[t],num:0,scope:"ShaderProgram"}];for(t in this.blocks)if(r[t]=r[t]||[],Array.isArray(this.blocks[t]))for(var o=this.block_scopes&&this.block_scopes[t]||[],s=null,a=0,u=0;u0&&(this.computed_vertex_source=i.join("\n")+this.computed_vertex_source),o.length>0&&(this.computed_fragment_source=o.join("\n")+this.computed_fragment_source)}}},{key:"setUniforms",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:!0;if(this.compiled){t&&(this.texture_unit=0);for(var r=c.default.parseUniforms(e),n=0;ni&&i1?r={scope:s[1],name:s[2],num:s[3]}:(s=o.match(/\/\/ tangram-block-end: ([A-Za-z0-9_-]+), ([A-Za-z0-9_-]+), (\d+)/),s&&s.length>1&&(r=null)),r&&(r.line=null==r.line?-1:r.line+1,r.source=o)}return r}},{key:"checkExtensions",value:function(){var e=this,t=[];return this.extensions.forEach(function(r){var n=p.default(e.gl,r),i="TANGRAM_EXTENSION_"+r;e.defines[i]=null!=n,n?t.push(r):u.default("debug","Could not enable extension '"+r+"'")}),t}}]),e}();r.default=x,x.id=0,x.current=null,x.defines={},x.blocks={},x.reset=function(){x.programs_by_source={},x.shaders_by_source={}},x.reset(),x.buildDefineString=function(e){var t="";for(var r in e)null!=e[r]&&e[r]!==!1&&(t+="boolean"==typeof e[r]&&e[r]===!0?"#define "+r+"\n":"number"==typeof e[r]&&Math.floor(e[r])===e[r]?"#define "+r+" "+e[r].toFixed(1)+"\n":"#define "+r+" "+e[r]+"\n");return t},x.buildExtensionString=function(e){e=e||[];var t="";return e.forEach(function(e){t+="#ifdef GL_"+e+"\n#extension GL_"+e+" : enable\n#endif\n"}),t},x.addBlock=function(e){var t;x.blocks[e]=x.blocks[e]||[];for(var r=arguments.length,n=Array(r>1?r-1:0),i=1;r>i;i++)n[i-1]=arguments[i];(t=x.blocks[e]).push.apply(t,n)},x.removeBlock=function(e){x.blocks[e]=[]},x.replaceBlock=function(e){x.removeBlock(e);for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;t>n;n++)r[n-1]=arguments[n];x.addBlock.apply(x,[e].concat(r))},x.updateProgram=function(e,t,r,n){var i=e._tangram_id+"::"+r+"::"+n;if(x.programs_by_source[i])return u.default("trace","Reusing identical source GL program object"),x.programs_by_source[i];try{var o=x.createShader(e,r,e.VERTEX_SHADER),s=x.createShader(e,n,e.FRAGMENT_SHADER)}catch(a){throw u.default("error",a.message),a}if(e.useProgram(null),null!=t)for(var l=e.getAttachedShaders(t),c=0;c2&&void 0!==arguments[2]?arguments[2]:{};i(this,e),this.gl=t,this.texture=t.createTexture(),this.texture&&(this.valid=!0),this.bind(),this.name=r,this.retain_count=0,this.source=null,this.source_type=null,this.config_type=null,this.loading=null,this.loaded=!1,this.filtering=n.filtering,this.sprites=n.sprites,this.texcoords={},this.sizes={},this.setData(1,1,new Uint8Array([0,0,0,255]),{filtering:"nearest"}),e.textures[this.name]&&(this.retain_count=e.textures[this.name].retain_count,e.textures[this.name].retain_count=0,e.textures[this.name].destroy()),e.textures[this.name]=this,e.texture_configs[this.name]=Object.assign({name:r},n),this.load(n),a.default("trace","creating Texture "+this.name)}return o(e,[{key:"destroy",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.force;return this.retain_count>0&&!r?void a.default("error","Texture '"+this.name+"': destroying texture with retain count of '"+this.retain_count+"'"):void(this.valid&&(this.gl.deleteTexture(this.texture),this.texture=null,delete this.data,this.data=null,delete e.textures[this.name],this.valid=!1,a.default("trace","destroying Texture "+this.name)))}},{key:"retain",value:function(){this.retain_count++}},{key:"release",value:function(){this.retain_count<=0&&a.default("error","Texture '"+this.name+"': releasing texture with retain count of '"+this.retain_count+"'"),this.retain_count--,this.retain_count<=0&&this.destroy()}},{key:"bind",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.valid&&(e.activeUnit!==t&&(this.gl.activeTexture(this.gl.TEXTURE0+t),e.activeUnit=t,e.boundTexture=null),e.boundTexture!==this.texture&&(this.gl.bindTexture(this.gl.TEXTURE_2D,this.texture),e.boundTexture=this.texture))}},{key:"load",value:function(e){var t=this;return e?(this.loading=null,"string"==typeof e.url?(this.config_type="url",this.setUrl(e.url,e)):e.element?(this.config_type="element",this.setElement(e.element,e)):e.data&&e.width&&e.height&&(this.config_type="data",this.setData(e.width,e.height,e.data,e)),this.loading=this.loading&&this.loading.then(function(){return t.calculateSprites(),t})||Promise.resolve(this),this.loading):this.loading||Promise.resolve(this)}},{key:"setUrl",value:function(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.valid?(this.url=t,this.source=this.url,this.source_type="url",this.loading=new Promise(function(t){var i=new Image;i.onload=function(){try{r.setElement(i,n)}catch(o){r.loaded=!1,a.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",o,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:o,texture:n})}r.loaded=!0,t(r)},i.onerror=function(i){r.loaded=!1,a.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",i,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:i,texture:n}),t(r)},l.default.isSafari()&&"data:"===r.source.slice(0,5)||(i.crossOrigin="anonymous"),i.src=r.source}),this.loading):void 0}},{key:"setData",value:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.width=e,this.height=t,this.source=r,this.source_type="data",Array.isArray(this.source)&&(this.source=new Uint8Array(this.source)),this.update(n),this.setFiltering(n),this.loaded=!0,this.loading=Promise.resolve(this),this.loading}},{key:"setElement",value:function(t,r){var n=t;if("string"==typeof t&&(t=document.querySelector(t)),t instanceof HTMLCanvasElement||t instanceof HTMLImageElement||t instanceof HTMLVideoElement)this.source=t,this.source_type="element",this.update(r),this.setFiltering(r);else{this.loaded=!1;var i="the 'element' parameter (`element: "+JSON.stringify(n)+"`) must be a CSS ";i+="selector string, or a , or