From fd9fee93e1bc7d4a6a19af46cc093ca6099ee4d2 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 3 Sep 2013 17:08:22 +0200 Subject: [PATCH] change some paths, js file size reduced by around 400kb --- Gruntfile.js | 23 +- dist/habitrpg-shared.js | 76 +++++-- dist/spritesheets.css | 464 +-------------------------------------- package.json | 2 +- spritesheets.css | 465 ---------------------------------------- 5 files changed, 71 insertions(+), 959 deletions(-) delete mode 100644 spritesheets.css diff --git a/Gruntfile.js b/Gruntfile.js index ba13f921fc..f2b3a09ed9 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,34 +1,35 @@ module.exports = function(grunt) { grunt.initConfig({ - concat_css: { - options: { - // Task-specific options go here. - }, - all: { - src: ["css/*.css"], - dest: "spritesheets.css" + cssmin: { + dist: { + options: { + report: 'gzip' + }, + files: { + "dist/spritesheets.css": ["css/*.css"], + } } }, browserify: { - all: { + dist: { src: ["script/index.js"], dest: "dist/habitrpg-shared.js" }, options: { transform: ['coffeeify'], - debug: true + //debug: true ENORMEOUS DATA URI SOURCE MAP } } }); // Load the plugin that provides the "uglify" task. - grunt.loadNpmTasks('grunt-concat-css'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTasks('grunt-browserify'); // Default task(s). - grunt.registerTask('default', ['concat_css', 'browserify']); + grunt.registerTask('default', ['cssmin', 'browserify']); }; \ No newline at end of file diff --git a/dist/habitrpg-shared.js b/dist/habitrpg-shared.js index 077aa55a92..6df628ecd8 100644 --- a/dist/habitrpg-shared.js +++ b/dist/habitrpg-shared.js @@ -7347,6 +7347,7 @@ if(typeof module != 'undefined' && module.exports){ obj.revive = function(user, options) { var candidate, loseThisItem, owned, paths; + if (options == null) { options = {}; } @@ -7396,6 +7397,7 @@ if(typeof module != 'undefined' && module.exports){ obj.tnl = function(level) { var value; + if (level >= 100) { value = 0; } else { @@ -7415,6 +7417,7 @@ if(typeof module != 'undefined' && module.exports){ obj.expModifier = function(value, weaponStr, level, priority) { var exp, str, strMod, totalStr; + if (priority == null) { priority = '!'; } @@ -7437,6 +7440,7 @@ if(typeof module != 'undefined' && module.exports){ obj.hpModifier = function(value, armorDef, helmDef, shieldDef, level, priority) { var def, defMod, hp, totalDef; + if (priority == null) { priority = '!'; } @@ -7455,6 +7459,7 @@ if(typeof module != 'undefined' && module.exports){ obj.gpModifier = function(value, modifier, priority, streak, user) { var afterStreak, streakBonus, val; + if (priority == null) { priority = '!'; } @@ -7481,6 +7486,7 @@ if(typeof module != 'undefined' && module.exports){ obj.taskDeltaFormula = function(currentValue, direction) { var delta; + if (currentValue < -47.27) { currentValue = -47.27; } else if (currentValue > 21.27) { @@ -7499,7 +7505,8 @@ if(typeof module != 'undefined' && module.exports){ randomDrop = function(user, delta, priority, streak, options) { - var acceptableDrops, chanceMultiplier, drop, paths, rarity, reachedDropLimit, _base, _base1, _base2, _ref1; + var acceptableDrops, chanceMultiplier, drop, paths, rarity, reachedDropLimit, _base, _base1, _base2, _ref1, _ref2, _ref3, _ref4; + if (streak == null) { streak = 0; } @@ -7507,7 +7514,7 @@ if(typeof module != 'undefined' && module.exports){ options = {}; } paths = options.paths || {}; - if ((_base = user.items).lastDrop == null) { + if ((_ref1 = (_base = user.items).lastDrop) == null) { _base.lastDrop = { date: +moment().subtract('d', 1), count: 0 @@ -7521,11 +7528,11 @@ if(typeof module != 'undefined' && module.exports){ chanceMultiplier = Math.abs(delta); chanceMultiplier *= obj.priorityValue(priority); chanceMultiplier += streak; - if (((_ref1 = user.flags) != null ? _ref1.dropsEnabled : void 0) && Math.random() < (.05 * chanceMultiplier)) { + if (((_ref2 = user.flags) != null ? _ref2.dropsEnabled : void 0) && Math.random() < (.05 * chanceMultiplier)) { rarity = Math.random(); if (rarity > .5) { drop = helpers.randomVal(pets); - ((_base1 = user.items).eggs != null ? (_base1 = user.items).eggs : _base1.eggs = []).push(drop); + ((_ref3 = (_base1 = user.items).eggs) != null ? _ref3 : _base1.eggs = []).push(drop); paths['items.eggs'] = true; drop.type = 'Egg'; drop.dialog = "You've found a " + drop.text + " Egg! " + drop.notes; @@ -7541,11 +7548,12 @@ if(typeof module != 'undefined' && module.exports){ acceptableDrops = ['Base', 'White', 'Desert']; } acceptableDrops = hatchingPotions.filter(function(hatchingPotion) { - var _ref2; - return _ref2 = hatchingPotion.name, __indexOf.call(acceptableDrops, _ref2) >= 0; + var _ref4; + + return _ref4 = hatchingPotion.name, __indexOf.call(acceptableDrops, _ref4) >= 0; }); drop = helpers.randomVal(acceptableDrops); - ((_base2 = user.items).hatchingPotions != null ? (_base2 = user.items).hatchingPotions : _base2.hatchingPotions = []).push(drop.name); + ((_ref4 = (_base2 = user.items).hatchingPotions) != null ? _ref4 : _base2.hatchingPotions = []).push(drop.name); paths['items.hatchingPotions'] = true; drop.type = 'HatchingPotion'; drop.dialog = "You've found a " + drop.text + " Hatching Potion! " + drop.notes; @@ -7558,7 +7566,8 @@ if(typeof module != 'undefined' && module.exports){ }; obj.score = function(user, task, direction, options) { - var addPoints, calculateDelta, cron, delta, exp, gp, hp, lvl, num, paths, priority, streak, subtractPoints, times, type, value, _ref1, _ref2, _ref3; + var addPoints, calculateDelta, cron, delta, exp, gp, hp, lvl, num, paths, priority, streak, subtractPoints, times, type, value, _ref1, _ref2, _ref3, _ref4; + if (options == null) { options = {}; } @@ -7589,6 +7598,7 @@ if(typeof module != 'undefined' && module.exports){ } return _.times(times, function() { var nextDelta; + nextDelta = obj.taskDeltaFormula(value, direction); if (adjustvalue) { value += nextDelta; @@ -7598,6 +7608,7 @@ if(typeof module != 'undefined' && module.exports){ }; addPoints = function() { var weaponStr; + weaponStr = items.getItem('weapon', user.items.weapon).strength; exp += obj.expModifier(delta, weaponStr, user.stats.lvl, priority) / 2; if (streak) { @@ -7608,6 +7619,7 @@ if(typeof module != 'undefined' && module.exports){ }; subtractPoints = function() { var armorDef, headDef, shieldDef; + armorDef = items.getItem('armor', user.items.armor).defense; headDef = items.getItem('head', user.items.head).defense; shieldDef = items.getItem('shield', user.items.shield).defense; @@ -7622,7 +7634,7 @@ if(typeof module != 'undefined' && module.exports){ subtractPoints(); } if (task.value !== value) { - (task.history != null ? task.history : task.history = []).push({ + ((_ref4 = task.history) != null ? _ref4 : task.history = []).push({ date: +(new Date), value: value }); @@ -7690,7 +7702,8 @@ if(typeof module != 'undefined' && module.exports){ updateStats = function(user, newStats, options) { - var gp, paths, tnl; + var gp, paths, tnl, _ref1; + if (options == null) { options = {}; } @@ -7733,7 +7746,7 @@ if(typeof module != 'undefined' && module.exports){ paths['stats.lvl'] = true; paths['stats.gp'] = true; paths['stats.hp'] = true; - if (user.flags == null) { + if ((_ref1 = user.flags) == null) { user.flags = {}; } if (!user.flags.customizationsNotification && (user.stats.exp > 10 || user.stats.lvl > 1)) { @@ -7771,7 +7784,8 @@ if(typeof module != 'undefined' && module.exports){ obj.cron = function(user, options) { - var daysMissed, expTally, lvl, now, paths, todoTally, _base, _base1, _ref1; + var daysMissed, expTally, lvl, now, paths, todoTally, _base, _base1, _ref1, _ref2, _ref3, _ref4; + if (options == null) { options = {}; } @@ -7794,7 +7808,8 @@ if(typeof module != 'undefined' && module.exports){ } todoTally = 0; user.todos.concat(user.dailys).forEach(function(task) { - var absVal, completed, id, repeat, scheduleMisses, type; + var absVal, completed, id, repeat, scheduleMisses, type, _ref2; + if (!task) { return; } @@ -7805,6 +7820,7 @@ if(typeof module != 'undefined' && module.exports){ scheduleMisses = 0; _.times(daysMissed, function(n) { var thatDay; + thatDay = moment(now).subtract('days', n + 1); if (helpers.shouldDo(thatDay, repeat, user.preferences)) { return scheduleMisses++; @@ -7821,7 +7837,7 @@ if(typeof module != 'undefined' && module.exports){ } switch (type) { case 'daily': - (task.history != null ? task.history : task.history = []).push({ + ((_ref2 = task.history) != null ? _ref2 : task.history = []).push({ date: +(new Date), value: task.value }); @@ -7843,7 +7859,7 @@ if(typeof module != 'undefined' && module.exports){ return paths["tasks." + task.id + ".value"] = true; } }); - ((_base = (user.history != null ? user.history : user.history = {})).todos != null ? (_base = (user.history != null ? user.history : user.history = {})).todos : _base.todos = []).push({ + ((_ref2 = (_base = ((_ref3 = user.history) != null ? _ref3 : user.history = {})).todos) != null ? _ref2 : _base.todos = []).push({ date: now, value: todoTally }); @@ -7853,7 +7869,7 @@ if(typeof module != 'undefined' && module.exports){ lvl++; expTally += obj.tnl(lvl); } - ((_base1 = user.history).exp != null ? (_base1 = user.history).exp : _base1.exp = []).push({ + ((_ref4 = (_base1 = user.history).exp) != null ? _ref4 : _base1.exp = []).push({ date: now, value: expTally }); @@ -7883,6 +7899,7 @@ var process=require("__browserify_process");(function() { sanitizeOptions = function(o) { var dayStart, now, timezoneOffset, _ref; + dayStart = o.dayStart && (0 <= (_ref = +o.dayStart) && _ref <= 24) ? +o.dayStart : 0; timezoneOffset = o.timezoneOffset ? +o.timezoneOffset : +moment().zone(); now = o.now ? moment(o.now).zone(timezoneOffset) : moment(+(new Date)).zone(timezoneOffset); @@ -7895,6 +7912,7 @@ var process=require("__browserify_process");(function() { startOfWeek = function(options) { var o; + if (options == null) { options = {}; } @@ -7904,6 +7922,7 @@ var process=require("__browserify_process");(function() { startOfDay = function(options) { var o; + if (options == null) { options = {}; } @@ -7928,6 +7947,7 @@ var process=require("__browserify_process");(function() { daysSince = function(yesterday, options) { var o; + if (options == null) { options = {}; } @@ -7944,6 +7964,7 @@ var process=require("__browserify_process");(function() { shouldDo = function(day, repeat, options) { var o, selected, yesterday; + if (options == null) { options = {}; } @@ -7968,6 +7989,7 @@ var process=require("__browserify_process");(function() { uuid = function() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { var r, v; + r = Math.random() * 16 | 0; v = (c === "x" ? r : r & 0x3 | 0x8); return v.toString(16); @@ -7977,7 +7999,8 @@ var process=require("__browserify_process");(function() { module.exports = { uuid: uuid, taskDefaults: function(task, filters) { - var defaults, self; + var defaults, self, _ref; + if (filters == null) { filters = {}; } @@ -8006,13 +8029,14 @@ var process=require("__browserify_process");(function() { }) }; _.defaults(task, defaults); - if (task.value == null) { + if ((_ref = task.value) == null) { task.value = task.type === 'reward' ? 10 : 0; } return task; }, newUser: function(isDerby) { var defaultTags, defaultTasks, guid, newUser, repeat, tag, task, userSchema, _i, _j, _len, _len1; + if (isDerby == null) { isDerby = false; } @@ -8175,6 +8199,7 @@ var process=require("__browserify_process");(function() { dotSet: function(path, val, obj) { var arr; + if (~path.indexOf('undefined')) { return; } @@ -8206,6 +8231,7 @@ var process=require("__browserify_process");(function() { randomVal: function(obj) { var count, key, result, val; + result = void 0; count = 0; for (key in obj) { @@ -8232,6 +8258,7 @@ var process=require("__browserify_process");(function() { username: function(auth, override) { var fb, _ref; + if (override) { return override; } @@ -8256,6 +8283,7 @@ var process=require("__browserify_process");(function() { encodeiCalLink: function(uid, apiToken) { var loc, _ref; + loc = (typeof window !== "undefined" && window !== null ? window.location.host : void 0) || (typeof process !== "undefined" && process !== null ? (_ref = process.env) != null ? _ref.BASE_URL : void 0 : void 0) || ''; return encodeURIComponent("http://" + loc + "/v1/users/" + uid + "/calendar.ics?apiToken=" + apiToken); }, @@ -8265,6 +8293,7 @@ var process=require("__browserify_process");(function() { equipped: function(type, item, preferences, backerTier) { var armorSet, gender; + if (item == null) { item = 0; } @@ -8361,6 +8390,7 @@ var process=require("__browserify_process");(function() { taskClasses: function(task, filters, dayStart, lastCron, showCompleted, main) { var classes, completed, enabled, filter, repeat, type, value, _ref; + if (showCompleted == null) { showCompleted = false; } @@ -8454,6 +8484,7 @@ var process=require("__browserify_process");(function() { appliedTags: function(userTags, taskTags) { var arr; + arr = []; _.each(userTags, function(t) { if (t == null) { @@ -8474,6 +8505,7 @@ var process=require("__browserify_process");(function() { }, totalStr: function(level, weapon) { var str; + if (weapon == null) { weapon = 0; } @@ -8485,6 +8517,7 @@ var process=require("__browserify_process");(function() { }, totalDef: function(level, armor, head, shield) { var totalDef; + if (armor == null) { armor = 0; } @@ -8505,6 +8538,7 @@ var process=require("__browserify_process");(function() { }, itemStat: function(type, item) { var i; + if (item == null) { item = 0; } @@ -8528,6 +8562,7 @@ var process=require("__browserify_process");(function() { hydrate: function(spec) { var hydrated, keys, _this = this; + if (_.isObject(spec) && !_.isArray(spec)) { hydrated = {}; keys = _.keys(spec).concat(_.keys(spec.__proto__)); @@ -8899,6 +8934,7 @@ try { module.exports.buyItem = function(user, type, options) { var nextItem; + if (options == null) { options = {}; } @@ -8931,9 +8967,11 @@ try { module.exports.updateStore = function(user) { var changes; + changes = {}; _.each(['weapon', 'armor', 'shield', 'head'], function(type) { var i, showNext, _ref, _ref1, _ref2; + i = ~~(((_ref = user.items) != null ? _ref[type] : void 0) || 0) + 1; showNext = true; if (i === items[type].length - 1) { @@ -8961,6 +8999,7 @@ try { module.exports.getItem = function(type, index) { var i; + if (index == null) { index = 0; } @@ -8972,5 +9011,4 @@ try { },{"lodash":2}]},{},[7]) -//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlcyI6WyIvVXNlcnMvbGVmbmlyZS9Ecm9wYm94L1NpdGVzL3BlcnNvbmFsL2hhYml0cnBnL21vZHVsZXMvaGFiaXRycGctc2hhcmVkL25vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9pbnNlcnQtbW9kdWxlLWdsb2JhbHMvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIi9Vc2Vycy9sZWZuaXJlL0Ryb3Bib3gvU2l0ZXMvcGVyc29uYWwvaGFiaXRycGcvbW9kdWxlcy9oYWJpdHJwZy1zaGFyZWQvbm9kZV9tb2R1bGVzL2xvZGFzaC9kaXN0L2xvZGFzaC5qcyIsIi9Vc2Vycy9sZWZuaXJlL0Ryb3Bib3gvU2l0ZXMvcGVyc29uYWwvaGFiaXRycGcvbW9kdWxlcy9oYWJpdHJwZy1zaGFyZWQvbm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCIvVXNlcnMvbGVmbmlyZS9Ecm9wYm94L1NpdGVzL3BlcnNvbmFsL2hhYml0cnBnL21vZHVsZXMvaGFiaXRycGctc2hhcmVkL25vZGVfbW9kdWxlcy9yZWxhdGl2ZS1kYXRlL2xpYi9yZWxhdGl2ZS1kYXRlLmpzIiwiL1VzZXJzL2xlZm5pcmUvRHJvcGJveC9TaXRlcy9wZXJzb25hbC9oYWJpdHJwZy9tb2R1bGVzL2hhYml0cnBnLXNoYXJlZC9zY3JpcHQvYWxnb3MuY29mZmVlIiwiL1VzZXJzL2xlZm5pcmUvRHJvcGJveC9TaXRlcy9wZXJzb25hbC9oYWJpdHJwZy9tb2R1bGVzL2hhYml0cnBnLXNoYXJlZC9zY3JpcHQvaGVscGVycy5jb2ZmZWUiLCIvVXNlcnMvbGVmbmlyZS9Ecm9wYm94L1NpdGVzL3BlcnNvbmFsL2hhYml0cnBnL21vZHVsZXMvaGFiaXRycGctc2hhcmVkL3NjcmlwdC9pbmRleC5qcyIsIi9Vc2Vycy9sZWZuaXJlL0Ryb3Bib3gvU2l0ZXMvcGVyc29uYWwvaGFiaXRycGcvbW9kdWxlcy9oYWJpdHJwZy1zaGFyZWQvc2NyaXB0L2l0ZW1zLmNvZmZlZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ243S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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UUFSRjtDQVNRLEVBQVcsQ0FBWCxDQUErQixFQUEvQixDQUFRLEtBQWhCO0NBQXFELENBQU0sRUFBTCxJQUFBO0NBVlY7Q0FBOUMsSUFBOEM7Q0FEOUMsRUFZaUIsQ0FBakIsQ0FBc0IsQ0FBdEIsQ0FBTztDQVpQLEVBYWtCLENBQWxCLENBQXVCLENBQXZCLENBQU87Q0Fkb0IsVUFlM0I7Q0FqSEYsRUFrRzZCOztDQWlCN0I7OztDQW5IQTs7Q0FBQSxDQXNIQSxDQUF5QixDQUFBLENBQUEsQ0FBbkIsQ0FBUSxFQUFZO0NBQ3hCLE9BQUE7O0dBRG9DLEdBQU47TUFDOUI7QUFBUyxDQUFULEVBQVEsQ0FBUixDQUFRLENBQVU7Q0FDWixHQUFBLENBQUEsTUFBTjtDQXhIRixFQXNIeUI7Q0F0SHpCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxucHJvY2Vzcy5uZXh0VGljayA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNhblNldEltbWVkaWF0ZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93LnNldEltbWVkaWF0ZTtcbiAgICB2YXIgY2FuUG9zdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93LnBvc3RNZXNzYWdlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyXG4gICAgO1xuXG4gICAgaWYgKGNhblNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGYpIHsgcmV0dXJuIHdpbmRvdy5zZXRJbW1lZGlhdGUoZikgfTtcbiAgICB9XG5cbiAgICBpZiAoY2FuUG9zdCkge1xuICAgICAgICB2YXIgcXVldWUgPSBbXTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChldi5zb3VyY2UgPT09IHdpbmRvdyAmJiBldi5kYXRhID09PSAncHJvY2Vzcy10aWNrJykge1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKCdwcm9jZXNzLXRpY2snLCAnKicpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgICB9O1xufSkoKTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufVxuXG4vLyBUT0RPKHNodHlsbWFuKVxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG4iLCJ2YXIgZ2xvYmFsPXNlbGY7LyoqXG4gKiBAbGljZW5zZVxuICogTG8tRGFzaCAxLjMuMSAoQ3VzdG9tIEJ1aWxkKSA8aHR0cDovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kZXJuIC1vIC4vZGlzdC9sb2Rhc2guanNgXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDEzIFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjQuNCA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvPlxuICogQ29weXJpZ2h0IDIwMDktMjAxMyBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgSW5jLlxuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG47KGZ1bmN0aW9uKHdpbmRvdykge1xuXG4gIC8qKiBVc2VkIGFzIGEgc2FmZSByZWZlcmVuY2UgZm9yIGB1bmRlZmluZWRgIGluIHByZSBFUzUgZW52aXJvbm1lbnRzICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgdG8gcG9vbCBhcnJheXMgYW5kIG9iamVjdHMgdXNlZCBpbnRlcm5hbGx5ICovXG4gIHZhciBhcnJheVBvb2wgPSBbXSxcbiAgICAgIG9iamVjdFBvb2wgPSBbXTtcblxuICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzICovXG4gIHZhciBpZENvdW50ZXIgPSAwO1xuXG4gIC8qKiBVc2VkIGludGVybmFsbHkgdG8gaW5kaWNhdGUgdmFyaW91cyB0aGluZ3MgKi9cbiAgdmFyIGluZGljYXRvck9iamVjdCA9IHt9O1xuXG4gIC8qKiBVc2VkIHRvIHByZWZpeCBrZXlzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGBfX3Byb3RvX19gIGFuZCBwcm9wZXJ0aWVzIG9uIGBPYmplY3QucHJvdG90eXBlYCAqL1xuICB2YXIga2V5UHJlZml4ID0gK25ldyBEYXRlICsgJyc7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNpemUgd2hlbiBvcHRpbWl6YXRpb25zIGFyZSBlbmFibGVkIGZvciBsYXJnZSBhcnJheXMgKi9cbiAgdmFyIGxhcmdlQXJyYXlTaXplID0gNzU7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIG1heCBzaXplIG9mIHRoZSBgYXJyYXlQb29sYCBhbmQgYG9iamVjdFBvb2xgICovXG4gIHZhciBtYXhQb29sU2l6ZSA9IDQwO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UgKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIEVTNiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzXG4gICAqIGh0dHA6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLTcuOC42XG4gICAqL1xuICB2YXIgcmVFc1RlbXBsYXRlID0gL1xcJFxceyhbXlxcXFx9XSooPzpcXFxcLlteXFxcXH1dKikqKVxcfS9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHJlZ2V4cCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcyAqL1xuICB2YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggXCJpbnRlcnBvbGF0ZVwiIHRlbXBsYXRlIGRlbGltaXRlcnMgKi9cbiAgdmFyIHJlSW50ZXJwb2xhdGUgPSAvPCU9KFtcXHNcXFNdKz8pJT4vZztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgZnVuY3Rpb25zIGNvbnRhaW5pbmcgYSBgdGhpc2AgcmVmZXJlbmNlICovXG4gIHZhciByZVRoaXMgPSAocmVUaGlzID0gL1xcYnRoaXNcXGIvKSAmJiByZVRoaXMudGVzdChydW5JbkNvbnRleHQpICYmIHJlVGhpcztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYW5kIHRlc3Qgd2hpdGVzcGFjZSAqL1xuICB2YXIgd2hpdGVzcGFjZSA9IChcbiAgICAvLyB3aGl0ZXNwYWNlXG4gICAgJyBcXHRcXHgwQlxcZlxceEEwXFx1ZmVmZicgK1xuXG4gICAgLy8gbGluZSB0ZXJtaW5hdG9yc1xuICAgICdcXG5cXHJcXHUyMDI4XFx1MjAyOScgK1xuXG4gICAgLy8gdW5pY29kZSBjYXRlZ29yeSBcIlpzXCIgc3BhY2Ugc2VwYXJhdG9yc1xuICAgICdcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwJ1xuICApO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgemVyb3MgdG8gYmUgcmVtb3ZlZCAqL1xuICB2YXIgcmVMZWFkaW5nU3BhY2VzQW5kWmVyb3MgPSBSZWdFeHAoJ15bJyArIHdoaXRlc3BhY2UgKyAnXSowKyg/PS4kKScpO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycyAqL1xuICB2YXIgcmVOb01hdGNoID0gLygkXikvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgY2hhcmFjdGVycyAqL1xuICB2YXIgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdW5lc2NhcGVkIGNoYXJhY3RlcnMgaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdFxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBhc3NpZ24gZGVmYXVsdCBgY29udGV4dGAgb2JqZWN0IHByb3BlcnRpZXMgKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQm9vbGVhbicsICdEYXRlJywgJ0Z1bmN0aW9uJywgJ01hdGgnLCAnTnVtYmVyJywgJ09iamVjdCcsXG4gICAgJ1JlZ0V4cCcsICdTdHJpbmcnLCAnXycsICdhdHRhY2hFdmVudCcsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAnaXNOYU4nLFxuICAgICdwYXJzZUludCcsICdzZXRJbW1lZGlhdGUnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5ICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAwO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgc2hvcnRjdXRzICovXG4gIHZhciBhcmdzQ2xhc3MgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5Q2xhc3MgPSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgYm9vbENsYXNzID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgICAgZGF0ZUNsYXNzID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgICAgZXJyb3JDbGFzcyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgICBmdW5jQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgbnVtYmVyQ2xhc3MgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICAgIG9iamVjdENsYXNzID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICByZWdleHBDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgICAgc3RyaW5nQ2xhc3MgPSAnW29iamVjdCBTdHJpbmddJztcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBvYmplY3QgY2xhc3NpZmljYXRpb25zIHRoYXQgYF8uY2xvbmVgIHN1cHBvcnRzICovXG4gIHZhciBjbG9uZWFibGVDbGFzc2VzID0ge307XG4gIGNsb25lYWJsZUNsYXNzZXNbZnVuY0NsYXNzXSA9IGZhbHNlO1xuICBjbG9uZWFibGVDbGFzc2VzW2FyZ3NDbGFzc10gPSBjbG9uZWFibGVDbGFzc2VzW2FycmF5Q2xhc3NdID1cbiAgY2xvbmVhYmxlQ2xhc3Nlc1tib29sQ2xhc3NdID0gY2xvbmVhYmxlQ2xhc3Nlc1tkYXRlQ2xhc3NdID1cbiAgY2xvbmVhYmxlQ2xhc3Nlc1tudW1iZXJDbGFzc10gPSBjbG9uZWFibGVDbGFzc2VzW29iamVjdENsYXNzXSA9XG4gIGNsb25lYWJsZUNsYXNzZXNbcmVnZXhwQ2xhc3NdID0gY2xvbmVhYmxlQ2xhc3Nlc1tzdHJpbmdDbGFzc10gPSB0cnVlO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVybWluZSBpZiB2YWx1ZXMgYXJlIG9mIHRoZSBsYW5ndWFnZSB0eXBlIE9iamVjdCAqL1xuICB2YXIgb2JqZWN0VHlwZXMgPSB7XG4gICAgJ2Jvb2xlYW4nOiBmYWxzZSxcbiAgICAnZnVuY3Rpb24nOiB0cnVlLFxuICAgICdvYmplY3QnOiB0cnVlLFxuICAgICdudW1iZXInOiBmYWxzZSxcbiAgICAnc3RyaW5nJzogZmFsc2UsXG4gICAgJ3VuZGVmaW5lZCc6IGZhbHNlXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMgKi9cbiAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFx0JzogJ3QnLFxuICAgICdcXHUyMDI4JzogJ3UyMDI4JyxcbiAgICAnXFx1MjAyOSc6ICd1MjAyOSdcbiAgfTtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IG9iamVjdFR5cGVzW3R5cGVvZiBleHBvcnRzXSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYCAqL1xuICB2YXIgZnJlZU1vZHVsZSA9IG9iamVjdFR5cGVzW3R5cGVvZiBtb2R1bGVdICYmIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cyAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgLCBmcm9tIE5vZGUuanMgb3IgQnJvd3NlcmlmaWVkIGNvZGUsIGFuZCB1c2UgaXQgYXMgYHdpbmRvd2AgKi9cbiAgdmFyIGZyZWVHbG9iYWwgPSBvYmplY3RUeXBlc1t0eXBlb2YgZ2xvYmFsXSAmJiBnbG9iYWw7XG4gIGlmIChmcmVlR2xvYmFsICYmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCkpIHtcbiAgICB3aW5kb3cgPSBmcmVlR2xvYmFsO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBiaW5hcnkgc2VhcmNoZXNcbiAgICogb3IgYGZyb21JbmRleGAgY29uc3RyYWludHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNpY0luZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSAoZnJvbUluZGV4IHx8IDApIC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbnRhaW5zYCBmb3IgY2FjaGUgb2JqZWN0cyB0aGF0IG1pbWljcyB0aGUgcmV0dXJuXG4gICAqIHNpZ25hdHVyZSBvZiBgXy5pbmRleE9mYCBieSByZXR1cm5pbmcgYDBgIGlmIHRoZSB2YWx1ZSBpcyBmb3VuZCwgZWxzZSBgLTFgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBgMGAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FjaGVJbmRleE9mKGNhY2hlLCB2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGNhY2hlID0gY2FjaGUuY2FjaGU7XG5cbiAgICBpZiAodHlwZSA9PSAnYm9vbGVhbicgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNhY2hlW3ZhbHVlXTtcbiAgICB9XG4gICAgaWYgKHR5cGUgIT0gJ251bWJlcicgJiYgdHlwZSAhPSAnc3RyaW5nJykge1xuICAgICAgdHlwZSA9ICdvYmplY3QnO1xuICAgIH1cbiAgICB2YXIga2V5ID0gdHlwZSA9PSAnbnVtYmVyJyA/IHZhbHVlIDoga2V5UHJlZml4ICsgdmFsdWU7XG4gICAgY2FjaGUgPSBjYWNoZVt0eXBlXSB8fCAoY2FjaGVbdHlwZV0gPSB7fSk7XG5cbiAgICByZXR1cm4gdHlwZSA9PSAnb2JqZWN0J1xuICAgICAgPyAoY2FjaGVba2V5XSAmJiBiYXNpY0luZGV4T2YoY2FjaGVba2V5XSwgdmFsdWUpID4gLTEgPyAwIDogLTEpXG4gICAgICA6IChjYWNoZVtrZXldID8gMCA6IC0xKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgZ2l2ZW4gYHZhbHVlYCB0byB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBvYmplY3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIGNhY2hlLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FjaGVQdXNoKHZhbHVlKSB7XG4gICAgdmFyIGNhY2hlID0gdGhpcy5jYWNoZSxcbiAgICAgICAgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuICAgIGlmICh0eXBlID09ICdib29sZWFuJyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBjYWNoZVt2YWx1ZV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZSAhPSAnbnVtYmVyJyAmJiB0eXBlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnb2JqZWN0JztcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB0eXBlID09ICdudW1iZXInID8gdmFsdWUgOiBrZXlQcmVmaXggKyB2YWx1ZSxcbiAgICAgICAgICB0eXBlQ2FjaGUgPSBjYWNoZVt0eXBlXSB8fCAoY2FjaGVbdHlwZV0gPSB7fSk7XG5cbiAgICAgIGlmICh0eXBlID09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICgodHlwZUNhY2hlW2tleV0gfHwgKHR5cGVDYWNoZVtrZXldID0gW10pKS5wdXNoKHZhbHVlKSA9PSB0aGlzLmFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGNhY2hlW3R5cGVdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVDYWNoZVtrZXldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5tYXhgIGFuZCBgXy5taW5gIGFzIHRoZSBkZWZhdWx0IGBjYWxsYmFja2Agd2hlbiBhIGdpdmVuXG4gICAqIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZyB2YWx1ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSBjaGFyYWN0ZXIgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyB0aGUgY29kZSB1bml0IG9mIGdpdmVuIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJBdENhbGxiYWNrKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmNoYXJDb2RlQXQoMCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgc29ydEJ5YCB0byBjb21wYXJlIHRyYW5zZm9ybWVkIGBjb2xsZWN0aW9uYCB2YWx1ZXMsIHN0YWJsZSBzb3J0aW5nXG4gICAqIHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8gYGJgLlxuICAgKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8gYGFgLlxuICAgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBvZiBgMWAgb3IgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcoYSwgYikge1xuICAgIHZhciBhaSA9IGEuaW5kZXgsXG4gICAgICAgIGJpID0gYi5pbmRleDtcblxuICAgIGEgPSBhLmNyaXRlcmlhO1xuICAgIGIgPSBiLmNyaXRlcmlhO1xuXG4gICAgLy8gZW5zdXJlIGEgc3RhYmxlIHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXNcbiAgICAvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MFxuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBpZiAoYSA+IGIgfHwgdHlwZW9mIGEgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBpZiAoYSA8IGIgfHwgdHlwZW9mIGIgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWkgPCBiaSA/IC0xIDogMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2FjaGUgb2JqZWN0IHRvIG9wdGltaXplIGxpbmVhciBzZWFyY2hlcyBvZiBsYXJnZSBhcnJheXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAgICogQHJldHVybnMge051bGx8T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBvYmplY3Qgb3IgYG51bGxgIGlmIGNhY2hpbmcgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ2FjaGUoYXJyYXkpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgdmFyIGNhY2hlID0gZ2V0T2JqZWN0KCk7XG4gICAgY2FjaGVbJ2ZhbHNlJ10gPSBjYWNoZVsnbnVsbCddID0gY2FjaGVbJ3RydWUnXSA9IGNhY2hlWyd1bmRlZmluZWQnXSA9IGZhbHNlO1xuXG4gICAgdmFyIHJlc3VsdCA9IGdldE9iamVjdCgpO1xuICAgIHJlc3VsdC5hcnJheSA9IGFycmF5O1xuICAgIHJlc3VsdC5jYWNoZSA9IGNhY2hlO1xuICAgIHJlc3VsdC5wdXNoID0gY2FjaGVQdXNoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGFycmF5W2luZGV4XSk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZS5vYmplY3QgPT09IGZhbHNlXG4gICAgICA/IChyZWxlYXNlT2JqZWN0KHJlc3VsdCksIG51bGwpXG4gICAgICA6IHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGB0ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZFxuICAgKiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIobWF0Y2gpIHtcbiAgICByZXR1cm4gJ1xcXFwnICsgc3RyaW5nRXNjYXBlc1ttYXRjaF07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBhcnJheSBmcm9tIHRoZSBhcnJheSBwb29sIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIHRoZSBwb29sIGlzIGVtcHR5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBmcm9tIHRoZSBwb29sLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXJyYXkoKSB7XG4gICAgcmV0dXJuIGFycmF5UG9vbC5wb3AoKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIG9iamVjdCBmcm9tIHRoZSBvYmplY3QgcG9vbCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiB0aGUgcG9vbCBpcyBlbXB0eS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIG9iamVjdCBmcm9tIHRoZSBwb29sLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0T2JqZWN0KCkge1xuICAgIHJldHVybiBvYmplY3RQb29sLnBvcCgpIHx8IHtcbiAgICAgICdhcnJheSc6IG51bGwsXG4gICAgICAnY2FjaGUnOiBudWxsLFxuICAgICAgJ2NyaXRlcmlhJzogbnVsbCxcbiAgICAgICdmYWxzZSc6IGZhbHNlLFxuICAgICAgJ2luZGV4JzogMCxcbiAgICAgICdsZWFkaW5nJzogZmFsc2UsXG4gICAgICAnbWF4V2FpdCc6IDAsXG4gICAgICAnbnVsbCc6IGZhbHNlLFxuICAgICAgJ251bWJlcic6IG51bGwsXG4gICAgICAnb2JqZWN0JzogbnVsbCxcbiAgICAgICdwdXNoJzogbnVsbCxcbiAgICAgICdzdHJpbmcnOiBudWxsLFxuICAgICAgJ3RyYWlsaW5nJzogZmFsc2UsXG4gICAgICAndHJ1ZSc6IGZhbHNlLFxuICAgICAgJ3VuZGVmaW5lZCc6IGZhbHNlLFxuICAgICAgJ3ZhbHVlJzogbnVsbFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQSBuby1vcGVyYXRpb24gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBub29wKCkge1xuICAgIC8vIG5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgZ2l2ZW4gYGFycmF5YCBiYWNrIHRvIHRoZSBhcnJheSBwb29sLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byByZWxlYXNlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVsZWFzZUFycmF5KGFycmF5KSB7XG4gICAgYXJyYXkubGVuZ3RoID0gMDtcbiAgICBpZiAoYXJyYXlQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7XG4gICAgICBhcnJheVBvb2wucHVzaChhcnJheSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIHRoZSBnaXZlbiBgb2JqZWN0YCBiYWNrIHRvIHRoZSBvYmplY3QgcG9vbC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcmVsZWFzZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlbGVhc2VPYmplY3Qob2JqZWN0KSB7XG4gICAgdmFyIGNhY2hlID0gb2JqZWN0LmNhY2hlO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgcmVsZWFzZU9iamVjdChjYWNoZSk7XG4gICAgfVxuICAgIG9iamVjdC5hcnJheSA9IG9iamVjdC5jYWNoZSA9IG9iamVjdC5jcml0ZXJpYSA9IG9iamVjdC5vYmplY3QgPSBvYmplY3QubnVtYmVyID0gb2JqZWN0LnN0cmluZyA9IG9iamVjdC52YWx1ZSA9IG51bGw7XG4gICAgaWYgKG9iamVjdFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgIG9iamVjdFBvb2wucHVzaChvYmplY3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbGljZXMgdGhlIGBjb2xsZWN0aW9uYCBmcm9tIHRoZSBgc3RhcnRgIGluZGV4IHVwIHRvLCBidXQgbm90IGluY2x1ZGluZyxcbiAgICogdGhlIGBlbmRgIGluZGV4LlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQsIGluc3RlYWQgb2YgYEFycmF5I3NsaWNlYCwgdG8gc3VwcG9ydCBub2RlIGxpc3RzXG4gICAqIGluIElFIDwgOSBhbmQgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmUgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzbGljZS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBpbmRleC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZCBUaGUgZW5kIGluZGV4LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgc3RhcnQgfHwgKHN0YXJ0ID0gMCk7XG4gICAgaWYgKHR5cGVvZiBlbmQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVuZCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0IHx8IDAsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCA8IDAgPyAwIDogbGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gYXJyYXlbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBnaXZlbiBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0PXdpbmRvd10gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpIHtcbiAgICAvLyBBdm9pZCBpc3N1ZXMgd2l0aCBzb21lIEVTMyBlbnZpcm9ubWVudHMgdGhhdCBhdHRlbXB0IHRvIHVzZSB2YWx1ZXMsIG5hbWVkXG4gICAgLy8gYWZ0ZXIgYnVpbHQtaW4gY29uc3RydWN0b3JzIGxpa2UgYE9iamVjdGAsIGZvciB0aGUgY3JlYXRpb24gb2YgbGl0ZXJhbHMuXG4gICAgLy8gRVM1IGNsZWFycyB0aGlzIHVwIGJ5IHN0YXRpbmcgdGhhdCBsaXRlcmFscyBtdXN0IHVzZSBidWlsdC1pbiBjb25zdHJ1Y3RvcnMuXG4gICAgLy8gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDExLjEuNS5cbiAgICBjb250ZXh0ID0gY29udGV4dCA/IF8uZGVmYXVsdHMod2luZG93Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2sod2luZG93LCBjb250ZXh0UHJvcHMpKSA6IHdpbmRvdztcblxuICAgIC8qKiBOYXRpdmUgY29uc3RydWN0b3IgcmVmZXJlbmNlcyAqL1xuICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksXG4gICAgICAgIEJvb2xlYW4gPSBjb250ZXh0LkJvb2xlYW4sXG4gICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgTnVtYmVyID0gY29udGV4dC5OdW1iZXIsXG4gICAgICAgIE9iamVjdCA9IGNvbnRleHQuT2JqZWN0LFxuICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCxcbiAgICAgICAgU3RyaW5nID0gY29udGV4dC5TdHJpbmcsXG4gICAgICAgIFR5cGVFcnJvciA9IGNvbnRleHQuVHlwZUVycm9yO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgYEFycmF5YCBtZXRob2QgcmVmZXJlbmNlcy5cbiAgICAgKlxuICAgICAqIE5vcm1hbGx5IGBBcnJheS5wcm90b3R5cGVgIHdvdWxkIHN1ZmZpY2UsIGhvd2V2ZXIsIHVzaW5nIGFuIGFycmF5IGxpdGVyYWxcbiAgICAgKiBhdm9pZHMgaXNzdWVzIGluIE5hcndoYWwuXG4gICAgICovXG4gICAgdmFyIGFycmF5UmVmID0gW107XG5cbiAgICAvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzICovXG4gICAgdmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICAgICAgc3RyaW5nUHJvdG8gPSBTdHJpbmcucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgbm9Db25mbGljdGAgKi9cbiAgICB2YXIgb2xkRGFzaCA9IGNvbnRleHQuXztcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUgKi9cbiAgICB2YXIgcmVOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgICAgIFN0cmluZyhvYmplY3RQcm90by52YWx1ZU9mKVxuICAgICAgICAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKVxuICAgICAgICAucmVwbGFjZSgvdmFsdWVPZnxmb3IgW15cXF1dKy9nLCAnLis/JykgKyAnJCdcbiAgICApO1xuXG4gICAgLyoqIE5hdGl2ZSBtZXRob2Qgc2hvcnRjdXRzICovXG4gICAgdmFyIGNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIGNsZWFyVGltZW91dCA9IGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjb25jYXQgPSBhcnJheVJlZi5jb25jYXQsXG4gICAgICAgIGZsb29yID0gTWF0aC5mbG9vcixcbiAgICAgICAgZm5Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyxcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YgPSByZU5hdGl2ZS50ZXN0KGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKSAmJiBnZXRQcm90b3R5cGVPZixcbiAgICAgICAgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgICAgcHVzaCA9IGFycmF5UmVmLnB1c2gsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNldEltbWVkaWF0ZSA9IGNvbnRleHQuc2V0SW1tZWRpYXRlLFxuICAgICAgICBzZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0LFxuICAgICAgICB0b1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyogTmF0aXZlIG1ldGhvZCBzaG9ydGN1dHMgZm9yIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMgKi9cbiAgICB2YXIgbmF0aXZlQmluZCA9IHJlTmF0aXZlLnRlc3QobmF0aXZlQmluZCA9IHRvU3RyaW5nLmJpbmQpICYmIG5hdGl2ZUJpbmQsXG4gICAgICAgIG5hdGl2ZUNyZWF0ZSA9IHJlTmF0aXZlLnRlc3QobmF0aXZlQ3JlYXRlID0gIE9iamVjdC5jcmVhdGUpICYmIG5hdGl2ZUNyZWF0ZSxcbiAgICAgICAgbmF0aXZlSXNBcnJheSA9IHJlTmF0aXZlLnRlc3QobmF0aXZlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkpICYmIG5hdGl2ZUlzQXJyYXksXG4gICAgICAgIG5hdGl2ZUlzRmluaXRlID0gY29udGV4dC5pc0Zpbml0ZSxcbiAgICAgICAgbmF0aXZlSXNOYU4gPSBjb250ZXh0LmlzTmFOLFxuICAgICAgICBuYXRpdmVLZXlzID0gcmVOYXRpdmUudGVzdChuYXRpdmVLZXlzID0gT2JqZWN0LmtleXMpICYmIG5hdGl2ZUtleXMsXG4gICAgICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgICAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbixcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlU2xpY2UgPSBhcnJheVJlZi5zbGljZTtcblxuICAgIC8qKiBEZXRlY3QgdmFyaW91cyBlbnZpcm9ubWVudHMgKi9cbiAgICB2YXIgaXNJZU9wZXJhID0gcmVOYXRpdmUudGVzdChjb250ZXh0LmF0dGFjaEV2ZW50KSxcbiAgICAgICAgaXNWOCA9IG5hdGl2ZUJpbmQgJiYgIS9cXG58dHJ1ZS8udGVzdChuYXRpdmVCaW5kICsgaXNJZU9wZXJhKTtcblxuICAgIC8qKiBVc2VkIHRvIGxvb2t1cCBhIGJ1aWx0LWluIGNvbnN0cnVjdG9yIGJ5IFtbQ2xhc3NdXSAqL1xuICAgIHZhciBjdG9yQnlDbGFzcyA9IHt9O1xuICAgIGN0b3JCeUNsYXNzW2FycmF5Q2xhc3NdID0gQXJyYXk7XG4gICAgY3RvckJ5Q2xhc3NbYm9vbENsYXNzXSA9IEJvb2xlYW47XG4gICAgY3RvckJ5Q2xhc3NbZGF0ZUNsYXNzXSA9IERhdGU7XG4gICAgY3RvckJ5Q2xhc3NbZnVuY0NsYXNzXSA9IEZ1bmN0aW9uO1xuICAgIGN0b3JCeUNsYXNzW29iamVjdENsYXNzXSA9IE9iamVjdDtcbiAgICBjdG9yQnlDbGFzc1tudW1iZXJDbGFzc10gPSBOdW1iZXI7XG4gICAgY3RvckJ5Q2xhc3NbcmVnZXhwQ2xhc3NdID0gUmVnRXhwO1xuICAgIGN0b3JCeUNsYXNzW3N0cmluZ0NsYXNzXSA9IFN0cmluZztcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCwgd2hpY2ggd3JhcHMgdGhlIGdpdmVuIGB2YWx1ZWAsIHRvIGVuYWJsZSBtZXRob2RcbiAgICAgKiBjaGFpbmluZy5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIExvLURhc2ggbWV0aG9kcywgd3JhcHBlcnMgYWxzbyBoYXZlIHRoZSBmb2xsb3dpbmcgYEFycmF5YCBtZXRob2RzOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGByZXZlcnNlYCwgYHNoaWZ0YCwgYHNsaWNlYCwgYHNvcnRgLCBgc3BsaWNlYCxcbiAgICAgKiBhbmQgYHVuc2hpZnRgXG4gICAgICpcbiAgICAgKiBDaGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgdmFsdWVgIG1ldGhvZCBpc1xuICAgICAqIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXG4gICAgICpcbiAgICAgKiBUaGUgY2hhaW5hYmxlIHdyYXBwZXIgZnVuY3Rpb25zIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXNzaWduYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNoYWluYCwgYGNvbXBhY3RgLFxuICAgICAqIGBjb21wb3NlYCwgYGNvbmNhdGAsIGBjb3VudEJ5YCwgYGNyZWF0ZUNhbGxiYWNrYCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCxcbiAgICAgKiBgZGVmZXJgLCBgZGVsYXlgLCBgZGlmZmVyZW5jZWAsIGBmaWx0ZXJgLCBgZmxhdHRlbmAsIGBmb3JFYWNoYCwgYGZvckluYCxcbiAgICAgKiBgZm9yT3duYCwgYGZ1bmN0aW9uc2AsIGBncm91cEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludmVydGAsXG4gICAgICogYGludm9rZWAsIGBrZXlzYCwgYG1hcGAsIGBtYXhgLCBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtaW5gLCBgb2JqZWN0YCwgYG9taXRgLFxuICAgICAqIGBvbmNlYCwgYHBhaXJzYCwgYHBhcnRpYWxgLCBgcGFydGlhbFJpZ2h0YCwgYHBpY2tgLCBgcGx1Y2tgLCBgcHVzaGAsIGByYW5nZWAsXG4gICAgICogYHJlamVjdGAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2h1ZmZsZWAsIGBzbGljZWAsIGBzb3J0YCwgYHNvcnRCeWAsIGBzcGxpY2VgLFxuICAgICAqIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGltZXNgLCBgdG9BcnJheWAsIGB0cmFuc2Zvcm1gLCBgdW5pb25gLCBgdW5pcWAsIGB1bnNoaWZ0YCxcbiAgICAgKiBgdW56aXBgLCBgdmFsdWVzYCwgYHdoZXJlYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGFuZCBgemlwYFxuICAgICAqXG4gICAgICogVGhlIG5vbi1jaGFpbmFibGUgd3JhcHBlciBmdW5jdGlvbnMgYXJlOlxuICAgICAqIGBjbG9uZWAsIGBjbG9uZURlZXBgLCBgY29udGFpbnNgLCBgZXNjYXBlYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgaGFzYCxcbiAgICAgKiBgaWRlbnRpdHlgLCBgaW5kZXhPZmAsIGBpc0FyZ3VtZW50c2AsIGBpc0FycmF5YCwgYGlzQm9vbGVhbmAsIGBpc0RhdGVgLFxuICAgICAqIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCwgYGlzRmluaXRlYCwgYGlzRnVuY3Rpb25gLCBgaXNOYU5gLFxuICAgICAqIGBpc051bGxgLCBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNQbGFpbk9iamVjdGAsIGBpc1JlZ0V4cGAsIGBpc1N0cmluZ2AsXG4gICAgICogYGlzVW5kZWZpbmVkYCwgYGpvaW5gLCBgbGFzdEluZGV4T2ZgLCBgbWl4aW5gLCBgbm9Db25mbGljdGAsIGBwYXJzZUludGAsXG4gICAgICogYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCwgYHJlc3VsdGAsIGBzaGlmdGAsIGBzaXplYCwgYHNvbWVgLFxuICAgICAqIGBzb3J0ZWRJbmRleGAsIGBydW5JbkNvbnRleHRgLCBgdGVtcGxhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBhbmQgYHZhbHVlYFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgZnVuY3Rpb25zIGBmaXJzdGAgYW5kIGBsYXN0YCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgd2hlbiBgbmAgaXNcbiAgICAgKiBwYXNzZWQsIG90aGVyd2lzZSB0aGV5IHJldHVybiB1bndyYXBwZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQG5hbWUgX1xuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBhbGlhcyBjaGFpblxuICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZ1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIHJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlXG4gICAgICogd3JhcHBlZC5yZWR1Y2UoZnVuY3Rpb24oc3VtLCBudW0pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBudW07XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gNlxuICAgICAqXG4gICAgICogLy8gcmV0dXJucyBhIHdyYXBwZWQgdmFsdWVcbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKGZ1bmN0aW9uKG51bSkge1xuICAgICAqICAgcmV0dXJuIG51bSAqIG51bTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICAgICAgLy8gZG9uJ3Qgd3JhcCBpZiBhbHJlYWR5IHdyYXBwZWQsIGV2ZW4gaWYgd3JhcHBlZCBieSBhIGRpZmZlcmVudCBgbG9kYXNoYCBjb25zdHJ1Y3RvclxuICAgICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgIWlzQXJyYXkodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKVxuICAgICAgID8gdmFsdWVcbiAgICAgICA6IG5ldyBsb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZhc3QgcGF0aCBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2hXcmFwcGVyKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIGVuc3VyZSBgbmV3IGxvZGFzaFdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBsb2Rhc2hgXG4gICAgbG9kYXNoV3JhcHBlci5wcm90b3R5cGUgPSBsb2Rhc2gucHJvdG90eXBlO1xuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHVzZWQgdG8gZmxhZyBlbnZpcm9ubWVudHMgZmVhdHVyZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgKi9cbiAgICB2YXIgc3VwcG9ydCA9IGxvZGFzaC5zdXBwb3J0ID0ge307XG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgaWYgYEZ1bmN0aW9uI2JpbmRgIGV4aXN0cyBhbmQgaXMgaW5mZXJyZWQgdG8gYmUgZmFzdCAoYWxsIGJ1dCBWOCkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0XG4gICAgICogQHR5cGUgQm9vbGVhblxuICAgICAqL1xuICAgIHN1cHBvcnQuZmFzdEJpbmQgPSBuYXRpdmVCaW5kICYmICFpc1Y4O1xuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIHRlbXBsYXRlIGRlbGltaXRlcnMgdXNlZCBieSBMby1EYXNoIGFyZSBzaW1pbGFyIHRvIHRob3NlIGluXG4gICAgICogZW1iZWRkZWQgUnVieSAoRVJCKS4gQ2hhbmdlIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlXG4gICAgICogZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAqL1xuICAgIGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzID0ge1xuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIFJlZ0V4cFxuICAgICAgICovXG4gICAgICAnZXNjYXBlJzogLzwlLShbXFxzXFxTXSs/KSU+L2csXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUgUmVnRXhwXG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IC88JShbXFxzXFxTXSs/KSU+L2csXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUgUmVnRXhwXG4gICAgICAgKi9cbiAgICAgICdpbnRlcnBvbGF0ZSc6IHJlSW50ZXJwb2xhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byByZWZlcmVuY2UgdGhlIGRhdGEgb2JqZWN0IGluIHRoZSB0ZW1wbGF0ZSB0ZXh0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIFN0cmluZ1xuICAgICAgICovXG4gICAgICAndmFyaWFibGUnOiAnJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgJ18nOiBsb2Rhc2hcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nXG4gICAgICogb2YgYHRoaXNBcmdgIGFuZCBwcmVwZW5kcyBhbnkgYHBhcnRpYWxBcmdzYCB0byB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVcbiAgICAgKiBib3VuZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQgb3IgdGhlIG1ldGhvZCBuYW1lLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxBcmdzIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2lkaWNhdG9yXSBVc2VkIHRvIGluZGljYXRlIGJpbmRpbmcgYnkga2V5IG9yIHBhcnRpYWxseVxuICAgICAqICBhcHBseWluZyBhcmd1bWVudHMgZnJvbSB0aGUgcmlnaHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQm91bmQoZnVuYywgdGhpc0FyZywgcGFydGlhbEFyZ3MsIGluZGljYXRvcikge1xuICAgICAgdmFyIGlzRnVuYyA9IGlzRnVuY3Rpb24oZnVuYyksXG4gICAgICAgICAgaXNQYXJ0aWFsID0gIXBhcnRpYWxBcmdzLFxuICAgICAgICAgIGtleSA9IHRoaXNBcmc7XG5cbiAgICAgIC8vIGp1Z2dsZSBhcmd1bWVudHNcbiAgICAgIGlmIChpc1BhcnRpYWwpIHtcbiAgICAgICAgdmFyIHJpZ2h0SW5kaWNhdG9yID0gaW5kaWNhdG9yO1xuICAgICAgICBwYXJ0aWFsQXJncyA9IHRoaXNBcmc7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICghaXNGdW5jKSB7XG4gICAgICAgIGlmICghaW5kaWNhdG9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzQXJnID0gZnVuYztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYm91bmQoKSB7XG4gICAgICAgIC8vIGBGdW5jdGlvbiNiaW5kYCBzcGVjXG4gICAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjMuNC41XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgdGhpc0JpbmRpbmcgPSBpc1BhcnRpYWwgPyB0aGlzIDogdGhpc0FyZztcblxuICAgICAgICBpZiAoIWlzRnVuYykge1xuICAgICAgICAgIGZ1bmMgPSB0aGlzQXJnW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxBcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGFyZ3MgPSBhcmdzLmxlbmd0aFxuICAgICAgICAgICAgPyAoYXJncyA9IG5hdGl2ZVNsaWNlLmNhbGwoYXJncyksIHJpZ2h0SW5kaWNhdG9yID8gYXJncy5jb25jYXQocGFydGlhbEFyZ3MpIDogcGFydGlhbEFyZ3MuY29uY2F0KGFyZ3MpKVxuICAgICAgICAgICAgOiBwYXJ0aWFsQXJncztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICAgICAgLy8gZW5zdXJlIGBuZXcgYm91bmRgIGlzIGFuIGluc3RhbmNlIG9mIGBmdW5jYFxuICAgICAgICAgIHRoaXNCaW5kaW5nID0gY3JlYXRlT2JqZWN0KGZ1bmMucHJvdG90eXBlKTtcblxuICAgICAgICAgIC8vIG1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yXG4gICAgICAgICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTMuMi4yXG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJvdW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBgcHJvdG90eXBlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdChwcm90b3R5cGUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdChwcm90b3R5cGUpID8gbmF0aXZlQ3JlYXRlKHByb3RvdHlwZSkgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBlc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWF0Y2ggVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sQ2hhcihtYXRjaCkge1xuICAgICAgcmV0dXJuIGh0bWxFc2NhcGVzW21hdGNoXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBcImluZGV4T2ZcIiBmdW5jdGlvbi4gSWYgdGhlIGBfLmluZGV4T2ZgIG1ldGhvZCBpc1xuICAgICAqIGN1c3RvbWl6ZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zXG4gICAgICogdGhlIGBiYXNpY0luZGV4T2ZgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIFwiaW5kZXhPZlwiIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzdWx0ID0gbG9kYXNoLmluZGV4T2YpID09PSBpbmRleE9mID8gYmFzaWNJbmRleE9mIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBqdWdnbGVzIGFyZ3VtZW50cywgYWxsb3dpbmcgYXJndW1lbnQgb3ZlcmxvYWRpbmdcbiAgICAgKiBmb3IgYF8uZmxhdHRlbmAgYW5kIGBfLnVuaXFgLCBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBnaXZlbiBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlcmxvYWRXcmFwcGVyKGZ1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihhcnJheSwgZmxhZywgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgICAgLy8ganVnZ2xlIGFyZ3VtZW50c1xuICAgICAgICBpZiAodHlwZW9mIGZsYWcgIT0gJ2Jvb2xlYW4nICYmIGZsYWcgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXNBcmcgPSBjYWxsYmFjaztcbiAgICAgICAgICBjYWxsYmFjayA9ICEodGhpc0FyZyAmJiB0aGlzQXJnW2ZsYWddID09PSBhcnJheSkgPyBmbGFnIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGZsYWcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuYyhhcnJheSwgZmxhZywgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIGBpc1BsYWluT2JqZWN0YCB3aGljaCBjaGVja3MgaWYgYSBnaXZlbiBgdmFsdWVgXG4gICAgICogaXMgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLCBhc3N1bWluZyBvYmplY3RzIGNyZWF0ZWRcbiAgICAgKiBieSB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IgaGF2ZSBubyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFuZCB0aGF0XG4gICAgICogdGhlcmUgYXJlIG5vIGBPYmplY3QucHJvdG90eXBlYCBleHRlbnNpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgYHRydWVgLCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hpbUlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIHZhciBjdG9yLFxuICAgICAgICAgIHJlc3VsdDtcblxuICAgICAgLy8gYXZvaWQgbm9uIE9iamVjdCBvYmplY3RzLCBgYXJndW1lbnRzYCBvYmplY3RzLCBhbmQgRE9NIGVsZW1lbnRzXG4gICAgICBpZiAoISh2YWx1ZSAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBvYmplY3RDbGFzcykgfHxcbiAgICAgICAgICAoY3RvciA9IHZhbHVlLmNvbnN0cnVjdG9yLCBpc0Z1bmN0aW9uKGN0b3IpICYmICEoY3RvciBpbnN0YW5jZW9mIGN0b3IpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBJbiBtb3N0IGVudmlyb25tZW50cyBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcyBhcmUgaXRlcmF0ZWQgYmVmb3JlXG4gICAgICAvLyBpdHMgaW5oZXJpdGVkIHByb3BlcnRpZXMuIElmIHRoZSBsYXN0IGl0ZXJhdGVkIHByb3BlcnR5IGlzIGFuIG9iamVjdCdzXG4gICAgICAvLyBvd24gcHJvcGVydHkgdGhlbiB0aGVyZSBhcmUgbm8gaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgIGZvckluKHZhbHVlLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHJlc3VsdCA9IGtleTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgdW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWF0Y2ggVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sQ2hhcihtYXRjaCkge1xuICAgICAgcmV0dXJuIGh0bWxVbmVzY2FwZXNbbWF0Y2hdO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgYHRydWVgLCBpZiB0aGUgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogKGZ1bmN0aW9uKCkgeyByZXR1cm4gXy5pc0FyZ3VtZW50cyhhcmd1bWVudHMpOyB9KSgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NDbGFzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGB0cnVlYCwgaWYgdGhlIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogKGZ1bmN0aW9uKCkgeyByZXR1cm4gXy5pc0FycmF5KGFyZ3VtZW50cyk7IH0pKCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheSA9IG5hdGl2ZUlzQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBBIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3Qua2V5c2Agd2hpY2ggcHJvZHVjZXMgYW4gYXJyYXkgb2YgdGhlXG4gICAgICogZ2l2ZW4gb2JqZWN0J3Mgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIHZhciBzaGltS2V5cyA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBvYmplY3QsIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGlmICghKG9iamVjdFR5cGVzW3R5cGVvZiBvYmplY3RdKSkgcmV0dXJuIHJlc3VsdDsgICAgXG4gICAgICAgIGZvciAoaW5kZXggaW4gaXRlcmFibGUpIHtcbiAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpdGVyYWJsZSwgaW5kZXgpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChpbmRleCk7ICAgIFxuICAgICAgICAgIH1cbiAgICAgICAgfSAgICBcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBjb21wb3NlZCBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZXlzKHsgJ29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzIH0pO1xuICAgICAqIC8vID0+IFsnb25lJywgJ3R3bycsICd0aHJlZSddIChvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIga2V5cyA9ICFuYXRpdmVLZXlzID8gc2hpbUtleXMgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzOlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBgPmAgY2hhcmFjdGVyIGlzIGVzY2FwZWQgZm9yIHN5bW1ldHJ5LCBjaGFyYWN0ZXJzIGxpa2UgYD5gIGFuZCBgL2BcbiAgICAgKiBkb24ndCByZXF1aXJlIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nIHVubGVzcyB0aGV5J3JlIHBhcnRcbiAgICAgKiBvZiBhIHRhZyBvciBhbiB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogaHR0cDovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvYW1iaWd1b3VzLWFtcGVyc2FuZHMgKHVuZGVyIFwic2VtaS1yZWxhdGVkIGZ1biBmYWN0XCIpXG4gICAgICovXG4gICAgdmFyIGh0bWxFc2NhcGVzID0ge1xuICAgICAgJyYnOiAnJmFtcDsnLFxuICAgICAgJzwnOiAnJmx0OycsXG4gICAgICAnPic6ICcmZ3Q7JyxcbiAgICAgICdcIic6ICcmcXVvdDsnLFxuICAgICAgXCInXCI6ICcmIzM5OydcbiAgICB9O1xuXG4gICAgLyoqIFVzZWQgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMgKi9cbiAgICB2YXIgaHRtbFVuZXNjYXBlcyA9IGludmVydChodG1sRXNjYXBlcyk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0KHMpIHRvIHRoZSBkZXN0aW5hdGlvblxuICAgICAqIG9iamVjdC4gU3Vic2VxdWVudCBzb3VyY2VzIHdpbGwgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzXG4gICAgICogc291cmNlcy4gSWYgYSBgY2FsbGJhY2tgIGZ1bmN0aW9uIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSBleGVjdXRlZCB0byBwcm9kdWNlXG4gICAgICogdGhlIGFzc2lnbmVkIHZhbHVlcy4gVGhlIGBjYWxsYmFja2AgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGhcbiAgICAgKiB0d28gYXJndW1lbnRzOyAob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc291cmNlMSwgc291cmNlMiwgLi4uXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmluZyB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnbmFtZSc6ICdtb2UnIH0sIHsgJ2FnZSc6IDQwIH0pO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnbW9lJywgJ2FnZSc6IDQwIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduLCBmdW5jdGlvbihhLCBiKSB7XG4gICAgICogICByZXR1cm4gdHlwZW9mIGEgPT0gJ3VuZGVmaW5lZCcgPyBiIDogYTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHZhciBmb29kID0geyAnbmFtZSc6ICdhcHBsZScgfTtcbiAgICAgKiBkZWZhdWx0cyhmb29kLCB7ICduYW1lJzogJ2JhbmFuYScsICd0eXBlJzogJ2ZydWl0JyB9KTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2FwcGxlJywgJ3R5cGUnOiAnZnJ1aXQnIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduID0gZnVuY3Rpb24gKG9iamVjdCwgc291cmNlLCBndWFyZCkge1xuICAgICAgdmFyIGluZGV4LCBpdGVyYWJsZSA9IG9iamVjdCwgcmVzdWx0ID0gaXRlcmFibGU7XG4gICAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gcmVzdWx0O1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgYXJnc0luZGV4ID0gMCxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gdHlwZW9mIGd1YXJkID09ICdudW1iZXInID8gMiA6IGFyZ3MubGVuZ3RoO1xuICAgICAgaWYgKGFyZ3NMZW5ndGggPiAzICYmIHR5cGVvZiBhcmdzW2FyZ3NMZW5ndGggLSAyXSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhhcmdzWy0tYXJnc0xlbmd0aCAtIDFdLCBhcmdzW2FyZ3NMZW5ndGgtLV0sIDIpO1xuICAgICAgfSBlbHNlIGlmIChhcmdzTGVuZ3RoID4gMiAmJiB0eXBlb2YgYXJnc1thcmdzTGVuZ3RoIC0gMV0gPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IGFyZ3NbLS1hcmdzTGVuZ3RoXTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgaXRlcmFibGUgPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICAgIGlmIChpdGVyYWJsZSAmJiBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSB7ICAgIFxuICAgICAgICB2YXIgb3duSW5kZXggPSAtMSxcbiAgICAgICAgICAgIG93blByb3BzID0gb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJhYmxlXSAmJiBrZXlzKGl0ZXJhYmxlKSxcbiAgICAgICAgICAgIGxlbmd0aCA9IG93blByb3BzID8gb3duUHJvcHMubGVuZ3RoIDogMDtcblxuICAgICAgICB3aGlsZSAoKytvd25JbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGluZGV4ID0gb3duUHJvcHNbb3duSW5kZXhdO1xuICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBjYWxsYmFjayA/IGNhbGxiYWNrKHJlc3VsdFtpbmRleF0sIGl0ZXJhYmxlW2luZGV4XSkgOiBpdGVyYWJsZVtpbmRleF07ICAgIFxuICAgICAgICB9ICAgIFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdmFsdWVgLiBJZiBgZGVlcGAgaXMgYHRydWVgLCBuZXN0ZWQgb2JqZWN0cyB3aWxsIGFsc29cbiAgICAgKiBiZSBjbG9uZWQsIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgYXNzaWduZWQgYnkgcmVmZXJlbmNlLiBJZiBhIGBjYWxsYmFja2BcbiAgICAgKiBmdW5jdGlvbiBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgZXhlY3V0ZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlcy4gSWZcbiAgICAgKiBgY2FsbGJhY2tgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNsb25pbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtkZWVwPWZhbHNlXSBBIGZsYWcgdG8gaW5kaWNhdGUgYSBkZWVwIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHBhcmFtLSB7QXJyYXl9IFtzdGFja0E9W11dIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtLSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgY2xvbmVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7TWl4ZWR9IFJldHVybnMgdGhlIGNsb25lZCBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc3Rvb2dlcyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnbW9lJywgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICduYW1lJzogJ2xhcnJ5JywgJ2FnZSc6IDUwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKHN0b29nZXMpO1xuICAgICAqIHNoYWxsb3dbMF0gPT09IHN0b29nZXNbMF07XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lKHN0b29nZXMsIHRydWUpO1xuICAgICAqIGRlZXBbMF0gPT09IHN0b29nZXNbMF07XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8ubWl4aW4oe1xuICAgICAqICAgJ2Nsb25lJzogXy5wYXJ0aWFsUmlnaHQoXy5jbG9uZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgICAgcmV0dXJuIF8uaXNFbGVtZW50KHZhbHVlKSA/IHZhbHVlLmNsb25lTm9kZShmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgICogICB9KVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNsb25lID0gXy5jbG9uZShkb2N1bWVudC5ib2R5KTtcbiAgICAgKiBjbG9uZS5jaGlsZE5vZGVzLmxlbmd0aDtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUsIGRlZXAsIGNhbGxiYWNrLCB0aGlzQXJnLCBzdGFja0EsIHN0YWNrQikge1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlO1xuXG4gICAgICAvLyBhbGxvd3Mgd29ya2luZyB3aXRoIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzIHdpdGhvdXQgdXNpbmcgdGhlaXIgYGNhbGxiYWNrYFxuICAgICAgLy8gYXJndW1lbnQsIGBpbmRleHxrZXlgLCBmb3IgdGhpcyBtZXRob2QncyBgY2FsbGJhY2tgXG4gICAgICBpZiAodHlwZW9mIGRlZXAgIT0gJ2Jvb2xlYW4nICYmIGRlZXAgIT0gbnVsbCkge1xuICAgICAgICB0aGlzQXJnID0gY2FsbGJhY2s7XG4gICAgICAgIGNhbGxiYWNrID0gZGVlcDtcbiAgICAgICAgZGVlcCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gKHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQnKVxuICAgICAgICAgID8gY2FsbGJhY2tcbiAgICAgICAgICA6IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMSk7XG5cbiAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgLy8gaW5zcGVjdCBbW0NsYXNzXV1cbiAgICAgIHZhciBpc09iaiA9IGlzT2JqZWN0KHJlc3VsdCk7XG4gICAgICBpZiAoaXNPYmopIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwocmVzdWx0KTtcbiAgICAgICAgaWYgKCFjbG9uZWFibGVDbGFzc2VzW2NsYXNzTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIC8vIHNoYWxsb3cgY2xvbmVcbiAgICAgIGlmICghaXNPYmogfHwgIWRlZXApIHtcbiAgICAgICAgcmV0dXJuIGlzT2JqXG4gICAgICAgICAgPyAoaXNBcnIgPyBzbGljZShyZXN1bHQpIDogYXNzaWduKHt9LCByZXN1bHQpKVxuICAgICAgICAgIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGN0b3IgPSBjdG9yQnlDbGFzc1tjbGFzc05hbWVdO1xuICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSBib29sQ2xhc3M6XG4gICAgICAgIGNhc2UgZGF0ZUNsYXNzOlxuICAgICAgICAgIHJldHVybiBuZXcgY3RvcigrcmVzdWx0KTtcblxuICAgICAgICBjYXNlIG51bWJlckNsYXNzOlxuICAgICAgICBjYXNlIHN0cmluZ0NsYXNzOlxuICAgICAgICAgIHJldHVybiBuZXcgY3RvcihyZXN1bHQpO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwQ2xhc3M6XG4gICAgICAgICAgcmV0dXJuIGN0b3IocmVzdWx0LnNvdXJjZSwgcmVGbGFncy5leGVjKHJlc3VsdCkpO1xuICAgICAgfVxuICAgICAgLy8gY2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBjb3JyZXNwb25kaW5nIGNsb25lXG4gICAgICB2YXIgaW5pdGVkU3RhY2sgPSAhc3RhY2tBO1xuICAgICAgc3RhY2tBIHx8IChzdGFja0EgPSBnZXRBcnJheSgpKTtcbiAgICAgIHN0YWNrQiB8fCAoc3RhY2tCID0gZ2V0QXJyYXkoKSk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdGFja0EubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSB2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBzdGFja0JbbGVuZ3RoXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaW5pdCBjbG9uZWQgb2JqZWN0XG4gICAgICByZXN1bHQgPSBpc0FyciA/IGN0b3IocmVzdWx0Lmxlbmd0aCkgOiB7fTtcblxuICAgICAgLy8gYWRkIGFycmF5IHByb3BlcnRpZXMgYXNzaWduZWQgYnkgYFJlZ0V4cCNleGVjYFxuICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnaW5kZXgnKSkge1xuICAgICAgICAgIHJlc3VsdC5pbmRleCA9IHZhbHVlLmluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnaW5wdXQnKSkge1xuICAgICAgICAgIHJlc3VsdC5pbnB1dCA9IHZhbHVlLmlucHV0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBhZGQgdGhlIHNvdXJjZSB2YWx1ZSB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHNcbiAgICAgIC8vIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCBpdHMgY2xvbmVcbiAgICAgIHN0YWNrQS5wdXNoKHZhbHVlKTtcbiAgICAgIHN0YWNrQi5wdXNoKHJlc3VsdCk7XG5cbiAgICAgIC8vIHJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cylcbiAgICAgIChpc0FyciA/IGZvckVhY2ggOiBmb3JPd24pKHZhbHVlLCBmdW5jdGlvbihvYmpWYWx1ZSwga2V5KSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gY2xvbmUob2JqVmFsdWUsIGRlZXAsIGNhbGxiYWNrLCB1bmRlZmluZWQsIHN0YWNrQSwgc3RhY2tCKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaW5pdGVkU3RhY2spIHtcbiAgICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQSk7XG4gICAgICAgIHJlbGVhc2VBcnJheShzdGFja0IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVlcCBjbG9uZSBvZiBgdmFsdWVgLiBJZiBhIGBjYWxsYmFja2AgZnVuY3Rpb24gaXMgcGFzc2VkLFxuICAgICAqIGl0IHdpbGwgYmUgZXhlY3V0ZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlcy4gSWYgYGNhbGxiYWNrYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGNsb25pbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjYWxsYmFja2BcbiAgICAgKiBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobS4gRnVuY3Rpb25zXG4gICAgICogYW5kIERPTSBub2RlcyBhcmUgKipub3QqKiBjbG9uZWQuIFRoZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhbmRcbiAgICAgKiBvYmplY3RzIGNyZWF0ZWQgYnkgY29uc3RydWN0b3JzIG90aGVyIHRoYW4gYE9iamVjdGAgYXJlIGNsb25lZCB0byBwbGFpbiBgT2JqZWN0YCBvYmplY3RzLlxuICAgICAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9pbmZyYXN0cnVjdHVyZS5odG1sI2ludGVybmFsLXN0cnVjdHVyZWQtY2xvbmluZy1hbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBkZWVwIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge01peGVkfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc3Rvb2dlcyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnbW9lJywgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICduYW1lJzogJ2xhcnJ5JywgJ2FnZSc6IDUwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChzdG9vZ2VzKTtcbiAgICAgKiBkZWVwWzBdID09PSBzdG9vZ2VzWzBdO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgdmlldyA9IHtcbiAgICAgKiAgICdsYWJlbCc6ICdkb2NzJyxcbiAgICAgKiAgICdub2RlJzogZWxlbWVudFxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY2xvbmUgPSBfLmNsb25lRGVlcCh2aWV3LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNFbGVtZW50KHZhbHVlKSA/IHZhbHVlLmNsb25lTm9kZSh0cnVlKSA6IHVuZGVmaW5lZDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNsb25lLm5vZGUgPT0gdmlldy5ub2RlO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIGNsb25lKHZhbHVlLCB0cnVlLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3QocykgdG8gdGhlIGRlc3RpbmF0aW9uXG4gICAgICogb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIE9uY2UgYVxuICAgICAqIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCBkZWZhdWx0cyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc291cmNlMSwgc291cmNlMiwgLi4uXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEFsbG93cyB3b3JraW5nIHdpdGggYF8ucmVkdWNlYCB3aXRob3V0IHVzaW5nIGl0c1xuICAgICAqICBjYWxsYmFjaydzIGBrZXlgIGFuZCBgb2JqZWN0YCBhcmd1bWVudHMgYXMgc291cmNlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmb29kID0geyAnbmFtZSc6ICdhcHBsZScgfTtcbiAgICAgKiBfLmRlZmF1bHRzKGZvb2QsIHsgJ25hbWUnOiAnYmFuYW5hJywgJ3R5cGUnOiAnZnJ1aXQnIH0pO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYXBwbGUnLCAndHlwZSc6ICdmcnVpdCcgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGZ1bmN0aW9uIChvYmplY3QsIHNvdXJjZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBvYmplY3QsIHJlc3VsdCA9IGl0ZXJhYmxlO1xuICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgIGFyZ3NJbmRleCA9IDAsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IHR5cGVvZiBndWFyZCA9PSAnbnVtYmVyJyA/IDIgOiBhcmdzLmxlbmd0aDtcbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgaXRlcmFibGUgPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICAgIGlmIChpdGVyYWJsZSAmJiBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSB7ICAgIFxuICAgICAgICB2YXIgb3duSW5kZXggPSAtMSxcbiAgICAgICAgICAgIG93blByb3BzID0gb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJhYmxlXSAmJiBrZXlzKGl0ZXJhYmxlKSxcbiAgICAgICAgICAgIGxlbmd0aCA9IG93blByb3BzID8gb3duUHJvcHMubGVuZ3RoIDogMDtcblxuICAgICAgICB3aGlsZSAoKytvd25JbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGluZGV4ID0gb3duUHJvcHNbb3duSW5kZXhdO1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0W2luZGV4XSA9PSAndW5kZWZpbmVkJykgcmVzdWx0W2luZGV4XSA9IGl0ZXJhYmxlW2luZGV4XTsgICAgXG4gICAgICAgIH0gICAgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBgXy5maW5kYCwgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZVxuICAgICAqIGVsZW1lbnQgdGhhdCBwYXNzZXMgdGhlIGNhbGxiYWNrIGNoZWNrLCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxTdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXJcbiAgICAgKiAgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHBhc3NlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZVxuICAgICAqICBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtNaXhlZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRLZXkoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzLCAnZCc6IDQgfSwgZnVuY3Rpb24obnVtKSB7XG4gICAgICogICByZXR1cm4gbnVtICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgIGZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGtleSwgb2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdCA9IGtleTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGBvYmplY3RgJ3Mgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLCBleGVjdXRpbmdcbiAgICAgKiB0aGUgYGNhbGxiYWNrYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGBjYWxsYmFja2AgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZFxuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBDYWxsYmFja3MgbWF5IGV4aXQgaXRlcmF0aW9uXG4gICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBEb2cobmFtZSkge1xuICAgICAqICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBEb2cucHJvdG90eXBlLmJhcmsgPSBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGFsZXJ0KCdXb29mLCB3b29mIScpO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZvckluKG5ldyBEb2coJ0RhZ255JyksIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGFsZXJ0KGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gYWxlcnRzICduYW1lJyBhbmQgJ2JhcmsnIChvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgZm9ySW4gPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBjb2xsZWN0aW9uLCByZXN1bHQgPSBpdGVyYWJsZTtcbiAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1bHQ7XG4gICAgICBpZiAoIW9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHJldHVybiByZXN1bHQ7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQnID8gY2FsbGJhY2sgOiBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcpOyAgICBcbiAgICAgICAgZm9yIChpbmRleCBpbiBpdGVyYWJsZSkge1xuICAgICAgICAgIGlmIChjYWxsYmFjayhpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2UpIHJldHVybiByZXN1bHQ7ICAgIFxuICAgICAgICB9ICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGFuIG9iamVjdCdzIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMsIGV4ZWN1dGluZyB0aGUgYGNhbGxiYWNrYFxuICAgICAqIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBrZXksIG9iamVjdCkuIENhbGxiYWNrcyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseVxuICAgICAqIHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yT3duKHsgJzAnOiAnemVybycsICcxJzogJ29uZScsICdsZW5ndGgnOiAyIH0sIGZ1bmN0aW9uKG51bSwga2V5KSB7XG4gICAgICogICBhbGVydChrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IGFsZXJ0cyAnMCcsICcxJywgYW5kICdsZW5ndGgnIChvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgZm9yT3duID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gY29sbGVjdGlvbiwgcmVzdWx0ID0gaXRlcmFibGU7XG4gICAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gcmVzdWx0O1xuICAgICAgaWYgKCFvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSByZXR1cm4gcmVzdWx0O1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAmJiB0eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrIDogbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTsgICAgXG4gICAgICAgIHZhciBvd25JbmRleCA9IC0xLFxuICAgICAgICAgICAgb3duUHJvcHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdICYmIGtleXMoaXRlcmFibGUpLFxuICAgICAgICAgICAgbGVuZ3RoID0gb3duUHJvcHMgPyBvd25Qcm9wcy5sZW5ndGggOiAwO1xuXG4gICAgICAgIHdoaWxlICgrK293bkluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaW5kZXggPSBvd25Qcm9wc1tvd25JbmRleF07XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rpb24pID09PSBmYWxzZSkgcmV0dXJuIHJlc3VsdDsgICAgXG4gICAgICAgIH0gICAgXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzb3J0ZWQgYXJyYXkgb2YgYWxsIGVudW1lcmFibGUgcHJvcGVydGllcywgb3duIGFuZCBpbmhlcml0ZWQsXG4gICAgICogb2YgYG9iamVjdGAgdGhhdCBoYXZlIGZ1bmN0aW9uIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBtZXRob2RzXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdGhhdCBoYXZlIGZ1bmN0aW9uIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnMoXyk7XG4gICAgICogLy8gPT4gWydhbGwnLCAnYW55JywgJ2JpbmQnLCAnYmluZEFsbCcsICdjbG9uZScsICdjb21wYWN0JywgJ2NvbXBvc2UnLCAuLi5dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGBwcm9wZXJ0eWAgZXhpc3RzIGFuZCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSxcbiAgICAgKiBpbnN0ZWFkIG9mIGFuIGluaGVyaXRlZCBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBrZXkgaXMgYSBkaXJlY3QgcHJvcGVydHksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5oYXMoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sICdiJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID8gaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIGdpdmVuIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNyZWF0ZWQgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAgXy5pbnZlcnQoeyAnZmlyc3QnOiAnbW9lJywgJ3NlY29uZCc6ICdsYXJyeScgfSk7XG4gICAgICogLy8gPT4geyAnbW9lJzogJ2ZpcnN0JywgJ2xhcnJ5JzogJ3NlY29uZCcgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGludmVydChvYmplY3QpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHByb3BzID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W29iamVjdFtrZXldXSA9IGtleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuIHZhbHVlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgYHRydWVgLCBpZiB0aGUgYHZhbHVlYCBpcyBhIGJvb2xlYW4gdmFsdWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYm9vbENsYXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZGF0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGB0cnVlYCwgaWYgdGhlIGB2YWx1ZWAgaXMgYSBkYXRlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPyAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IGRhdGVDbGFzcykgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgYHRydWVgLCBpZiB0aGUgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlLm5vZGVUeXBlID09PSAxIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZW1wdHkuIEFycmF5cywgc3RyaW5ncywgb3IgYGFyZ3VtZW50c2Agb2JqZWN0cyB3aXRoIGFcbiAgICAgKiBsZW5ndGggb2YgYDBgIGFuZCBvYmplY3RzIHdpdGggbm8gb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgY29uc2lkZXJlZFxuICAgICAqIFwiZW1wdHlcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8U3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgnJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwodmFsdWUpLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgaWYgKChjbGFzc05hbWUgPT0gYXJyYXlDbGFzcyB8fCBjbGFzc05hbWUgPT0gc3RyaW5nQ2xhc3MgfHwgY2xhc3NOYW1lID09IGFyZ3NDbGFzcyApIHx8XG4gICAgICAgICAgKGNsYXNzTmFtZSA9PSBvYmplY3RDbGFzcyAmJiB0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInICYmIGlzRnVuY3Rpb24odmFsdWUuc3BsaWNlKSkpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3JPd24odmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKHJlc3VsdCA9IGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlXG4gICAgICogZXF1aXZhbGVudCB0byBlYWNoIG90aGVyLiBJZiBgY2FsbGJhY2tgIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSBleGVjdXRlZCB0b1xuICAgICAqIGNvbXBhcmUgdmFsdWVzLiBJZiBgY2FsbGJhY2tgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zIHdpbGwgYmUgaGFuZGxlZFxuICAgICAqIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjYWxsYmFja2AgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGhcbiAgICAgKiB0d28gYXJndW1lbnRzOyAoYSwgYikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGEgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gYiBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaW5nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHBhcmFtLSB7QXJyYXl9IFtzdGFja0E9W11dIFRyYWNrcyB0cmF2ZXJzZWQgYGFgIG9iamVjdHMuXG4gICAgICogQHBhcmFtLSB7QXJyYXl9IFtzdGFja0I9W11dIFRyYWNrcyB0cmF2ZXJzZWQgYGJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgYHRydWVgLCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBtb2UgPSB7ICduYW1lJzogJ21vZScsICdhZ2UnOiA0MCB9O1xuICAgICAqIHZhciBjb3B5ID0geyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfTtcbiAgICAgKlxuICAgICAqIG1vZSA9PSBjb3B5O1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWwobW9lLCBjb3B5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgd29yZHMgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXJXb3JkcyA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKHdvcmRzLCBvdGhlcldvcmRzLCBmdW5jdGlvbihhLCBiKSB7XG4gICAgICogICB2YXIgcmVHcmVldCA9IC9eKD86aGVsbG98aGkpJC9pLFxuICAgICAqICAgICAgIGFHcmVldCA9IF8uaXNTdHJpbmcoYSkgJiYgcmVHcmVldC50ZXN0KGEpLFxuICAgICAqICAgICAgIGJHcmVldCA9IF8uaXNTdHJpbmcoYikgJiYgcmVHcmVldC50ZXN0KGIpO1xuICAgICAqXG4gICAgICogICByZXR1cm4gKGFHcmVldCB8fCBiR3JlZXQpID8gKGFHcmVldCA9PSBiR3JlZXQpIDogdW5kZWZpbmVkO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKGEsIGIsIGNhbGxiYWNrLCB0aGlzQXJnLCBzdGFja0EsIHN0YWNrQikge1xuICAgICAgLy8gdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHdoZW4gY29tcGFyaW5nIG9iamVjdHMsIGBhYCBoYXMgYXQgbGVhc3QgdGhlIHByb3BlcnRpZXMgb2YgYGJgXG4gICAgICB2YXIgd2hlcmVJbmRpY2F0b3IgPSBjYWxsYmFjayA9PT0gaW5kaWNhdG9yT2JqZWN0O1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICYmICF3aGVyZUluZGljYXRvcikge1xuICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMik7XG4gICAgICAgIHZhciByZXN1bHQgPSBjYWxsYmFjayhhLCBiKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGV4aXQgZWFybHkgZm9yIGlkZW50aWNhbCB2YWx1ZXNcbiAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIC8vIHRyZWF0IGArMGAgdnMuIGAtMGAgYXMgbm90IGVxdWFsXG4gICAgICAgIHJldHVybiBhICE9PSAwIHx8ICgxIC8gYSA9PSAxIC8gYik7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBhLFxuICAgICAgICAgIG90aGVyVHlwZSA9IHR5cGVvZiBiO1xuXG4gICAgICAvLyBleGl0IGVhcmx5IGZvciB1bmxpa2UgcHJpbWl0aXZlIHZhbHVlc1xuICAgICAgaWYgKGEgPT09IGEgJiZcbiAgICAgICAgICAoIWEgfHwgKHR5cGUgIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlICE9ICdvYmplY3QnKSkgJiZcbiAgICAgICAgICAoIWIgfHwgKG90aGVyVHlwZSAhPSAnZnVuY3Rpb24nICYmIG90aGVyVHlwZSAhPSAnb2JqZWN0JykpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIGV4aXQgZWFybHkgZm9yIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAsIGF2b2lkaW5nIEVTMydzIEZ1bmN0aW9uI2NhbGwgYmVoYXZpb3JcbiAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjMuNC40XG4gICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH1cbiAgICAgIC8vIGNvbXBhcmUgW1tDbGFzc11dIG5hbWVzXG4gICAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChhKSxcbiAgICAgICAgICBvdGhlckNsYXNzID0gdG9TdHJpbmcuY2FsbChiKTtcblxuICAgICAgaWYgKGNsYXNzTmFtZSA9PSBhcmdzQ2xhc3MpIHtcbiAgICAgICAgY2xhc3NOYW1lID0gb2JqZWN0Q2xhc3M7XG4gICAgICB9XG4gICAgICBpZiAob3RoZXJDbGFzcyA9PSBhcmdzQ2xhc3MpIHtcbiAgICAgICAgb3RoZXJDbGFzcyA9IG9iamVjdENsYXNzO1xuICAgICAgfVxuICAgICAgaWYgKGNsYXNzTmFtZSAhPSBvdGhlckNsYXNzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGNhc2UgYm9vbENsYXNzOlxuICAgICAgICBjYXNlIGRhdGVDbGFzczpcbiAgICAgICAgICAvLyBjb2VyY2UgZGF0ZXMgYW5kIGJvb2xlYW5zIHRvIG51bWJlcnMsIGRhdGVzIHRvIG1pbGxpc2Vjb25kcyBhbmQgYm9vbGVhbnNcbiAgICAgICAgICAvLyB0byBgMWAgb3IgYDBgLCB0cmVhdGluZyBpbnZhbGlkIGRhdGVzIGNvZXJjZWQgdG8gYE5hTmAgYXMgbm90IGVxdWFsXG4gICAgICAgICAgcmV0dXJuICthID09ICtiO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyQ2xhc3M6XG4gICAgICAgICAgLy8gdHJlYXQgYE5hTmAgdnMuIGBOYU5gIGFzIGVxdWFsXG4gICAgICAgICAgcmV0dXJuIChhICE9ICthKVxuICAgICAgICAgICAgPyBiICE9ICtiXG4gICAgICAgICAgICAvLyBidXQgdHJlYXQgYCswYCB2cy4gYC0wYCBhcyBub3QgZXF1YWxcbiAgICAgICAgICAgIDogKGEgPT0gMCA/ICgxIC8gYSA9PSAxIC8gYikgOiBhID09ICtiKTtcblxuICAgICAgICBjYXNlIHJlZ2V4cENsYXNzOlxuICAgICAgICBjYXNlIHN0cmluZ0NsYXNzOlxuICAgICAgICAgIC8vIGNvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgKGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjEwLjYuNClcbiAgICAgICAgICAvLyB0cmVhdCBzdHJpbmcgcHJpbWl0aXZlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvYmplY3QgaW5zdGFuY2VzIGFzIGVxdWFsXG4gICAgICAgICAgcmV0dXJuIGEgPT0gU3RyaW5nKGIpO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gY2xhc3NOYW1lID09IGFycmF5Q2xhc3M7XG4gICAgICBpZiAoIWlzQXJyKSB7XG4gICAgICAgIC8vIHVud3JhcCBhbnkgYGxvZGFzaGAgd3JhcHBlZCB2YWx1ZXNcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYSwgJ19fd3JhcHBlZF9fICcpIHx8IGhhc093blByb3BlcnR5LmNhbGwoYiwgJ19fd3JhcHBlZF9fJykpIHtcbiAgICAgICAgICByZXR1cm4gaXNFcXVhbChhLl9fd3JhcHBlZF9fIHx8IGEsIGIuX193cmFwcGVkX18gfHwgYiwgY2FsbGJhY2ssIHRoaXNBcmcsIHN0YWNrQSwgc3RhY2tCKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleGl0IGZvciBmdW5jdGlvbnMgYW5kIERPTSBub2Rlc1xuICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG9iamVjdENsYXNzKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluIG9sZGVyIHZlcnNpb25zIG9mIE9wZXJhLCBgYXJndW1lbnRzYCBvYmplY3RzIGhhdmUgYEFycmF5YCBjb25zdHJ1Y3RvcnNcbiAgICAgICAgdmFyIGN0b3JBID0gYS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIGN0b3JCID0gYi5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBub24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbFxuICAgICAgICBpZiAoY3RvckEgIT0gY3RvckIgJiYgIShcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihjdG9yQSkgJiYgY3RvckEgaW5zdGFuY2VvZiBjdG9yQSAmJlxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGN0b3JCKSAmJiBjdG9yQiBpbnN0YW5jZW9mIGN0b3JCXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBhc3N1bWUgY3ljbGljIHN0cnVjdHVyZXMgYXJlIGVxdWFsXG4gICAgICAvLyB0aGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljIHN0cnVjdHVyZXMgaXMgYWRhcHRlZCBmcm9tIEVTIDUuMVxuICAgICAgLy8gc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBvcGVyYXRpb24gYEpPYCAoaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMTIuMylcbiAgICAgIHZhciBpbml0ZWRTdGFjayA9ICFzdGFja0E7XG4gICAgICBzdGFja0EgfHwgKHN0YWNrQSA9IGdldEFycmF5KCkpO1xuICAgICAgc3RhY2tCIHx8IChzdGFja0IgPSBnZXRBcnJheSgpKTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IGEpIHtcbiAgICAgICAgICByZXR1cm4gc3RhY2tCW2xlbmd0aF0gPT0gYjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHNpemUgPSAwO1xuICAgICAgcmVzdWx0ID0gdHJ1ZTtcblxuICAgICAgLy8gYWRkIGBhYCBhbmQgYGJgIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0c1xuICAgICAgc3RhY2tBLnB1c2goYSk7XG4gICAgICBzdGFja0IucHVzaChiKTtcblxuICAgICAgLy8gcmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKVxuICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgICBzaXplID0gYi5sZW5ndGg7XG5cbiAgICAgICAgLy8gY29tcGFyZSBsZW5ndGhzIHRvIGRldGVybWluZSBpZiBhIGRlZXAgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnlcbiAgICAgICAgcmVzdWx0ID0gc2l6ZSA9PSBhLmxlbmd0aDtcbiAgICAgICAgaWYgKCFyZXN1bHQgJiYgIXdoZXJlSW5kaWNhdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBkZWVwIGNvbXBhcmUgdGhlIGNvbnRlbnRzLCBpZ25vcmluZyBub24tbnVtZXJpYyBwcm9wZXJ0aWVzXG4gICAgICAgIHdoaWxlIChzaXplLS0pIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICAgIHZhbHVlID0gYltzaXplXTtcblxuICAgICAgICAgIGlmICh3aGVyZUluZGljYXRvcikge1xuICAgICAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSBpc0VxdWFsKGFbaW5kZXhdLCB2YWx1ZSwgY2FsbGJhY2ssIHRoaXNBcmcsIHN0YWNrQSwgc3RhY2tCKSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIShyZXN1bHQgPSBpc0VxdWFsKGFbc2l6ZV0sIHZhbHVlLCBjYWxsYmFjaywgdGhpc0FyZywgc3RhY2tBLCBzdGFja0IpKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBkZWVwIGNvbXBhcmUgb2JqZWN0cyB1c2luZyBgZm9ySW5gLCBpbnN0ZWFkIG9mIGBmb3JPd25gLCB0byBhdm9pZCBgT2JqZWN0LmtleXNgXG4gICAgICAvLyB3aGljaCwgaW4gdGhpcyBjYXNlLCBpcyBtb3JlIGNvc3RseVxuICAgICAgZm9ySW4oYiwgZnVuY3Rpb24odmFsdWUsIGtleSwgYikge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSB7XG4gICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzLlxuICAgICAgICAgIHNpemUrKztcbiAgICAgICAgICAvLyBkZWVwIGNvbXBhcmUgZWFjaCBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgICAgICByZXR1cm4gKHJlc3VsdCA9IGhhc093blByb3BlcnR5LmNhbGwoYSwga2V5KSAmJiBpc0VxdWFsKGFba2V5XSwgdmFsdWUsIGNhbGxiYWNrLCB0aGlzQXJnLCBzdGFja0EsIHN0YWNrQikpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3VsdCAmJiAhd2hlcmVJbmRpY2F0b3IpIHtcbiAgICAgICAgLy8gZW5zdXJlIGJvdGggb2JqZWN0cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzXG4gICAgICAgIGZvckluKGEsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGEpIHtcbiAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhLCBrZXkpKSB7XG4gICAgICAgICAgICAvLyBgc2l6ZWAgd2lsbCBiZSBgLTFgIGlmIGBhYCBoYXMgbW9yZSBwcm9wZXJ0aWVzIHRoYW4gYGJgXG4gICAgICAgICAgICByZXR1cm4gKHJlc3VsdCA9IC0tc2l6ZSA+IC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGluaXRlZFN0YWNrKSB7XG4gICAgICAgIHJlbGVhc2VBcnJheShzdGFja0EpO1xuICAgICAgICByZWxlYXNlQXJyYXkoc3RhY2tCKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMsIG9yIGNhbiBiZSBjb2VyY2VkIHRvLCBhIGZpbml0ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBuYXRpdmUgYGlzRmluaXRlYCwgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBmb3JcbiAgICAgKiBib29sZWFucyBhbmQgZW1wdHkgc3RyaW5ncy4gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjEuMi41LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgYHRydWVgLCBpZiB0aGUgYHZhbHVlYCBpcyBmaW5pdGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgtMTAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKCcxMCcpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUodHJ1ZSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoJycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gbmF0aXZlSXNGaW5pdGUodmFsdWUpICYmICFuYXRpdmVJc05hTihwYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGB0cnVlYCwgaWYgdGhlIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGUgbGFuZ3VhZ2UgdHlwZSBvZiBPYmplY3QuXG4gICAgICogKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdCgxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGUgdmFsdWUgaXMgdGhlIEVDTUFTY3JpcHQgbGFuZ3VhZ2UgdHlwZSBvZiBPYmplY3RcbiAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDhcbiAgICAgIC8vIGFuZCBhdm9pZCBhIFY4IGJ1Z1xuICAgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MVxuICAgICAgcmV0dXJuICEhKHZhbHVlICYmIG9iamVjdFR5cGVzW3R5cGVvZiB2YWx1ZV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgbmF0aXZlIGBpc05hTmAsIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBhbmQgb3RoZXIgdmFsdWVzLiBTZWUgaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMS4yLjQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4oTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgICAgLy8gYE5hTmAgYXMgYSBwcmltaXRpdmUgaXMgdGhlIG9ubHkgdmFsdWUgdGhhdCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmXG4gICAgICAvLyAocGVyZm9ybSB0aGUgW1tDbGFzc11dIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWUgaG9zdCBvYmplY3RzIGluIElFKVxuICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBgdmFsdWVgIGlzIGBudWxsYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbCh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBgdmFsdWVgIGlzIGEgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoOC40ICogNSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHRvU3RyaW5nLmNhbGwodmFsdWUpID09IG51bWJlckNsYXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIGB2YWx1ZWAgaXMgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgYHRydWVgLCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIFN0b29nZShuYW1lLCBhZ2UpIHtcbiAgICAgKiAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICogICB0aGlzLmFnZSA9IGFnZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IFN0b29nZSgnbW9lJywgNDApKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICduYW1lJzogJ21vZScsICdhZ2UnOiA0MCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgdmFyIGlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKCEodmFsdWUgJiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gb2JqZWN0Q2xhc3MpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZixcbiAgICAgICAgICBvYmpQcm90byA9IHR5cGVvZiB2YWx1ZU9mID09ICdmdW5jdGlvbicgJiYgKG9ialByb3RvID0gZ2V0UHJvdG90eXBlT2YodmFsdWVPZikpICYmIGdldFByb3RvdHlwZU9mKG9ialByb3RvKTtcblxuICAgICAgcmV0dXJuIG9ialByb3RvXG4gICAgICAgID8gKHZhbHVlID09IG9ialByb3RvIHx8IGdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBvYmpQcm90bylcbiAgICAgICAgOiBzaGltSXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcmVndWxhciBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgYHRydWVgLCBpZiB0aGUgYHZhbHVlYCBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzUmVnRXhwKC9tb2UvKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZWdFeHAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/ICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gcmVnZXhwQ2xhc3MpIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoJ21vZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdDbGFzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGB0cnVlYCwgaWYgdGhlIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVkJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBtZXJnZXMgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiB0aGUgc291cmNlIG9iamVjdChzKSwgdGhhdFxuICAgICAqIGRvbid0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAsIGludG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gU3Vic2VxdWVudCBzb3VyY2VzXG4gICAgICogd2lsbCBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy4gSWYgYSBgY2FsbGJhY2tgIGZ1bmN0aW9uXG4gICAgICogaXMgcGFzc2VkLCBpdCB3aWxsIGJlIGV4ZWN1dGVkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uXG4gICAgICogYW5kIHNvdXJjZSBwcm9wZXJ0aWVzLiBJZiBgY2FsbGJhY2tgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgd2lsbCBiZVxuICAgICAqIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM7IChvYmplY3RWYWx1ZSwgc291cmNlVmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzb3VyY2UxLCBzb3VyY2UyLCAuLi5dIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2luZyBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtkZWVwSW5kaWNhdG9yXSBJbmRpY2F0ZXMgdGhhdCBgc3RhY2tBYCBhbmQgYHN0YWNrQmAgYXJlXG4gICAgICogIGFycmF5cyBvZiB0cmF2ZXJzZWQgb2JqZWN0cywgaW5zdGVhZCBvZiBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0tIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0tIHtBcnJheX0gW3N0YWNrQj1bXV0gQXNzb2NpYXRlcyB2YWx1ZXMgd2l0aCBzb3VyY2UgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG5hbWVzID0ge1xuICAgICAqICAgJ3N0b29nZXMnOiBbXG4gICAgICogICAgIHsgJ25hbWUnOiAnbW9lJyB9LFxuICAgICAqICAgICB7ICduYW1lJzogJ2xhcnJ5JyB9XG4gICAgICogICBdXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBhZ2VzID0ge1xuICAgICAqICAgJ3N0b29nZXMnOiBbXG4gICAgICogICAgIHsgJ2FnZSc6IDQwIH0sXG4gICAgICogICAgIHsgJ2FnZSc6IDUwIH1cbiAgICAgKiAgIF1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZShuYW1lcywgYWdlcyk7XG4gICAgICogLy8gPT4geyAnc3Rvb2dlcyc6IFt7ICduYW1lJzogJ21vZScsICdhZ2UnOiA0MCB9LCB7ICduYW1lJzogJ2xhcnJ5JywgJ2FnZSc6IDUwIH1dIH1cbiAgICAgKlxuICAgICAqIHZhciBmb29kID0ge1xuICAgICAqICAgJ2ZydWl0cyc6IFsnYXBwbGUnXSxcbiAgICAgKiAgICd2ZWdldGFibGVzJzogWydiZWV0J11cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIG90aGVyRm9vZCA9IHtcbiAgICAgKiAgICdmcnVpdHMnOiBbJ2JhbmFuYSddLFxuICAgICAqICAgJ3ZlZ2V0YWJsZXMnOiBbJ2NhcnJvdCddXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2UoZm9vZCwgb3RoZXJGb29kLCBmdW5jdGlvbihhLCBiKSB7XG4gICAgICogICByZXR1cm4gXy5pc0FycmF5KGEpID8gYS5jb25jYXQoYikgOiB1bmRlZmluZWQ7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnZnJ1aXRzJzogWydhcHBsZScsICdiYW5hbmEnXSwgJ3ZlZ2V0YWJsZXMnOiBbJ2JlZXQnLCAnY2Fycm90XSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2Uob2JqZWN0LCBzb3VyY2UsIGRlZXBJbmRpY2F0b3IpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSAyO1xuXG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIGlmIChkZWVwSW5kaWNhdG9yID09PSBpbmRpY2F0b3JPYmplY3QpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJnc1szXSxcbiAgICAgICAgICAgIHN0YWNrQSA9IGFyZ3NbNF0sXG4gICAgICAgICAgICBzdGFja0IgPSBhcmdzWzVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGluaXRlZFN0YWNrID0gdHJ1ZTtcbiAgICAgICAgc3RhY2tBID0gZ2V0QXJyYXkoKTtcbiAgICAgICAgc3RhY2tCID0gZ2V0QXJyYXkoKTtcblxuICAgICAgICAvLyBhbGxvd3Mgd29ya2luZyB3aXRoIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCB3aXRob3V0XG4gICAgICAgIC8vIHVzaW5nIHRoZWlyIGBjYWxsYmFja2AgYXJndW1lbnRzLCBgaW5kZXh8a2V5YCBhbmQgYGNvbGxlY3Rpb25gXG4gICAgICAgIGlmICh0eXBlb2YgZGVlcEluZGljYXRvciAhPSAnbnVtYmVyJykge1xuICAgICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZW5ndGggPiAzICYmIHR5cGVvZiBhcmdzW2xlbmd0aCAtIDJdID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhhcmdzWy0tbGVuZ3RoIC0gMV0sIGFyZ3NbbGVuZ3RoLS1dLCAyKTtcbiAgICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIHR5cGVvZiBhcmdzW2xlbmd0aCAtIDFdID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGFyZ3NbLS1sZW5ndGhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAoaXNBcnJheShhcmdzW2luZGV4XSkgPyBmb3JFYWNoIDogZm9yT3duKShhcmdzW2luZGV4XSwgZnVuY3Rpb24oc291cmNlLCBrZXkpIHtcbiAgICAgICAgICB2YXIgZm91bmQsXG4gICAgICAgICAgICAgIGlzQXJyLFxuICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2UsXG4gICAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgICBpZiAoc291cmNlICYmICgoaXNBcnIgPSBpc0FycmF5KHNvdXJjZSkpIHx8IGlzUGxhaW5PYmplY3Qoc291cmNlKSkpIHtcbiAgICAgICAgICAgIC8vIGF2b2lkIG1lcmdpbmcgcHJldmlvdXNseSBtZXJnZWQgY3ljbGljIHNvdXJjZXNcbiAgICAgICAgICAgIHZhciBzdGFja0xlbmd0aCA9IHN0YWNrQS5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoc3RhY2tMZW5ndGgtLSkge1xuICAgICAgICAgICAgICBpZiAoKGZvdW5kID0gc3RhY2tBW3N0YWNrTGVuZ3RoXSA9PSBzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBzdGFja0Jbc3RhY2tMZW5ndGhdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgIHZhciBpc1NoYWxsb3c7XG4gICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmICgoaXNTaGFsbG93ID0gdHlwZW9mIHJlc3VsdCAhPSAndW5kZWZpbmVkJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWlzU2hhbGxvdykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gaXNBcnJcbiAgICAgICAgICAgICAgICAgID8gKGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSlcbiAgICAgICAgICAgICAgICAgIDogKGlzUGxhaW5PYmplY3QodmFsdWUpID8gdmFsdWUgOiB7fSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gYWRkIGBzb3VyY2VgIGFuZCBhc3NvY2lhdGVkIGB2YWx1ZWAgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzXG4gICAgICAgICAgICAgIHN0YWNrQS5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICAgIHN0YWNrQi5wdXNoKHZhbHVlKTtcblxuICAgICAgICAgICAgICAvLyByZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKVxuICAgICAgICAgICAgICBpZiAoIWlzU2hhbGxvdykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbWVyZ2UodmFsdWUsIHNvdXJjZSwgaW5kaWNhdG9yT2JqZWN0LCBjYWxsYmFjaywgc3RhY2tBLCBzdGFja0IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBzb3VyY2UpO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdGVkU3RhY2spIHtcbiAgICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQSk7XG4gICAgICAgIHJlbGVhc2VBcnJheShzdGFja0IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgb2JqZWN0YCBleGNsdWRpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLlxuICAgICAqIFByb3BlcnR5IG5hbWVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJyYXlzIG9mXG4gICAgICogcHJvcGVydHkgbmFtZXMuIElmIGEgYGNhbGxiYWNrYCBmdW5jdGlvbiBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgZXhlY3V0ZWRcbiAgICAgKiBmb3IgZWFjaCBwcm9wZXJ0eSBpbiB0aGUgYG9iamVjdGAsIG9taXR0aW5nIHRoZSBwcm9wZXJ0aWVzIGBjYWxsYmFja2BcbiAgICAgKiByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBgY2FsbGJhY2tgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gY2FsbGJhY2t8W3Byb3AxLCBwcm9wMiwgLi4uXSBUaGUgcHJvcGVydGllcyB0byBvbWl0XG4gICAgICogIG9yIHRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aG91dCB0aGUgb21pdHRlZCBwcm9wZXJ0aWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm9taXQoeyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfSwgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnbW9lJyB9XG4gICAgICpcbiAgICAgKiBfLm9taXQoeyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcic7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnbmFtZSc6ICdtb2UnIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbWl0KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpbmRleE9mID0gZ2V0SW5kZXhPZigpLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICBpZiAoaXNGdW5jKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGNvbmNhdC5hcHBseShhcnJheVJlZiwgbmF0aXZlU2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICAgIH1cbiAgICAgIGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGlmIChpc0Z1bmNcbiAgICAgICAgICAgICAgPyAhY2FsbGJhY2sodmFsdWUsIGtleSwgb2JqZWN0KVxuICAgICAgICAgICAgICA6IGluZGV4T2YocHJvcHMsIGtleSkgPCAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHR3byBkaW1lbnNpb25hbCBhcnJheSBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3Mga2V5LXZhbHVlIHBhaXJzLFxuICAgICAqIGkuZS4gYFtba2V5MSwgdmFsdWUxXSwgW2tleTIsIHZhbHVlMl1dYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIG5ldyBhcnJheSBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFpcnMoeyAnbW9lJzogMzAsICdsYXJyeSc6IDQwIH0pO1xuICAgICAqIC8vID0+IFtbJ21vZScsIDMwXSwgWydsYXJyeScsIDQwXV0gKG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhaXJzKG9iamVjdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBba2V5LCBvYmplY3Rba2V5XV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGBvYmplY3RgIGNvbXBvc2VkIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAgICAgKiBQcm9wZXJ0eSBuYW1lcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cyBvZiBwcm9wZXJ0eVxuICAgICAqIG5hbWVzLiBJZiBgY2FsbGJhY2tgIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSBleGVjdXRlZCBmb3IgZWFjaCBwcm9wZXJ0eSBpbiB0aGVcbiAgICAgKiBgb2JqZWN0YCwgcGlja2luZyB0aGUgcHJvcGVydGllcyBgY2FsbGJhY2tgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIGBjYWxsYmFja2BcbiAgICAgKiBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb258U3RyaW5nfSBjYWxsYmFja3xbcHJvcDEsIHByb3AyLCAuLi5dIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbiBvciBwcm9wZXJ0aWVzIHRvIHBpY2ssIGVpdGhlciBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvciBhcnJheXMuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgcHJvcGVydGllcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5waWNrKHsgJ25hbWUnOiAnbW9lJywgJ191c2VyaWQnOiAnbW9lMScgfSwgJ25hbWUnKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ21vZScgfVxuICAgICAqXG4gICAgICogXy5waWNrKHsgJ25hbWUnOiAnbW9lJywgJ191c2VyaWQnOiAnbW9lMScgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleS5jaGFyQXQoMCkgIT0gJ18nO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnbW9lJyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gcGljayhvYmplY3QsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBwcm9wcyA9IGNvbmNhdC5hcHBseShhcnJheVJlZiwgbmF0aXZlU2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSxcbiAgICAgICAgICAgIGxlbmd0aCA9IGlzT2JqZWN0KG9iamVjdCkgPyBwcm9wcy5sZW5ndGggOiAwO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGtleSwgb2JqZWN0KSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgLCB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGFuIGBvYmplY3RgIHRvIGEgbmV3XG4gICAgICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIGVsZW1lbnRzXG4gICAgICogdGhyb3VnaCB0aGUgYGNhbGxiYWNrYCwgd2l0aCBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uIHBvdGVudGlhbGx5IG11dGF0aW5nXG4gICAgICogdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWRcbiAgICAgKiB3aXRoIGZvdXIgYXJndW1lbnRzOyAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuIENhbGxiYWNrcyBtYXkgZXhpdFxuICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7TWl4ZWR9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc3F1YXJlcyA9IF8udHJhbnNmb3JtKFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0sIGZ1bmN0aW9uKHJlc3VsdCwgbnVtKSB7XG4gICAgICogICBudW0gKj0gbnVtO1xuICAgICAqICAgaWYgKG51bSAlIDIpIHtcbiAgICAgKiAgICAgcmV0dXJuIHJlc3VsdC5wdXNoKG51bSkgPCAzO1xuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxLCA5LCAyNV1cbiAgICAgKlxuICAgICAqIHZhciBtYXBwZWQgPSBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgZnVuY3Rpb24ocmVzdWx0LCBudW0sIGtleSkge1xuICAgICAqICAgcmVzdWx0W2tleV0gPSBudW0gKiAzO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAzLCAnYic6IDYsICdjJzogOSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgY2FsbGJhY2ssIGFjY3VtdWxhdG9yLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCk7XG4gICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgNCk7XG5cbiAgICAgIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc0Fycikge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICBwcm90byA9IGN0b3IgJiYgY3Rvci5wcm90b3R5cGU7XG5cbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGNyZWF0ZU9iamVjdChwcm90byk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIChpc0FyciA/IGZvckVhY2ggOiBmb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNvbXBvc2VkIG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKHsgJ29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzIH0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXSAob3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBvYmplY3RbcHJvcHNbaW5kZXhdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBpbmRleGVzLCBvciBrZXlzLCBvZiB0aGVcbiAgICAgKiBgY29sbGVjdGlvbmAuIEluZGV4ZXMgbWF5IGJlIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvciBhcyBhcnJheXNcbiAgICAgKiBvZiBpbmRleGVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fE51bWJlcnxTdHJpbmd9IFtpbmRleDEsIGluZGV4MiwgLi4uXSBUaGUgaW5kZXhlcyBvZlxuICAgICAqICBgY29sbGVjdGlvbmAgdG8gcmV0cmlldmUsIGVpdGhlciBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvciBhcnJheXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlXG4gICAgICogIHByb3ZpZGVkIGluZGV4ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYXQoWydhJywgJ2InLCAnYycsICdkJywgJ2UnXSwgWzAsIDIsIDRdKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYycsICdlJ11cbiAgICAgKlxuICAgICAqIF8uYXQoWydtb2UnLCAnbGFycnknLCAnY3VybHknXSwgMCwgMik7XG4gICAgICogLy8gPT4gWydtb2UnLCAnY3VybHknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGF0KGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHByb3BzID0gY29uY2F0LmFwcGx5KGFycmF5UmVmLCBuYXRpdmVTbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBjb2xsZWN0aW9uW3Byb3BzW2luZGV4XV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIGB0YXJnZXRgIGVsZW1lbnQgaXMgcHJlc2VudCBpbiBhIGBjb2xsZWN0aW9uYCB1c2luZyBzdHJpY3RcbiAgICAgKiBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCBpcyB1c2VkXG4gICAgICogYXMgdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgaW5jbHVkZVxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBjaGVjayBmb3IuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHRhcmdldGAgZWxlbWVudCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbnRhaW5zKFsxLCAyLCAzXSwgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5jb250YWlucyhbMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmNvbnRhaW5zKHsgJ25hbWUnOiAnbW9lJywgJ2FnZSc6IDQwIH0sICdtb2UnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbnRhaW5zKCdjdXJseScsICd1cicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb250YWlucyhjb2xsZWN0aW9uLCB0YXJnZXQsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4IDwgMCA/IG5hdGl2ZU1heCgwLCBsZW5ndGggKyBmcm9tSW5kZXgpIDogZnJvbUluZGV4KSB8fCAwO1xuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIHJlc3VsdCA9IChpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICAgID8gY29sbGVjdGlvbi5pbmRleE9mKHRhcmdldCwgZnJvbUluZGV4KVxuICAgICAgICAgIDogaW5kZXhPZihjb2xsZWN0aW9uLCB0YXJnZXQsIGZyb21JbmRleClcbiAgICAgICAgKSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKCsraW5kZXggPj0gZnJvbUluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gIShyZXN1bHQgPSB2YWx1ZSA9PT0gdGFyZ2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIHJldHVybmVkIGZyb20gcnVubmluZyBlYWNoIGVsZW1lbnQgb2YgdGhlXG4gICAgICogYGNvbGxlY3Rpb25gIHRocm91Z2ggdGhlIGdpdmVuIGBjYWxsYmFja2AuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mIGVhY2gga2V5XG4gICAgICogaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5IHdhcyByZXR1cm5lZCBieSB0aGUgYGNhbGxiYWNrYC4gVGhlIGBjYWxsYmFja2BcbiAgICAgKiBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy5wbHVja1wiIHN0eWxlXG4gICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8U3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyXG4gICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGVcbiAgICAgKiAgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvdW50QnkoWzQuMywgNi4xLCA2LjRdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIE1hdGguZmxvb3IobnVtKTsgfSk7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiBfLmNvdW50QnkoWzQuMywgNi4xLCA2LjRdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3VudEJ5KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZyk7XG5cbiAgICAgIGZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICBrZXkgPSBTdHJpbmcoY2FsbGJhY2sodmFsdWUsIGtleSwgY29sbGVjdGlvbikpO1xuICAgICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkgPyByZXN1bHRba2V5XSsrIDogcmVzdWx0W2tleV0gPSAxKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGBjYWxsYmFja2AgcmV0dXJucyBhIHRydXRoeSB2YWx1ZSBmb3IgKiphbGwqKiBlbGVtZW50cyBvZiBhXG4gICAgICogYGNvbGxlY3Rpb25gLiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGFsbFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8U3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyXG4gICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGVcbiAgICAgKiAgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIGNhbGxiYWNrIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciBzdG9vZ2VzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnbGFycnknLCAnYWdlJzogNTAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmV2ZXJ5KHN0b29nZXMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ud2hlcmVcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmV2ZXJ5KHN0b29nZXMsIHsgJ2FnZSc6IDUwIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykge1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmICghKHJlc3VsdCA9ICEhY2FsbGJhY2soY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIHJldHVybiAocmVzdWx0ID0gISFjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4YW1pbmVzIGVhY2ggZWxlbWVudCBpbiBhIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICAgICAqIHRoZSBgY2FsbGJhY2tgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIGBjYWxsYmFja2AgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZFxuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy5wbHVja1wiIHN0eWxlXG4gICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBzZWxlY3RcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fFN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlclxuICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlXG4gICAgICogIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgcGFzc2VkIHRoZSBjYWxsYmFjayBjaGVjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGV2ZW5zID0gXy5maWx0ZXIoWzEsIDIsIDMsIDQsIDUsIDZdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIG51bSAlIDIgPT0gMDsgfSk7XG4gICAgICogLy8gPT4gWzIsIDQsIDZdXG4gICAgICpcbiAgICAgKiB2YXIgZm9vZCA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYXBwbGUnLCAgJ29yZ2FuaWMnOiBmYWxzZSwgJ3R5cGUnOiAnZnJ1aXQnIH0sXG4gICAgICogICB7ICduYW1lJzogJ2NhcnJvdCcsICdvcmdhbmljJzogdHJ1ZSwgICd0eXBlJzogJ3ZlZ2V0YWJsZScgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbHRlcihmb29kLCAnb3JnYW5pYycpO1xuICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2NhcnJvdCcsICdvcmdhbmljJzogdHJ1ZSwgJ3R5cGUnOiAndmVnZXRhYmxlJyB9XVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLndoZXJlXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maWx0ZXIoZm9vZCwgeyAndHlwZSc6ICdmcnVpdCcgfSk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYXBwbGUnLCAnb3JnYW5pYyc6IGZhbHNlLCAndHlwZSc6ICdmcnVpdCcgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDtcblxuICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4XTtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhhbWluZXMgZWFjaCBlbGVtZW50IGluIGEgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IHRoYXQgdGhlIGBjYWxsYmFja2BcbiAgICAgKiByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBgY2FsbGJhY2tgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgZGV0ZWN0LCBmaW5kV2hlcmVcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fFN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlclxuICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlXG4gICAgICogIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge01peGVkfSBSZXR1cm5zIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmQoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihudW0pIHtcbiAgICAgKiAgIHJldHVybiBudW0gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogdmFyIGZvb2QgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2FwcGxlJywgICdvcmdhbmljJzogZmFsc2UsICd0eXBlJzogJ2ZydWl0JyB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdiYW5hbmEnLCAnb3JnYW5pYyc6IHRydWUsICAndHlwZSc6ICdmcnVpdCcgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmVldCcsICAgJ29yZ2FuaWMnOiBmYWxzZSwgJ3R5cGUnOiAndmVnZXRhYmxlJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy53aGVyZVwiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZmluZChmb29kLCB7ICd0eXBlJzogJ3ZlZ2V0YWJsZScgfSk7XG4gICAgICogLy8gPT4geyAnbmFtZSc6ICdiZWV0JywgJ29yZ2FuaWMnOiBmYWxzZSwgJ3R5cGUnOiAndmVnZXRhYmxlJyB9XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmQoZm9vZCwgJ29yZ2FuaWMnKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2JhbmFuYScsICdvcmdhbmljJzogdHJ1ZSwgJ3R5cGUnOiAnZnJ1aXQnIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZyk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGEgYGNvbGxlY3Rpb25gLCBleGVjdXRpbmcgdGhlIGBjYWxsYmFja2AgZm9yIGVhY2ggZWxlbWVudCBpblxuICAgICAqIHRoZSBgY29sbGVjdGlvbmAuIFRoZSBgY2FsbGJhY2tgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuIENhbGxiYWNrcyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHlcbiAgICAgKiBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fFN0cmluZ30gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS5mb3JFYWNoKGFsZXJ0KS5qb2luKCcsJyk7XG4gICAgICogLy8gPT4gYWxlcnRzIGVhY2ggbnVtYmVyIGFuZCByZXR1cm5zICcxLDIsMydcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaCh7ICdvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMyB9LCBhbGVydCk7XG4gICAgICogLy8gPT4gYWxlcnRzIGVhY2ggbnVtYmVyIHZhbHVlIChvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwO1xuXG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQnID8gY2FsbGJhY2sgOiBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2soY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgcmV0dXJuZWQgZnJvbSBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiB0aGVcbiAgICAgKiBgY29sbGVjdGlvbmAgdGhyb3VnaCB0aGUgYGNhbGxiYWNrYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2YgZWFjaCBrZXkgaXNcbiAgICAgKiBhbiBhcnJheSBvZiBlbGVtZW50cyBwYXNzZWQgdG8gYGNhbGxiYWNrYCB0aGF0IHJldHVybmVkIHRoZSBrZXkuIFRoZSBgY2FsbGJhY2tgXG4gICAgICogaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8U3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyXG4gICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGVcbiAgICAgKiAgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzQuMiwgNi4xLCA2LjRdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIE1hdGguZmxvb3IobnVtKTsgfSk7XG4gICAgICogLy8gPT4geyAnNCc6IFs0LjJdLCAnNic6IFs2LjEsIDYuNF0gfVxuICAgICAqXG4gICAgICogXy5ncm91cEJ5KFs0LjIsIDYuMSwgNi40XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiB0aGlzLmZsb29yKG51bSk7IH0sIE1hdGgpO1xuICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjRdIH1cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdyb3VwQnkoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcblxuICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGtleSA9IFN0cmluZyhjYWxsYmFjayh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSk7XG4gICAgICAgIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSA/IHJlc3VsdFtrZXldIDogcmVzdWx0W2tleV0gPSBbXSkucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIG5hbWVkIGJ5IGBtZXRob2ROYW1lYCBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIGBjb2xsZWN0aW9uYCxcbiAgICAgKiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICAgKiB3aWxsIGJlIHBhc3NlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgbWV0aG9kTmFtZWAgaXMgYSBmdW5jdGlvbiwgaXQgd2lsbFxuICAgICAqIGJlIGludm9rZWQgZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gdGhlIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbYXJnMSwgYXJnMiwgLi4uXSBBcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2UoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZShbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGludm9rZShjb2xsZWN0aW9uLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgYXJncyA9IG5hdGl2ZVNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSxcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBtZXRob2ROYW1lID09ICdmdW5jdGlvbicsXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheSh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInID8gbGVuZ3RoIDogMCk7XG5cbiAgICAgIGZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gKGlzRnVuYyA/IG1ldGhvZE5hbWUgOiB2YWx1ZVttZXRob2ROYW1lXSkuYXBwbHkodmFsdWUsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIHRoZSBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJvdWdoIHRoZSBgY2FsbGJhY2tgLiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGNvbGxlY3RcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fFN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlclxuICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlXG4gICAgICogIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggYGNhbGxiYWNrYCBleGVjdXRpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gKiAzOyB9KTtcbiAgICAgKiAvLyA9PiBbMywgNiwgOV1cbiAgICAgKlxuICAgICAqIF8ubWFwKHsgJ29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzIH0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICogMzsgfSk7XG4gICAgICogLy8gPT4gWzMsIDYsIDldIChvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciBzdG9vZ2VzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnbGFycnknLCAnYWdlJzogNTAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLm1hcChzdG9vZ2VzLCAnbmFtZScpO1xuICAgICAqIC8vID0+IFsnbW9lJywgJ2xhcnJ5J11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7XG5cbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBjYWxsYmFjayhjb2xsZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXN1bHRbKytpbmRleF0gPSBjYWxsYmFjayh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhbiBgYXJyYXlgLiBJZiBgY2FsbGJhY2tgIGlzIHBhc3NlZCxcbiAgICAgKiBpdCB3aWxsIGJlIGV4ZWN1dGVkIGZvciBlYWNoIHZhbHVlIGluIHRoZSBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZVxuICAgICAqIGNyaXRlcmlvbiBieSB3aGljaCB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0b1xuICAgICAqIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fFN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlclxuICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlXG4gICAgICogIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge01peGVkfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIHZhciBzdG9vZ2VzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnbGFycnknLCAnYWdlJzogNTAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1heChzdG9vZ2VzLCBmdW5jdGlvbihzdG9vZ2UpIHsgcmV0dXJuIHN0b29nZS5hZ2U7IH0pO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnbGFycnknLCAnYWdlJzogNTAgfTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ubWF4KHN0b29nZXMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2xhcnJ5JywgJ2FnZSc6IDUwIH07XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgY29tcHV0ZWQgPSAtSW5maW5pdHksXG4gICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZWQ7XG5cbiAgICAgIGlmICghY2FsbGJhY2sgJiYgaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07XG4gICAgICAgICAgaWYgKHZhbHVlID4gcmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrID0gKCFjYWxsYmFjayAmJiBpc1N0cmluZyhjb2xsZWN0aW9uKSlcbiAgICAgICAgICA/IGNoYXJBdENhbGxiYWNrXG4gICAgICAgICAgOiBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcpO1xuXG4gICAgICAgIGZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICAgIGlmIChjdXJyZW50ID4gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGNvbXB1dGVkID0gY3VycmVudDtcbiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBhbiBgYXJyYXlgLiBJZiBgY2FsbGJhY2tgIGlzIHBhc3NlZCxcbiAgICAgKiBpdCB3aWxsIGJlIGV4ZWN1dGVkIGZvciBlYWNoIHZhbHVlIGluIHRoZSBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZVxuICAgICAqIGNyaXRlcmlvbiBieSB3aGljaCB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fFN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlclxuICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlXG4gICAgICogIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge01peGVkfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIHZhciBzdG9vZ2VzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnbGFycnknLCAnYWdlJzogNTAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1pbihzdG9vZ2VzLCBmdW5jdGlvbihzdG9vZ2UpIHsgcmV0dXJuIHN0b29nZS5hZ2U7IH0pO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnbW9lJywgJ2FnZSc6IDQwIH07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLm1pbihzdG9vZ2VzLCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IEluZmluaXR5LFxuICAgICAgICAgIHJlc3VsdCA9IGNvbXB1dGVkO1xuXG4gICAgICBpZiAoIWNhbGxiYWNrICYmIGlzQXJyYXkoY29sbGVjdGlvbikpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbGxlY3Rpb25baW5kZXhdO1xuICAgICAgICAgIGlmICh2YWx1ZSA8IHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayA9ICghY2FsbGJhY2sgJiYgaXNTdHJpbmcoY29sbGVjdGlvbikpXG4gICAgICAgICAgPyBjaGFyQXRDYWxsYmFja1xuICAgICAgICAgIDogbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcblxuICAgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIHZhciBjdXJyZW50ID0gY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgICBpZiAoY3VycmVudCA8IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICBjb21wdXRlZCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHByb3BlcnR5IGZyb20gYWxsIGVsZW1lbnRzIGluIHRoZSBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBwbHVjay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc3Rvb2dlcyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnbW9lJywgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICduYW1lJzogJ2xhcnJ5JywgJ2FnZSc6IDUwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5wbHVjayhzdG9vZ2VzLCAnbmFtZScpO1xuICAgICAqIC8vID0+IFsnbW9lJywgJ2xhcnJ5J11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwbHVjayhjb2xsZWN0aW9uLCBwcm9wZXJ0eSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDtcblxuICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGNvbGxlY3Rpb25baW5kZXhdW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdCB8fCBtYXAoY29sbGVjdGlvbiwgcHJvcGVydHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZHVjZXMgYSBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gdGhlIGBjb2xsZWN0aW9uYCB0aHJvdWdoIHRoZSBgY2FsbGJhY2tgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBgY2FsbGJhY2tgIGV4ZWN1dGlvbiBjb25zdW1lcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBleGVjdXRpb24uXG4gICAgICogSWYgYGFjY3VtdWxhdG9yYCBpcyBub3QgcGFzc2VkLCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYGNvbGxlY3Rpb25gIHdpbGwgYmVcbiAgICAgKiB1c2VkIGFzIHRoZSBpbml0aWFsIGBhY2N1bXVsYXRvcmAgdmFsdWUuIFRoZSBgY2FsbGJhY2tgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYFxuICAgICAqIGFuZCBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM7IChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgZm9sZGwsIGluamVjdFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW2FjY3VtdWxhdG9yXSBJbml0aWFsIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge01peGVkfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHN1bSA9IF8ucmVkdWNlKFsxLCAyLCAzXSwgZnVuY3Rpb24oc3VtLCBudW0pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBudW07XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gNlxuICAgICAqXG4gICAgICogdmFyIG1hcHBlZCA9IF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCBmdW5jdGlvbihyZXN1bHQsIG51bSwga2V5KSB7XG4gICAgICogICByZXN1bHRba2V5XSA9IG51bSAqIDM7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBjYWxsYmFjaywgYWNjdW11bGF0b3IsIHRoaXNBcmcpIHtcbiAgICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgdmFyIG5vYWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMztcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCA0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChub2FjY3VtKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBjb2xsZWN0aW9uWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gbm9hY2N1bVxuICAgICAgICAgICAgPyAobm9hY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgICAgIDogY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbilcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBgXy5yZWR1Y2VgLCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGFcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGZvbGRyXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbYWNjdW11bGF0b3JdIEluaXRpYWwgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7TWl4ZWR9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgbGlzdCA9IFtbMCwgMV0sIFsyLCAzXSwgWzQsIDVdXTtcbiAgICAgKiB2YXIgZmxhdCA9IF8ucmVkdWNlUmlnaHQobGlzdCwgZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYS5jb25jYXQoYik7IH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBjYWxsYmFjaywgYWNjdW11bGF0b3IsIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpdGVyYWJsZSA9IGNvbGxlY3Rpb24sXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMCxcbiAgICAgICAgICBub2FjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGtleXMoY29sbGVjdGlvbik7XG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCA0KTtcbiAgICAgIGZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGluZGV4ID0gcHJvcHMgPyBwcm9wc1stLWxlbmd0aF0gOiAtLWxlbmd0aDtcbiAgICAgICAgYWNjdW11bGF0b3IgPSBub2FjY3VtXG4gICAgICAgICAgPyAobm9hY2N1bSA9IGZhbHNlLCBpdGVyYWJsZVtpbmRleF0pXG4gICAgICAgICAgOiBjYWxsYmFjayhhY2N1bXVsYXRvciwgaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZWxlbWVudHMgb2YgYVxuICAgICAqIGBjb2xsZWN0aW9uYCB0aGF0IGBjYWxsYmFja2AgZG9lcyAqKm5vdCoqIHJldHVybiB0cnV0aHkgZm9yLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxTdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXJcbiAgICAgKiAgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHBhc3NlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZVxuICAgICAqICBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBlbGVtZW50cyB0aGF0IGRpZCAqKm5vdCoqIHBhc3MgdGhlXG4gICAgICogIGNhbGxiYWNrIGNoZWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2RkcyA9IF8ucmVqZWN0KFsxLCAyLCAzLCA0LCA1LCA2XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gJSAyID09IDA7IH0pO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqXG4gICAgICogdmFyIGZvb2QgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2FwcGxlJywgICdvcmdhbmljJzogZmFsc2UsICd0eXBlJzogJ2ZydWl0JyB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdjYXJyb3QnLCAnb3JnYW5pYyc6IHRydWUsICAndHlwZSc6ICd2ZWdldGFibGUnIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5yZWplY3QoZm9vZCwgJ29yZ2FuaWMnKTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdhcHBsZScsICdvcmdhbmljJzogZmFsc2UsICd0eXBlJzogJ2ZydWl0JyB9XVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLndoZXJlXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5yZWplY3QoZm9vZCwgeyAndHlwZSc6ICdmcnVpdCcgfSk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnY2Fycm90JywgJ29yZ2FuaWMnOiB0cnVlLCAndHlwZSc6ICd2ZWdldGFibGUnIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgICByZXR1cm4gZmlsdGVyKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gIWNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIGBhcnJheWAgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICogRmlzaGVyLVlhdGVzIHNodWZmbGUuIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlci1ZYXRlc19zaHVmZmxlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IHNodWZmbGVkIGNvbGxlY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNCwgNSwgNl0pO1xuICAgICAqIC8vID0+IFs0LCAxLCA2LCAzLCA1LCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheSh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInID8gbGVuZ3RoIDogMCk7XG5cbiAgICAgIGZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBmbG9vcihuYXRpdmVSYW5kb20oKSAqICgrK2luZGV4ICsgMSkpO1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gcmVzdWx0W3JhbmRdO1xuICAgICAgICByZXN1bHRbcmFuZF0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGBjb2xsZWN0aW9uLmxlbmd0aGAgZm9yIGFycmF5c1xuICAgICAqIGFuZCBhcnJheS1saWtlIG9iamVjdHMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBgY29sbGVjdGlvbi5sZW5ndGhgIG9yIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDJdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMgfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5zaXplKCdjdXJseScpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgPyBsZW5ndGggOiBrZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGBjYWxsYmFja2AgcmV0dXJucyBhIHRydXRoeSB2YWx1ZSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGFcbiAgICAgKiBgY29sbGVjdGlvbmAuIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFzIHNvb24gYXMgaXQgZmluZHMgcGFzc2luZyB2YWx1ZSwgYW5kXG4gICAgICogZG9lcyBub3QgaXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgYGNvbGxlY3Rpb25gLiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0b1xuICAgICAqIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGFueVxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fFN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8U3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyXG4gICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGVcbiAgICAgKiAgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBjYWxsYmFjayBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvbWUoW251bGwsIDAsICd5ZXMnLCBmYWxzZV0sIEJvb2xlYW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIHZhciBmb29kID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdhcHBsZScsICAnb3JnYW5pYyc6IGZhbHNlLCAndHlwZSc6ICdmcnVpdCcgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnY2Fycm90JywgJ29yZ2FuaWMnOiB0cnVlLCAgJ3R5cGUnOiAndmVnZXRhYmxlJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uc29tZShmb29kLCAnb3JnYW5pYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy53aGVyZVwiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uc29tZShmb29kLCB7ICd0eXBlJzogJ21lYXQnIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDtcblxuICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBpZiAoKHJlc3VsdCA9IGNhbGxiYWNrKGNvbGxlY3Rpb25baW5kZXhdLCBpbmRleCwgY29sbGVjdGlvbikpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gIShyZXN1bHQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICAgICAqIHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIHRoZSBgY29sbGVjdGlvbmAgdGhyb3VnaCB0aGUgYGNhbGxiYWNrYC4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCB3aWxsIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gICAgICogZXF1YWwgZWxlbWVudHMuIFRoZSBgY2FsbGJhY2tgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fFN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlclxuICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlXG4gICAgICogIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHNvcnRlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0QnkoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIE1hdGguc2luKG51bSk7IH0pO1xuICAgICAqIC8vID0+IFszLCAxLCAyXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIHRoaXMuc2luKG51bSk7IH0sIE1hdGgpO1xuICAgICAqIC8vID0+IFszLCAxLCAyXVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5zb3J0QnkoWydiYW5hbmEnLCAnc3RyYXdiZXJyeScsICdhcHBsZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4gWydhcHBsZScsICdiYW5hbmEnLCAnc3RyYXdiZXJyeSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydEJ5KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgPyBsZW5ndGggOiAwKTtcblxuICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBvYmplY3QgPSByZXN1bHRbKytpbmRleF0gPSBnZXRPYmplY3QoKTtcbiAgICAgICAgb2JqZWN0LmNyaXRlcmlhID0gY2FsbGJhY2sodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICAgIG9iamVjdC5pbmRleCA9IGluZGV4O1xuICAgICAgICBvYmplY3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuICAgICAgcmVzdWx0LnNvcnQoY29tcGFyZUFzY2VuZGluZyk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIG9iamVjdCA9IHJlc3VsdFtsZW5ndGhdO1xuICAgICAgICByZXN1bHRbbGVuZ3RoXSA9IG9iamVjdC52YWx1ZTtcbiAgICAgICAgcmVsZWFzZU9iamVjdChvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgYGNvbGxlY3Rpb25gIHRvIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29udmVydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAoZnVuY3Rpb24oKSB7IHJldHVybiBfLnRvQXJyYXkoYXJndW1lbnRzKS5zbGljZSgxKTsgfSkoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiAmJiB0eXBlb2YgY29sbGVjdGlvbi5sZW5ndGggPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHNsaWNlKGNvbGxlY3Rpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGFtaW5lcyBlYWNoIGVsZW1lbnQgaW4gYSBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiB0aGF0IGhhdmUgdGhlIGdpdmVuIGBwcm9wZXJ0aWVzYC4gV2hlbiBjaGVja2luZyBgcHJvcGVydGllc2AsIHRoaXMgbWV0aG9kXG4gICAgICogcGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnRcbiAgICAgKiB0byBlYWNoIG90aGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIGZpbHRlciBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBnaXZlbiBgcHJvcGVydGllc2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzdG9vZ2VzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnbGFycnknLCAnYWdlJzogNTAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLndoZXJlKHN0b29nZXMsIHsgJ2FnZSc6IDQwIH0pO1xuICAgICAqIC8vID0+IFt7ICduYW1lJzogJ21vZScsICdhZ2UnOiA0MCB9XVxuICAgICAqL1xuICAgIHZhciB3aGVyZSA9IGZpbHRlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIG9mIGBhcnJheWAgcmVtb3ZlZC4gVGhlIHZhbHVlc1xuICAgICAqIGBmYWxzZWAsIGBudWxsYCwgYDBgLCBgXCJcImAsIGB1bmRlZmluZWRgIGFuZCBgTmFOYCBhcmUgYWxsIGZhbHNleS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGBhcnJheWAgZWxlbWVudHMgbm90IHByZXNlbnQgaW4gdGhlIG90aGVyIGFycmF5c1xuICAgICAqIHVzaW5nIHN0cmljdCBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5MSwgYXJyYXkyLCAuLi5dIEFycmF5cyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgYGFycmF5YCBlbGVtZW50cyBub3QgcHJlc2VudCBpbiB0aGVcbiAgICAgKiAgb3RoZXIgYXJyYXlzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2UoWzEsIDIsIDMsIDQsIDVdLCBbNSwgMiwgMTBdKTtcbiAgICAgKiAvLyA9PiBbMSwgMywgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkaWZmZXJlbmNlKGFycmF5KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleE9mID0gZ2V0SW5kZXhPZigpLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICBzZWVuID0gY29uY2F0LmFwcGx5KGFycmF5UmVmLCBuYXRpdmVTbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB2YXIgaXNMYXJnZSA9IGxlbmd0aCA+PSBsYXJnZUFycmF5U2l6ZSAmJiBpbmRleE9mID09PSBiYXNpY0luZGV4T2Y7XG5cbiAgICAgIGlmIChpc0xhcmdlKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IGNyZWF0ZUNhY2hlKHNlZW4pO1xuICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICBpbmRleE9mID0gY2FjaGVJbmRleE9mO1xuICAgICAgICAgIHNlZW4gPSBjYWNoZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpc0xhcmdlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGluZGV4T2Yoc2VlbiwgdmFsdWUpIDwgMCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzTGFyZ2UpIHtcbiAgICAgICAgcmVsZWFzZU9iamVjdChzZWVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBgXy5maW5kYCwgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2ZcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHBhc3NlcyB0aGUgY2FsbGJhY2sgY2hlY2ssIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8U3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyXG4gICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGVcbiAgICAgKiAgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7TWl4ZWR9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmluZEluZGV4KFsnYXBwbGUnLCAnYmFuYW5hJywgJ2JlZXQnXSwgZnVuY3Rpb24oZm9vZCkge1xuICAgICAqICAgcmV0dXJuIC9eYi8udGVzdChmb29kKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBpZiAoY2FsbGJhY2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYGFycmF5YC4gSWYgYSBudW1iZXIgYG5gIGlzIHBhc3NlZCwgdGhlIGZpcnN0XG4gICAgICogYG5gIGVsZW1lbnRzIG9mIHRoZSBgYXJyYXlgIGFyZSByZXR1cm5lZC4gSWYgYSBgY2FsbGJhY2tgIGZ1bmN0aW9uIGlzIHBhc3NlZCxcbiAgICAgKiBlbGVtZW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSBhcmUgcmV0dXJuZWQgYXMgbG9uZyBhcyB0aGUgYGNhbGxiYWNrYFxuICAgICAqIHJldHVybnMgdHJ1dGh5LiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGhlYWQsIHRha2VcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fE51bWJlcnxTdHJpbmd9IFtjYWxsYmFja3xuXSBUaGUgZnVuY3Rpb24gY2FsbGVkXG4gICAgICogIHBlciBlbGVtZW50IG9yIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLiBJZiBhIHByb3BlcnR5IG5hbWUgb3JcbiAgICAgKiAgb2JqZWN0IGlzIHBhc3NlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiXG4gICAgICogIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtNaXhlZH0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudChzKSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpcnN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5maXJzdChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5maXJzdChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkge1xuICAgICAqICAgcmV0dXJuIG51bSA8IDM7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB2YXIgZm9vZCA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFuYW5hJywgJ29yZ2FuaWMnOiB0cnVlIH0sXG4gICAgICogICB7ICduYW1lJzogJ2JlZXQnLCAgICdvcmdhbmljJzogZmFsc2UgfSxcbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maXJzdChmb29kLCAnb3JnYW5pYycpO1xuICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2JhbmFuYScsICdvcmdhbmljJzogdHJ1ZSB9XVxuICAgICAqXG4gICAgICogdmFyIGZvb2QgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2FwcGxlJywgICd0eXBlJzogJ2ZydWl0JyB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdiYW5hbmEnLCAndHlwZSc6ICdmcnVpdCcgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmVldCcsICAgJ3R5cGUnOiAndmVnZXRhYmxlJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy53aGVyZVwiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZmlyc3QoZm9vZCwgeyAndHlwZSc6ICdmcnVpdCcgfSk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYXBwbGUnLCAndHlwZSc6ICdmcnVpdCcgfSwgeyAnbmFtZSc6ICdiYW5hbmEnLCAndHlwZSc6ICdmcnVpdCcgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaXJzdChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIGlmIChhcnJheSkge1xuICAgICAgICB2YXIgbiA9IDAsXG4gICAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGNhbGxiYWNrKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuID0gY2FsbGJhY2s7XG4gICAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCB0aGlzQXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlbMF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzbGljZShhcnJheSwgMCwgbmF0aXZlTWluKG5hdGl2ZU1heCgwLCBuKSwgbGVuZ3RoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbnMgYSBuZXN0ZWQgYXJyYXkgKHRoZSBuZXN0aW5nIGNhbiBiZSB0byBhbnkgZGVwdGgpLiBJZiBgaXNTaGFsbG93YFxuICAgICAqIGlzIHRydXRoeSwgYGFycmF5YCB3aWxsIG9ubHkgYmUgZmxhdHRlbmVkIGEgc2luZ2xlIGxldmVsLiBJZiBgY2FsbGJhY2tgXG4gICAgICogaXMgcGFzc2VkLCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBpcyBwYXNzZWQgdGhyb3VnaCBhIGBjYWxsYmFja2AgYmVmb3JlXG4gICAgICogZmxhdHRlbmluZy4gVGhlIGBjYWxsYmFja2AgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy5wbHVja1wiIHN0eWxlXG4gICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc1NoYWxsb3c9ZmFsc2VdIEEgZmxhZyB0byBpbmRpY2F0ZSBvbmx5IGZsYXR0ZW5pbmcgYSBzaW5nbGUgbGV2ZWwuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8U3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyXG4gICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGVcbiAgICAgKiAgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyXSwgWzMsIFtbNF1dXV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbihbMSwgWzJdLCBbMywgW1s0XV1dXSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFtbNF1dXTtcbiAgICAgKlxuICAgICAqIHZhciBzdG9vZ2VzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdjdXJseScsICdxdW90ZXMnOiBbJ09oLCBhIHdpc2UgZ3V5LCBlaD8nLCAnUG9pZmVjdCEnXSB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdtb2UnLCAncXVvdGVzJzogWydTcHJlYWQgb3V0IScsICdZb3Uga251Y2tsZWhlYWQhJ10gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZsYXR0ZW4oc3Rvb2dlcywgJ3F1b3RlcycpO1xuICAgICAqIC8vID0+IFsnT2gsIGEgd2lzZSBndXksIGVoPycsICdQb2lmZWN0IScsICdTcHJlYWQgb3V0IScsICdZb3Uga251Y2tsZWhlYWQhJ11cbiAgICAgKi9cbiAgICB2YXIgZmxhdHRlbiA9IG92ZXJsb2FkV3JhcHBlcihmdW5jdGlvbiBmbGF0dGVuKGFycmF5LCBpc1NoYWxsb3csIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgdmFsdWUgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpXG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHB1c2guYXBwbHkocmVzdWx0LCBpc1NoYWxsb3cgPyB2YWx1ZSA6IGZsYXR0ZW4odmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIHVzaW5nXG4gICAgICogc3RyaWN0IGVxdWFsaXR5IGZvciBjb21wYXJpc29ucywgaS5lLiBgPT09YC4gSWYgdGhlIGBhcnJheWAgaXMgYWxyZWFkeVxuICAgICAqIHNvcnRlZCwgcGFzc2luZyBgdHJ1ZWAgZm9yIGBmcm9tSW5kZXhgIHdpbGwgcnVuIGEgZmFzdGVyIGJpbmFyeSBzZWFyY2guXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW58TnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbSBvciBgdHJ1ZWAgdG9cbiAgICAgKiAgcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSBvciBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAyLCAzKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDEsIDIsIDIsIDMsIDNdLCAyLCB0cnVlKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgICAgaWYgKHR5cGVvZiBmcm9tSW5kZXggPT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCA8IDAgPyBuYXRpdmVNYXgoMCwgbGVuZ3RoICsgZnJvbUluZGV4KSA6IGZyb21JbmRleCB8fCAwKTtcbiAgICAgIH0gZWxzZSBpZiAoZnJvbUluZGV4KSB7XG4gICAgICAgIHZhciBpbmRleCA9IHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBhcnJheVtpbmRleF0gPT09IHZhbHVlID8gaW5kZXggOiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheSA/IGJhc2ljSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkgOiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLiBJZiBhIG51bWJlciBgbmAgaXMgcGFzc2VkLCB0aGVcbiAgICAgKiBsYXN0IGBuYCBlbGVtZW50cyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgcmVzdWx0LiBJZiBhIGBjYWxsYmFja2AgZnVuY3Rpb25cbiAgICAgKiBpcyBwYXNzZWQsIGVsZW1lbnRzIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5IGFyZSBleGNsdWRlZCBmcm9tIHRoZSByZXN1bHRcbiAgICAgKiBhcyBsb25nIGFzIHRoZSBgY2FsbGJhY2tgIHJldHVybnMgdHJ1dGh5LiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0b1xuICAgICAqIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxOdW1iZXJ8U3RyaW5nfSBbY2FsbGJhY2t8bj0xXSBUaGUgZnVuY3Rpb24gY2FsbGVkXG4gICAgICogIHBlciBlbGVtZW50IG9yIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZXhjbHVkZS4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yXG4gICAgICogIG9iamVjdCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIlxuICAgICAqICBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5pbml0aWFsKFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7XG4gICAgICogICByZXR1cm4gbnVtID4gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIHZhciBmb29kID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiZWV0JywgICAnb3JnYW5pYyc6IGZhbHNlIH0sXG4gICAgICogICB7ICduYW1lJzogJ2NhcnJvdCcsICdvcmdhbmljJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uaW5pdGlhbChmb29kLCAnb3JnYW5pYycpO1xuICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2JlZXQnLCAgICdvcmdhbmljJzogZmFsc2UgfV1cbiAgICAgKlxuICAgICAqIHZhciBmb29kID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYW5hbmEnLCAndHlwZSc6ICdmcnVpdCcgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmVldCcsICAgJ3R5cGUnOiAndmVnZXRhYmxlJyB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdjYXJyb3QnLCAndHlwZSc6ICd2ZWdldGFibGUnIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLndoZXJlXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5pbml0aWFsKGZvb2QsIHsgJ3R5cGUnOiAndmVnZXRhYmxlJyB9KTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdiYW5hbmEnLCAndHlwZSc6ICdmcnVpdCcgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgaWYgKCFhcnJheSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbiA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdudW1iZXInICYmIGNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgICAgIHdoaWxlIChpbmRleC0tICYmIGNhbGxiYWNrKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgIG4rKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IChjYWxsYmFjayA9PSBudWxsIHx8IHRoaXNBcmcpID8gMSA6IGNhbGxiYWNrIHx8IG47XG4gICAgICB9XG4gICAgICByZXR1cm4gc2xpY2UoYXJyYXksIDAsIG5hdGl2ZU1pbihuYXRpdmVNYXgoMCwgbGVuZ3RoIC0gbiksIGxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgYWxsIHRoZSBwYXNzZWQtaW4gYXJyYXlzIHVzaW5nIHN0cmljdCBlcXVhbGl0eVxuICAgICAqIGZvciBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXkxLCBhcnJheTIsIC4uLl0gQXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHVuaXF1ZSBlbGVtZW50cyB0aGF0IGFyZSBwcmVzZW50XG4gICAgICogIGluICoqYWxsKiogb2YgdGhlIGFycmF5cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb24oWzEsIDIsIDNdLCBbMTAxLCAyLCAxLCAxMF0sIFsyLCAxXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGFycmF5KSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgY2FjaGVzID0gZ2V0QXJyYXkoKSxcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4T2YgPSBnZXRJbmRleE9mKCksXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSBnZXRBcnJheSgpO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgICAgY2FjaGVzW2FyZ3NJbmRleF0gPSBpbmRleE9mID09PSBiYXNpY0luZGV4T2YgJiZcbiAgICAgICAgICAodmFsdWUgPyB2YWx1ZS5sZW5ndGggOiAwKSA+PSBsYXJnZUFycmF5U2l6ZSAmJlxuICAgICAgICAgIGNyZWF0ZUNhY2hlKGFyZ3NJbmRleCA/IGFyZ3NbYXJnc0luZGV4XSA6IHNlZW4pO1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbMF07XG4gICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIGlmICgoY2FjaGUgPyBjYWNoZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA6IGluZGV4T2Yoc2VlbiwgdmFsdWUpKSA8IDApIHtcbiAgICAgICAgICBhcmdzSW5kZXggPSBhcmdzTGVuZ3RoO1xuICAgICAgICAgIChjYWNoZSB8fCBzZWVuKS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICB3aGlsZSAoLS1hcmdzSW5kZXgpIHtcbiAgICAgICAgICAgIGNhY2hlID0gY2FjaGVzW2FyZ3NJbmRleF07XG4gICAgICAgICAgICBpZiAoKGNhY2hlID8gY2FjaGVJbmRleE9mKGNhY2hlLCB2YWx1ZSkgOiBpbmRleE9mKGFyZ3NbYXJnc0luZGV4XSwgdmFsdWUpKSA8IDApIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgICBjYWNoZSA9IGNhY2hlc1thcmdzTGVuZ3RoXTtcbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgcmVsZWFzZU9iamVjdChjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlbGVhc2VBcnJheShjYWNoZXMpO1xuICAgICAgcmVsZWFzZUFycmF5KHNlZW4pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGBhcnJheWAuIElmIGEgbnVtYmVyIGBuYCBpcyBwYXNzZWQsIHRoZVxuICAgICAqIGxhc3QgYG5gIGVsZW1lbnRzIG9mIHRoZSBgYXJyYXlgIGFyZSByZXR1cm5lZC4gSWYgYSBgY2FsbGJhY2tgIGZ1bmN0aW9uXG4gICAgICogaXMgcGFzc2VkLCBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSBhcmUgcmV0dXJuZWQgYXMgbG9uZyBhcyB0aGVcbiAgICAgKiBgY2FsbGJhY2tgIHJldHVybnMgdHJ1dGh5LiBUaGUgYGNhbGxiYWNrYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy5wbHVja1wiIHN0eWxlXG4gICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8TnVtYmVyfFN0cmluZ30gW2NhbGxiYWNrfG5dIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGVsZW1lbnQgb3IgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZXR1cm4uIElmIGEgcHJvcGVydHkgbmFtZSBvclxuICAgICAqICBvYmplY3QgaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCJcbiAgICAgKiAgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge01peGVkfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQocykgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLmxhc3QoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHtcbiAgICAgKiAgIHJldHVybiBudW0gPiAxO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogdmFyIGZvb2QgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2JlZXQnLCAgICdvcmdhbmljJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnY2Fycm90JywgJ29yZ2FuaWMnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5sYXN0KGZvb2QsICdvcmdhbmljJyk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnY2Fycm90JywgJ29yZ2FuaWMnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiB2YXIgZm9vZCA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFuYW5hJywgJ3R5cGUnOiAnZnJ1aXQnIH0sXG4gICAgICogICB7ICduYW1lJzogJ2JlZXQnLCAgICd0eXBlJzogJ3ZlZ2V0YWJsZScgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnY2Fycm90JywgJ3R5cGUnOiAndmVnZXRhYmxlJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy53aGVyZVwiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ubGFzdChmb29kLCB7ICd0eXBlJzogJ3ZlZ2V0YWJsZScgfSk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmVldCcsICd0eXBlJzogJ3ZlZ2V0YWJsZScgfSwgeyAnbmFtZSc6ICdjYXJyb3QnLCAndHlwZSc6ICd2ZWdldGFibGUnIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIGlmIChhcnJheSkge1xuICAgICAgICB2YXIgbiA9IDAsXG4gICAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgICAgICB3aGlsZSAoaW5kZXgtLSAmJiBjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICAgIG4rKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbiA9IGNhbGxiYWNrO1xuICAgICAgICAgIGlmIChuID09IG51bGwgfHwgdGhpc0FyZykge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5W2xlbmd0aCAtIDFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2xpY2UoYXJyYXksIG5hdGl2ZU1heCgwLCBsZW5ndGggLSBuKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIHVzaW5nIHN0cmljdFxuICAgICAqIGVxdWFsaXR5IGZvciBjb21wYXJpc29ucywgaS5lLiBgPT09YC4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0IGlzIHVzZWRcbiAgICAgKiBhcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUgb3IgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMywgMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAyLCAzKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBpbmRleCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgICAgIGlmICh0eXBlb2YgZnJvbUluZGV4ID09ICdudW1iZXInKSB7XG4gICAgICAgIGluZGV4ID0gKGZyb21JbmRleCA8IDAgPyBuYXRpdmVNYXgoMCwgaW5kZXggKyBmcm9tSW5kZXgpIDogbmF0aXZlTWluKGZyb21JbmRleCwgaW5kZXggLSAxKSkgKyAxO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbVxuICAgICAqIGBzdGFydGAgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgYGVuZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyByYW5nZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxMCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDExKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDMwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1LCAyMCwgMjVdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIC0xMCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgsIC05XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICAgIHN0YXJ0ID0gK3N0YXJ0IHx8IDA7XG4gICAgICBzdGVwID0gK3N0ZXAgfHwgMTtcblxuICAgICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9XG4gICAgICAvLyB1c2UgYEFycmF5KGxlbmd0aClgIHNvIFY4IHdpbGwgYXZvaWQgdGhlIHNsb3dlciBcImRpY3Rpb25hcnlcIiBtb2RlXG4gICAgICAvLyBodHRwOi8veW91dHUuYmUvWEFxSXBHVThaWmsjdD0xN20yNXNcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heCgwLCBjZWlsKChlbmQgLSBzdGFydCkgLyBzdGVwKSksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uaW5pdGlhbGAsIHRoaXMgbWV0aG9kIGdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgdmFsdWUgb2ZcbiAgICAgKiBgYXJyYXlgLiBJZiBhIG51bWJlciBgbmAgaXMgcGFzc2VkLCB0aGUgZmlyc3QgYG5gIHZhbHVlcyBhcmUgZXhjbHVkZWQgZnJvbVxuICAgICAqIHRoZSByZXN1bHQuIElmIGEgYGNhbGxiYWNrYCBmdW5jdGlvbiBpcyBwYXNzZWQsIGVsZW1lbnRzIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgKiBvZiB0aGUgYXJyYXkgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHJlc3VsdCBhcyBsb25nIGFzIHRoZSBgY2FsbGJhY2tgIHJldHVybnNcbiAgICAgKiB0cnV0aHkuIFRoZSBgY2FsbGJhY2tgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgZHJvcCwgdGFpbFxuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8TnVtYmVyfFN0cmluZ30gW2NhbGxiYWNrfG49MV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGV4Y2x1ZGUuIElmIGEgcHJvcGVydHkgbmFtZSBvclxuICAgICAqICBvYmplY3QgaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCJcbiAgICAgKiAgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJlc3QoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8ucmVzdChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkge1xuICAgICAqICAgcmV0dXJuIG51bSA8IDM7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiB2YXIgZm9vZCA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFuYW5hJywgJ29yZ2FuaWMnOiB0cnVlIH0sXG4gICAgICogICB7ICduYW1lJzogJ2JlZXQnLCAgICdvcmdhbmljJzogZmFsc2UgfSxcbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5yZXN0KGZvb2QsICdvcmdhbmljJyk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmVldCcsICdvcmdhbmljJzogZmFsc2UgfV1cbiAgICAgKlxuICAgICAqIHZhciBmb29kID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdhcHBsZScsICAndHlwZSc6ICdmcnVpdCcgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFuYW5hJywgJ3R5cGUnOiAnZnJ1aXQnIH0sXG4gICAgICogICB7ICduYW1lJzogJ2JlZXQnLCAgICd0eXBlJzogJ3ZlZ2V0YWJsZScgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ud2hlcmVcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnJlc3QoZm9vZCwgeyAndHlwZSc6ICdmcnVpdCcgfSk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmVldCcsICd0eXBlJzogJ3ZlZ2V0YWJsZScgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgIHZhciBuID0gMCxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICBuKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSAoY2FsbGJhY2sgPT0gbnVsbCB8fCB0aGlzQXJnKSA/IDEgOiBuYXRpdmVNYXgoMCwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNsaWNlKGFycmF5LCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoIHRoZSBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiB0aGUgc29ydCBvcmRlciBvZiB0aGVcbiAgICAgKiBzb3J0ZWQgYGFycmF5YC4gSWYgYGNhbGxiYWNrYCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yIGB2YWx1ZWAgYW5kXG4gICAgICogZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpciBzb3J0IHJhbmtpbmcuIFRoZSBgY2FsbGJhY2tgIGlzXG4gICAgICogYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBhc3NlZCBmb3IgYGNhbGxiYWNrYCwgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxTdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXJcbiAgICAgKiAgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHBhc3NlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZVxuICAgICAqICBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFsyMCwgMzAsIDUwXSwgNDApO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uc29ydGVkSW5kZXgoW3sgJ3gnOiAyMCB9LCB7ICd4JzogMzAgfSwgeyAneCc6IDUwIH1dLCB7ICd4JzogNDAgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiB2YXIgZGljdCA9IHtcbiAgICAgKiAgICd3b3JkVG9OdW1iZXInOiB7ICd0d2VudHknOiAyMCwgJ3RoaXJ0eSc6IDMwLCAnZm91cnR5JzogNDAsICdmaWZ0eSc6IDUwIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleChbJ3R3ZW50eScsICd0aGlydHknLCAnZmlmdHknXSwgJ2ZvdXJ0eScsIGZ1bmN0aW9uKHdvcmQpIHtcbiAgICAgKiAgIHJldHVybiBkaWN0LndvcmRUb051bWJlclt3b3JkXTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFsndHdlbnR5JywgJ3RoaXJ0eScsICdmaWZ0eSddLCAnZm91cnR5JywgZnVuY3Rpb24od29yZCkge1xuICAgICAqICAgcmV0dXJuIHRoaXMud29yZFRvTnVtYmVyW3dvcmRdO1xuICAgICAqIH0sIGRpY3QpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiBsb3c7XG5cbiAgICAgIC8vIGV4cGxpY2l0bHkgcmVmZXJlbmNlIGBpZGVudGl0eWAgZm9yIGJldHRlciBpbmxpbmluZyBpbiBGaXJlZm94XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSA6IGlkZW50aXR5O1xuICAgICAgdmFsdWUgPSBjYWxsYmFjayh2YWx1ZSk7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDE7XG4gICAgICAgIChjYWxsYmFjayhhcnJheVttaWRdKSA8IHZhbHVlKVxuICAgICAgICAgID8gbG93ID0gbWlkICsgMVxuICAgICAgICAgIDogaGlnaCA9IG1pZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIHVuaW9uIG9mIHRoZSBwYXNzZWQtaW4gYXJyYXlzIHVzaW5nIHN0cmljdCBlcXVhbGl0eSBmb3JcbiAgICAgKiBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXkxLCBhcnJheTIsIC4uLl0gQXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCB0aGF0IGFyZVxuICAgICAqICBwcmVzZW50IGluIG9uZSBvciBtb3JlIG9mIHRoZSBhcnJheXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzEsIDIsIDNdLCBbMTAxLCAyLCAxLCAxMF0sIFsyLCAxXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDEwMSwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pb24oYXJyYXkpIHtcbiAgICAgIGlmICghaXNBcnJheShhcnJheSkpIHtcbiAgICAgICAgYXJndW1lbnRzWzBdID0gYXJyYXkgPyBuYXRpdmVTbGljZS5jYWxsKGFycmF5KSA6IGFycmF5UmVmO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuaXEoY29uY2F0LmFwcGx5KGFycmF5UmVmLCBhcmd1bWVudHMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLXZhbHVlLWZyZWUgdmVyc2lvbiBvZiB0aGUgYGFycmF5YCB1c2luZyBzdHJpY3QgZXF1YWxpdHlcbiAgICAgKiBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIHRoZSBgYXJyYXlgIGlzIGFscmVhZHkgc29ydGVkLCBwYXNzaW5nIGB0cnVlYFxuICAgICAqIGZvciBgaXNTb3J0ZWRgIHdpbGwgcnVuIGEgZmFzdGVyIGFsZ29yaXRobS4gSWYgYGNhbGxiYWNrYCBpcyBwYXNzZWQsIGVhY2hcbiAgICAgKiBlbGVtZW50IG9mIGBhcnJheWAgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGBjYWxsYmFja2AgYmVmb3JlIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuXG4gICAgICogVGhlIGBjYWxsYmFja2AgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcGFzc2VkIGZvciBgY2FsbGJhY2tgLCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwYXNzZWQgZm9yIGBjYWxsYmFja2AsIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgdW5pcXVlXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzU29ydGVkPWZhbHNlXSBBIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYGFycmF5YCBpcyBhbHJlYWR5IHNvcnRlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxTdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXJcbiAgICAgKiAgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHBhc3NlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZVxuICAgICAqICBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIGR1cGxpY2F0ZS12YWx1ZS1mcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXEoWzEsIDIsIDEsIDMsIDFdKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udW5pcShbMSwgMSwgMiwgMiwgM10sIHRydWUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy51bmlxKFsnQScsICdiJywgJ0MnLCAnYScsICdCJywgJ2MnXSwgZnVuY3Rpb24obGV0dGVyKSB7IHJldHVybiBsZXR0ZXIudG9Mb3dlckNhc2UoKTsgfSk7XG4gICAgICogLy8gPT4gWydBJywgJ2InLCAnQyddXG4gICAgICpcbiAgICAgKiBfLnVuaXEoWzEsIDIuNSwgMywgMS41LCAyLCAzLjVdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7XG4gICAgICogLy8gPT4gWzEsIDIuNSwgM11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8udW5pcShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHVuaXEgPSBvdmVybG9hZFdyYXBwZXIoZnVuY3Rpb24oYXJyYXksIGlzU29ydGVkLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHZhciBpc0xhcmdlID0gIWlzU29ydGVkICYmIGxlbmd0aCA+PSBsYXJnZUFycmF5U2l6ZSAmJiBpbmRleE9mID09PSBiYXNpY0luZGV4T2YsXG4gICAgICAgICAgc2VlbiA9IChjYWxsYmFjayB8fCBpc0xhcmdlKSA/IGdldEFycmF5KCkgOiByZXN1bHQ7XG5cbiAgICAgIGlmIChpc0xhcmdlKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IGNyZWF0ZUNhY2hlKHNlZW4pO1xuICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICBpbmRleE9mID0gY2FjaGVJbmRleE9mO1xuICAgICAgICAgIHNlZW4gPSBjYWNoZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpc0xhcmdlID0gZmFsc2U7XG4gICAgICAgICAgc2VlbiA9IGNhbGxiYWNrID8gc2VlbiA6IChyZWxlYXNlQXJyYXkoc2VlbiksIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gY2FsbGJhY2sgPyBjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGFycmF5KSA6IHZhbHVlO1xuXG4gICAgICAgIGlmIChpc1NvcnRlZFxuICAgICAgICAgICAgICA/ICFpbmRleCB8fCBzZWVuW3NlZW4ubGVuZ3RoIC0gMV0gIT09IGNvbXB1dGVkXG4gICAgICAgICAgICAgIDogaW5kZXhPZihzZWVuLCBjb21wdXRlZCkgPCAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sgfHwgaXNMYXJnZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNMYXJnZSkge1xuICAgICAgICByZWxlYXNlQXJyYXkoc2Vlbi5hcnJheSk7XG4gICAgICAgIHJlbGVhc2VPYmplY3Qoc2Vlbik7XG4gICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHJlbGVhc2VBcnJheShzZWVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy56aXBgLCB0aGlzIG1ldGhvZCBzcGxpdHMgZ3JvdXBzIG9mIGVsZW1lbnRzIGludG8gYXJyYXlzXG4gICAgICogY29tcG9zZWQgb2YgZWxlbWVudHMgZnJvbSBlYWNoIGdyb3VwIGF0IHRoZWlyIGNvcnJlc3BvbmRpbmcgaW5kZXhlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgdGhlIGNvbXBvc2VkIGFycmF5cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bnppcChbWydtb2UnLCAzMCwgdHJ1ZV0sIFsnbGFycnknLCA0MCwgZmFsc2VdXSk7XG4gICAgICogLy8gPT4gW1snbW9lJywgJ2xhcnJ5J10sIFszMCwgNDBdLCBbdHJ1ZSwgZmFsc2VdXTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBtYXgocGx1Y2soYXJyYXksICdsZW5ndGgnKSkgOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCA8IDAgPyAwIDogbGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IHBsdWNrKGFycmF5LCBpbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHBhc3NlZCB2YWx1ZXMgcmVtb3ZlZCB1c2luZ1xuICAgICAqIHN0cmljdCBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbHRlci5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdmFsdWUxLCB2YWx1ZTIsIC4uLl0gVmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMSwgMiwgMSwgMCwgMywgMSwgNF0sIDAsIDEpO1xuICAgICAqIC8vID0+IFsyLCAzLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdpdGhvdXQoYXJyYXkpIHtcbiAgICAgIHJldHVybiBkaWZmZXJlbmNlKGFycmF5LCBuYXRpdmVTbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdyb3VwcyB0aGUgZWxlbWVudHMgb2YgZWFjaCBhcnJheSBhdCB0aGVpciBjb3JyZXNwb25kaW5nIGluZGV4ZXMuIFVzZWZ1bCBmb3JcbiAgICAgKiBzZXBhcmF0ZSBkYXRhIHNvdXJjZXMgdGhhdCBhcmUgY29vcmRpbmF0ZWQgdGhyb3VnaCBtYXRjaGluZyBhcnJheSBpbmRleGVzLlxuICAgICAqIEZvciBhIG1hdHJpeCBvZiBuZXN0ZWQgYXJyYXlzLCBgXy56aXAuYXBwbHkoLi4uKWAgY2FuIHRyYW5zcG9zZSB0aGUgbWF0cml4XG4gICAgICogaW4gYSBzaW1pbGFyIGZhc2hpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5MSwgYXJyYXkyLCAuLi5dIEFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ21vZScsICdsYXJyeSddLCBbMzAsIDQwXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snbW9lJywgMzAsIHRydWVdLCBbJ2xhcnJ5JywgNDAsIGZhbHNlXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB6aXAoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA/IHVuemlwKGFyZ3VtZW50cykgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBmcm9tIGFycmF5cyBvZiBga2V5c2AgYW5kIGB2YWx1ZXNgLiBQYXNzIGVpdGhlclxuICAgICAqIGEgc2luZ2xlIHR3byBkaW1lbnNpb25hbCBhcnJheSwgaS5lLiBgW1trZXkxLCB2YWx1ZTFdLCBba2V5MiwgdmFsdWUyXV1gLCBvclxuICAgICAqIHR3byBhcnJheXMsIG9uZSBvZiBga2V5c2AgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIG9iamVjdFxuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBrZXlzIFRoZSBhcnJheSBvZiBrZXlzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGdpdmVuIGtleXMgYW5kXG4gICAgICogIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ21vZScsICdsYXJyeSddLCBbMzAsIDQwXSk7XG4gICAgICogLy8gPT4geyAnbW9lJzogMzAsICdsYXJyeSc6IDQwIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB6aXBPYmplY3Qoa2V5cywgdmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBrZXlzID8ga2V5cy5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlc1tpbmRleF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleVswXV0gPSBrZXlbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBJZiBgbmAgaXMgZ3JlYXRlciB0aGFuIGAwYCwgYSBmdW5jdGlvbiBpcyBjcmVhdGVkIHRoYXQgaXMgcmVzdHJpY3RlZCB0b1xuICAgICAqIGV4ZWN1dGluZyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbiwgb25seSBhZnRlciBpdCBpcyBjYWxsZWQgYG5gIHRpbWVzLiBJZiBgbmAgaXMgbGVzcyB0aGFuIGAxYCxcbiAgICAgKiBgZnVuY2AgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHksIHdpdGhvdXQgYSBgdGhpc2AgYmluZGluZyBvciBhZGRpdGlvbmFsXG4gICAgICogYXJndW1lbnRzLCBhbmQgaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmVcbiAgICAgKiBpdCBpcyBleGVjdXRlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcmVuZGVyTm90ZXMgPSBfLmFmdGVyKG5vdGVzLmxlbmd0aCwgcmVuZGVyKTtcbiAgICAgKiBfLmZvckVhY2gobm90ZXMsIGZ1bmN0aW9uKG5vdGUpIHtcbiAgICAgKiAgIG5vdGUuYXN5bmNTYXZlKHsgJ3N1Y2Nlc3MnOiByZW5kZXJOb3RlcyB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyBgcmVuZGVyTm90ZXNgIGlzIHJ1biBvbmNlLCBhZnRlciBhbGwgbm90ZXMgaGF2ZSBzYXZlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmIChuIDwgMSkge1xuICAgICAgICByZXR1cm4gZnVuYygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uIDwgMSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgcHJlcGVuZHMgYW55IGFkZGl0aW9uYWwgYGJpbmRgIGFyZ3VtZW50cyB0byB0aG9zZVxuICAgICAqIHBhc3NlZCB0byB0aGUgYm91bmQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbYXJnMSwgYXJnMiwgLi4uXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gZnVuY3Rpb24oZ3JlZXRpbmcpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMubmFtZTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogZnVuYyA9IF8uYmluZChmdW5jLCB7ICduYW1lJzogJ21vZScgfSwgJ2hpJyk7XG4gICAgICogZnVuYygpO1xuICAgICAqIC8vID0+ICdoaSBtb2UnXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmluZChmdW5jLCB0aGlzQXJnKSB7XG4gICAgICAvLyB1c2UgYEZ1bmN0aW9uI2JpbmRgIGlmIGl0IGV4aXN0cyBhbmQgaXMgZmFzdFxuICAgICAgLy8gKGluIFY4IGBGdW5jdGlvbiNiaW5kYCBpcyBzbG93ZXIgZXhjZXB0IHdoZW4gcGFydGlhbGx5IGFwcGxpZWQpXG4gICAgICByZXR1cm4gc3VwcG9ydC5mYXN0QmluZCB8fCAobmF0aXZlQmluZCAmJiBhcmd1bWVudHMubGVuZ3RoID4gMilcbiAgICAgICAgPyBuYXRpdmVCaW5kLmNhbGwuYXBwbHkobmF0aXZlQmluZCwgYXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZUJvdW5kKGZ1bmMsIHRoaXNBcmcsIG5hdGl2ZVNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZHMgbWV0aG9kcyBvbiBgb2JqZWN0YCB0byBgb2JqZWN0YCwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nIG1ldGhvZC5cbiAgICAgKiBNZXRob2QgbmFtZXMgbWF5IGJlIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvciBhcyBhcnJheXMgb2YgbWV0aG9kXG4gICAgICogbmFtZXMuIElmIG5vIG1ldGhvZCBuYW1lcyBhcmUgcHJvdmlkZWQsIGFsbCB0aGUgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBgb2JqZWN0YFxuICAgICAqIHdpbGwgYmUgYm91bmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW21ldGhvZE5hbWUxLCBtZXRob2ROYW1lMiwgLi4uXSBNZXRob2QgbmFtZXMgb24gdGhlIG9iamVjdCB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAnbGFiZWwnOiAnZG9jcycsXG4gICAgICogICdvbkNsaWNrJzogZnVuY3Rpb24oKSB7IGFsZXJ0KCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTsgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldyk7XG4gICAgICogalF1ZXJ5KCcjZG9jcycpLm9uKCdjbGljaycsIHZpZXcub25DbGljayk7XG4gICAgICogLy8gPT4gYWxlcnRzICdjbGlja2VkIGRvY3MnLCB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJpbmRBbGwob2JqZWN0KSB7XG4gICAgICB2YXIgZnVuY3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvbmNhdC5hcHBseShhcnJheVJlZiwgbmF0aXZlU2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSA6IGZ1bmN0aW9ucyhvYmplY3QpLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZnVuY3MubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gZnVuY3NbaW5kZXhdO1xuICAgICAgICBvYmplY3Rba2V5XSA9IGJpbmQob2JqZWN0W2tleV0sIG9iamVjdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBvYmplY3Rba2V5XWBcbiAgICAgKiBhbmQgcHJlcGVuZHMgYW55IGFkZGl0aW9uYWwgYGJpbmRLZXlgIGFyZ3VtZW50cyB0byB0aG9zZSBwYXNzZWQgdG8gdGhlIGJvdW5kXG4gICAgICogZnVuY3Rpb24uIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG9cbiAgICAgKiByZWZlcmVuY2UgbWV0aG9kcyB0aGF0IHdpbGwgYmUgcmVkZWZpbmVkIG9yIGRvbid0IHlldCBleGlzdC5cbiAgICAgKiBTZWUgaHR0cDovL21pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge01peGVkfSBbYXJnMSwgYXJnMiwgLi4uXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAnbmFtZSc6ICdtb2UnLFxuICAgICAqICAgJ2dyZWV0JzogZnVuY3Rpb24oZ3JlZXRpbmcpIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy5uYW1lO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGZ1bmMoKTtcbiAgICAgKiAvLyA9PiAnaGkgbW9lJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcsICcgKyB0aGlzLm5hbWUgKyAnISc7XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIGZ1bmMoKTtcbiAgICAgKiAvLyA9PiAnaGksIG1vZSEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmluZEtleShvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUJvdW5kKG9iamVjdCwga2V5LCBuYXRpdmVTbGljZS5jYWxsKGFyZ3VtZW50cywgMiksIGluZGljYXRvck9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoZSBwYXNzZWQgZnVuY3Rpb25zLFxuICAgICAqIHdoZXJlIGVhY2ggZnVuY3Rpb24gY29uc3VtZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBmb2xsb3dzLlxuICAgICAqIEZvciBleGFtcGxlLCBjb21wb3NpbmcgdGhlIGZ1bmN0aW9ucyBgZigpYCwgYGcoKWAsIGFuZCBgaCgpYCBwcm9kdWNlcyBgZihnKGgoKSkpYC5cbiAgICAgKiBFYWNoIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjb21wb3NlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZnVuYzEsIGZ1bmMyLCAuLi5dIEZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXQgPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiAnaGkgJyArIG5hbWU7IH07XG4gICAgICogdmFyIGV4Y2xhaW0gPSBmdW5jdGlvbihzdGF0ZW1lbnQpIHsgcmV0dXJuIHN0YXRlbWVudCArICchJzsgfTtcbiAgICAgKiB2YXIgd2VsY29tZSA9IF8uY29tcG9zZShleGNsYWltLCBncmVldCk7XG4gICAgICogd2VsY29tZSgnbW9lJyk7XG4gICAgICogLy8gPT4gJ2hpIG1vZSEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgICAgIHZhciBmdW5jcyA9IGFyZ3VtZW50cztcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBsZW5ndGggPSBmdW5jcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgYXJncyA9IFtmdW5jc1tsZW5ndGhdLmFwcGx5KHRoaXMsIGFyZ3MpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJnc1swXTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgYSBjYWxsYmFjayBib3VuZCB0byBhbiBvcHRpb25hbCBgdGhpc0FyZ2AuIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5XG4gICAgICogbmFtZSwgdGhlIGNyZWF0ZWQgY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuXG4gICAgICogSWYgYGZ1bmNgIGlzIGFuIG9iamVjdCwgdGhlIGNyZWF0ZWQgY2FsbGJhY2sgd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50c1xuICAgICAqIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudCBvYmplY3QgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBOb3RlOiBBbGwgTG8tRGFzaCBtZXRob2RzLCB0aGF0IGFjY2VwdCBhIGBjYWxsYmFja2AgYXJndW1lbnQsIHVzZSBgXy5jcmVhdGVDYWxsYmFja2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW2Z1bmM9aWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2FyZ0NvdW50PTNdIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZSBjYWxsYmFjayBhY2NlcHRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc3Rvb2dlcyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnbW9lJywgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICduYW1lJzogJ2xhcnJ5JywgJ2FnZSc6IDUwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gd3JhcCB0byBjcmVhdGUgY3VzdG9tIGNhbGxiYWNrIHNob3J0aGFuZHNcbiAgICAgKiBfLmNyZWF0ZUNhbGxiYWNrID0gXy53cmFwKF8uY3JlYXRlQ2FsbGJhY2ssIGZ1bmN0aW9uKGZ1bmMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICogICB2YXIgbWF0Y2ggPSAvXiguKz8pX18oW2dsXXQpKC4rKSQvLmV4ZWMoY2FsbGJhY2spO1xuICAgICAqICAgcmV0dXJuICFtYXRjaCA/IGZ1bmMoY2FsbGJhY2ssIHRoaXNBcmcpIDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICogICAgIHJldHVybiBtYXRjaFsyXSA9PSAnZ3QnID8gb2JqZWN0W21hdGNoWzFdXSA+IG1hdGNoWzNdIDogb2JqZWN0W21hdGNoWzFdXSA8IG1hdGNoWzNdO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHN0b29nZXMsICdhZ2VfX2d0NDUnKTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdsYXJyeScsICdhZ2UnOiA1MCB9XVxuICAgICAqXG4gICAgICogLy8gY3JlYXRlIG1peGlucyB3aXRoIHN1cHBvcnQgZm9yIFwiXy5wbHVja1wiIGFuZCBcIl8ud2hlcmVcIiBjYWxsYmFjayBzaG9ydGhhbmRzXG4gICAgICogXy5taXhpbih7XG4gICAgICogICAndG9Mb29rdXAnOiBmdW5jdGlvbihjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAqICAgICBjYWxsYmFjayA9IF8uY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAqICAgICByZXR1cm4gXy5yZWR1Y2UoY29sbGVjdGlvbiwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgKiAgICAgICByZXR1cm4gKHJlc3VsdFtjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pXSA9IHZhbHVlLCByZXN1bHQpO1xuICAgICAqICAgICB9LCB7fSk7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLnRvTG9va3VwKHN0b29nZXMsICduYW1lJyk7XG4gICAgICogLy8gPT4geyAnbW9lJzogeyAnbmFtZSc6ICdtb2UnLCAnYWdlJzogNDAgfSwgJ2xhcnJ5JzogeyAnbmFtZSc6ICdsYXJyeScsICdhZ2UnOiA1MCB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYWxsYmFjayhmdW5jLCB0aGlzQXJnLCBhcmdDb3VudCkge1xuICAgICAgaWYgKGZ1bmMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHk7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBmdW5jO1xuICAgICAgaWYgKHR5cGUgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAodHlwZSAhPSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmplY3RbZnVuY107XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzKGZ1bmMpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgICAgdmFyIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICBpZiAoIShyZXN1bHQgPSBpc0VxdWFsKG9iamVjdFtwcm9wc1tsZW5ndGhdXSwgZnVuY1twcm9wc1tsZW5ndGhdXSwgaW5kaWNhdG9yT2JqZWN0KSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcgfHwgKHJlVGhpcyAmJiAhcmVUaGlzLnRlc3QoZm5Ub1N0cmluZy5jYWxsKGZ1bmMpKSkpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9XG4gICAgICBpZiAoYXJnQ291bnQgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoYXJnQ291bnQgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGEsIGIpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGFyZ0NvdW50ID09PSA0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGRlbGF5IHRoZSBleGVjdXRpb24gb2YgYGZ1bmNgIHVudGlsIGFmdGVyXG4gICAgICogYHdhaXRgIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgaW52b2tlZC4gUGFzc1xuICAgICAqIGFuIGBvcHRpb25zYCBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmdcbiAgICAgKiBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIGRlYm91bmNlZFxuICAgICAqIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGNhbGwuXG4gICAgICpcbiAgICAgKiBOb3RlOiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2Agd2lsbCBiZSBjYWxsZWRcbiAgICAgKiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIGlzXG4gICAgICogaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiAgW2xlYWRpbmc9ZmFsc2VdIEEgYm9vbGVhbiB0byBzcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqICBbbWF4V2FpdF0gVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGNhbGxlZC5cbiAgICAgKiAgW3RyYWlsaW5nPXRydWVdIEEgYm9vbGVhbiB0byBzcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsYXp5TGF5b3V0ID0gXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDMwMCk7XG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIGxhenlMYXlvdXQpO1xuICAgICAqXG4gICAgICogalF1ZXJ5KCcjcG9zdGJveCcpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDIwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgYXJncyxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgdGhpc0FyZyxcbiAgICAgICAgICBjYWxsQ291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwLFxuICAgICAgICAgIG1heFdhaXQgPSBmYWxzZSxcbiAgICAgICAgICBtYXhUaW1lb3V0SWQgPSBudWxsLFxuICAgICAgICAgIHRpbWVvdXRJZCA9IG51bGwsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KG1heFRpbWVvdXRJZCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICBjYWxsQ291bnQgPSAwO1xuICAgICAgICBtYXhUaW1lb3V0SWQgPSB0aW1lb3V0SWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWxheWVkKCkge1xuICAgICAgICB2YXIgaXNDYWxsZWQgPSB0cmFpbGluZyAmJiAoIWxlYWRpbmcgfHwgY2FsbENvdW50ID4gMSk7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIGlmIChpc0NhbGxlZCkge1xuICAgICAgICAgIGlmIChtYXhXYWl0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgbGFzdENhbGxlZCA9IG5ldyBEYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG1heERlbGF5ZWQoKSB7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIGlmICh0cmFpbGluZyB8fCAobWF4V2FpdCAhPT0gd2FpdCkpIHtcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gbmV3IERhdGU7XG4gICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3YWl0ID0gbmF0aXZlTWF4KDAsIHdhaXQgfHwgMCk7XG4gICAgICBpZiAob3B0aW9ucyA9PT0gdHJ1ZSkge1xuICAgICAgICB2YXIgbGVhZGluZyA9IHRydWU7XG4gICAgICAgIHRyYWlsaW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSBvcHRpb25zLmxlYWRpbmc7XG4gICAgICAgIG1heFdhaXQgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucyAmJiBuYXRpdmVNYXgod2FpdCwgb3B0aW9ucy5tYXhXYWl0IHx8IDApO1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgdGhpc0FyZyA9IHRoaXM7XG4gICAgICAgIGNhbGxDb3VudCsrO1xuXG4gICAgICAgIC8vIGF2b2lkIGlzc3VlcyB3aXRoIFRpdGFuaXVtIGFuZCBgdW5kZWZpbmVkYCB0aW1lb3V0IGlkc1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwY2VsZXJhdG9yL3RpdGFuaXVtX21vYmlsZS9ibG9iLzNfMV8wX0dBL2FuZHJvaWQvdGl0YW5pdW0vc3JjL2phdmEvdGkvbW9kdWxlcy90aXRhbml1bS9UaXRhbml1bU1vZHVsZS5qYXZhI0wxODUtTDE5MlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICBpZiAobWF4V2FpdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBpZiAobGVhZGluZyAmJiBjYWxsQ291bnQgPCAyKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgbm93ID0gbmV3IERhdGU7XG4gICAgICAgICAgaWYgKCFtYXhUaW1lb3V0SWQgJiYgIWxlYWRpbmcpIHtcbiAgICAgICAgICAgIGxhc3RDYWxsZWQgPSBub3c7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciByZW1haW5pbmcgPSBtYXhXYWl0IC0gKG5vdyAtIGxhc3RDYWxsZWQpO1xuICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG1heFRpbWVvdXRJZCk7XG4gICAgICAgICAgICBtYXhUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgICAgICAgbGFzdENhbGxlZCA9IG5vdztcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCFtYXhUaW1lb3V0SWQpIHtcbiAgICAgICAgICAgIG1heFRpbWVvdXRJZCA9IHNldFRpbWVvdXQobWF4RGVsYXllZCwgcmVtYWluaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdhaXQgIT09IG1heFdhaXQpIHtcbiAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGRlbGF5ZWQsIHdhaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmVycyBleGVjdXRpbmcgdGhlIGBmdW5jYCBmdW5jdGlvbiB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLlxuICAgICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIGBmdW5jYCB3aGVuIGl0IGlzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW2FyZzEsIGFyZzIsIC4uLl0gQXJndW1lbnRzIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbigpIHsgYWxlcnQoJ2RlZmVycmVkJyk7IH0pO1xuICAgICAqIC8vIHJldHVybnMgZnJvbSB0aGUgZnVuY3Rpb24gYmVmb3JlIGBhbGVydGAgaXMgY2FsbGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmZXIoZnVuYykge1xuICAgICAgdmFyIGFyZ3MgPSBuYXRpdmVTbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCAxKTtcbiAgICB9XG4gICAgLy8gdXNlIGBzZXRJbW1lZGlhdGVgIGlmIGl0J3MgYXZhaWxhYmxlIGluIE5vZGUuanNcbiAgICBpZiAoaXNWOCAmJiBmcmVlTW9kdWxlICYmIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVmZXIgPSBiaW5kKHNldEltbWVkaWF0ZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGBmdW5jYCBmdW5jdGlvbiBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIHdpbGwgYmUgcGFzc2VkIHRvIGBmdW5jYCB3aGVuIGl0IGlzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgZXhlY3V0aW9uLlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IFthcmcxLCBhcmcyLCAuLi5dIEFyZ3VtZW50cyB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGguXG4gICAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2cgPSBfLmJpbmQoY29uc29sZS5sb2csIGNvbnNvbGUpO1xuICAgICAqIF8uZGVsYXkobG9nLCAxMDAwLCAnbG9nZ2VkIGxhdGVyJyk7XG4gICAgICogLy8gPT4gJ2xvZ2dlZCBsYXRlcicgKEFwcGVhcnMgYWZ0ZXIgb25lIHNlY29uZC4pXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsYXkoZnVuYywgd2FpdCkge1xuICAgICAgdmFyIGFyZ3MgPSBuYXRpdmVTbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICAgICAqIHBhc3NlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHRcbiAgICAgKiBiYXNlZCBvbiB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdFxuICAgICAqIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gICAgICogaXMgZXhlY3V0ZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBUaGUgcmVzdWx0XG4gICAgICogY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gQSBmdW5jdGlvbiB1c2VkIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXppbmcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmaWJvbmFjY2kgPSBfLm1lbW9pemUoZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gPCAyID8gbiA6IGZpYm9uYWNjaShuIC0gMSkgKyBmaWJvbmFjY2kobiAtIDIpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgICAgIGZ1bmN0aW9uIG1lbW9pemVkKCkge1xuICAgICAgICB2YXIgY2FjaGUgPSBtZW1vaXplZC5jYWNoZSxcbiAgICAgICAgICAgIGtleSA9IGtleVByZWZpeCArIChyZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBhcmd1bWVudHNbMF0pO1xuXG4gICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGNhY2hlLCBrZXkpXG4gICAgICAgICAgPyBjYWNoZVtrZXldXG4gICAgICAgICAgOiAoY2FjaGVba2V5XSA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IHt9O1xuICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gZXhlY3V0ZSBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzIHRvXG4gICAgICogdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgY2FsbC4gVGhlIGBmdW5jYCBpcyBleGVjdXRlZFxuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIC8vIGBpbml0aWFsaXplYCBleGVjdXRlcyBgY3JlYXRlQXBwbGljYXRpb25gIG9uY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgICAgIHZhciByYW4sXG4gICAgICAgICAgcmVzdWx0O1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChyYW4pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBjbGVhciB0aGUgYGZ1bmNgIHZhcmlhYmxlIHNvIHRoZSBmdW5jdGlvbiBtYXkgYmUgZ2FyYmFnZSBjb2xsZWN0ZWRcbiAgICAgICAgZnVuYyA9IG51bGw7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgaW52b2tlcyBgZnVuY2Agd2l0aCBhbnkgYWRkaXRpb25hbFxuICAgICAqIGBwYXJ0aWFsYCBhcmd1bWVudHMgcHJlcGVuZGVkIHRvIHRob3NlIHBhc3NlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLiBUaGlzXG4gICAgICogbWV0aG9kIGlzIHNpbWlsYXIgdG8gYF8uYmluZGAsIGV4Y2VwdCBpdCBkb2VzICoqbm90KiogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW2FyZzEsIGFyZzIsIC4uLl0gQXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgbmFtZSkgeyByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lOyB9O1xuICAgICAqIHZhciBoaSA9IF8ucGFydGlhbChncmVldCwgJ2hpJyk7XG4gICAgICogaGkoJ21vZScpO1xuICAgICAqIC8vID0+ICdoaSBtb2UnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFydGlhbChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQm91bmQoZnVuYywgbmF0aXZlU2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIGBfLnBhcnRpYWxgLCBleGNlcHQgdGhhdCBgcGFydGlhbGAgYXJndW1lbnRzIGFyZVxuICAgICAqIGFwcGVuZGVkIHRvIHRob3NlIHBhc3NlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW2FyZzEsIGFyZzIsIC4uLl0gQXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHNEZWVwID0gXy5wYXJ0aWFsUmlnaHQoXy5tZXJnZSwgXy5kZWZhdWx0cyk7XG4gICAgICpcbiAgICAgKiB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICd2YXJpYWJsZSc6ICdkYXRhJyxcbiAgICAgKiAgICdpbXBvcnRzJzogeyAnanEnOiAkIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogZGVmYXVsdHNEZWVwKG9wdGlvbnMsIF8udGVtcGxhdGVTZXR0aW5ncyk7XG4gICAgICpcbiAgICAgKiBvcHRpb25zLnZhcmlhYmxlXG4gICAgICogLy8gPT4gJ2RhdGEnXG4gICAgICpcbiAgICAgKiBvcHRpb25zLmltcG9ydHNcbiAgICAgKiAvLyA9PiB7ICdfJzogXywgJ2pxJzogJCB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFydGlhbFJpZ2h0KGZ1bmMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCb3VuZChmdW5jLCBuYXRpdmVTbGljZS5jYWxsKGFyZ3VtZW50cywgMSksIG51bGwsIGluZGljYXRvck9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gZXhlY3V0ZWQsIHdpbGwgb25seSBjYWxsIHRoZSBgZnVuY2AgZnVuY3Rpb25cbiAgICAgKiBhdCBtb3N0IG9uY2UgcGVyIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFBhc3MgYW4gYG9wdGlvbnNgIG9iamVjdCB0b1xuICAgICAqIGluZGljYXRlIHRoYXQgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlXG4gICAgICogb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gd2lsbFxuICAgICAqIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBjYWxsLlxuICAgICAqXG4gICAgICogTm90ZTogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIHdpbGwgYmUgY2FsbGVkXG4gICAgICogb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhlIHRocm90dGxlZCBmdW5jdGlvbiBpc1xuICAgICAqIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBleGVjdXRpb25zIHRvLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiAgW2xlYWRpbmc9dHJ1ZV0gQSBib29sZWFuIHRvIHNwZWNpZnkgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogIFt0cmFpbGluZz10cnVlXSBBIGJvb2xlYW4gdG8gc3BlY2lmeSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKTtcbiAgICAgKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIGpRdWVyeSgnLmludGVyYWN0aXZlJykub24oJ2NsaWNrJywgXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHtcbiAgICAgKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gICAgICogfSkpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBsZWFkaW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuICAgICAgb3B0aW9ucyA9IGdldE9iamVjdCgpO1xuICAgICAgb3B0aW9ucy5sZWFkaW5nID0gbGVhZGluZztcbiAgICAgIG9wdGlvbnMubWF4V2FpdCA9IHdhaXQ7XG4gICAgICBvcHRpb25zLnRyYWlsaW5nID0gdHJhaWxpbmc7XG5cbiAgICAgIHZhciByZXN1bHQgPSBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKTtcbiAgICAgIHJlbGVhc2VPYmplY3Qob3B0aW9ucyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBhc3NlcyBgdmFsdWVgIHRvIHRoZSBgd3JhcHBlcmAgZnVuY3Rpb24gYXMgaXRzXG4gICAgICogZmlyc3QgYXJndW1lbnQuIEFkZGl0aW9uYWwgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcGFzc2VkIHRvIHRoZSBgd3JhcHBlcmAgZnVuY3Rpb24uIFRoZSBgd3JhcHBlcmAgaXMgZXhlY3V0ZWQgd2l0aFxuICAgICAqIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnNcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaGVsbG8gPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiAnaGVsbG8gJyArIG5hbWU7IH07XG4gICAgICogaGVsbG8gPSBfLndyYXAoaGVsbG8sIGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAnYmVmb3JlLCAnICsgZnVuYygnbW9lJykgKyAnLCBhZnRlcic7XG4gICAgICogfSk7XG4gICAgICogaGVsbG8oKTtcbiAgICAgKiAvLyA9PiAnYmVmb3JlLCBoZWxsbyBtb2UsIGFmdGVyJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbdmFsdWVdO1xuICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIGAmYCwgYDxgLCBgPmAsIGBcImAsIGFuZCBgJ2AgaW4gYHN0cmluZ2AgdG8gdGhlaXJcbiAgICAgKiBjb3JyZXNwb25kaW5nIEhUTUwgZW50aXRpZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGUoJ01vZSwgTGFycnkgJiBDdXJseScpO1xuICAgICAqIC8vID0+ICdNb2UsIExhcnJ5ICZhbXA7IEN1cmx5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiBzdHJpbmcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHN0cmluZykucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtNaXhlZH0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgbW9lID0geyAnbmFtZSc6ICdtb2UnIH07XG4gICAgICogbW9lID09PSBfLmlkZW50aXR5KG1vZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBmdW5jdGlvbnMgcHJvcGVydGllcyBvZiBgb2JqZWN0YCB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24gYW5kIGNoYWluYWJsZVxuICAgICAqIHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9uIHByb3BlcnRpZXMgdG8gYWRkIHRvIGBsb2Rhc2hgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1peGluKHtcbiAgICAgKiAgICdjYXBpdGFsaXplJzogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uY2FwaXRhbGl6ZSgnbW9lJyk7XG4gICAgICogLy8gPT4gJ01vZSdcbiAgICAgKlxuICAgICAqIF8oJ21vZScpLmNhcGl0YWxpemUoKTtcbiAgICAgKiAvLyA9PiAnTW9lJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCkge1xuICAgICAgZm9yRWFjaChmdW5jdGlvbnMob2JqZWN0KSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGxvZGFzaFttZXRob2ROYW1lXSA9IG9iamVjdFttZXRob2ROYW1lXTtcblxuICAgICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICAgICAgYXJncyA9IFt2YWx1ZV07XG5cbiAgICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkobG9kYXNoLCBhcmdzKTtcbiAgICAgICAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB2YWx1ZSA9PT0gcmVzdWx0KVxuICAgICAgICAgICAgPyB0aGlzXG4gICAgICAgICAgICA6IG5ldyBsb2Rhc2hXcmFwcGVyKHJlc3VsdCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnRzIHRoZSAnXycgdmFyaWFibGUgdG8gaXRzIHByZXZpb3VzIHZhbHVlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvXG4gICAgICogdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdGllc1xuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgY29udGV4dC5fID0gb2xkRGFzaDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBgdmFsdWVgIGludG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIGByYWRpeGAuXG4gICAgICogSWYgYHJhZGl4YCBpcyBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIHRoZVxuICAgICAqIGB2YWx1ZWAgaXMgYSBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBtZXRob2QgYXZvaWRzIGRpZmZlcmVuY2VzIGluIG5hdGl2ZSBFUzMgYW5kIEVTNSBgcGFyc2VJbnRgXG4gICAgICogaW1wbGVtZW50YXRpb25zLiBTZWUgaHR0cDovL2VzNS5naXRodWIuY29tLyNFLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdGllc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFyc2UuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtyYWRpeF0gVGhlIHJhZGl4IHVzZWQgdG8gaW50ZXJwcmV0IHRoZSB2YWx1ZSB0byBwYXJzZS5cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIHRoZSBuZXcgaW50ZWdlciB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYXJzZUludCgnMDgnKTtcbiAgICAgKiAvLyA9PiA4XG4gICAgICovXG4gICAgdmFyIHBhcnNlSW50ID0gbmF0aXZlUGFyc2VJbnQod2hpdGVzcGFjZSArICcwOCcpID09IDggPyBuYXRpdmVQYXJzZUludCA6IGZ1bmN0aW9uKHZhbHVlLCByYWRpeCkge1xuICAgICAgLy8gRmlyZWZveCBhbmQgT3BlcmEgc3RpbGwgZm9sbG93IHRoZSBFUzMgc3BlY2lmaWVkIGltcGxlbWVudGF0aW9uIG9mIGBwYXJzZUludGBcbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludChpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZS5yZXBsYWNlKHJlTGVhZGluZ1NwYWNlc0FuZFplcm9zLCAnJykgOiB2YWx1ZSwgcmFkaXggfHwgMCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIGBtaW5gIGFuZCBgbWF4YCAoaW5jbHVzaXZlKS4gSWYgb25seSBvbmVcbiAgICAgKiBhcmd1bWVudCBpcyBwYXNzZWQsIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttaW49MF0gVGhlIG1pbmltdW0gcG9zc2libGUgdmFsdWUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXg9MV0gVGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUuXG4gICAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBhIHJhbmRvbSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDAsIDUpO1xuICAgICAqIC8vID0+IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSk7XG4gICAgICogLy8gPT4gYWxzbyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYW5kb20obWluLCBtYXgpIHtcbiAgICAgIGlmIChtaW4gPT0gbnVsbCAmJiBtYXggPT0gbnVsbCkge1xuICAgICAgICBtYXggPSAxO1xuICAgICAgfVxuICAgICAgbWluID0gK21pbiB8fCAwO1xuICAgICAgaWYgKG1heCA9PSBudWxsKSB7XG4gICAgICAgIG1heCA9IG1pbjtcbiAgICAgICAgbWluID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9ICttYXggfHwgMDtcbiAgICAgIH1cbiAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgICByZXR1cm4gKG1pbiAlIDEgfHwgbWF4ICUgMSlcbiAgICAgICAgPyBtaW4gKyBuYXRpdmVNaW4ocmFuZCAqIChtYXggLSBtaW4gKyBwYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsnJykubGVuZ3RoIC0gMSkpKSwgbWF4KVxuICAgICAgICA6IG1pbiArIGZsb29yKHJhbmQgKiAobWF4IC0gbWluICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSB2YWx1ZSBvZiBgcHJvcGVydHlgIG9uIGBvYmplY3RgLiBJZiBgcHJvcGVydHlgIGlzIGEgZnVuY3Rpb24sXG4gICAgICogaXQgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBvYmplY3RgIGFuZCBpdHMgcmVzdWx0IHJldHVybmVkLFxuICAgICAqIGVsc2UgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJldHVybmVkLiBJZiBgb2JqZWN0YCBpcyBmYWxzZXksIHRoZW4gYHVuZGVmaW5lZGBcbiAgICAgKiBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGdldCB0aGUgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMge01peGVkfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdjaGVlc2UnOiAnY3J1bXBldHMnLFxuICAgICAqICAgJ3N0dWZmJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIHJldHVybiAnbm9uc2Vuc2UnO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdjaGVlc2UnKTtcbiAgICAgKiAvLyA9PiAnY3J1bXBldHMnXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdzdHVmZicpO1xuICAgICAqIC8vID0+ICdub25zZW5zZSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID8gb2JqZWN0W3Byb3BlcnR5XSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlKSA/IG9iamVjdFtwcm9wZXJ0eV0oKSA6IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbWljcm8tdGVtcGxhdGluZyBtZXRob2QgdGhhdCBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBwcmVzZXJ2ZXNcbiAgICAgKiB3aGl0ZXNwYWNlLCBhbmQgY29ycmVjdGx5IGVzY2FwZXMgcXVvdGVzIHdpdGhpbiBpbnRlcnBvbGF0ZWQgY29kZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCwgYF8udGVtcGxhdGVgIHV0aWxpemVzIHNvdXJjZVVSTHMgZm9yIGVhc2llclxuICAgICAqIGRlYnVnZ2luZy4gU2VlIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmxcbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlOlxuICAgICAqIGh0dHA6Ly9sb2Rhc2guY29tLyNjdXN0b20tYnVpbGRzXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWU6XG4gICAgICogaHR0cDovL2RldmVsb3Blci5jaHJvbWUuY29tL3N0YWJsZS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsLmh0bWxcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGVtcGxhdGUgdGV4dC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSBUaGUgZGF0YSBvYmplY3QgdXNlZCB0byBwb3B1bGF0ZSB0aGUgdGV4dC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogIGVzY2FwZSAtIFRoZSBcImVzY2FwZVwiIGRlbGltaXRlciByZWdleHAuXG4gICAgICogIGV2YWx1YXRlIC0gVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgcmVnZXhwLlxuICAgICAqICBpbnRlcnBvbGF0ZSAtIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHJlZ2V4cC5cbiAgICAgKiAgc291cmNlVVJMIC0gVGhlIHNvdXJjZVVSTCBvZiB0aGUgdGVtcGxhdGUncyBjb21waWxlZCBzb3VyY2UuXG4gICAgICogIHZhcmlhYmxlIC0gVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufFN0cmluZ30gUmV0dXJucyBhIGNvbXBpbGVkIGZ1bmN0aW9uIHdoZW4gbm8gYGRhdGFgIG9iamVjdFxuICAgICAqICBpcyBnaXZlbiwgZWxzZSBpdCByZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdGV4dC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgYSBjb21waWxlZCB0ZW1wbGF0ZVxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSBuYW1lICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAnbmFtZSc6ICdtb2UnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtb2UnXG4gICAgICpcbiAgICAgKiB2YXIgbGlzdCA9ICc8JSBfLmZvckVhY2gocGVvcGxlLCBmdW5jdGlvbihuYW1lKSB7ICU+PGxpPjwlPSBuYW1lICU+PC9saT48JSB9KTsgJT4nO1xuICAgICAqIF8udGVtcGxhdGUobGlzdCwgeyAncGVvcGxlJzogWydtb2UnLCAnbGFycnknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPm1vZTwvbGk+PGxpPmxhcnJ5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIEhUTUwgaW4gZGF0YSBwcm9wZXJ0eSB2YWx1ZXNcbiAgICAgKiBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+JywgeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAqIC8vID0+ICc8Yj4mbHQ7c2NyaXB0Jmd0OzwvYj4nXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgRVM2IGRlbGltaXRlciBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgZGVmYXVsdCBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyXG4gICAgICogXy50ZW1wbGF0ZSgnaGVsbG8gJHsgbmFtZSB9JywgeyAnbmFtZSc6ICdjdXJseScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGN1cmx5J1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnNcbiAgICAgKiBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgZXBpdGhldCk7ICU+IScsIHsgJ2VwaXRoZXQnOiAnc3Rvb2dlJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gc3Rvb2dlISdcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIGN1c3RvbSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzID0ge1xuICAgICAqICAgJ2ludGVycG9sYXRlJzogL3t7KFtcXHNcXFNdKz8pfX0vZ1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLnRlbXBsYXRlKCdoZWxsbyB7eyBuYW1lIH19IScsIHsgJ25hbWUnOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGVcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gbmFtZSAlPicsIG51bGwsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9KTtcbiAgICAgKiBjb21waWxlZChkYXRhKTtcbiAgICAgKiAvLyA9PiBmaW5kIHRoZSBzb3VyY2Ugb2YgXCJncmVldGluZy5qc3RcIiB1bmRlciB0aGUgU291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGVcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS5uYW1lICU+IScsIG51bGwsIHsgJ3ZhcmlhYmxlJzogJ2RhdGEnIH0pO1xuICAgICAqIGNvbXBpbGVkLnNvdXJjZTtcbiAgICAgKiAvLyA9PiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICogICB2YXIgX190LCBfX3AgPSAnJywgX19lID0gXy5lc2NhcGU7XG4gICAgICogICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS5uYW1lICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogICByZXR1cm4gX19wO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgc291cmNlYCBwcm9wZXJ0eSB0byBpbmxpbmUgY29tcGlsZWQgdGVtcGxhdGVzIGZvciBtZWFuaW5nZnVsXG4gICAgICogLy8gbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBhIHN0YWNrIHRyYWNlXG4gICAgICogZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY3dkLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHRleHQsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgIC8vIGJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvXG4gICAgICAvLyBhbmQgTGF1cmEgRG9rdG9yb3ZhJ3MgZG9ULmpzXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcbiAgICAgIHRleHQgfHwgKHRleHQgPSAnJyk7XG5cbiAgICAgIC8vIGF2b2lkIG1pc3NpbmcgZGVwZW5kZW5jaWVzIHdoZW4gYGl0ZXJhdG9yVGVtcGxhdGVgIGlzIG5vdCBkZWZpbmVkXG4gICAgICBvcHRpb25zID0gZGVmYXVsdHMoe30sIG9wdGlvbnMsIHNldHRpbmdzKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBkZWZhdWx0cyh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IHZhbHVlcyhpbXBvcnRzKTtcblxuICAgICAgdmFyIGlzRXZhbHVhdGluZyxcbiAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCxcbiAgICAgICAgICBzb3VyY2UgPSBcIl9fcCArPSAnXCI7XG5cbiAgICAgIC8vIGNvbXBpbGUgdGhlIHJlZ2V4cCB0byBtYXRjaCBlYWNoIGRlbGltaXRlclxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgdGV4dC5yZXBsYWNlKHJlRGVsaW1pdGVycywgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZVZhbHVlLCBpbnRlcnBvbGF0ZVZhbHVlLCBlc1RlbXBsYXRlVmFsdWUsIGV2YWx1YXRlVmFsdWUsIG9mZnNldCkge1xuICAgICAgICBpbnRlcnBvbGF0ZVZhbHVlIHx8IChpbnRlcnBvbGF0ZVZhbHVlID0gZXNUZW1wbGF0ZVZhbHVlKTtcblxuICAgICAgICAvLyBlc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHNcbiAgICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gcmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHNcbiAgICAgICAgaWYgKGVzY2FwZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuX19lKFwiICsgZXNjYXBlVmFsdWUgKyBcIikgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXZhbHVhdGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJztcXG5cIiArIGV2YWx1YXRlVmFsdWUgKyBcIjtcXG5fX3AgKz0gJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnBvbGF0ZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuKChfX3QgPSAoXCIgKyBpbnRlcnBvbGF0ZVZhbHVlICsgXCIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgICAgLy8gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBwcm9kdWN0cyByZXF1aXJlcyByZXR1cm5pbmcgdGhlIGBtYXRjaGBcbiAgICAgICAgLy8gc3RyaW5nIGluIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWVcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAgIC8vIGlmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCwgd3JhcCBhIHdpdGgtc3RhdGVtZW50IGFyb3VuZCB0aGUgZ2VuZXJhdGVkXG4gICAgICAvLyBjb2RlIHRvIGFkZCB0aGUgZGF0YSBvYmplY3QgdG8gdGhlIHRvcCBvZiB0aGUgc2NvcGUgY2hhaW5cbiAgICAgIHZhciB2YXJpYWJsZSA9IG9wdGlvbnMudmFyaWFibGUsXG4gICAgICAgICAgaGFzVmFyaWFibGUgPSB2YXJpYWJsZTtcblxuICAgICAgaWYgKCFoYXNWYXJpYWJsZSkge1xuICAgICAgICB2YXJpYWJsZSA9ICdvYmonO1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAoJyArIHZhcmlhYmxlICsgJykge1xcbicgKyBzb3VyY2UgKyAnXFxufVxcbic7XG4gICAgICB9XG4gICAgICAvLyBjbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3NcbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gZnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keVxuICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyB2YXJpYWJsZSArICcpIHtcXG4nICtcbiAgICAgICAgKGhhc1ZhcmlhYmxlID8gJycgOiB2YXJpYWJsZSArICcgfHwgKCcgKyB2YXJpYWJsZSArICcgPSB7fSk7XFxuJykgK1xuICAgICAgICBcInZhciBfX3QsIF9fcCA9ICcnLCBfX2UgPSBfLmVzY2FwZVwiICtcbiAgICAgICAgKGlzRXZhbHVhdGluZ1xuICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XFxuJyArXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxcblwiXG4gICAgICAgICAgOiAnO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIHNvdXJjZSArXG4gICAgICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBmb3IgZWFzaWVyIGRlYnVnZ2luZyBhbmQgd3JhcCBpbiBhIG11bHRpLWxpbmUgY29tbWVudCB0b1xuICAgICAgLy8gYXZvaWQgaXNzdWVzIHdpdGggTmFyd2hhbCwgSUUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24sIGFuZCB0aGUgSlMgZW5naW5lXG4gICAgICAvLyBlbWJlZGRlZCBpbiBBZG9iZSBwcm9kdWN0cy5cbiAgICAgIC8vIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmxcbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnXFxuLypcXG4vL0Agc291cmNlVVJMPScgKyAob3B0aW9ucy5zb3VyY2VVUkwgfHwgJy9sb2Rhc2gvdGVtcGxhdGUvc291cmNlWycgKyAodGVtcGxhdGVDb3VudGVyKyspICsgJ10nKSArICdcXG4qLyc7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbihpbXBvcnRzS2V5cywgJ3JldHVybiAnICsgc291cmNlICsgc291cmNlVVJMKS5hcHBseSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGUuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdChkYXRhKTtcbiAgICAgIH1cbiAgICAgIC8vIHByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIHZpYSBpdHMgYHRvU3RyaW5nYCBtZXRob2QsIGluXG4gICAgICAvLyBzdXBwb3J0ZWQgZW52aXJvbm1lbnRzLCBvciB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3JcbiAgICAgIC8vIGlubGluaW5nIGNvbXBpbGVkIHRlbXBsYXRlcyBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3NcbiAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBgY2FsbGJhY2tgIGZ1bmN0aW9uIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzXG4gICAgICogb2YgZWFjaCBgY2FsbGJhY2tgIGV4ZWN1dGlvbi4gVGhlIGBjYWxsYmFja2AgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkXG4gICAgICogd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBleGVjdXRlIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtNaXhlZH0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZGljZVJvbGxzID0gXy50aW1lcygzLCBfLnBhcnRpYWwoXy5yYW5kb20sIDEsIDYpKTtcbiAgICAgKiAvLyA9PiBbMywgNiwgNF1cbiAgICAgKlxuICAgICAqIF8udGltZXMoMywgZnVuY3Rpb24obikgeyBtYWdlLmNhc3RTcGVsbChuKTsgfSk7XG4gICAgICogLy8gPT4gY2FsbHMgYG1hZ2UuY2FzdFNwZWxsKG4pYCB0aHJlZSB0aW1lcywgcGFzc2luZyBgbmAgb2YgYDBgLCBgMWAsIGFuZCBgMmAgcmVzcGVjdGl2ZWx5XG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIGZ1bmN0aW9uKG4pIHsgdGhpcy5jYXN0KG4pOyB9LCBtYWdlKTtcbiAgICAgKiAvLyA9PiBhbHNvIGNhbGxzIGBtYWdlLmNhc3RTcGVsbChuKWAgdGhyZWUgdGltZXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aW1lcyhuLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgbiA9IChuID0gK24pID4gLTEgPyBuIDogMDtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGNhbGxiYWNrKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYCwgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdGllc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB1bmVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuZXNjYXBlKCdNb2UsIExhcnJ5ICZhbXA7IEN1cmx5Jyk7XG4gICAgICogLy8gPT4gJ01vZSwgTGFycnkgJiBDdXJseSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiBzdHJpbmcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHN0cmluZykucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIHBhc3NlZCwgdGhlIElEIHdpbGwgYmUgYXBwZW5kZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtwcmVmaXhdIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge1N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gU3RyaW5nKHByZWZpeCA9PSBudWxsID8gJycgOiBwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGBpbnRlcmNlcHRvcmAgd2l0aCB0aGUgYHZhbHVlYCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIGFuZCB0aGVuXG4gICAgICogcmV0dXJucyBgdmFsdWVgLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInRhcCBpbnRvXCIgYSBtZXRob2QgY2hhaW4sXG4gICAgICogaW4gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbiB0aGUgY2hhaW4uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmdcbiAgICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFzcyB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge01peGVkfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDMsIDRdKVxuICAgICAqICAuZmlsdGVyKGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICUgMiA9PSAwOyB9KVxuICAgICAqICAudGFwKGFsZXJ0KVxuICAgICAqICAubWFwKGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICogbnVtOyB9KVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiAvLyBbMiwgNF0gKGFsZXJ0ZWQpXG4gICAgICogLy8gPT4gWzQsIDE2XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhcCh2YWx1ZSwgaW50ZXJjZXB0b3IpIHtcbiAgICAgIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0aGUgYHRvU3RyaW5nYCByZXN1bHQgb2YgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB0b1N0cmluZ1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENoYWluaW5nXG4gICAgICogQHJldHVybnMge1N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nIHJlc3VsdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pLnRvU3RyaW5nKCk7XG4gICAgICogLy8gPT4gJzEsMiwzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJUb1N0cmluZygpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodGhpcy5fX3dyYXBwZWRfXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZU9mXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgdmFsdWVcbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmdcbiAgICAgKiBAcmV0dXJucyB7TWl4ZWR9IFJldHVybnMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZU9mKCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclZhbHVlT2YoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3dyYXBwZWRfXztcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIGFkZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgd2hlbiBjaGFpbmluZ1xuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hc3NpZ24gPSBhc3NpZ247XG4gICAgbG9kYXNoLmF0ID0gYXQ7XG4gICAgbG9kYXNoLmJpbmQgPSBiaW5kO1xuICAgIGxvZGFzaC5iaW5kQWxsID0gYmluZEFsbDtcbiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb21wb3NlID0gY29tcG9zZTtcbiAgICBsb2Rhc2guY291bnRCeSA9IGNvdW50Qnk7XG4gICAgbG9kYXNoLmNyZWF0ZUNhbGxiYWNrID0gY3JlYXRlQ2FsbGJhY2s7XG4gICAgbG9kYXNoLmRlYm91bmNlID0gZGVib3VuY2U7XG4gICAgbG9kYXNoLmRlZmF1bHRzID0gZGVmYXVsdHM7XG4gICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7XG4gICAgbG9kYXNoLmRlbGF5ID0gZGVsYXk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duO1xuICAgIGxvZGFzaC5mdW5jdGlvbnMgPSBmdW5jdGlvbnM7XG4gICAgbG9kYXNoLmdyb3VwQnkgPSBncm91cEJ5O1xuICAgIGxvZGFzaC5pbml0aWFsID0gaW5pdGlhbDtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9uO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludm9rZSA9IGludm9rZTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLm1hcCA9IG1hcDtcbiAgICBsb2Rhc2gubWF4ID0gbWF4O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWluID0gbWluO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub25jZSA9IG9uY2U7XG4gICAgbG9kYXNoLnBhaXJzID0gcGFpcnM7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBpY2sgPSBwaWNrO1xuICAgIGxvZGFzaC5wbHVjayA9IHBsdWNrO1xuICAgIGxvZGFzaC5yYW5nZSA9IHJhbmdlO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlc3QgPSByZXN0O1xuICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5O1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRpbWVzID0gdGltZXM7XG4gICAgbG9kYXNoLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgbG9kYXNoLnVuaW9uID0gdW5pb247XG4gICAgbG9kYXNoLnVuaXEgPSB1bmlxO1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgbG9kYXNoLndoZXJlID0gd2hlcmU7XG4gICAgbG9kYXNoLndpdGhvdXQgPSB3aXRob3V0O1xuICAgIGxvZGFzaC53cmFwID0gd3JhcDtcbiAgICBsb2Rhc2guemlwID0gemlwO1xuICAgIGxvZGFzaC56aXBPYmplY3QgPSB6aXBPYmplY3Q7XG5cbiAgICAvLyBhZGQgYWxpYXNlc1xuICAgIGxvZGFzaC5jb2xsZWN0ID0gbWFwO1xuICAgIGxvZGFzaC5kcm9wID0gcmVzdDtcbiAgICBsb2Rhc2guZWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbjtcbiAgICBsb2Rhc2gubWV0aG9kcyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2gub2JqZWN0ID0gemlwT2JqZWN0O1xuICAgIGxvZGFzaC5zZWxlY3QgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLnRhaWwgPSByZXN0O1xuICAgIGxvZGFzaC51bmlxdWUgPSB1bmlxO1xuXG4gICAgLy8gYWRkIGZ1bmN0aW9ucyB0byBgbG9kYXNoLnByb3RvdHlwZWBcbiAgICBtaXhpbihsb2Rhc2gpO1xuXG4gICAgLy8gYWRkIFVuZGVyc2NvcmUgY29tcGF0XG4gICAgbG9kYXNoLmNoYWluID0gbG9kYXNoO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY2hhaW4gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH07XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIGFkZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyB3aGVuIGNoYWluaW5nXG4gICAgbG9kYXNoLmNsb25lID0gY2xvbmU7XG4gICAgbG9kYXNoLmNsb25lRGVlcCA9IGNsb25lRGVlcDtcbiAgICBsb2Rhc2guY29udGFpbnMgPSBjb250YWlucztcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5ldmVyeSA9IGV2ZXJ5O1xuICAgIGxvZGFzaC5maW5kID0gZmluZDtcbiAgICBsb2Rhc2guZmluZEluZGV4ID0gZmluZEluZGV4O1xuICAgIGxvZGFzaC5maW5kS2V5ID0gZmluZEtleTtcbiAgICBsb2Rhc2guaGFzID0gaGFzO1xuICAgIGxvZGFzaC5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIGxvZGFzaC5pbmRleE9mID0gaW5kZXhPZjtcbiAgICBsb2Rhc2guaXNBcmd1bWVudHMgPSBpc0FyZ3VtZW50cztcbiAgICBsb2Rhc2guaXNBcnJheSA9IGlzQXJyYXk7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzTmFOID0gaXNOYU47XG4gICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDtcbiAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjtcbiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmxhc3RJbmRleE9mID0gbGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5wYXJzZUludCA9IHBhcnNlSW50O1xuICAgIGxvZGFzaC5yYW5kb20gPSByYW5kb207XG4gICAgbG9kYXNoLnJlZHVjZSA9IHJlZHVjZTtcbiAgICBsb2Rhc2gucmVkdWNlUmlnaHQgPSByZWR1Y2VSaWdodDtcbiAgICBsb2Rhc2gucmVzdWx0ID0gcmVzdWx0O1xuICAgIGxvZGFzaC5ydW5JbkNvbnRleHQgPSBydW5JbkNvbnRleHQ7XG4gICAgbG9kYXNoLnNpemUgPSBzaXplO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcblxuICAgIC8vIGFkZCBhbGlhc2VzXG4gICAgbG9kYXNoLmFsbCA9IGV2ZXJ5O1xuICAgIGxvZGFzaC5hbnkgPSBzb21lO1xuICAgIGxvZGFzaC5kZXRlY3QgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kV2hlcmUgPSBmaW5kO1xuICAgIGxvZGFzaC5mb2xkbCA9IHJlZHVjZTtcbiAgICBsb2Rhc2guZm9sZHIgPSByZWR1Y2VSaWdodDtcbiAgICBsb2Rhc2guaW5jbHVkZSA9IGNvbnRhaW5zO1xuICAgIGxvZGFzaC5pbmplY3QgPSByZWR1Y2U7XG5cbiAgICBmb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICBpZiAoIWxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhcmdzID0gW3RoaXMuX193cmFwcGVkX19dO1xuICAgICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShsb2Rhc2gsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBhZGQgZnVuY3Rpb25zIGNhcGFibGUgb2YgcmV0dXJuaW5nIHdyYXBwZWQgYW5kIHVud3JhcHBlZCB2YWx1ZXMgd2hlbiBjaGFpbmluZ1xuICAgIGxvZGFzaC5maXJzdCA9IGZpcnN0O1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcblxuICAgIC8vIGFkZCBhbGlhc2VzXG4gICAgbG9kYXNoLnRha2UgPSBmaXJzdDtcbiAgICBsb2Rhc2guaGVhZCA9IGZpcnN0O1xuXG4gICAgZm9yT3duKGxvZGFzaCwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgaWYgKCFsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdKSB7XG4gICAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmModGhpcy5fX3dyYXBwZWRfXywgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayA9PSBudWxsIHx8ICh0aGlzQXJnICYmIHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgPyByZXN1bHRcbiAgICAgICAgICAgIDogbmV3IGxvZGFzaFdyYXBwZXIocmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUgU3RyaW5nXG4gICAgICovXG4gICAgbG9kYXNoLlZFUlNJT04gPSAnMS4zLjEnO1xuXG4gICAgLy8gYWRkIFwiQ2hhaW5pbmdcIiBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXJcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvU3RyaW5nID0gd3JhcHBlclRvU3RyaW5nO1xuICAgIGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWVPZjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnZhbHVlT2YgPSB3cmFwcGVyVmFsdWVPZjtcblxuICAgIC8vIGFkZCBgQXJyYXlgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzXG4gICAgZm9yRWFjaChbJ2pvaW4nLCAncG9wJywgJ3NoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlSZWZbbWV0aG9kTmFtZV07XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMuX193cmFwcGVkX18sIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gYWRkIGBBcnJheWAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRoZSB3cmFwcGVkIHZhbHVlXG4gICAgZm9yRWFjaChbJ3B1c2gnLCAncmV2ZXJzZScsICdzb3J0JywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBhcnJheVJlZlttZXRob2ROYW1lXTtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZnVuYy5hcHBseSh0aGlzLl9fd3JhcHBlZF9fLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBhZGQgYEFycmF5YCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbmV3IHdyYXBwZWQgdmFsdWVzXG4gICAgZm9yRWFjaChbJ2NvbmNhdCcsICdzbGljZScsICdzcGxpY2UnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBhcnJheVJlZlttZXRob2ROYW1lXTtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBsb2Rhc2hXcmFwcGVyKGZ1bmMuYXBwbHkodGhpcy5fX3dyYXBwZWRfXywgYXJndW1lbnRzKSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvZGFzaDtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIGV4cG9zZSBMby1EYXNoXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gc29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2UgdGhlIGZvbGxvd2luZzpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIExvLURhc2ggdG8gdGhlIGdsb2JhbCBvYmplY3QgZXZlbiB3aGVuIGFuIEFNRCBsb2FkZXIgaXMgcHJlc2VudCBpblxuICAgIC8vIGNhc2UgTG8tRGFzaCB3YXMgaW5qZWN0ZWQgYnkgYSB0aGlyZC1wYXJ0eSBzY3JpcHQgYW5kIG5vdCBpbnRlbmRlZCB0byBiZVxuICAgIC8vIGxvYWRlZCBhcyBhIG1vZHVsZS4gVGhlIGdsb2JhbCBhc3NpZ25tZW50IGNhbiBiZSByZXZlcnRlZCBpbiB0aGUgTG8tRGFzaFxuICAgIC8vIG1vZHVsZSB2aWEgaXRzIGBub0NvbmZsaWN0KClgIG1ldGhvZC5cbiAgICB3aW5kb3cuXyA9IF87XG5cbiAgICAvLyBkZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBwYXRoIG1hcHBpbmcsIGl0IGNhbiBiZVxuICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZVxuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfO1xuICAgIH0pO1xuICB9XG4gIC8vIGNoZWNrIGZvciBgZXhwb3J0c2AgYWZ0ZXIgYGRlZmluZWAgaW4gY2FzZSBhIGJ1aWxkIG9wdGltaXplciBhZGRzIGFuIGBleHBvcnRzYCBvYmplY3RcbiAgZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgIWZyZWVFeHBvcnRzLm5vZGVUeXBlKSB7XG4gICAgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTIHYwLjguMCtcbiAgICBpZiAoZnJlZU1vZHVsZSkge1xuICAgICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIH1cbiAgICAvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuICAgIGVsc2Uge1xuICAgICAgZnJlZUV4cG9ydHMuXyA9IF87XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIGluIGEgYnJvd3NlciBvciBSaGlub1xuICAgIHdpbmRvdy5fID0gXztcbiAgfVxufSh0aGlzKSk7XG4iLCIvLyBtb21lbnQuanNcbi8vIHZlcnNpb24gOiAyLjEuMFxuLy8gYXV0aG9yIDogVGltIFdvb2Rcbi8vIGxpY2Vuc2UgOiBNSVRcbi8vIG1vbWVudGpzLmNvbVxuXG4oZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBDb25zdGFudHNcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICB2YXIgbW9tZW50LFxuICAgICAgICBWRVJTSU9OID0gXCIyLjEuMFwiLFxuICAgICAgICByb3VuZCA9IE1hdGgucm91bmQsIGksXG4gICAgICAgIC8vIGludGVybmFsIHN0b3JhZ2UgZm9yIGxhbmd1YWdlIGNvbmZpZyBmaWxlc1xuICAgICAgICBsYW5ndWFnZXMgPSB7fSxcblxuICAgICAgICAvLyBjaGVjayBmb3Igbm9kZUpTXG4gICAgICAgIGhhc01vZHVsZSA9ICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cyksXG5cbiAgICAgICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgICAgIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoXFwtP1xcZCspL2ksXG4gICAgICAgIGFzcE5ldFRpbWVTcGFuSnNvblJlZ2V4ID0gLyhcXC0pPyhcXGQqKT9cXC4/KFxcZCspXFw6KFxcZCspXFw6KFxcZCspXFwuPyhcXGR7M30pPy8sXG5cbiAgICAgICAgLy8gZm9ybWF0IHRva2Vuc1xuICAgICAgICBmb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KE1vfE1NP00/TT98RG98REREb3xERD9EP0Q/fGRkZD9kP3xkbz98d1tvfHddP3xXW298V10/fFlZWVlZfFlZWVl8WVl8Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98bW0/fHNzP3xTUz9TP3xYfHp6P3xaWj98LikvZyxcbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KExUfExMP0w/TD98bHsxLDR9KS9nLFxuXG4gICAgICAgIC8vIHBhcnNpbmcgdG9rZW4gcmVnZXhlc1xuICAgICAgICBwYXJzZVRva2VuT25lT3JUd29EaWdpdHMgPSAvXFxkXFxkPy8sIC8vIDAgLSA5OVxuICAgICAgICBwYXJzZVRva2VuT25lVG9UaHJlZURpZ2l0cyA9IC9cXGR7MSwzfS8sIC8vIDAgLSA5OTlcbiAgICAgICAgcGFyc2VUb2tlblRocmVlRGlnaXRzID0gL1xcZHszfS8sIC8vIDAwMCAtIDk5OVxuICAgICAgICBwYXJzZVRva2VuRm91ckRpZ2l0cyA9IC9cXGR7MSw0fS8sIC8vIDAgLSA5OTk5XG4gICAgICAgIHBhcnNlVG9rZW5TaXhEaWdpdHMgPSAvWytcXC1dP1xcZHsxLDZ9LywgLy8gLTk5OSw5OTkgLSA5OTksOTk5XG4gICAgICAgIHBhcnNlVG9rZW5Xb3JkID0gL1swLTldKlsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSt8W1xcdTA2MDAtXFx1MDZGRlxcL10rKFxccyo/W1xcdTA2MDAtXFx1MDZGRl0rKXsxLDJ9L2ksIC8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxuICAgICAgICBwYXJzZVRva2VuVGltZXpvbmUgPSAvWnxbXFwrXFwtXVxcZFxcZDo/XFxkXFxkL2ksIC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgICAgICBwYXJzZVRva2VuVCA9IC9UL2ksIC8vIFQgKElTTyBzZXBlcmF0b3IpXG4gICAgICAgIHBhcnNlVG9rZW5UaW1lc3RhbXBNcyA9IC9bXFwrXFwtXT9cXGQrKFxcLlxcZHsxLDN9KT8vLCAvLyAxMjM0NTY3ODkgMTIzNDU2Nzg5LjEyM1xuXG4gICAgICAgIC8vIHByZWxpbWluYXJ5IGlzbyByZWdleFxuICAgICAgICAvLyAwMDAwLTAwLTAwICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMFxuICAgICAgICBpc29SZWdleCA9IC9eXFxzKlxcZHs0fS1cXGRcXGQtXFxkXFxkKChUfCApKFxcZFxcZCg6XFxkXFxkKDpcXGRcXGQoXFwuXFxkXFxkP1xcZD8pPyk/KT8pPyhbXFwrXFwtXVxcZFxcZDo/XFxkXFxkKT8pPy8sXG4gICAgICAgIGlzb0Zvcm1hdCA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWicsXG5cbiAgICAgICAgLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xuICAgICAgICBpc29UaW1lcyA9IFtcbiAgICAgICAgICAgIFsnSEg6bW06c3MuUycsIC8oVHwgKVxcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkezEsM30vXSxcbiAgICAgICAgICAgIFsnSEg6bW06c3MnLCAvKFR8IClcXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISDptbScsIC8oVHwgKVxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEgnLCAvKFR8IClcXGRcXGQvXVxuICAgICAgICBdLFxuXG4gICAgICAgIC8vIHRpbWV6b25lIGNodW5rZXIgXCIrMTA6MDBcIiA+IFtcIjEwXCIsIFwiMDBcIl0gb3IgXCItMTUzMFwiID4gW1wiLTE1XCIsIFwiMzBcIl1cbiAgICAgICAgcGFyc2VUaW1lem9uZUNodW5rZXIgPSAvKFtcXCtcXC1dfFxcZFxcZCkvZ2ksXG5cbiAgICAgICAgLy8gZ2V0dGVyIGFuZCBzZXR0ZXIgbmFtZXNcbiAgICAgICAgcHJveHlHZXR0ZXJzQW5kU2V0dGVycyA9ICdEYXRlfEhvdXJzfE1pbnV0ZXN8U2Vjb25kc3xNaWxsaXNlY29uZHMnLnNwbGl0KCd8JyksXG4gICAgICAgIHVuaXRNaWxsaXNlY29uZEZhY3RvcnMgPSB7XG4gICAgICAgICAgICAnTWlsbGlzZWNvbmRzJyA6IDEsXG4gICAgICAgICAgICAnU2Vjb25kcycgOiAxZTMsXG4gICAgICAgICAgICAnTWludXRlcycgOiA2ZTQsXG4gICAgICAgICAgICAnSG91cnMnIDogMzZlNSxcbiAgICAgICAgICAgICdEYXlzJyA6IDg2NGU1LFxuICAgICAgICAgICAgJ01vbnRocycgOiAyNTkyZTYsXG4gICAgICAgICAgICAnWWVhcnMnIDogMzE1MzZlNlxuICAgICAgICB9LFxuXG4gICAgICAgIHVuaXRBbGlhc2VzID0ge1xuICAgICAgICAgICAgbXMgOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICAgICAgcyA6ICdzZWNvbmQnLFxuICAgICAgICAgICAgbSA6ICdtaW51dGUnLFxuICAgICAgICAgICAgaCA6ICdob3VyJyxcbiAgICAgICAgICAgIGQgOiAnZGF5JyxcbiAgICAgICAgICAgIHcgOiAnd2VlaycsXG4gICAgICAgICAgICBNIDogJ21vbnRoJyxcbiAgICAgICAgICAgIHkgOiAneWVhcidcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBmb3JtYXQgZnVuY3Rpb24gc3RyaW5nc1xuICAgICAgICBmb3JtYXRGdW5jdGlvbnMgPSB7fSxcblxuICAgICAgICAvLyB0b2tlbnMgdG8gb3JkaW5hbGl6ZSBhbmQgcGFkXG4gICAgICAgIG9yZGluYWxpemVUb2tlbnMgPSAnREREIHcgVyBNIEQgZCcuc3BsaXQoJyAnKSxcbiAgICAgICAgcGFkZGVkVG9rZW5zID0gJ00gRCBIIGggbSBzIHcgVycuc3BsaXQoJyAnKSxcblxuICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9ucyA9IHtcbiAgICAgICAgICAgIE0gICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9udGgoKSArIDE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgTU1NICA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nKCkubW9udGhzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBNTU1NIDogZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBEICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGUoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBEREQgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheU9mWWVhcigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGQgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGQgICA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZGQgIDogZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGRkZCA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3ICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndlZWsoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBXICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWsoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBZWSAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy55ZWFyKCkgJSAxMDAsIDIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFlZWVkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLnllYXIoKSwgNCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWVlZWVkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLnllYXIoKSwgNSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2cgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMud2Vla1llYXIoKSAlIDEwMCwgMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2dnZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53ZWVrWWVhcigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdnZ2dnIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy53ZWVrWWVhcigpLCA1KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBHRyAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy5pc29XZWVrWWVhcigpICUgMTAwLCAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBHR0dHIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtZZWFyKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgR0dHR0cgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLmlzb1dlZWtZZWFyKCksIDUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2Vla2RheSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla2RheSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGEgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEEgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFuZygpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBIICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaCAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbSAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmRzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgUyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZHMoKSAvIDEwMCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgU1MgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKH5+KHRoaXMubWlsbGlzZWNvbmRzKCkgLyAxMCksIDIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFNTUyAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLm1pbGxpc2Vjb25kcygpLCAzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBaICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhID0gLXRoaXMuem9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBiID0gXCIrXCI7XG4gICAgICAgICAgICAgICAgaWYgKGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSAtYTtcbiAgICAgICAgICAgICAgICAgICAgYiA9IFwiLVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYiArIGxlZnRaZXJvRmlsbCh+fihhIC8gNjApLCAyKSArIFwiOlwiICsgbGVmdFplcm9GaWxsKH5+YSAlIDYwLCAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBaWiAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhID0gLXRoaXMuem9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBiID0gXCIrXCI7XG4gICAgICAgICAgICAgICAgaWYgKGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSAtYTtcbiAgICAgICAgICAgICAgICAgICAgYiA9IFwiLVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYiArIGxlZnRaZXJvRmlsbCh+figxMCAqIGEgLyA2KSwgNCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeiA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56b25lQWJicigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHp6IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnpvbmVOYW1lKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWCAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51bml4KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICBmdW5jdGlvbiBwYWRUb2tlbihmdW5jLCBjb3VudCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwoZnVuYy5jYWxsKHRoaXMsIGEpLCBjb3VudCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9yZGluYWxpemVUb2tlbihmdW5jLCBwZXJpb2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nKCkub3JkaW5hbChmdW5jLmNhbGwodGhpcywgYSksIHBlcmlvZCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd2hpbGUgKG9yZGluYWxpemVUb2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGkgPSBvcmRpbmFsaXplVG9rZW5zLnBvcCgpO1xuICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1tpICsgJ28nXSA9IG9yZGluYWxpemVUb2tlbihmb3JtYXRUb2tlbkZ1bmN0aW9uc1tpXSwgaSk7XG4gICAgfVxuICAgIHdoaWxlIChwYWRkZWRUb2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGkgPSBwYWRkZWRUb2tlbnMucG9wKCk7XG4gICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW2kgKyBpXSA9IHBhZFRva2VuKGZvcm1hdFRva2VuRnVuY3Rpb25zW2ldLCAyKTtcbiAgICB9XG4gICAgZm9ybWF0VG9rZW5GdW5jdGlvbnMuRERERCA9IHBhZFRva2VuKGZvcm1hdFRva2VuRnVuY3Rpb25zLkRERCwgMyk7XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgQ29uc3RydWN0b3JzXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgZnVuY3Rpb24gTGFuZ3VhZ2UoKSB7XG5cbiAgICB9XG5cbiAgICAvLyBNb21lbnQgcHJvdG90eXBlIG9iamVjdFxuICAgIGZ1bmN0aW9uIE1vbWVudChjb25maWcpIHtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gRHVyYXRpb24gQ29uc3RydWN0b3JcbiAgICBmdW5jdGlvbiBEdXJhdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgeWVhcnMgPSBkdXJhdGlvbi55ZWFycyB8fCBkdXJhdGlvbi55ZWFyIHx8IGR1cmF0aW9uLnkgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IGR1cmF0aW9uLm1vbnRocyB8fCBkdXJhdGlvbi5tb250aCB8fCBkdXJhdGlvbi5NIHx8IDAsXG4gICAgICAgICAgICB3ZWVrcyA9IGR1cmF0aW9uLndlZWtzIHx8IGR1cmF0aW9uLndlZWsgfHwgZHVyYXRpb24udyB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IGR1cmF0aW9uLmRheXMgfHwgZHVyYXRpb24uZGF5IHx8IGR1cmF0aW9uLmQgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gZHVyYXRpb24uaG91cnMgfHwgZHVyYXRpb24uaG91ciB8fCBkdXJhdGlvbi5oIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gZHVyYXRpb24ubWludXRlcyB8fCBkdXJhdGlvbi5taW51dGUgfHwgZHVyYXRpb24ubSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IGR1cmF0aW9uLnNlY29uZHMgfHwgZHVyYXRpb24uc2Vjb25kIHx8IGR1cmF0aW9uLnMgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLm1pbGxpc2Vjb25kcyB8fCBkdXJhdGlvbi5taWxsaXNlY29uZCB8fCBkdXJhdGlvbi5tcyB8fCAwO1xuXG4gICAgICAgIC8vIHN0b3JlIHJlZmVyZW5jZSB0byBpbnB1dCBmb3IgZGV0ZXJtaW5pc3RpYyBjbG9uaW5nXG4gICAgICAgIHRoaXMuX2lucHV0ID0gZHVyYXRpb247XG5cbiAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGRhdGVBZGRSZW1vdmVcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgICAgICBtaW51dGVzICogNmU0ICsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBob3VycyAqIDM2ZTU7IC8vIDEwMDAgKiA2MCAqIDYwXG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgZGF0ZUFkZFJlbW92ZSB0cmVhdHMgMjQgaG91cnMgYXMgZGlmZmVyZW50IGZyb20gYVxuICAgICAgICAvLyBkYXkgd2hlbiB3b3JraW5nIGFyb3VuZCBEU1QsIHdlIG5lZWQgdG8gc3RvcmUgdGhlbSBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuX2RheXMgPSBkYXlzICtcbiAgICAgICAgICAgIHdlZWtzICogNztcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcbiAgICAgICAgLy8gd2hpY2ggbW9udGhzIHlvdSBhcmUgYXJlIHRhbGtpbmcgYWJvdXQsIHNvIHdlIGhhdmUgdG8gc3RvcmVcbiAgICAgICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fbW9udGhzID0gbW9udGhzICtcbiAgICAgICAgICAgIHllYXJzICogMTI7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBIZWxwZXJzXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChiLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzUm91bmQobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbGVmdCB6ZXJvIGZpbGwgYSBudW1iZXJcbiAgICAvLyBzZWUgaHR0cDovL2pzcGVyZi5jb20vbGVmdC16ZXJvLWZpbGxpbmcgZm9yIHBlcmZvcm1hbmNlIGNvbXBhcmlzb25cbiAgICBmdW5jdGlvbiBsZWZ0WmVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciArICcnO1xuICAgICAgICB3aGlsZSAob3V0cHV0Lmxlbmd0aCA8IHRhcmdldExlbmd0aCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gJzAnICsgb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBfLmFkZFRpbWUgYW5kIF8uc3VidHJhY3RUaW1lXG4gICAgZnVuY3Rpb24gYWRkT3JTdWJ0cmFjdER1cmF0aW9uRnJvbU1vbWVudChtb20sIGR1cmF0aW9uLCBpc0FkZGluZywgaWdub3JlVXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IGR1cmF0aW9uLl9kYXlzLFxuICAgICAgICAgICAgbW9udGhzID0gZHVyYXRpb24uX21vbnRocyxcbiAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICBob3VycyxcbiAgICAgICAgICAgIGN1cnJlbnREYXRlO1xuXG4gICAgICAgIGlmIChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIG1vbS5fZC5zZXRUaW1lKCttb20uX2QgKyBtaWxsaXNlY29uZHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RvcmUgdGhlIG1pbnV0ZXMgYW5kIGhvdXJzIHNvIHdlIGNhbiByZXN0b3JlIHRoZW1cbiAgICAgICAgaWYgKGRheXMgfHwgbW9udGhzKSB7XG4gICAgICAgICAgICBtaW51dGVzID0gbW9tLm1pbnV0ZSgpO1xuICAgICAgICAgICAgaG91cnMgPSBtb20uaG91cigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBtb20uZGF0ZShtb20uZGF0ZSgpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9udGhzKSB7XG4gICAgICAgICAgICBtb20ubW9udGgobW9tLm1vbnRoKCkgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcyAmJiAhaWdub3JlVXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICBtb21lbnQudXBkYXRlT2Zmc2V0KG1vbSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzdG9yZSB0aGUgbWludXRlcyBhbmQgaG91cnMgYWZ0ZXIgcG9zc2libHkgY2hhbmdpbmcgZHN0XG4gICAgICAgIGlmIChkYXlzIHx8IG1vbnRocykge1xuICAgICAgICAgICAgbW9tLm1pbnV0ZShtaW51dGVzKTtcbiAgICAgICAgICAgIG1vbS5ob3VyKGhvdXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGlzIGFuIGFycmF5XG4gICAgZnVuY3Rpb24gaXNBcnJheShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5Mikge1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBsZW5ndGhEaWZmID0gTWF0aC5hYnMoYXJyYXkxLmxlbmd0aCAtIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAofn5hcnJheTFbaV0gIT09IH5+YXJyYXkyW2ldKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB1bml0cyA/IHVuaXRBbGlhc2VzW3VuaXRzXSB8fCB1bml0cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyguKXMkLywgJyQxJykgOiB1bml0cztcbiAgICB9XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgTGFuZ3VhZ2VzXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICBMYW5ndWFnZS5wcm90b3R5cGUgPSB7XG4gICAgICAgIHNldCA6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICAgICAgZm9yIChpIGluIGNvbmZpZykge1xuICAgICAgICAgICAgICAgIHByb3AgPSBjb25maWdbaV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfbW9udGhzIDogXCJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyXCIuc3BsaXQoXCJfXCIpLFxuICAgICAgICBtb250aHMgOiBmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1ttLm1vbnRoKCldO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9tb250aHNTaG9ydCA6IFwiSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWNcIi5zcGxpdChcIl9cIiksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1BhcnNlIDogZnVuY3Rpb24gKG1vbnRoTmFtZSkge1xuICAgICAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbW9tID0gbW9tZW50KFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykgKyAnfF4nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3dlZWtkYXlzIDogXCJTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheVwiLnNwbGl0KFwiX1wiKSxcbiAgICAgICAgd2Vla2RheXMgOiBmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzW20uZGF5KCldO1xuICAgICAgICB9LFxuXG4gICAgICAgIF93ZWVrZGF5c1Nob3J0IDogXCJTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXRcIi5zcGxpdChcIl9cIiksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiBmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3dlZWtkYXlzTWluIDogXCJTdV9Nb19UdV9XZV9UaF9Gcl9TYVwiLnNwbGl0KFwiX1wiKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiBmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldO1xuICAgICAgICB9LFxuXG4gICAgICAgIHdlZWtkYXlzUGFyc2UgOiBmdW5jdGlvbiAod2Vla2RheU5hbWUpIHtcbiAgICAgICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbW9tID0gbW9tZW50KFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpICsgJ3xeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9sb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogXCJoOm1tIEFcIixcbiAgICAgICAgICAgIEwgOiBcIk1NL0REL1lZWVlcIixcbiAgICAgICAgICAgIExMIDogXCJNTU1NIEQgWVlZWVwiLFxuICAgICAgICAgICAgTExMIDogXCJNTU1NIEQgWVlZWSBMVFwiLFxuICAgICAgICAgICAgTExMTCA6IFwiZGRkZCwgTU1NTSBEIFlZWVkgTFRcIlxuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldO1xuICAgICAgICAgICAgaWYgKCFvdXRwdXQgJiYgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSA9IG91dHB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKVswXSA9PT0gJ3AnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfbWVyaWRpZW1QYXJzZSA6IC9bYXBdXFwuP20/XFwuPy9pLFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhbScgOiAnQU0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9jYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IGZ1bmN0aW9uIChrZXksIG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyW2tleV07XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIG91dHB1dCA9PT0gJ2Z1bmN0aW9uJyA/IG91dHB1dC5hcHBseShtb20pIDogb3V0cHV0O1xuICAgICAgICB9LFxuXG4gICAgICAgIF9yZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiBcImluICVzXCIsXG4gICAgICAgICAgICBwYXN0IDogXCIlcyBhZ29cIixcbiAgICAgICAgICAgIHMgOiBcImEgZmV3IHNlY29uZHNcIixcbiAgICAgICAgICAgIG0gOiBcImEgbWludXRlXCIsXG4gICAgICAgICAgICBtbSA6IFwiJWQgbWludXRlc1wiLFxuICAgICAgICAgICAgaCA6IFwiYW4gaG91clwiLFxuICAgICAgICAgICAgaGggOiBcIiVkIGhvdXJzXCIsXG4gICAgICAgICAgICBkIDogXCJhIGRheVwiLFxuICAgICAgICAgICAgZGQgOiBcIiVkIGRheXNcIixcbiAgICAgICAgICAgIE0gOiBcImEgbW9udGhcIixcbiAgICAgICAgICAgIE1NIDogXCIlZCBtb250aHNcIixcbiAgICAgICAgICAgIHkgOiBcImEgeWVhclwiLFxuICAgICAgICAgICAgeXkgOiBcIiVkIHllYXJzXCJcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDogZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX3JlbGF0aXZlVGltZVtzdHJpbmddO1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb3V0cHV0ID09PSAnZnVuY3Rpb24nKSA/XG4gICAgICAgICAgICAgICAgb3V0cHV0KG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkgOlxuICAgICAgICAgICAgICAgIG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgICAgICB9LFxuICAgICAgICBwYXN0RnV0dXJlIDogZnVuY3Rpb24gKGRpZmYsIG91dHB1dCkge1xuICAgICAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZm9ybWF0ID09PSAnZnVuY3Rpb24nID8gZm9ybWF0KG91dHB1dCkgOiBmb3JtYXQucmVwbGFjZSgvJXMvaSwgb3V0cHV0KTtcbiAgICAgICAgfSxcblxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZShcIiVkXCIsIG51bWJlcik7XG4gICAgICAgIH0sXG4gICAgICAgIF9vcmRpbmFsIDogXCIlZFwiLFxuXG4gICAgICAgIHByZXBhcnNlIDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgfSxcblxuICAgICAgICBwb3N0Zm9ybWF0IDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgfSxcblxuICAgICAgICB3ZWVrIDogZnVuY3Rpb24gKG1vbSkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgICAgIH0sXG4gICAgICAgIF93ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTG9hZHMgYSBsYW5ndWFnZSBkZWZpbml0aW9uIGludG8gdGhlIGBsYW5ndWFnZXNgIGNhY2hlLiAgVGhlIGZ1bmN0aW9uXG4gICAgLy8gdGFrZXMgYSBrZXkgYW5kIG9wdGlvbmFsbHkgdmFsdWVzLiAgSWYgbm90IGluIHRoZSBicm93c2VyIGFuZCBubyB2YWx1ZXNcbiAgICAvLyBhcmUgcHJvdmlkZWQsIGl0IHdpbGwgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZSBtb2R1bGUuICBBcyBhIGNvbnZlbmllbmNlLFxuICAgIC8vIHRoaXMgZnVuY3Rpb24gYWxzbyByZXR1cm5zIHRoZSBsYW5ndWFnZSB2YWx1ZXMuXG4gICAgZnVuY3Rpb24gbG9hZExhbmcoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFsdWVzLmFiYnIgPSBrZXk7XG4gICAgICAgIGlmICghbGFuZ3VhZ2VzW2tleV0pIHtcbiAgICAgICAgICAgIGxhbmd1YWdlc1trZXldID0gbmV3IExhbmd1YWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFuZ3VhZ2VzW2tleV0uc2V0KHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBsYW5ndWFnZXNba2V5XTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmVzIHdoaWNoIGxhbmd1YWdlIGRlZmluaXRpb24gdG8gdXNlIGFuZCByZXR1cm5zIGl0LlxuICAgIC8vXG4gICAgLy8gV2l0aCBubyBwYXJhbWV0ZXJzLCBpdCB3aWxsIHJldHVybiB0aGUgZ2xvYmFsIGxhbmd1YWdlLiAgSWYgeW91XG4gICAgLy8gcGFzcyBpbiBhIGxhbmd1YWdlIGtleSwgc3VjaCBhcyAnZW4nLCBpdCB3aWxsIHJldHVybiB0aGVcbiAgICAvLyBkZWZpbml0aW9uIGZvciAnZW4nLCBzbyBsb25nIGFzICdlbicgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgdXNpbmdcbiAgICAvLyBtb21lbnQubGFuZy5cbiAgICBmdW5jdGlvbiBnZXRMYW5nRGVmaW5pdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQuZm4uX2xhbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYW5ndWFnZXNba2V5XSAmJiBoYXNNb2R1bGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZSgnLi9sYW5nLycgKyBrZXkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIGNhbGwgd2l0aCBubyBwYXJhbXMgdG8gc2V0IHRvIGRlZmF1bHRcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9tZW50LmZuLl9sYW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYW5ndWFnZXNba2V5XTtcbiAgICB9XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgRm9ybWF0dGluZ1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xcWy4qXFxdLykpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgXCJcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksIGksIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGFycmF5W2ldIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KSA6IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcbiAgICBmdW5jdGlvbiBmb3JtYXRNb21lbnQobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciBpID0gNTtcblxuICAgICAgICBmdW5jdGlvbiByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBtLmxhbmcoKS5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoaS0tICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0pIHtcbiAgICAgICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID0gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0obSk7XG4gICAgfVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIFBhcnNpbmdcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIC8vIGdldCB0aGUgcmVnZXggdG8gZmluZCB0aGUgbmV4dCB0b2tlblxuICAgIGZ1bmN0aW9uIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgICAgY2FzZSAnRERERCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlblRocmVlRGlnaXRzO1xuICAgICAgICBjYXNlICdZWVlZJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuRm91ckRpZ2l0cztcbiAgICAgICAgY2FzZSAnWVlZWVknOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5TaXhEaWdpdHM7XG4gICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICBjYXNlICdTUyc6XG4gICAgICAgIGNhc2UgJ1NTUyc6XG4gICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbk9uZVRvVGhyZWVEaWdpdHM7XG4gICAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgIGNhc2UgJ01NTU0nOlxuICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgIGNhc2UgJ2RkZCc6XG4gICAgICAgIGNhc2UgJ2RkZGQnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5Xb3JkO1xuICAgICAgICBjYXNlICdhJzpcbiAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICByZXR1cm4gZ2V0TGFuZ0RlZmluaXRpb24oY29uZmlnLl9sKS5fbWVyaWRpZW1QYXJzZTtcbiAgICAgICAgY2FzZSAnWCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlblRpbWVzdGFtcE1zO1xuICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgY2FzZSAnWlonOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5UaW1lem9uZTtcbiAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlblQ7XG4gICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgY2FzZSAnREQnOlxuICAgICAgICBjYXNlICdZWSc6XG4gICAgICAgIGNhc2UgJ0hIJzpcbiAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbk9uZU9yVHdvRGlnaXRzO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRva2VuLnJlcGxhY2UoJ1xcXFwnLCAnJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGltZXpvbmVNaW51dGVzRnJvbVN0cmluZyhzdHJpbmcpIHtcbiAgICAgICAgdmFyIHR6Y2h1bmsgPSAocGFyc2VUb2tlblRpbWV6b25lLmV4ZWMoc3RyaW5nKSB8fCBbXSlbMF0sXG4gICAgICAgICAgICBwYXJ0cyA9ICh0emNodW5rICsgJycpLm1hdGNoKHBhcnNlVGltZXpvbmVDaHVua2VyKSB8fCBbJy0nLCAwLCAwXSxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgfn5wYXJ0c1syXTtcblxuICAgICAgICByZXR1cm4gcGFydHNbMF0gPT09ICcrJyA/IC1taW51dGVzIDogbWludXRlcztcbiAgICB9XG5cbiAgICAvLyBmdW5jdGlvbiB0byBjb252ZXJ0IHN0cmluZyBpbnB1dCB0byBkYXRlXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgdmFyIGEsIGRhdGVQYXJ0QXJyYXkgPSBjb25maWcuX2E7XG5cbiAgICAgICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICAvLyBNT05USFxuICAgICAgICBjYXNlICdNJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBNTVxuICAgICAgICBjYXNlICdNTScgOlxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVsxXSA9IChpbnB1dCA9PSBudWxsKSA/IDAgOiB+fmlucHV0IC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdNTU0nIDogLy8gZmFsbCB0aHJvdWdoIHRvIE1NTU1cbiAgICAgICAgY2FzZSAnTU1NTScgOlxuICAgICAgICAgICAgYSA9IGdldExhbmdEZWZpbml0aW9uKGNvbmZpZy5fbCkubW9udGhzUGFyc2UoaW5wdXQpO1xuICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbmQgYSBtb250aCBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWQuXG4gICAgICAgICAgICBpZiAoYSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVsxXSA9IGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIERBWSBPRiBNT05USFxuICAgICAgICBjYXNlICdEJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBEREREXG4gICAgICAgIGNhc2UgJ0REJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBEREREXG4gICAgICAgIGNhc2UgJ0RERCcgOiAvLyBmYWxsIHRocm91Z2ggdG8gRERERFxuICAgICAgICBjYXNlICdEREREJyA6XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbMl0gPSB+fmlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFlFQVJcbiAgICAgICAgY2FzZSAnWVknIDpcbiAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbMF0gPSB+fmlucHV0ICsgKH5+aW5wdXQgPiA2OCA/IDE5MDAgOiAyMDAwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdZWVlZJyA6XG4gICAgICAgIGNhc2UgJ1lZWVlZJyA6XG4gICAgICAgICAgICBkYXRlUGFydEFycmF5WzBdID0gfn5pbnB1dDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBBTSAvIFBNXG4gICAgICAgIGNhc2UgJ2EnIDogLy8gZmFsbCB0aHJvdWdoIHRvIEFcbiAgICAgICAgY2FzZSAnQScgOlxuICAgICAgICAgICAgY29uZmlnLl9pc1BtID0gZ2V0TGFuZ0RlZmluaXRpb24oY29uZmlnLl9sKS5pc1BNKGlucHV0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAyNCBIT1VSXG4gICAgICAgIGNhc2UgJ0gnIDogLy8gZmFsbCB0aHJvdWdoIHRvIGhoXG4gICAgICAgIGNhc2UgJ0hIJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBoaFxuICAgICAgICBjYXNlICdoJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBoaFxuICAgICAgICBjYXNlICdoaCcgOlxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVszXSA9IH5+aW5wdXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gTUlOVVRFXG4gICAgICAgIGNhc2UgJ20nIDogLy8gZmFsbCB0aHJvdWdoIHRvIG1tXG4gICAgICAgIGNhc2UgJ21tJyA6XG4gICAgICAgICAgICBkYXRlUGFydEFycmF5WzRdID0gfn5pbnB1dDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBTRUNPTkRcbiAgICAgICAgY2FzZSAncycgOiAvLyBmYWxsIHRocm91Z2ggdG8gc3NcbiAgICAgICAgY2FzZSAnc3MnIDpcbiAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbNV0gPSB+fmlucHV0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIE1JTExJU0VDT05EXG4gICAgICAgIGNhc2UgJ1MnIDpcbiAgICAgICAgY2FzZSAnU1MnIDpcbiAgICAgICAgY2FzZSAnU1NTJyA6XG4gICAgICAgICAgICBkYXRlUGFydEFycmF5WzZdID0gfn4gKCgnMC4nICsgaW5wdXQpICogMTAwMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVU5JWCBUSU1FU1RBTVAgV0lUSCBNU1xuICAgICAgICBjYXNlICdYJzpcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQpICogMTAwMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVElNRVpPTkVcbiAgICAgICAgY2FzZSAnWicgOiAvLyBmYWxsIHRocm91Z2ggdG8gWlpcbiAgICAgICAgY2FzZSAnWlonIDpcbiAgICAgICAgICAgIGNvbmZpZy5fdXNlVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fdHptID0gdGltZXpvbmVNaW51dGVzRnJvbVN0cmluZyhpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoZSBpbnB1dCBpcyBudWxsLCB0aGUgZGF0ZSBpcyBub3QgdmFsaWRcbiAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBkYXRlRnJvbUFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgZGF0ZSwgaW5wdXQgPSBbXTtcblxuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IChjb25maWcuX2FbaV0gPT0gbnVsbCkgPyAoaSA9PT0gMiA/IDEgOiAwKSA6IGNvbmZpZy5fYVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCB0aGUgb2Zmc2V0cyB0byB0aGUgdGltZSB0byBiZSBwYXJzZWQgc28gdGhhdCB3ZSBjYW4gaGF2ZSBhIGNsZWFuIGFycmF5IGZvciBjaGVja2luZyBpc1ZhbGlkXG4gICAgICAgIGlucHV0WzNdICs9IH5+KChjb25maWcuX3R6bSB8fCAwKSAvIDYwKTtcbiAgICAgICAgaW5wdXRbNF0gKz0gfn4oKGNvbmZpZy5fdHptIHx8IDApICUgNjApO1xuXG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZSgwKTtcblxuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoaW5wdXRbMF0sIGlucHV0WzFdLCBpbnB1dFsyXSk7XG4gICAgICAgICAgICBkYXRlLnNldFVUQ0hvdXJzKGlucHV0WzNdLCBpbnB1dFs0XSwgaW5wdXRbNV0sIGlucHV0WzZdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoaW5wdXRbMF0sIGlucHV0WzFdLCBpbnB1dFsyXSk7XG4gICAgICAgICAgICBkYXRlLnNldEhvdXJzKGlucHV0WzNdLCBpbnB1dFs0XSwgaW5wdXRbNV0sIGlucHV0WzZdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZy5fZCA9IGRhdGU7XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xuICAgIGZ1bmN0aW9uIG1ha2VEYXRlRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpIHtcbiAgICAgICAgLy8gVGhpcyBhcnJheSBpcyB1c2VkIHRvIG1ha2UgYSBEYXRlLCBlaXRoZXIgd2l0aCBgbmV3IERhdGVgIG9yIGBEYXRlLlVUQ2BcbiAgICAgICAgdmFyIHRva2VucyA9IGNvbmZpZy5fZi5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGksIHBhcnNlZElucHV0O1xuXG4gICAgICAgIGNvbmZpZy5fYSA9IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhcnNlZElucHV0ID0gKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbnNbaV0sIGNvbmZpZykuZXhlYyhzdHJpbmcpIHx8IFtdKVswXTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZShzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXRzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5zW2ldXSkge1xuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2Vuc1tpXSwgcGFyc2VkSW5wdXQsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IHRvIHRoZSBzdHJpbmdcbiAgICAgICAgaWYgKHN0cmluZykge1xuICAgICAgICAgICAgY29uZmlnLl9pbCA9IHN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBhbSBwbVxuICAgICAgICBpZiAoY29uZmlnLl9pc1BtICYmIGNvbmZpZy5fYVszXSA8IDEyKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbM10gKz0gMTI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgaXMgMTIgYW0sIGNoYW5nZSBob3VycyB0byAwXG4gICAgICAgIGlmIChjb25maWcuX2lzUG0gPT09IGZhbHNlICYmIGNvbmZpZy5fYVszXSA9PT0gMTIpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVszXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV0dXJuXG4gICAgICAgIGRhdGVGcm9tQXJyYXkoY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIG1ha2VEYXRlRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIHRlbXBNb21lbnQsXG4gICAgICAgICAgICBiZXN0TW9tZW50LFxuXG4gICAgICAgICAgICBzY29yZVRvQmVhdCA9IDk5LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLl9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnID0gZXh0ZW5kKHt9LCBjb25maWcpO1xuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIG1ha2VEYXRlRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcbiAgICAgICAgICAgIHRlbXBNb21lbnQgPSBuZXcgTW9tZW50KHRlbXBDb25maWcpO1xuXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSBjb21wYXJlQXJyYXlzKHRlbXBDb25maWcuX2EsIHRlbXBNb21lbnQudG9BcnJheSgpKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWRcbiAgICAgICAgICAgIC8vIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBpZiAodGVtcE1vbWVudC5faWwpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gdGVtcE1vbWVudC5faWwubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQpIHtcbiAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcE1vbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQpO1xuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0XG4gICAgZnVuY3Rpb24gbWFrZURhdGVGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gaXNvUmVnZXguZXhlYyhzdHJpbmcpO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgLy8gbWF0Y2hbMl0gc2hvdWxkIGJlIFwiVFwiIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uZmlnLl9mID0gJ1lZWVktTU0tREQnICsgKG1hdGNoWzJdIHx8IFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNvVGltZXNbaV1bMV0uZXhlYyhzdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5fZiArPSBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnNlVG9rZW5UaW1lem9uZS5leGVjKHN0cmluZykpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2YgKz0gXCIgWlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFrZURhdGVGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShzdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZURhdGVGcm9tSW5wdXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoZWQgPSBhc3BOZXRKc29uUmVnZXguZXhlYyhpbnB1dCk7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK21hdGNoZWRbMV0pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG1ha2VEYXRlRnJvbVN0cmluZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2EgPSBpbnB1dC5zbGljZSgwKTtcbiAgICAgICAgICAgIGRhdGVGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGlucHV0IGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKCtpbnB1dCkgOiBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgUmVsYXRpdmUgVGltZVxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBtb21lbnQuZm4uZnJvbSwgbW9tZW50LmZuLmZyb21Ob3csIGFuZCBtb21lbnQuZHVyYXRpb24uZm4uaHVtYW5pemVcbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlVGltZUFnbyhzdHJpbmcsIG51bWJlciwgd2l0aG91dFN1ZmZpeCwgaXNGdXR1cmUsIGxhbmcpIHtcbiAgICAgICAgcmV0dXJuIGxhbmcucmVsYXRpdmVUaW1lKG51bWJlciB8fCAxLCAhIXdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZShtaWxsaXNlY29uZHMsIHdpdGhvdXRTdWZmaXgsIGxhbmcpIHtcbiAgICAgICAgdmFyIHNlY29uZHMgPSByb3VuZChNYXRoLmFicyhtaWxsaXNlY29uZHMpIC8gMTAwMCksXG4gICAgICAgICAgICBtaW51dGVzID0gcm91bmQoc2Vjb25kcyAvIDYwKSxcbiAgICAgICAgICAgIGhvdXJzID0gcm91bmQobWludXRlcyAvIDYwKSxcbiAgICAgICAgICAgIGRheXMgPSByb3VuZChob3VycyAvIDI0KSxcbiAgICAgICAgICAgIHllYXJzID0gcm91bmQoZGF5cyAvIDM2NSksXG4gICAgICAgICAgICBhcmdzID0gc2Vjb25kcyA8IDQ1ICYmIFsncycsIHNlY29uZHNdIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA9PT0gMSAmJiBbJ20nXSB8fFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMgPCA0NSAmJiBbJ21tJywgbWludXRlc10gfHxcbiAgICAgICAgICAgICAgICBob3VycyA9PT0gMSAmJiBbJ2gnXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzIDwgMjIgJiYgWydoaCcsIGhvdXJzXSB8fFxuICAgICAgICAgICAgICAgIGRheXMgPT09IDEgJiYgWydkJ10gfHxcbiAgICAgICAgICAgICAgICBkYXlzIDw9IDI1ICYmIFsnZGQnLCBkYXlzXSB8fFxuICAgICAgICAgICAgICAgIGRheXMgPD0gNDUgJiYgWydNJ10gfHxcbiAgICAgICAgICAgICAgICBkYXlzIDwgMzQ1ICYmIFsnTU0nLCByb3VuZChkYXlzIC8gMzApXSB8fFxuICAgICAgICAgICAgICAgIHllYXJzID09PSAxICYmIFsneSddIHx8IFsneXknLCB5ZWFyc107XG4gICAgICAgIGFyZ3NbMl0gPSB3aXRob3V0U3VmZml4O1xuICAgICAgICBhcmdzWzNdID0gbWlsbGlzZWNvbmRzID4gMDtcbiAgICAgICAgYXJnc1s0XSA9IGxhbmc7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseSh7fSwgYXJncyk7XG4gICAgfVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIFdlZWsgb2YgWWVhclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgLy8gZmlyc3REYXlPZldlZWsgICAgICAgMCA9IHN1biwgNiA9IHNhdFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXkgb2YgdGhlIHdlZWsgdGhhdCBzdGFydHMgdGhlIHdlZWtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAodXN1YWxseSBzdW5kYXkgb3IgbW9uZGF5KVxuICAgIC8vIGZpcnN0RGF5T2ZXZWVrT2ZZZWFyIDAgPSBzdW4sIDYgPSBzYXRcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3Qgd2VlayBpcyB0aGUgd2VlayB0aGF0IGNvbnRhaW5zIHRoZSBmaXJzdFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZGF5IG9mIHRoZSB3ZWVrXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgKGVnLiBJU08gd2Vla3MgdXNlIHRodXJzZGF5ICg0KSlcbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZmlyc3REYXlPZldlZWssIGZpcnN0RGF5T2ZXZWVrT2ZZZWFyKSB7XG4gICAgICAgIHZhciBlbmQgPSBmaXJzdERheU9mV2Vla09mWWVhciAtIGZpcnN0RGF5T2ZXZWVrLFxuICAgICAgICAgICAgZGF5c1RvRGF5T2ZXZWVrID0gZmlyc3REYXlPZldlZWtPZlllYXIgLSBtb20uZGF5KCksXG4gICAgICAgICAgICBhZGp1c3RlZE1vbWVudDtcblxuXG4gICAgICAgIGlmIChkYXlzVG9EYXlPZldlZWsgPiBlbmQpIHtcbiAgICAgICAgICAgIGRheXNUb0RheU9mV2VlayAtPSA3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRheXNUb0RheU9mV2VlayA8IGVuZCAtIDcpIHtcbiAgICAgICAgICAgIGRheXNUb0RheU9mV2VlayArPSA3O1xuICAgICAgICB9XG5cbiAgICAgICAgYWRqdXN0ZWRNb21lbnQgPSBtb21lbnQobW9tKS5hZGQoJ2QnLCBkYXlzVG9EYXlPZldlZWspO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2VlazogTWF0aC5jZWlsKGFkanVzdGVkTW9tZW50LmRheU9mWWVhcigpIC8gNyksXG4gICAgICAgICAgICB5ZWFyOiBhZGp1c3RlZE1vbWVudC55ZWFyKClcbiAgICAgICAgfTtcbiAgICB9XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgVG9wIExldmVsIEZ1bmN0aW9uc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIGZ1bmN0aW9uIG1ha2VNb21lbnQoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGdldExhbmdEZWZpbml0aW9uKCkucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudC5pc01vbWVudChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZyA9IGV4dGVuZCh7fSwgaW5wdXQpO1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK2lucHV0Ll9kKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBtYWtlRGF0ZUZyb21TdHJpbmdBbmRBcnJheShjb25maWcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWtlRGF0ZUZyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1ha2VEYXRlRnJvbUlucHV0KGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjb25maWcpO1xuICAgIH1cblxuICAgIG1vbWVudCA9IGZ1bmN0aW9uIChpbnB1dCwgZm9ybWF0LCBsYW5nKSB7XG4gICAgICAgIHJldHVybiBtYWtlTW9tZW50KHtcbiAgICAgICAgICAgIF9pIDogaW5wdXQsXG4gICAgICAgICAgICBfZiA6IGZvcm1hdCxcbiAgICAgICAgICAgIF9sIDogbGFuZyxcbiAgICAgICAgICAgIF9pc1VUQyA6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBjcmVhdGluZyB3aXRoIHV0Y1xuICAgIG1vbWVudC51dGMgPSBmdW5jdGlvbiAoaW5wdXQsIGZvcm1hdCwgbGFuZykge1xuICAgICAgICByZXR1cm4gbWFrZU1vbWVudCh7XG4gICAgICAgICAgICBfdXNlVVRDIDogdHJ1ZSxcbiAgICAgICAgICAgIF9pc1VUQyA6IHRydWUsXG4gICAgICAgICAgICBfbCA6IGxhbmcsXG4gICAgICAgICAgICBfaSA6IGlucHV0LFxuICAgICAgICAgICAgX2YgOiBmb3JtYXRcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIGNyZWF0aW5nIHdpdGggdW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpXG4gICAgbW9tZW50LnVuaXggPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbWVudChpbnB1dCAqIDEwMDApO1xuICAgIH07XG5cbiAgICAvLyBkdXJhdGlvblxuICAgIG1vbWVudC5kdXJhdGlvbiA9IGZ1bmN0aW9uIChpbnB1dCwga2V5KSB7XG4gICAgICAgIHZhciBpc0R1cmF0aW9uID0gbW9tZW50LmlzRHVyYXRpb24oaW5wdXQpLFxuICAgICAgICAgICAgaXNOdW1iZXIgPSAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyksXG4gICAgICAgICAgICBkdXJhdGlvbiA9IChpc0R1cmF0aW9uID8gaW5wdXQuX2lucHV0IDogKGlzTnVtYmVyID8ge30gOiBpbnB1dCkpLFxuICAgICAgICAgICAgbWF0Y2hlZCA9IGFzcE5ldFRpbWVTcGFuSnNvblJlZ2V4LmV4ZWMoaW5wdXQpLFxuICAgICAgICAgICAgc2lnbixcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gaW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgICAgIHNpZ24gPSAobWF0Y2hlZFsxXSA9PT0gXCItXCIpID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICBkOiB+fm1hdGNoZWRbMl0gKiBzaWduLFxuICAgICAgICAgICAgICAgIGg6IH5+bWF0Y2hlZFszXSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbTogfn5tYXRjaGVkWzRdICogc2lnbixcbiAgICAgICAgICAgICAgICBzOiB+fm1hdGNoZWRbNV0gKiBzaWduLFxuICAgICAgICAgICAgICAgIG1zOiB+fm1hdGNoZWRbNl0gKiBzaWduXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbiAmJiBpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnX2xhbmcnKSkge1xuICAgICAgICAgICAgcmV0Ll9sYW5nID0gaW5wdXQuX2xhbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICAvLyB2ZXJzaW9uIG51bWJlclxuICAgIG1vbWVudC52ZXJzaW9uID0gVkVSU0lPTjtcblxuICAgIC8vIGRlZmF1bHQgZm9ybWF0XG4gICAgbW9tZW50LmRlZmF1bHRGb3JtYXQgPSBpc29Gb3JtYXQ7XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9tZW50IGlzIG11dGF0ZWQuXG4gICAgLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG4gICAgbW9tZW50LnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgbGFuZ3VhZ2VzIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGxhbmd1YWdlLiAgSWZcbiAgICAvLyBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiwgaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIC8vIGxhbmd1YWdlIGtleS5cbiAgICBtb21lbnQubGFuZyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlcykge1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudC5mbi5fbGFuZy5fYWJicjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgICBsb2FkTGFuZyhrZXksIHZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWxhbmd1YWdlc1trZXldKSB7XG4gICAgICAgICAgICBnZXRMYW5nRGVmaW5pdGlvbihrZXkpO1xuICAgICAgICB9XG4gICAgICAgIG1vbWVudC5kdXJhdGlvbi5mbi5fbGFuZyA9IG1vbWVudC5mbi5fbGFuZyA9IGdldExhbmdEZWZpbml0aW9uKGtleSk7XG4gICAgfTtcblxuICAgIC8vIHJldHVybnMgbGFuZ3VhZ2UgZGF0YVxuICAgIG1vbWVudC5sYW5nRGF0YSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xhbmcgJiYga2V5Ll9sYW5nLl9hYmJyKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xhbmcuX2FiYnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldExhbmdEZWZpbml0aW9uKGtleSk7XG4gICAgfTtcblxuICAgIC8vIGNvbXBhcmUgbW9tZW50IG9iamVjdFxuICAgIG1vbWVudC5pc01vbWVudCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE1vbWVudDtcbiAgICB9O1xuXG4gICAgLy8gZm9yIHR5cGVjaGVja2luZyBEdXJhdGlvbiBvYmplY3RzXG4gICAgbW9tZW50LmlzRHVyYXRpb24gPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9O1xuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIE1vbWVudCBQcm90b3R5cGVcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIG1vbWVudC5mbiA9IE1vbWVudC5wcm90b3R5cGUgPSB7XG5cbiAgICAgICAgY2xvbmUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KHRoaXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHZhbHVlT2YgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuX2QgKyAoKHRoaXMuX29mZnNldCB8fCAwKSAqIDYwMDAwKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1bml4IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoK3RoaXMgLyAxMDAwKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0b1N0cmluZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChcImRkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvRGF0ZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXQgPyBuZXcgRGF0ZSgrdGhpcykgOiB0aGlzLl9kO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvSVNPU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtb21lbnQodGhpcykudXRjKCksICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9BcnJheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbS55ZWFyKCksXG4gICAgICAgICAgICAgICAgbS5tb250aCgpLFxuICAgICAgICAgICAgICAgIG0uZGF0ZSgpLFxuICAgICAgICAgICAgICAgIG0uaG91cnMoKSxcbiAgICAgICAgICAgICAgICBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgICAgICBtLnNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICBtLm1pbGxpc2Vjb25kcygpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzVmFsaWQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNWYWxpZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNWYWxpZCA9ICFjb21wYXJlQXJyYXlzKHRoaXMuX2EsICh0aGlzLl9pc1VUQyA/IG1vbWVudC51dGModGhpcy5fYSkgOiBtb21lbnQodGhpcy5fYSkpLnRvQXJyYXkoKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNWYWxpZCA9ICFpc05hTih0aGlzLl9kLmdldFRpbWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5faXNWYWxpZDtcbiAgICAgICAgfSxcblxuICAgICAgICB1dGMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy56b25lKDApO1xuICAgICAgICB9LFxuXG4gICAgICAgIGxvY2FsIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy56b25lKDApO1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZvcm1hdCA6IGZ1bmN0aW9uIChpbnB1dFN0cmluZykge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyB8fCBtb21lbnQuZGVmYXVsdEZvcm1hdCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nKCkucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFkZCA6IGZ1bmN0aW9uIChpbnB1dCwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgZHVyO1xuICAgICAgICAgICAgLy8gc3dpdGNoIGFyZ3MgdG8gc3VwcG9ydCBhZGQoJ3MnLCAxKSBhbmQgYWRkKDEsICdzJylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZHVyID0gbW9tZW50LmR1cmF0aW9uKCt2YWwsIGlucHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHVyID0gbW9tZW50LmR1cmF0aW9uKGlucHV0LCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkT3JTdWJ0cmFjdER1cmF0aW9uRnJvbU1vbWVudCh0aGlzLCBkdXIsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3VidHJhY3QgOiBmdW5jdGlvbiAoaW5wdXQsIHZhbCkge1xuICAgICAgICAgICAgdmFyIGR1cjtcbiAgICAgICAgICAgIC8vIHN3aXRjaCBhcmdzIHRvIHN1cHBvcnQgc3VidHJhY3QoJ3MnLCAxKSBhbmQgc3VidHJhY3QoMSwgJ3MnKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24oK3ZhbCwgaW5wdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQsIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRPclN1YnRyYWN0RHVyYXRpb25Gcm9tTW9tZW50KHRoaXMsIGR1ciwgLTEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGlmZiA6IGZ1bmN0aW9uIChpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcy5faXNVVEMgPyBtb21lbnQoaW5wdXQpLnpvbmUodGhpcy5fb2Zmc2V0IHx8IDApIDogbW9tZW50KGlucHV0KS5sb2NhbCgpLFxuICAgICAgICAgICAgICAgIHpvbmVEaWZmID0gKHRoaXMuem9uZSgpIC0gdGhhdC56b25lKCkpICogNmU0LFxuICAgICAgICAgICAgICAgIGRpZmYsIG91dHB1dDtcblxuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgICAgIGlmICh1bml0cyA9PT0gJ3llYXInIHx8IHVuaXRzID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAgICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgZGF5cyBpbiB0aGUgbW9udGhzIGluIHRoZSBnaXZlbiBkYXRlc1xuICAgICAgICAgICAgICAgIGRpZmYgPSAodGhpcy5kYXlzSW5Nb250aCgpICsgdGhhdC5kYXlzSW5Nb250aCgpKSAqIDQzMmU1OyAvLyAyNCAqIDYwICogNjAgKiAxMDAwIC8gMlxuICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKCh0aGlzLnllYXIoKSAtIHRoYXQueWVhcigpKSAqIDEyKSArICh0aGlzLm1vbnRoKCkgLSB0aGF0Lm1vbnRoKCkpO1xuICAgICAgICAgICAgICAgIC8vIGFkanVzdCBieSB0YWtpbmcgZGlmZmVyZW5jZSBpbiBkYXlzLCBhdmVyYWdlIG51bWJlciBvZiBkYXlzXG4gICAgICAgICAgICAgICAgLy8gYW5kIGRzdCBpbiB0aGUgZ2l2ZW4gbW9udGhzLlxuICAgICAgICAgICAgICAgIG91dHB1dCArPSAoKHRoaXMgLSBtb21lbnQodGhpcykuc3RhcnRPZignbW9udGgnKSkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoYXQgLSBtb21lbnQodGhhdCkuc3RhcnRPZignbW9udGgnKSkpIC8gZGlmZjtcbiAgICAgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aXRoIHpvbmVzLCB0byBuZWdhdGUgYWxsIGRzdFxuICAgICAgICAgICAgICAgIG91dHB1dCAtPSAoKHRoaXMuem9uZSgpIC0gbW9tZW50KHRoaXMpLnN0YXJ0T2YoJ21vbnRoJykuem9uZSgpKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhhdC56b25lKCkgLSBtb21lbnQodGhhdCkuc3RhcnRPZignbW9udGgnKS56b25lKCkpKSAqIDZlNCAvIGRpZmY7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0IC8gMTI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaWZmID0gKHRoaXMgLSB0aGF0KTtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB1bml0cyA9PT0gJ3NlY29uZCcgPyBkaWZmIC8gMWUzIDogLy8gMTAwMFxuICAgICAgICAgICAgICAgICAgICB1bml0cyA9PT0gJ21pbnV0ZScgPyBkaWZmIC8gNmU0IDogLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnaG91cicgPyBkaWZmIC8gMzZlNSA6IC8vIDEwMDAgKiA2MCAqIDYwXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnZGF5JyA/IChkaWZmIC0gem9uZURpZmYpIC8gODY0ZTUgOiAvLyAxMDAwICogNjAgKiA2MCAqIDI0LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnd2VlaycgPyAoZGlmZiAtIHpvbmVEaWZmKSAvIDYwNDhlNSA6IC8vIDEwMDAgKiA2MCAqIDYwICogMjQgKiA3LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICAgICAgICAgIGRpZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic1JvdW5kKG91dHB1dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbSA6IGZ1bmN0aW9uICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50LmR1cmF0aW9uKHRoaXMuZGlmZih0aW1lKSkubGFuZyh0aGlzLmxhbmcoKS5fYWJicikuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZyb21Ob3cgOiBmdW5jdGlvbiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJvbShtb21lbnQoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FsZW5kYXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGlmZiA9IHRoaXMuZGlmZihtb21lbnQoKS5zdGFydE9mKCdkYXknKSwgJ2RheXMnLCB0cnVlKSxcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSBkaWZmIDwgLTYgPyAnc2FtZUVsc2UnIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgLTEgPyAnbGFzdFdlZWsnIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMCA/ICdsYXN0RGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDEgPyAnc2FtZURheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAyID8gJ25leHREYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgNyA/ICduZXh0V2VlaycgOiAnc2FtZUVsc2UnO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KHRoaXMubGFuZygpLmNhbGVuZGFyKGZvcm1hdCwgdGhpcykpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzTGVhcFllYXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgeWVhciA9IHRoaXMueWVhcigpO1xuICAgICAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzRFNUIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnpvbmUoKSA8IHRoaXMuY2xvbmUoKS5tb250aCgwKS56b25lKCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUoKSA8IHRoaXMuY2xvbmUoKS5tb250aCg1KS56b25lKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRheSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIGRheSA9IHRoaXMuX2lzVVRDID8gdGhpcy5fZC5nZXRVVENEYXkoKSA6IHRoaXMuX2QuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5sYW5nKCkud2Vla2RheXNQYXJzZShpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoeyBkIDogaW5wdXQgLSBkYXkgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGggOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciB1dGMgPSB0aGlzLl9pc1VUQyA/ICdVVEMnIDogJycsXG4gICAgICAgICAgICAgICAgZGF5T2ZNb250aCxcbiAgICAgICAgICAgICAgICBkYXlzSW5Nb250aDtcblxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMubGFuZygpLm1vbnRoc1BhcnNlKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGF5T2ZNb250aCA9IHRoaXMuZGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kWydzZXQnICsgdXRjICsgJ01vbnRoJ10oaW5wdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZShNYXRoLm1pbihkYXlPZk1vbnRoLCB0aGlzLmRheXNJbk1vbnRoKCkpKTtcblxuICAgICAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kWydnZXQnICsgdXRjICsgJ01vbnRoJ10oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBzdGFydE9mOiBmdW5jdGlvbiAodW5pdHMpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggaW50ZW50aW9uYWxseSBvbWl0cyBicmVhayBrZXl3b3Jkc1xuICAgICAgICAgICAgLy8gdG8gdXRpbGl6ZSBmYWxsaW5nIHRocm91Z2ggdGhlIGNhc2VzLlxuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGhpcy5tb250aCgwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlKDEpO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kcygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmRzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gd2Vla3MgYXJlIGEgc3BlY2lhbCBjYXNlXG4gICAgICAgICAgICBpZiAodW5pdHMgPT09ICd3ZWVrJykge1xuICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheSgwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW5kT2Y6IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0cykuYWRkKHVuaXRzLCAxKS5zdWJ0cmFjdCgnbXMnLCAxKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0FmdGVyOiBmdW5jdGlvbiAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgICAgICB1bml0cyA9IHR5cGVvZiB1bml0cyAhPT0gJ3VuZGVmaW5lZCcgPyB1bml0cyA6ICdtaWxsaXNlY29uZCc7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKSA+ICttb21lbnQoaW5wdXQpLnN0YXJ0T2YodW5pdHMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzQmVmb3JlOiBmdW5jdGlvbiAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgICAgICB1bml0cyA9IHR5cGVvZiB1bml0cyAhPT0gJ3VuZGVmaW5lZCcgPyB1bml0cyA6ICdtaWxsaXNlY29uZCc7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKSA8ICttb21lbnQoaW5wdXQpLnN0YXJ0T2YodW5pdHMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzU2FtZTogZnVuY3Rpb24gKGlucHV0LCB1bml0cykge1xuICAgICAgICAgICAgdW5pdHMgPSB0eXBlb2YgdW5pdHMgIT09ICd1bmRlZmluZWQnID8gdW5pdHMgOiAnbWlsbGlzZWNvbmQnO1xuICAgICAgICAgICAgcmV0dXJuICt0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykgPT09ICttb21lbnQoaW5wdXQpLnN0YXJ0T2YodW5pdHMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1pbjogZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgICAgICAgICBvdGhlciA9IG1vbWVudC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuIG90aGVyIDwgdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgfSxcblxuICAgICAgICBtYXg6IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICAgICAgb3RoZXIgPSBtb21lbnQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgem9uZSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwO1xuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gdGltZXpvbmVNaW51dGVzRnJvbVN0cmluZyhpbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNikge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IGlucHV0O1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRPclN1YnRyYWN0RHVyYXRpb25Gcm9tTW9tZW50KHRoaXMsIG1vbWVudC5kdXJhdGlvbihvZmZzZXQgLSBpbnB1dCwgJ20nKSwgMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiB0aGlzLl9kLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICB6b25lQWJiciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IFwiVVRDXCIgOiBcIlwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIHpvbmVOYW1lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gXCJDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZVwiIDogXCJcIjtcbiAgICAgICAgfSxcblxuICAgICAgICBkYXlzSW5Nb250aCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQudXRjKFt0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpICsgMSwgMF0pLmRhdGUoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBkYXlPZlllYXIgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciBkYXlPZlllYXIgPSByb3VuZCgobW9tZW50KHRoaXMpLnN0YXJ0T2YoJ2RheScpIC0gbW9tZW50KHRoaXMpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNSkgKyAxO1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBkYXlPZlllYXIgOiB0aGlzLmFkZChcImRcIiwgKGlucHV0IC0gZGF5T2ZZZWFyKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2Vla1llYXIgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciB5ZWFyID0gd2Vla09mWWVhcih0aGlzLCB0aGlzLmxhbmcoKS5fd2Vlay5kb3csIHRoaXMubGFuZygpLl93ZWVrLmRveSkueWVhcjtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8geWVhciA6IHRoaXMuYWRkKFwieVwiLCAoaW5wdXQgLSB5ZWFyKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNvV2Vla1llYXIgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciB5ZWFyID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS55ZWFyO1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB5ZWFyIDogdGhpcy5hZGQoXCJ5XCIsIChpbnB1dCAtIHllYXIpKTtcbiAgICAgICAgfSxcblxuICAgICAgICB3ZWVrIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgd2VlayA9IHRoaXMubGFuZygpLndlZWsodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZChcImRcIiwgKGlucHV0IC0gd2VlaykgKiA3KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc29XZWVrIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKFwiZFwiLCAoaW5wdXQgLSB3ZWVrKSAqIDcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHdlZWtkYXkgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciB3ZWVrZGF5ID0gKHRoaXMuX2QuZ2V0RGF5KCkgKyA3IC0gdGhpcy5sYW5nKCkuX3dlZWsuZG93KSAlIDc7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChcImRcIiwgaW5wdXQgLSB3ZWVrZGF5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc29XZWVrZGF5IDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgICAgICAvLyBhcyBhIGdldHRlciwgcmV0dXJucyA3IGluc3RlYWQgb2YgMCAoMS03IHJhbmdlIGluc3RlYWQgb2YgMC02KVxuICAgICAgICAgICAgLy8gYXMgYSBzZXR0ZXIsIHN1bmRheSBzaG91bGQgYmVsb25nIHRvIHRoZSBwcmV2aW91cyB3ZWVrLlxuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB0aGlzLmRheSgpIHx8IDcgOiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IGlucHV0IDogaW5wdXQgLSA3KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBJZiBwYXNzZWQgYSBsYW5ndWFnZSBrZXksIGl0IHdpbGwgc2V0IHRoZSBsYW5ndWFnZSBmb3IgdGhpc1xuICAgICAgICAvLyBpbnN0YW5jZS4gIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAgICBsYW5nIDogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhbmcgPSBnZXRMYW5nRGVmaW5pdGlvbihrZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmb3IgYWRkaW5nIHNob3J0Y3V0c1xuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXJBbmRTZXR0ZXIobmFtZSwga2V5KSB7XG4gICAgICAgIG1vbWVudC5mbltuYW1lXSA9IG1vbWVudC5mbltuYW1lICsgJ3MnXSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHV0YyA9IHRoaXMuX2lzVVRDID8gJ1VUQycgOiAnJztcbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZFsnc2V0JyArIHV0YyArIGtleV0oaW5wdXQpO1xuICAgICAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kWydnZXQnICsgdXRjICsga2V5XSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGxvb3AgdGhyb3VnaCBhbmQgYWRkIHNob3J0Y3V0cyAoTW9udGgsIERhdGUsIEhvdXJzLCBNaW51dGVzLCBTZWNvbmRzLCBNaWxsaXNlY29uZHMpXG4gICAgZm9yIChpID0gMDsgaSA8IHByb3h5R2V0dGVyc0FuZFNldHRlcnMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgIG1ha2VHZXR0ZXJBbmRTZXR0ZXIocHJveHlHZXR0ZXJzQW5kU2V0dGVyc1tpXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywgJycpLCBwcm94eUdldHRlcnNBbmRTZXR0ZXJzW2ldKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgc2hvcnRjdXQgZm9yIHllYXIgKHVzZXMgZGlmZmVyZW50IHN5bnRheCB0aGFuIHRoZSBnZXR0ZXIvc2V0dGVyICd5ZWFyJyA9PSAnRnVsbFllYXInKVxuICAgIG1ha2VHZXR0ZXJBbmRTZXR0ZXIoJ3llYXInLCAnRnVsbFllYXInKTtcblxuICAgIC8vIGFkZCBwbHVyYWwgbWV0aG9kc1xuICAgIG1vbWVudC5mbi5kYXlzID0gbW9tZW50LmZuLmRheTtcbiAgICBtb21lbnQuZm4ubW9udGhzID0gbW9tZW50LmZuLm1vbnRoO1xuICAgIG1vbWVudC5mbi53ZWVrcyA9IG1vbWVudC5mbi53ZWVrO1xuICAgIG1vbWVudC5mbi5pc29XZWVrcyA9IG1vbWVudC5mbi5pc29XZWVrO1xuXG4gICAgLy8gYWRkIGFsaWFzZWQgZm9ybWF0IG1ldGhvZHNcbiAgICBtb21lbnQuZm4udG9KU09OID0gbW9tZW50LmZuLnRvSVNPU3RyaW5nO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBEdXJhdGlvbiBQcm90b3R5cGVcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIG1vbWVudC5kdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZSA9IHtcbiAgICAgICAgX2J1YmJsZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMsXG4gICAgICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzLFxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgICAgIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycztcblxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMgJSAxMDAwO1xuXG4gICAgICAgICAgICBzZWNvbmRzID0gYWJzUm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgICAgICBkYXRhLnNlY29uZHMgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgICAgIG1pbnV0ZXMgPSBhYnNSb3VuZChzZWNvbmRzIC8gNjApO1xuICAgICAgICAgICAgZGF0YS5taW51dGVzID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgICAgICBob3VycyA9IGFic1JvdW5kKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgICAgICBkYXRhLmhvdXJzID0gaG91cnMgJSAyNDtcblxuICAgICAgICAgICAgZGF5cyArPSBhYnNSb3VuZChob3VycyAvIDI0KTtcbiAgICAgICAgICAgIGRhdGEuZGF5cyA9IGRheXMgJSAzMDtcblxuICAgICAgICAgICAgbW9udGhzICs9IGFic1JvdW5kKGRheXMgLyAzMCk7XG4gICAgICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocyAlIDEyO1xuXG4gICAgICAgICAgICB5ZWFycyA9IGFic1JvdW5kKG1vbnRocyAvIDEyKTtcbiAgICAgICAgICAgIGRhdGEueWVhcnMgPSB5ZWFycztcbiAgICAgICAgfSxcblxuICAgICAgICB3ZWVrcyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBhYnNSb3VuZCh0aGlzLmRheXMoKSAvIDcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHZhbHVlT2YgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgICAgdGhpcy5fZGF5cyAqIDg2NGU1ICtcbiAgICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICAgIH5+KHRoaXMuX21vbnRocyAvIDEyKSAqIDMxNTM2ZTY7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaHVtYW5pemUgOiBmdW5jdGlvbiAod2l0aFN1ZmZpeCkge1xuICAgICAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSArdGhpcyxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSByZWxhdGl2ZVRpbWUoZGlmZmVyZW5jZSwgIXdpdGhTdWZmaXgsIHRoaXMubGFuZygpKTtcblxuICAgICAgICAgICAgaWYgKHdpdGhTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzLmxhbmcoKS5wYXN0RnV0dXJlKGRpZmZlcmVuY2UsIG91dHB1dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhbmcoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWRkIDogZnVuY3Rpb24gKGlucHV0LCB2YWwpIHtcbiAgICAgICAgICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChtb21lbnQpXG4gICAgICAgICAgICB2YXIgZHVyID0gbW9tZW50LmR1cmF0aW9uKGlucHV0LCB2YWwpO1xuXG4gICAgICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgKz0gZHVyLl9taWxsaXNlY29uZHM7XG4gICAgICAgICAgICB0aGlzLl9kYXlzICs9IGR1ci5fZGF5cztcbiAgICAgICAgICAgIHRoaXMuX21vbnRocyArPSBkdXIuX21vbnRocztcblxuICAgICAgICAgICAgdGhpcy5fYnViYmxlKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIHN1YnRyYWN0IDogZnVuY3Rpb24gKGlucHV0LCB2YWwpIHtcbiAgICAgICAgICAgIHZhciBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQsIHZhbCk7XG5cbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyAtPSBkdXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHRoaXMuX2RheXMgLT0gZHVyLl9kYXlzO1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzIC09IGR1ci5fbW9udGhzO1xuXG4gICAgICAgICAgICB0aGlzLl9idWJibGUoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IDogZnVuY3Rpb24gKHVuaXRzKSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzLnRvTG93ZXJDYXNlKCkgKyAncyddKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXMgOiBmdW5jdGlvbiAodW5pdHMpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbJ2FzJyArIHVuaXRzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdW5pdHMuc2xpY2UoMSkgKyAncyddKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbGFuZyA6IG1vbWVudC5mbi5sYW5nXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG1ha2VEdXJhdGlvbkdldHRlcihuYW1lKSB7XG4gICAgICAgIG1vbWVudC5kdXJhdGlvbi5mbltuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhW25hbWVdO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VEdXJhdGlvbkFzR2V0dGVyKG5hbWUsIGZhY3Rvcikge1xuICAgICAgICBtb21lbnQuZHVyYXRpb24uZm5bJ2FzJyArIG5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICt0aGlzIC8gZmFjdG9yO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZvciAoaSBpbiB1bml0TWlsbGlzZWNvbmRGYWN0b3JzKSB7XG4gICAgICAgIGlmICh1bml0TWlsbGlzZWNvbmRGYWN0b3JzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBtYWtlRHVyYXRpb25Bc0dldHRlcihpLCB1bml0TWlsbGlzZWNvbmRGYWN0b3JzW2ldKTtcbiAgICAgICAgICAgIG1ha2VEdXJhdGlvbkdldHRlcihpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZUR1cmF0aW9uQXNHZXR0ZXIoJ1dlZWtzJywgNjA0OGU1KTtcbiAgICBtb21lbnQuZHVyYXRpb24uZm4uYXNNb250aHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoK3RoaXMgLSB0aGlzLnllYXJzKCkgKiAzMTUzNmU2KSAvIDI1OTJlNiArIHRoaXMueWVhcnMoKSAqIDEyO1xuICAgIH07XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgRGVmYXVsdCBMYW5nXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsYW5ndWFnZSwgb3RoZXIgbGFuZ3VhZ2VzIHdpbGwgaW5oZXJpdCBmcm9tIEVuZ2xpc2guXG4gICAgbW9tZW50LmxhbmcoJ2VuJywge1xuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4gKG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBFeHBvc2luZyBNb21lbnRcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIC8vIENvbW1vbkpTIG1vZHVsZSBpcyBkZWZpbmVkXG4gICAgaWYgKGhhc01vZHVsZSkge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vbWVudDtcbiAgICB9XG4gICAgLypnbG9iYWwgZW5kZXI6ZmFsc2UgKi9cbiAgICBpZiAodHlwZW9mIGVuZGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBoZXJlLCBgdGhpc2AgbWVhbnMgYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIG9yIGBnbG9iYWxgIG9uIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gYWRkIGBtb21lbnRgIGFzIGEgZ2xvYmFsIG9iamVjdCB2aWEgYSBzdHJpbmcgaWRlbnRpZmllcixcbiAgICAgICAgLy8gZm9yIENsb3N1cmUgQ29tcGlsZXIgXCJhZHZhbmNlZFwiIG1vZGVcbiAgICAgICAgdGhpc1snbW9tZW50J10gPSBtb21lbnQ7XG4gICAgfVxuICAgIC8qZ2xvYmFsIGRlZmluZTpmYWxzZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoXCJtb21lbnRcIiwgW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQ7XG4gICAgICAgIH0pO1xuICAgIH1cbn0pLmNhbGwodGhpcyk7XG4iLCJ2YXIgcmVsYXRpdmVEYXRlID0gKGZ1bmN0aW9uKHVuZGVmaW5lZCl7XG5cbiAgdmFyIFNFQ09ORCA9IDEwMDAsXG4gICAgICBNSU5VVEUgPSA2MCAqIFNFQ09ORCxcbiAgICAgIEhPVVIgPSA2MCAqIE1JTlVURSxcbiAgICAgIERBWSA9IDI0ICogSE9VUixcbiAgICAgIFdFRUsgPSA3ICogREFZLFxuICAgICAgWUVBUiA9IERBWSAqIDM2NSxcbiAgICAgIE1PTlRIID0gWUVBUiAvIDEyO1xuXG4gIHZhciBmb3JtYXRzID0gW1xuICAgIFsgMC43ICogTUlOVVRFLCAnanVzdCBub3cnIF0sXG4gICAgWyAxLjUgKiBNSU5VVEUsICdhIG1pbnV0ZSBhZ28nIF0sXG4gICAgWyA2MCAqIE1JTlVURSwgJ21pbnV0ZXMgYWdvJywgTUlOVVRFIF0sXG4gICAgWyAxLjUgKiBIT1VSLCAnYW4gaG91ciBhZ28nIF0sXG4gICAgWyBEQVksICdob3VycyBhZ28nLCBIT1VSIF0sXG4gICAgWyAyICogREFZLCAneWVzdGVyZGF5JyBdLFxuICAgIFsgNyAqIERBWSwgJ2RheXMgYWdvJywgREFZIF0sXG4gICAgWyAxLjUgKiBXRUVLLCAnYSB3ZWVrIGFnbyddLFxuICAgIFsgTU9OVEgsICd3ZWVrcyBhZ28nLCBXRUVLIF0sXG4gICAgWyAxLjUgKiBNT05USCwgJ2EgbW9udGggYWdvJyBdLFxuICAgIFsgWUVBUiwgJ21vbnRocyBhZ28nLCBNT05USCBdLFxuICAgIFsgMS41ICogWUVBUiwgJ2EgeWVhciBhZ28nIF0sXG4gICAgWyBOdW1iZXIuTUFYX1ZBTFVFLCAneWVhcnMgYWdvJywgWUVBUiBdXG4gIF07XG5cbiAgZnVuY3Rpb24gcmVsYXRpdmVEYXRlKGlucHV0LHJlZmVyZW5jZSl7XG4gICAgIXJlZmVyZW5jZSAmJiAoIHJlZmVyZW5jZSA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpICk7XG4gICAgcmVmZXJlbmNlIGluc3RhbmNlb2YgRGF0ZSAmJiAoIHJlZmVyZW5jZSA9IHJlZmVyZW5jZS5nZXRUaW1lKCkgKTtcbiAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgJiYgKCBpbnB1dCA9IGlucHV0LmdldFRpbWUoKSApO1xuICAgIFxuICAgIHZhciBkZWx0YSA9IHJlZmVyZW5jZSAtIGlucHV0LFxuICAgICAgICBmb3JtYXQsIGksIGxlbjtcblxuICAgIGZvcihpID0gLTEsIGxlbj1mb3JtYXRzLmxlbmd0aDsgKytpIDwgbGVuOyApe1xuICAgICAgZm9ybWF0ID0gZm9ybWF0c1tpXTtcbiAgICAgIGlmKGRlbHRhIDwgZm9ybWF0WzBdKXtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFsyXSA9PSB1bmRlZmluZWQgPyBmb3JtYXRbMV0gOiBNYXRoLnJvdW5kKGRlbHRhL2Zvcm1hdFsyXSkgKyAnICcgKyBmb3JtYXRbMV07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZWxhdGl2ZURhdGU7XG5cbn0pKCk7XG5cbmlmKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpe1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlbGF0aXZlRGF0ZTtcbn1cbiIsIm1vbWVudCA9IHJlcXVpcmUoJ21vbWVudCcpXG5fID0gcmVxdWlyZSgnbG9kYXNoJylcbmhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMuY29mZmVlJylcbml0ZW1zID0gcmVxdWlyZSgnLi9pdGVtcy5jb2ZmZWUnKVxue3BldHMsIGhhdGNoaW5nUG90aW9uc30gPSBpdGVtcy5pdGVtc1xuXG5YUCA9IDE1XG5IUCA9IDJcbm9iaiA9IG1vZHVsZS5leHBvcnRzID0ge31cblxub2JqLnJldml2ZSA9ICh1c2VyLCBvcHRpb25zPXt9KS0+XG4gIHBhdGhzID0gb3B0aW9ucy5wYXRocyB8fCB7fVxuXG4gICMgUmVzZXQgc3RhdHNcbiAgdXNlci5zdGF0cy5ocCA9IDUwXG4gIHVzZXIuc3RhdHMuZXhwID0gMFxuICB1c2VyLnN0YXRzLmdwID0gMFxuICB1c2VyLnN0YXRzLmx2bC0tIGlmIHVzZXIuc3RhdHMubHZsID4gMVxuXG4gICMjIExvc2UgYSByYW5kb20gaXRlbVxuICBsb3NlVGhpc0l0ZW0gPSBmYWxzZVxuICBvd25lZCA9IHVzZXIuaXRlbXNcbiAgIyB1bmxlc3MgdGhleSdyZSBhbHJlYWR5IGF0IDAtZXZlcnl0aGluZ1xuICBpZiB+fm93bmVkLmFybW9yID4gMCBvciB+fm93bmVkLmhlYWQgPiAwIG9yIH5+b3duZWQuc2hpZWxkID4gMCBvciB+fm93bmVkLndlYXBvbiA+IDBcbiAgICAjIGZpbmQgYSByYW5kb20gaXRlbSB0byBsb3NlXG4gICAgdW50aWwgbG9zZVRoaXNJdGVtXG4gICAgICAjY2FuZGlkYXRlID0gezA6J2l0ZW1zLmFybW9yJywgMTonaXRlbXMuaGVhZCcsIDI6J2l0ZW1zLnNoaWVsZCcsIDM6J2l0ZW1zLndlYXBvbicsIDQ6J3N0YXRzLmdwJ31bTWF0aC5yYW5kb20oKSo1fDBdXG4gICAgICBjYW5kaWRhdGUgPSB7MDonYXJtb3InLCAxOidoZWFkJywgMjonc2hpZWxkJywgMzond2VhcG9uJ31bTWF0aC5yYW5kb20oKSo0fDBdXG4gICAgICBsb3NlVGhpc0l0ZW0gPSBjYW5kaWRhdGUgaWYgb3duZWRbY2FuZGlkYXRlXSA+IDBcbiAgICB1c2VyLml0ZW1zW2xvc2VUaGlzSXRlbV0gPSAwXG4gIFwic3RhdHMuaHAgc3RhdHMuZXhwIHN0YXRzLmdwIHN0YXRzLmx2bCBpdGVtcy4je2xvc2VUaGlzSXRlbX1cIi5zcGxpdCgnICcpLmZvckVhY2ggKHBhdGgpIC0+XG4gICAgcGF0aHNbcGF0aF0gPSAxXG5cblxub2JqLnByaW9yaXR5VmFsdWUgPSAocHJpb3JpdHkgPSAnIScpIC0+XG4gIHN3aXRjaCBwcmlvcml0eVxuICAgIHdoZW4gJyEnIHRoZW4gMVxuICAgIHdoZW4gJyEhJyB0aGVuIDEuNVxuICAgIHdoZW4gJyEhIScgdGhlbiAyXG4gICAgZWxzZSAxXG5cbm9iai50bmwgPSAobGV2ZWwpIC0+XG4gIGlmIGxldmVsID49IDEwMFxuICAgIHZhbHVlID0gMFxuICBlbHNlXG4gICAgdmFsdWUgPSBNYXRoLnJvdW5kKCgoTWF0aC5wb3cobGV2ZWwsIDIpICogMC4yNSkgKyAoMTAgKiBsZXZlbCkgKyAxMzkuNzUpIC8gMTApICogMTBcbiAgIyByb3VuZCB0byBuZWFyZXN0IDEwXG4gIHJldHVybiB2YWx1ZVxuXG4jIyNcbiAgQ2FsY3VsYXRlcyBFeHAgbW9kaWZpY2FpdG9uIGJhc2VkIG9uIGxldmVsIGFuZCB3ZWFwb24gc3RyZW5ndGhcbiAge3ZhbHVlfSB0YXNrLnZhbHVlIGZvciBleHAgZ2FpblxuICB7d2VhcG9uU3RyZW5ndGgpIHdlYXBvbiBzdHJlbmd0aFxuICB7bGV2ZWx9IGN1cnJlbnQgdXNlciBsZXZlbFxuICB7cHJpb3JpdHl9IHVzZXItZGVmaW5lZCBwcmlvcml0eSBtdWx0aXBsaWVyXG4jIyNcbm9iai5leHBNb2RpZmllciA9ICh2YWx1ZSwgd2VhcG9uU3RyLCBsZXZlbCwgcHJpb3JpdHkgPSAnIScpIC0+XG4gIHN0ciA9IChsZXZlbCAtIDEpIC8gMlxuICAjIHVsdGltYXRlbHkgZ2V0IHRoaXMgZnJvbSB1c2VyXG4gIHRvdGFsU3RyID0gKHN0ciArIHdlYXBvblN0cikgLyAxMDBcbiAgc3RyTW9kID0gMSArIHRvdGFsU3RyXG4gIGV4cCA9IHZhbHVlICogWFAgKiBzdHJNb2QgKiBvYmoucHJpb3JpdHlWYWx1ZShwcmlvcml0eSlcbiAgcmV0dXJuIE1hdGgucm91bmQoZXhwKVxuXG4jIyNcbiAgQ2FsY3VsYXRlcyBIUCBtb2RpZmljYXRpb24gYmFzZWQgb24gbGV2ZWwgYW5kIGFybW9yIGRlZmVuY2VcbiAge3ZhbHVlfSB0YXNrLnZhbHVlIGZvciBocCBsb3NzXG4gIHthcm1vckRlZmVuc2V9IGRlZmVuc2UgZnJvbSBhcm1vclxuICB7aGVsbURlZmVuc2V9IGRlZmVuc2UgZnJvbSBoZWxtXG4gIHtsZXZlbH0gY3VycmVudCB1c2VyIGxldmVsXG4gIHtwcmlvcml0eX0gdXNlci1kZWZpbmVkIHByaW9yaXR5IG11bHRpcGxpZXJcbiMjI1xub2JqLmhwTW9kaWZpZXIgPSAodmFsdWUsIGFybW9yRGVmLCBoZWxtRGVmLCBzaGllbGREZWYsIGxldmVsLCBwcmlvcml0eSA9ICchJykgLT5cbiAgZGVmID0gKGxldmVsIC0gMSkgLyAyXG4gICMgdWx0aW1hdGVseSBnZXQgdGhpcyBmcm9tIHVzZXI/XG4gIHRvdGFsRGVmID0gKGRlZiArIGFybW9yRGVmICsgaGVsbURlZiArIHNoaWVsZERlZikgLyAxMDBcbiAgI3VsdGltYXRlIGdldCB0aGlzIGZyb20gdXNlclxuICBkZWZNb2QgPSAxIC0gdG90YWxEZWZcbiAgaHAgPSB2YWx1ZSAqIEhQICogZGVmTW9kICogb2JqLnByaW9yaXR5VmFsdWUocHJpb3JpdHkpXG4gIHJldHVybiBNYXRoLnJvdW5kKGhwICogMTApIC8gMTBcbiMgcm91bmQgdG8gMWRwXG5cbiMjI1xuICBGdXR1cmUgdXNlXG4gIHtwcmlvcml0eX0gdXNlci1kZWZpbmVkIHByaW9yaXR5IG11bHRpcGxpZXJcbiMjI1xub2JqLmdwTW9kaWZpZXIgPSAodmFsdWUsIG1vZGlmaWVyLCBwcmlvcml0eSA9ICchJywgc3RyZWFrLCB1c2VyKSAtPlxuICB2YWwgPSB2YWx1ZSAqIG1vZGlmaWVyICogb2JqLnByaW9yaXR5VmFsdWUocHJpb3JpdHkpXG4gIGlmIHN0cmVhayBhbmQgdXNlclxuICAgIHN0cmVha0JvbnVzID0gc3RyZWFrIC8gMTAwICsgMSAjIGVnLCAxLWRheSBzdHJlYWsgaXMgMS4xLCAyLWRheSBpcyAxLjIsIGV0Y1xuICAgIGFmdGVyU3RyZWFrID0gdmFsICogc3RyZWFrQm9udXNcbiAgICB1c2VyLl90bXAuc3RyZWFrQm9udXMgPSBhZnRlclN0cmVhayAtIHZhbCBpZiAodmFsID4gMCkgIyBrZWVwIHRoaXMgb24taGFuZCBmb3IgbGF0ZXIsIHNvIHdlIGNhbiBub3RpZnkgc3RyZWFrLWJvbnVzXG4gICAgcmV0dXJuIGFmdGVyU3RyZWFrXG4gIGVsc2VcbiAgICByZXR1cm4gdmFsXG5cbiMjI1xuICBDYWxjdWxhdGVzIHRoZSBuZXh0IHRhc2sudmFsdWUgYmFzZWQgb24gZGlyZWN0aW9uXG4gIFVzZXMgYSBjYXBwZWQgaW52ZXJzZSBsb2cgeT0uOTVeeCwgeT49IC01XG4gIHtjdXJyZW50VmFsdWV9IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB0YXNrXG4gIHtkaXJlY3Rpb259IHVwIG9yIGRvd25cbiMjI1xub2JqLnRhc2tEZWx0YUZvcm11bGEgPSAoY3VycmVudFZhbHVlLCBkaXJlY3Rpb24pIC0+XG4gIGlmIGN1cnJlbnRWYWx1ZSA8IC00Ny4yNyB0aGVuIGN1cnJlbnRWYWx1ZSA9IC00Ny4yN1xuICBlbHNlIGlmIGN1cnJlbnRWYWx1ZSA+IDIxLjI3IHRoZW4gY3VycmVudFZhbHVlID0gMjEuMjdcbiAgZGVsdGEgPSBNYXRoLnBvdygwLjk3NDcsIGN1cnJlbnRWYWx1ZSlcbiAgcmV0dXJuIGRlbHRhIGlmIGRpcmVjdGlvbiBpcyAndXAnXG4gIHJldHVybiAtZGVsdGFcblxuXG4jIyNcbiAgRHJvcCBTeXN0ZW1cbiMjI1xuXG5yYW5kb21Ecm9wID0gKHVzZXIsIGRlbHRhLCBwcmlvcml0eSwgc3RyZWFrID0gMCwgb3B0aW9ucz17fSkgLT5cbiAgcGF0aHMgPSBvcHRpb25zLnBhdGhzIHx8IHt9XG4gICMgbGltaXQgZHJvcHMgdG8gMiAvIGRheVxuICB1c2VyLml0ZW1zLmxhc3REcm9wID89XG4gICAgZGF0ZTogK21vbWVudCgpLnN1YnRyYWN0KCdkJywgMSkgIyB0cmljayAtIHNldCBpdCB0byB5ZXN0ZXJkYXkgb24gZmlyc3QgcnVuLCB0aGF0IHdheSB0aGV5IGNhbiBnZXQgZHJvcHMgdG9kYXlcbiAgICBjb3VudDogMFxuICBwYXRoc1snaXRlbXMubGFzdERyb3AnXSA9IHRydWVcblxuICByZWFjaGVkRHJvcExpbWl0ID0gKGhlbHBlcnMuZGF5c1NpbmNlKHVzZXIuaXRlbXMubGFzdERyb3AuZGF0ZSwgdXNlci5wcmVmZXJlbmNlcykgaXMgMCkgYW5kICh1c2VyLml0ZW1zLmxhc3REcm9wLmNvdW50ID49IDIpXG4gIHJldHVybiBpZiByZWFjaGVkRHJvcExpbWl0XG5cbiAgIyAlIGNoYW5jZSBvZiBnZXR0aW5nIGEgcGV0IG9yIG1lYXRcbiAgY2hhbmNlTXVsdGlwbGllciA9IE1hdGguYWJzKGRlbHRhKVxuICBjaGFuY2VNdWx0aXBsaWVyICo9IG9iai5wcmlvcml0eVZhbHVlKHByaW9yaXR5KSAjIG11bHRpcGx5IGNoYW5jZSBieSByZWRkbmVzc1xuICBjaGFuY2VNdWx0aXBsaWVyICs9IHN0cmVhayAjIHN0cmVhayBib251c1xuXG4gIGlmIHVzZXIuZmxhZ3M/LmRyb3BzRW5hYmxlZCBhbmQgTWF0aC5yYW5kb20oKSA8ICguMDUgKiBjaGFuY2VNdWx0aXBsaWVyKVxuICAgICMgY3VycmVudCBicmVha2Rvd24gLSAxJSAoYWRqdXN0YWJsZSkgY2hhbmNlIG9uIGRyb3BcbiAgICAjIElmIHRoZXkgZ290IGEgZHJvcDogNTAlIGNoYW5jZSBvZiBlZ2csIDUwJSBIYXRjaGluZyBQb3Rpb24uIElmIGhhdGNoaW5nUG90aW9uLCBicm9rZW4gZG93biBmdXJ0aGVyIGV2ZW4gZnVydGhlclxuICAgIHJhcml0eSA9IE1hdGgucmFuZG9tKClcblxuICAgICMgRWdnLCA1MCUgY2hhbmNlXG4gICAgaWYgcmFyaXR5ID4gLjVcbiAgICAgIGRyb3AgPSBoZWxwZXJzLnJhbmRvbVZhbChwZXRzKVxuICAgICAgKHVzZXIuaXRlbXMuZWdncyA/PSBbXSkucHVzaCBkcm9wOyBwYXRoc1snaXRlbXMuZWdncyddID0gdHJ1ZVxuICAgICAgZHJvcC50eXBlID0gJ0VnZydcbiAgICAgIGRyb3AuZGlhbG9nID0gXCJZb3UndmUgZm91bmQgYSAje2Ryb3AudGV4dH0gRWdnISAje2Ryb3Aubm90ZXN9XCJcblxuICAgICAgIyBIYXRjaGluZyBQb3Rpb24sIDUwJSBjaGFuY2UgLSBicmVhayBkb3duIGJ5IHJhcml0eSBldmVuIG1vcmUuIEZJWE1FIHRoaXMgbWF5IG5vdCBiZSB0aGUgYmVzdCBtZXRob2QsIHNvIHJldmlzaXRcbiAgICBlbHNlXG4gICAgICBhY2NlcHRhYmxlRHJvcHMgPSBbXVxuXG4gICAgICAjIFRpZXIgNSAoQmx1ZSBNb29uIFJhcmUpXG4gICAgICBpZiByYXJpdHkgPCAuMVxuICAgICAgICBhY2NlcHRhYmxlRHJvcHMgPVxuICAgICAgICAgIFsnQmFzZScsICdXaGl0ZScsICdEZXNlcnQnLCAnUmVkJywgJ1NoYWRlJywgJ1NrZWxldG9uJywgJ1pvbWJpZScsICdDb3R0b25DYW5keVBpbmsnLCAnQ290dG9uQ2FuZHlCbHVlJyxcbiAgICAgICAgICAgJ0dvbGRlbiddXG5cbiAgICAgICAgIyBUaWVyIDQgKFZlcnkgUmFyZSlcbiAgICAgIGVsc2UgaWYgcmFyaXR5IDwgLjJcbiAgICAgICAgYWNjZXB0YWJsZURyb3BzID1cbiAgICAgICAgICBbJ0Jhc2UnLCAnV2hpdGUnLCAnRGVzZXJ0JywgJ1JlZCcsICdTaGFkZScsICdTa2VsZXRvbicsICdab21iaWUnLCAnQ290dG9uQ2FuZHlQaW5rJywgJ0NvdHRvbkNhbmR5Qmx1ZSddXG5cbiAgICAgICAgIyBUaWVyIDMgKFJhcmUpXG4gICAgICBlbHNlIGlmIHJhcml0eSA8IC4zXG4gICAgICAgIGFjY2VwdGFibGVEcm9wcyA9IFsnQmFzZScsICdXaGl0ZScsICdEZXNlcnQnLCAnUmVkJywgJ1NoYWRlJywgJ1NrZWxldG9uJ11cblxuICAgICAgIyBDb21tZW50ZWQgb3V0IGZvciB0ZXN0aW5nIHdpdGggaW5jcmVhc2VkIGVnZyBkcm9wLCBkZWxldGUgaWYgc3VjY2Vzc2Z1bFxuICAgICAgICAjIFRpZXIgMiAoU2NhcmNlKVxuICAgICAgIyBlbHNlIGlmIHJhcml0eSA8IC40XG4gICAgICAjICAgYWNjZXB0YWJsZURyb3BzID0gWydCYXNlJywgJ1doaXRlJywgJ0Rlc2VydCddXG5cbiAgICAgICAgIyBUaWVyIDEgKENvbW1vbilcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjZXB0YWJsZURyb3BzID0gWydCYXNlJywgJ1doaXRlJywgJ0Rlc2VydCddXG5cbiAgICAgIGFjY2VwdGFibGVEcm9wcyA9IGhhdGNoaW5nUG90aW9ucy5maWx0ZXIgKGhhdGNoaW5nUG90aW9uKSAtPlxuICAgICAgICBoYXRjaGluZ1BvdGlvbi5uYW1lIGluIGFjY2VwdGFibGVEcm9wc1xuICAgICAgZHJvcCA9IGhlbHBlcnMucmFuZG9tVmFsIGFjY2VwdGFibGVEcm9wc1xuICAgICAgKHVzZXIuaXRlbXMuaGF0Y2hpbmdQb3Rpb25zID89IFtdKS5wdXNoIGRyb3AubmFtZTsgcGF0aHNbJ2l0ZW1zLmhhdGNoaW5nUG90aW9ucyddID0gdHJ1ZVxuICAgICAgZHJvcC50eXBlID0gJ0hhdGNoaW5nUG90aW9uJ1xuICAgICAgZHJvcC5kaWFsb2cgPSBcIllvdSd2ZSBmb3VuZCBhICN7ZHJvcC50ZXh0fSBIYXRjaGluZyBQb3Rpb24hICN7ZHJvcC5ub3Rlc31cIlxuXG4gICAgIyBpZiB0aGV5J3ZlIGRyb3BwZWQgc29tZXRoaW5nLCB3ZSB3YW50IHRoZSBjb25zdW1pbmcgY2xpZW50IHRvIGtub3cgc28gdGhleSBjYW4gbm90aWZ5IHRoZSB1c2VyLiBTZWUgaG93IHRoZSBEZXJieVxuICAgICMgYXBwIGhhbmRsZXMgaXQgZm9yIGV4YW1wbGUuIFdvdWxkIHRoaXMgYmUgYmV0dGVyIGhhbmRsZWQgYXMgYW4gZW1pdCgpID9cbiAgICB1c2VyLl90bXAuZHJvcCA9IGRyb3BcblxuICAgIHVzZXIuaXRlbXMubGFzdERyb3AuZGF0ZSA9ICtuZXcgRGF0ZVxuICAgIHVzZXIuaXRlbXMubGFzdERyb3AuY291bnQrK1xuICAgIHBhdGhzWydpdGVtcy5sYXN0RHJvcCddID0gdHJ1ZVxuXG5cbiMgIHt0YXNrfSB0YXNrIHlvdSB3YW50IHRvIHNjb3JlXG4jICB7ZGlyZWN0aW9ufSAndXAnIG9yICdkb3duJ1xub2JqLnNjb3JlID0gKHVzZXIsIHRhc2ssIGRpcmVjdGlvbiwgb3B0aW9ucz17fSkgLT5cblxuICAjIFRoaXMgaXMgZm9yIHNldHRpbmcgb25lLXRpbWUgdGVtcG9yYXJ5IGZsYWdzLCBzdWNoIGFzIHN0cmVha0JvbnVzIG9yIGl0ZW1Ecm9wcGVkLiBVc2VmdWwgZm9yIG5vdGlmeWluZ1xuICAjIHRoZSBBUEkgY29uc3VtZXIsIHRoZW4gY2xlYXJlZCBhZnRlcndhcmRzXG4gIHVzZXIuX3RtcCA9IHt9XG5cbiAgW2dwLCBocCwgZXhwLCBsdmxdID0gWyt1c2VyLnN0YXRzLmdwLCArdXNlci5zdGF0cy5ocCwgK3VzZXIuc3RhdHMuZXhwLCB+fnVzZXIuc3RhdHMubHZsXVxuICBbdHlwZSwgdmFsdWUsIHN0cmVhaywgcHJpb3JpdHldID0gW3Rhc2sudHlwZSwgK3Rhc2sudmFsdWUsIH5+dGFzay5zdHJlYWssIHRhc2sucHJpb3JpdHkgb3IgJyEnXVxuICBbcGF0aHMsIHRpbWVzLCBjcm9uXSA9IFtvcHRpb25zLnBhdGhzIHx8IHt9LCBvcHRpb25zLnRpbWVzIHx8IDEsIG9wdGlvbnMuY3JvbiB8fCBmYWxzZV1cblxuICAjIEhhbmRsZSBjb3JydXB0IHRhc2tzXG4gICMgVGhpcyB0eXBlIG9mIGNsZWFudXAtY29kZSBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCByZXZpc2l0IG9uY2Ugd2UncmUgb2ZmIERlcmJ5XG4gIHJldHVybiAwIHVubGVzcyB0YXNrLmlkXG4gIGlmICFfLmlzTnVtYmVyKHZhbHVlKSBvciBfLmlzTmFOKHZhbHVlKVxuICAgIHRhc2sudmFsdWUgPSB2YWx1ZSA9IDA7XG4gICAgcGF0aHNbXCJ0YXNrcy4je3Rhc2suaWR9LnZhbHVlXCJdID0gdHJ1ZVxuICBfLmVhY2ggdXNlci5zdGF0cywgKHYsaykgLT5cbiAgICBpZiAhXy5pc051bWJlcih2KSBvciBfLmlzTmFOKHYpXG4gICAgICB1c2VyLnN0YXRzW2tdID0gMDsgcGF0aHNbXCJzdGF0cy4je2t9XCJdID0gdHJ1ZVxuXG4gICMgSWYgdGhleSdyZSB0cnlpbmcgdG8gcHVyaGNhc2UgYSB0b28tZXhwZW5zaXZlIHJld2FyZCwgZG9uJ3QgYWxsb3cgdGhlbSB0byBkbyB0aGF0LlxuICBpZiB0YXNrLnZhbHVlID4gdXNlci5zdGF0cy5ncCBhbmQgdGFzay50eXBlIGlzICdyZXdhcmQnXG4gICAgcmV0dXJuXG5cbiAgZGVsdGEgPSAwXG4gIGNhbGN1bGF0ZURlbHRhID0gKGFkanVzdHZhbHVlID0gdHJ1ZSkgLT5cbiAgICAjIElmIG11bHRpcGxlIGRheXMgaGF2ZSBwYXNzZWQsIG11bHRpcGx5IHRpbWVzIGRheXMgbWlzc2VkXG4gICAgXy50aW1lcyB0aW1lcywgLT5cbiAgICAgICMgRWFjaCBpdGVyYXRpb24gY2FsY3VsYXRlIHRoZSBkZWx0YSAobmV4dERlbHRhKSwgd2hpY2ggaXMgdGhlbiBhY2N1bXVsYXRlZCBpbiBkZWx0YVxuICAgICAgIyAoYWthLCB0aGUgdG90YWwgZGVsdGEpLiBUaGlzIHdlaXJkbmVzcyB3b24ndCBiZSBuZWNlc3Nhcnkgd2hlbiBjYWxjdWxhdGluZyBtYXRoZW1hdGljYWxseVxuICAgICAgIyByYXRoZXIgdGhhbiBpdGVyYXRpdmVseVxuICAgICAgbmV4dERlbHRhID0gb2JqLnRhc2tEZWx0YUZvcm11bGEodmFsdWUsIGRpcmVjdGlvbilcbiAgICAgIHZhbHVlICs9IG5leHREZWx0YSBpZiBhZGp1c3R2YWx1ZVxuICAgICAgZGVsdGEgKz0gbmV4dERlbHRhXG5cbiAgYWRkUG9pbnRzID0gLT5cbiAgICB3ZWFwb25TdHIgPSBpdGVtcy5nZXRJdGVtKCd3ZWFwb24nLCB1c2VyLml0ZW1zLndlYXBvbikuc3RyZW5ndGhcbiAgICBleHAgKz0gb2JqLmV4cE1vZGlmaWVyKGRlbHRhLCB3ZWFwb25TdHIsIHVzZXIuc3RhdHMubHZsLCBwcmlvcml0eSkgLyAyICMgLzIgaGFjayBmb3Igbm93LCBwZW9wbGUgbGV2ZWxpbmcgdG9vIGZhc3RcbiAgICBpZiBzdHJlYWtcbiAgICAgIGdwICs9IG9iai5ncE1vZGlmaWVyKGRlbHRhLCAxLCBwcmlvcml0eSwgc3RyZWFrLCB1c2VyKVxuICAgIGVsc2VcbiAgICAgIGdwICs9IG9iai5ncE1vZGlmaWVyKGRlbHRhLCAxLCBwcmlvcml0eSlcblxuXG4gIHN1YnRyYWN0UG9pbnRzID0gLT5cbiAgICBhcm1vckRlZiA9IGl0ZW1zLmdldEl0ZW0oJ2FybW9yJywgdXNlci5pdGVtcy5hcm1vcikuZGVmZW5zZVxuICAgIGhlYWREZWYgPSBpdGVtcy5nZXRJdGVtKCdoZWFkJywgdXNlci5pdGVtcy5oZWFkKS5kZWZlbnNlXG4gICAgc2hpZWxkRGVmID0gaXRlbXMuZ2V0SXRlbSgnc2hpZWxkJywgdXNlci5pdGVtcy5zaGllbGQpLmRlZmVuc2VcbiAgICBocCArPSBvYmouaHBNb2RpZmllcihkZWx0YSwgYXJtb3JEZWYsIGhlYWREZWYsIHNoaWVsZERlZiwgdXNlci5zdGF0cy5sdmwsIHByaW9yaXR5KVxuXG4gIHN3aXRjaCB0eXBlXG4gICAgd2hlbiAnaGFiaXQnXG4gICAgICBjYWxjdWxhdGVEZWx0YSgpXG4gICAgICAjIEFkZCBoYWJpdCB2YWx1ZSB0byBoYWJpdC1oaXN0b3J5IChpZiBkaWZmZXJlbnQpXG4gICAgICBpZiAoZGVsdGEgPiAwKSB0aGVuIGFkZFBvaW50cygpIGVsc2Ugc3VidHJhY3RQb2ludHMoKVxuICAgICAgaWYgdGFzay52YWx1ZSAhPSB2YWx1ZVxuICAgICAgICAodGFzay5oaXN0b3J5ID89IFtdKS5wdXNoIHsgZGF0ZTogK25ldyBEYXRlLCB2YWx1ZTogdmFsdWUgfTsgcGF0aHNbXCJ0YXNrcy4je3Rhc2suaWR9Lmhpc3RvcnlcIl0gPSB0cnVlXG5cbiAgICB3aGVuICdkYWlseSdcbiAgICAgIGlmIGNyb25cbiAgICAgICAgY2FsY3VsYXRlRGVsdGEoKVxuICAgICAgICBzdWJ0cmFjdFBvaW50cygpXG4gICAgICAgIHRhc2suc3RyZWFrID0gMFxuICAgICAgZWxzZVxuICAgICAgICBjYWxjdWxhdGVEZWx0YSgpXG4gICAgICAgIGFkZFBvaW50cygpICMgb2J2aW91c2x5IGZvciBkZWx0YT4wLCBidXQgYWxzbyBhIHRyaWNrIHRvIHVuZG8gYWNjaWRlbnRhbCBjaGVja2JveGVzXG4gICAgICAgIGlmIGRpcmVjdGlvbiBpcyAndXAnXG4gICAgICAgICAgc3RyZWFrID0gaWYgc3RyZWFrIHRoZW4gc3RyZWFrICsgMSBlbHNlIDFcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHN0cmVhayA9IGlmIHN0cmVhayB0aGVuIHN0cmVhayAtIDEgZWxzZSAwXG4gICAgICAgIHRhc2suc3RyZWFrID0gc3RyZWFrXG4gICAgICBwYXRoc1tcInRhc2tzLiN7dGFzay5pZH0uc3RyZWFrXCJdID0gdHJ1ZVxuXG4gICAgd2hlbiAndG9kbydcbiAgICAgIGlmIGNyb25cbiAgICAgICAgY2FsY3VsYXRlRGVsdGEoKVxuICAgICAgICAjZG9uJ3QgdG91Y2ggc3RhdHMgb24gY3JvblxuICAgICAgZWxzZVxuICAgICAgICBjYWxjdWxhdGVEZWx0YSgpXG4gICAgICAgIGFkZFBvaW50cygpICMgb2J2aW91c2x5IGZvciBkZWx0YT4wLCBidXQgYWxzbyBhIHRyaWNrIHRvIHVuZG8gYWNjaWRlbnRhbCBjaGVja2JveGVzXG5cbiAgICB3aGVuICdyZXdhcmQnXG4gICAgIyBEb24ndCBhZGp1c3QgdmFsdWVzIGZvciByZXdhcmRzXG4gICAgICBjYWxjdWxhdGVEZWx0YShmYWxzZSlcbiAgICAgICMgcHVyY2hhc2UgaXRlbVxuICAgICAgZ3AgLT0gTWF0aC5hYnModGFzay52YWx1ZSlcbiAgICAgIG51bSA9IHBhcnNlRmxvYXQodGFzay52YWx1ZSkudG9GaXhlZCgyKVxuICAgICAgIyBpZiB0b28gZXhwZW5zaXZlLCByZWR1Y2UgaGVhbHRoICYgemVybyBncFxuICAgICAgaWYgZ3AgPCAwXG4gICAgICAgIGhwICs9IGdwXG4gICAgICAgICMgaHAgLSBncCBkaWZmZXJlbmNlXG4gICAgICAgIGdwID0gMFxuXG4gIHRhc2sudmFsdWUgPSB2YWx1ZTsgcGF0aHNbXCJ0YXNrcy4je3Rhc2suaWR9LnZhbHVlXCJdID0gdHJ1ZVxuICB1cGRhdGVTdGF0cyB1c2VyLCB7IGhwLCBleHAsIGdwIH0sIHtwYXRoczogcGF0aHN9XG5cbiAgIyBEcm9wIHN5c3RlbSAoZG9uJ3QgcnVuIG9uIHRoZSBjbGllbnQsIGFzIGl0IHdvdWxkIG9ubHkgYmUgZGlzY2FyZGVkIHNpbmNlIG9wcyBhcmUgc2VudCB0byB0aGUgQVBJLCBub3QgdGhlIHJlc3VsdHMpXG4gIGlmIHR5cGVvZiB3aW5kb3cgaXMgJ3VuZGVmaW5lZCdcbiAgICByYW5kb21Ecm9wKHVzZXIsIGRlbHRhLCBwcmlvcml0eSwgc3RyZWFrLCB7cGF0aHM6IHBhdGhzfSkgaWYgZGlyZWN0aW9uIGlzICd1cCdcblxuICByZXR1cm4gZGVsdGFcblxuIyMjXG4gIFVwZGF0ZXMgdXNlciBzdGF0cyB3aXRoIG5ldyBzdGF0cy4gSGFuZGxlcyBkZWF0aCwgbGV2ZWxpbmcgdXAsIGV0Y1xuICB7c3RhdHN9IG5ldyBzdGF0c1xuICB7dXBkYXRlfSBpZiBhZ2dyZWdhdGVkIGNoYW5nZXMsIHBhc3MgaW4gdXNlck9iaiBhcyB1cGRhdGUuIG90aGVyd2lzZSBjb21taXRzIHdpbGwgYmUgbWFkZSBpbW1lZGlhdGVseVxuIyMjXG51cGRhdGVTdGF0cyA9ICh1c2VyLCBuZXdTdGF0cywgb3B0aW9ucz17fSkgLT5cbiAgcGF0aHMgPSBvcHRpb25zLnBhdGhzIHx8IHt9XG4gICMgaWYgdXNlciBpcyBkZWFkLCBkb250IGRvIGFueXRoaW5nXG4gIHJldHVybiBpZiB1c2VyLnN0YXRzLmhwIDw9IDBcblxuICBpZiBuZXdTdGF0cy5ocD9cbiAgICAjIEdhbWUgT3ZlclxuICAgIGlmIG5ld1N0YXRzLmhwIDw9IDBcbiAgICAgIHVzZXIuc3RhdHMuaHAgPSAwOyBwYXRoc1snc3RhdHMuaHAnXSA9IHRydWUgIyBzaWduaWZpZXMgZGVhZFxuICAgICAgcmV0dXJuXG4gICAgZWxzZVxuICAgICAgdXNlci5zdGF0cy5ocCA9IG5ld1N0YXRzLmhwOyBwYXRoc1snc3RhdHMuaHAnXSA9IHRydWVcblxuICBpZiBuZXdTdGF0cy5leHA/XG4gICAgdG5sID0gb2JqLnRubCh1c2VyLnN0YXRzLmx2bClcbiAgICAjc2lsZW50ID0gZmFsc2VcbiAgICAjIGlmIHdlJ3JlIGF0IGxldmVsIDEwMCwgdHVybiB4cCB0byBnb2xkXG4gICAgaWYgdXNlci5zdGF0cy5sdmwgPj0gMTAwXG4gICAgICBuZXdTdGF0cy5ncCArPSBuZXdTdGF0cy5leHAgLyAxNVxuICAgICAgbmV3U3RhdHMuZXhwID0gMFxuICAgICAgdXNlci5zdGF0cy5sdmwgPSAxMDBcbiAgICBlbHNlXG4gICAgICAjIGxldmVsIHVwICYgY2Fycnktb3ZlciBleHBcbiAgICAgIGlmIG5ld1N0YXRzLmV4cCA+PSB0bmxcbiAgICAgICAgI3NpbGVudCA9IHRydWUgIyBwdXNoIHRocm91Z2ggdGhlIG5lZ2F0aXZlIHhwIHNpbGVudGx5XG4gICAgICAgIHVzZXIuc3RhdHMuZXhwID0gbmV3U3RhdHMuZXhwICMgcHVzaCBub3JtYWwgKyBub3RpZmljYXRpb25cbiAgICAgICAgd2hpbGUgbmV3U3RhdHMuZXhwID49IHRubCBhbmQgdXNlci5zdGF0cy5sdmwgPCAxMDAgIyBrZWVwIGxldmVsbGluZyB1cFxuICAgICAgICAgIG5ld1N0YXRzLmV4cCAtPSB0bmxcbiAgICAgICAgICB1c2VyLnN0YXRzLmx2bCsrXG4gICAgICAgICAgdG5sID0gb2JqLnRubCh1c2VyLnN0YXRzLmx2bClcbiAgICAgICAgaWYgdXNlci5zdGF0cy5sdmwgPT0gMTAwXG4gICAgICAgICAgbmV3U3RhdHMuZXhwID0gMFxuICAgICAgICB1c2VyLnN0YXRzLmhwID0gNTBcblxuICAgIHVzZXIuc3RhdHMuZXhwID0gbmV3U3RhdHMuZXhwXG5cbiAgICBwYXRoc1tcInN0YXRzLmV4cFwiXT10cnVlOyBwYXRoc1snc3RhdHMubHZsJ109dHJ1ZTsgcGF0aHNbJ3N0YXRzLmdwJ109dHJ1ZTsgcGF0aHNbJ3N0YXRzLmhwJ109dHJ1ZTtcbiAgICAjaWYgc2lsZW50XG4gICAgI2NvbnNvbGUubG9nKFwicHVzaGluZyBzaWxlbnQgOlwiICArIG9iai5zdGF0cy5leHApXG5cblxuICAgICMgU2V0IGZsYWdzIHdoZW4gdGhleSB1bmxvY2sgZmVhdHVyZXNcbiAgICB1c2VyLmZsYWdzID89IHt9XG4gICAgaWYgIXVzZXIuZmxhZ3MuY3VzdG9taXphdGlvbnNOb3RpZmljYXRpb24gYW5kICh1c2VyLnN0YXRzLmV4cCA+IDEwIG9yIHVzZXIuc3RhdHMubHZsID4gMSlcbiAgICAgIHVzZXIuZmxhZ3MuY3VzdG9taXphdGlvbnNOb3RpZmljYXRpb24gPSB0cnVlOyBwYXRoc1snZmxhZ3MuY3VzdG9taXphdGlvbnNOb3RpZmljYXRpb24nXT10cnVlO1xuICAgIGlmICF1c2VyLmZsYWdzLml0ZW1zRW5hYmxlZCBhbmQgdXNlci5zdGF0cy5sdmwgPj0gMlxuICAgICAgdXNlci5mbGFncy5pdGVtc0VuYWJsZWQgPSB0cnVlOyBwYXRoc1snZmxhZ3MuaXRlbXNFbmFibGVkJ109dHJ1ZTtcbiAgICBpZiAhdXNlci5mbGFncy5wYXJ0eUVuYWJsZWQgYW5kIHVzZXIuc3RhdHMubHZsID49IDNcbiAgICAgIHVzZXIuZmxhZ3MucGFydHlFbmFibGVkID0gdHJ1ZTsgcGF0aHNbJ2ZsYWdzLnBhcnR5RW5hYmxlZCddPXRydWU7XG4gICAgaWYgIXVzZXIuZmxhZ3MuZHJvcHNFbmFibGVkIGFuZCB1c2VyLnN0YXRzLmx2bCA+PSA0XG4gICAgICB1c2VyLmZsYWdzLmRyb3BzRW5hYmxlZCA9IHRydWU7IHBhdGhzWydmbGFncy5kcm9wc0VuYWJsZWQnXT10cnVlO1xuXG4gIGlmIG5ld1N0YXRzLmdwP1xuICAgICNGSVhNRSB3aGF0IHdhcyBJIGRvaW5nIGhlcmU/IEkgY2FuJ3QgcmVtZW1iZXIsIGdwIGlzbid0IGRlZmluZWRcbiAgICBncCA9IDAuMCBpZiAoIWdwPyBvciBncCA8IDApXG4gICAgdXNlci5zdGF0cy5ncCA9IG5ld1N0YXRzLmdwXG5cbiMjI1xuICBBdCBlbmQgb2YgZGF5LCBhZGQgdmFsdWUgdG8gYWxsIGluY29tcGxldGUgRGFpbHkgJiBUb2RvIHRhc2tzIChmdXJ0aGVyIGluY2VudGl2ZSlcbiAgRm9yIGluY29tcGxldGUgRGFpbHlzLCBkZWR1Y3QgZXhwZXJpZW5jZVxuICBNYWtlIHN1cmUgdG8gcnVuIHRoaXMgZnVuY3Rpb24gb25jZSBpbiBhIHdoaWxlIGFzIHNlcnZlciB3aWxsIG5vdCB0YWtlIGNhcmUgb2Ygb3Zlcm5pZ2h0IGNhbGN1bGF0aW9ucy5cbiAgQW5kIHlvdSBoYXZlIHRvIHJ1biBpdCBldmVyeSB0aW1lIGNsaWVudCBjb25uZWN0cy5cbiAge3VzZXJ9XG4jIyNcbm9iai5jcm9uID0gKHVzZXIsIG9wdGlvbnM9e30pIC0+XG4gIFtwYXRocywgbm93XSA9IFtvcHRpb25zLnBhdGhzIHx8IHt9LCArb3B0aW9ucy5ub3cgfHwgK25ldyBEYXRlXVxuXG4gICMgTmV3IHVzZXIgKCFsYXN0Q3JvbiwgbGFzdENyb249PW5ldykgb3IgaXQgZ290IGJ1c3RlZCBzb21laG93LCBtYXliZSB0aGV5IHdlbnQgdG8gYSBkaWZmZXJlbnQgdGltZXpvbmVcbiAgIyBGSVhNRSBtb3ZlIHRoaXMgdG8gcHJlLXNhdmUgaW4gbW9uZ29vc2VcbiAgaWYgIXVzZXIubGFzdENyb24/IG9yIHVzZXIubGFzdENyb24gaXMgJ25ldycgb3IgbW9tZW50KHVzZXIubGFzdENyb24pLmlzQWZ0ZXIobm93KVxuICAgIHVzZXIubGFzdENyb24gPSBub3c7IHBhdGhzWydsYXN0Q3JvbiddID0gdHJ1ZVxuICAgIHJldHVyblxuXG4gIGRheXNNaXNzZWQgPSBoZWxwZXJzLmRheXNTaW5jZSB1c2VyLmxhc3RDcm9uLCBfLmRlZmF1bHRzKHtub3d9LCB1c2VyLnByZWZlcmVuY2VzKVxuICByZXR1cm4gdW5sZXNzIGRheXNNaXNzZWQgPiAwXG5cbiAgdXNlci5sYXN0Q3JvbiA9IG5vdzsgcGF0aHNbJ2xhc3RDcm9uJ10gPSB0cnVlXG5cbiAgIyBVc2VyIGlzIHJlc3RpbmcgYXQgdGhlIGlubi4gVXNlZCB0byBiZSB3ZSB1bi1jaGVja2VkIGVhY2ggZGFpbHkgd2l0aG91dCBwZXJmb3JtaW5nIGNhbGN1bGF0aW9uIChzZWUgY29tbWl0cyBiZWZvcmUgZmIyOWUzNSlcbiAgIyBidXQgdG8gcHJldmVudCBhYnVzaW5nIHRoZSBpbm4gKGh0dHA6Ly9nb28uZ2wvR0RiOXgpIHdlIG5vdyBkbyAqbm90KiBjYWxjdWxhdGUgZGFpbGllcywgYW5kIHNpbXBseSBzZXQgbGFzdENyb24gdG8gdG9kYXlcbiAgcmV0dXJuIGlmIHVzZXIuZmxhZ3MucmVzdCBpcyB0cnVlXG5cbiAgIyBUYWxseSBlYWNoIHRhc2tcbiAgdG9kb1RhbGx5ID0gMFxuICB1c2VyLnRvZG9zLmNvbmNhdCh1c2VyLmRhaWx5cykuZm9yRWFjaCAodGFzaykgLT5cbiAgICByZXR1cm4gdW5sZXNzIHRhc2tcbiAgICB7aWQsIHR5cGUsIGNvbXBsZXRlZCwgcmVwZWF0fSA9IHRhc2tcbiAgICAjIERlZHVjdCBleHBlcmllbmNlIGZvciBtaXNzZWQgRGFpbHkgdGFza3MsIGJ1dCBub3QgZm9yIFRvZG9zIChqdXN0IGluY3JlYXNlIHRvZG8ncyB2YWx1ZSlcbiAgICB1bmxlc3MgY29tcGxldGVkXG4gICAgICBzY2hlZHVsZU1pc3NlcyA9IGRheXNNaXNzZWRcbiAgICAgICMgZm9yIGRhaWx5cyB3aGljaCBoYXZlIHJlcGVhdCBkYXRlcywgbmVlZCB0byBjYWxjdWxhdGUgaG93IG1hbnkgdGhleSd2ZSBtaXNzZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG93biBzY2hlZHVsZVxuICAgICAgaWYgKHR5cGUgaXMgJ2RhaWx5JykgYW5kIHJlcGVhdFxuICAgICAgICBzY2hlZHVsZU1pc3NlcyA9IDBcbiAgICAgICAgXy50aW1lcyBkYXlzTWlzc2VkLCAobikgLT5cbiAgICAgICAgICB0aGF0RGF5ID0gbW9tZW50KG5vdykuc3VidHJhY3QoJ2RheXMnLCBuICsgMSlcbiAgICAgICAgICBzY2hlZHVsZU1pc3NlcysrIGlmIGhlbHBlcnMuc2hvdWxkRG8odGhhdERheSwgcmVwZWF0LCB1c2VyLnByZWZlcmVuY2VzKVxuICAgICAgb2JqLnNjb3JlKHVzZXIsIHRhc2ssICdkb3duJywge3RpbWVzOnNjaGVkdWxlTWlzc2VzLCBjcm9uOnRydWUsIHBhdGhzOnBhdGhzfSkgaWYgc2NoZWR1bGVNaXNzZXMgPiAwXG5cbiAgICBzd2l0Y2ggdHlwZVxuICAgICAgd2hlbiAnZGFpbHknXG4gICAgICAgICh0YXNrLmhpc3RvcnkgPz0gW10pLnB1c2goeyBkYXRlOiArbmV3IERhdGUsIHZhbHVlOiB0YXNrLnZhbHVlIH0pOyBwYXRoc1tcInRhc2tzLiN7dGFzay5pZH0uaGlzdG9yeVwiXSA9IHRydWVcbiAgICAgICAgdGFzay5jb21wbGV0ZWQgPSBmYWxzZTsgcGF0aHNbXCJ0YXNrcy4je3Rhc2suaWR9LmNvbXBsZXRlZFwiXSA9IHRydWU7XG4gICAgICB3aGVuICd0b2RvJ1xuICAgICAgICAjZ2V0IHVwZGF0ZWQgdmFsdWVcbiAgICAgICAgYWJzVmFsID0gaWYgKGNvbXBsZXRlZCkgdGhlbiBNYXRoLmFicyh0YXNrLnZhbHVlKSBlbHNlIHRhc2sudmFsdWVcbiAgICAgICAgdG9kb1RhbGx5ICs9IGFic1ZhbFxuXG4gIHVzZXIuaGFiaXRzLmZvckVhY2ggKHRhc2spIC0+ICMgc2xvd2x5IHJlc2V0ICdvbmxpZXMnIHZhbHVlIHRvIDBcbiAgICBpZiB0YXNrLnVwIGlzIGZhbHNlIG9yIHRhc2suZG93biBpcyBmYWxzZVxuICAgICAgaWYgTWF0aC5hYnModGFzay52YWx1ZSkgPCAwLjFcbiAgICAgICAgdGFzay52YWx1ZSA9IDBcbiAgICAgIGVsc2VcbiAgICAgICAgdGFzay52YWx1ZSA9IHRhc2sudmFsdWUgLyAyXG4gICAgICBwYXRoc1tcInRhc2tzLiN7dGFzay5pZH0udmFsdWVcIl0gPSB0cnVlXG5cblxuICAjIEZpbmlzaGVkIHRhbGx5aW5nXG4gICgodXNlci5oaXN0b3J5ID89IHt9KS50b2RvcyA/PSBbXSkucHVzaCB7IGRhdGU6IG5vdywgdmFsdWU6IHRvZG9UYWxseSB9XG4gICMgdGFsbHkgZXhwZXJpZW5jZVxuICBleHBUYWxseSA9IHVzZXIuc3RhdHMuZXhwXG4gIGx2bCA9IDAgI2l0ZXJhdG9yXG4gIHdoaWxlIGx2bCA8ICh1c2VyLnN0YXRzLmx2bCAtIDEpXG4gICAgbHZsKytcbiAgICBleHBUYWxseSArPSBvYmoudG5sKGx2bClcbiAgKHVzZXIuaGlzdG9yeS5leHAgPz0gW10pLnB1c2ggeyBkYXRlOiBub3csIHZhbHVlOiBleHBUYWxseSB9XG4gIHBhdGhzW1wiaGlzdG9yeVwiXSA9IHRydWVcbiAgdXNlclxuIiwibW9tZW50ID0gcmVxdWlyZSAnbW9tZW50J1xuXyA9IHJlcXVpcmUgJ2xvZGFzaCdcbml0ZW1zID0gcmVxdWlyZSgnLi9pdGVtcy5jb2ZmZWUnKVxuXG4jIyNcbiAgRWFjaCB0aW1lIHdlJ3JlIHBlcmZvcm1pbmcgZGF0ZSBtYXRoIChjcm9uLCB0YXNrLWR1ZS1kYXlzLCBldGMpLCB3ZSBuZWVkIHRvIHRha2UgdXNlciBwcmVmZXJlbmNlcyBpbnRvIGNvbnNpZGVyYXRpb24uXG4gIFNwZWNpZmljYWxseSB7ZGF5U3RhcnR9IChjdXN0b20gZGF5IHN0YXJ0KSBhbmQge3RpbWV6b25lT2Zmc2V0fS4gVGhpcyBmdW5jdGlvbiBzYW5pdGl6ZXMgLyBkZWZhdWx0cyB0aG9zZSB2YWx1ZXMuXG4gIHtub3d9IGlzIGFsc28gcGFzc2VkIGluIGZvciB2YXJpb3VzIHB1cnBvc2VzLCBvbmUgZXhhbXBsZSBiZWluZyB0aGUgdGVzdCBzY3JpcHRzIHNjcmlwdHMgdGVzdGluZyBkaWZmZXJlbnQgXCJub3dcIiB0aW1lc1xuIyMjXG5zYW5pdGl6ZU9wdGlvbnMgPSAobykgLT5cbiAgZGF5U3RhcnQgPSBpZiAoby5kYXlTdGFydCBhbmQgMCA8PSArby5kYXlTdGFydCA8PSAyNCkgdGhlbiArby5kYXlTdGFydCBlbHNlIDBcbiAgdGltZXpvbmVPZmZzZXQgPSBpZiBvLnRpbWV6b25lT2Zmc2V0IHRoZW4gKyhvLnRpbWV6b25lT2Zmc2V0KSBlbHNlICttb21lbnQoKS56b25lKClcbiAgbm93ID0gaWYgby5ub3cgdGhlbiBtb21lbnQoby5ub3cpLnpvbmUodGltZXpvbmVPZmZzZXQpIGVsc2UgbW9tZW50KCtuZXcgRGF0ZSkuem9uZSh0aW1lem9uZU9mZnNldClcbiAgIyByZXR1cm4gYSBuZXcgb2JqZWN0LCB3ZSBkb24ndCB3YW50IHRvIGFkZCBcIm5vd1wiIHRvIHVzZXIgb2JqZWN0XG4gIHtkYXlTdGFydCwgdGltZXpvbmVPZmZzZXQsIG5vd31cblxuc3RhcnRPZldlZWsgPSAob3B0aW9ucz17fSkgLT5cbiAgbyA9IHNhbml0aXplT3B0aW9ucyhvcHRpb25zKVxuICBtb21lbnQoby5ub3cpLnN0YXJ0T2YoJ3dlZWsnKVxuXG5zdGFydE9mRGF5ID0gKG9wdGlvbnM9e30pIC0+XG4gIG8gPSBzYW5pdGl6ZU9wdGlvbnMob3B0aW9ucylcbiAgbW9tZW50KG8ubm93KS5zdGFydE9mKCdkYXknKS5hZGQoJ2gnLCBvcHRpb25zLmRheVN0YXJ0KVxuXG5kYXlNYXBwaW5nID0gezA6J3N1JywxOidtJywyOid0JywzOid3Jyw0Oid0aCcsNTonZicsNjoncyd9XG5cbiMjI1xuICBBYnNvbHV0ZSBkaWZmIGZyb20gXCJ5ZXN0ZXJkYXlcIiB0aWxsIG5vd1xuIyMjXG5kYXlzU2luY2UgPSAoeWVzdGVyZGF5LCBvcHRpb25zID0ge30pIC0+XG4gIG8gPSBzYW5pdGl6ZU9wdGlvbnMgb3B0aW9uc1xuICBNYXRoLmFicyBzdGFydE9mRGF5KF8uZGVmYXVsdHMge25vdzp5ZXN0ZXJkYXl9LCBvKS5kaWZmKG8ubm93LCAnZGF5cycpXG5cbiMjI1xuICBTaG91bGQgdGhlIHVzZXIgZG8gdGhpcyB0YWtzIG9uIHRoaXMgZGF0ZSwgZ2l2ZW4gdGhlIHRhc2sncyByZXBlYXQgb3B0aW9ucyBhbmQgdXNlci5wcmVmZXJlbmNlcy5kYXlTdGFydD9cbiMjI1xuc2hvdWxkRG8gPSAoZGF5LCByZXBlYXQsIG9wdGlvbnM9e30pIC0+XG4gIHJldHVybiBmYWxzZSB1bmxlc3MgcmVwZWF0XG4gIG8gPSBzYW5pdGl6ZU9wdGlvbnMgb3B0aW9uc1xuICBzZWxlY3RlZCA9IHJlcGVhdFtkYXlNYXBwaW5nW3N0YXJ0T2ZEYXkoXy5kZWZhdWx0cyB7bm93OmRheX0sIG8pLmRheSgpXV1cbiAgcmV0dXJuIHNlbGVjdGVkIHVubGVzcyBtb21lbnQoZGF5KS56b25lKG8udGltZXpvbmVPZmZzZXQpLmlzU2FtZShvLm5vdywnZCcpXG4gIGlmIG9wdGlvbnMuZGF5U3RhcnQgPD0gby5ub3cuaG91cigpICMgd2UncmUgcGFzdCB0aGUgZGF5U3RhcnQgbWFyaywgaXMgaXQgZHVlIHRvZGF5P1xuICAgIHJldHVybiBzZWxlY3RlZFxuICBlbHNlICMgd2UncmUgbm90IHBhc3QgZGF5U3RhcnQgbWFyaywgY2hlY2sgaWYgaXQgd2FzIGR1ZSBcInllc3RlcmRheVwiXG4gICAgeWVzdGVyZGF5ID0gbW9tZW50KG8ubm93KS5zdWJ0cmFjdCgxLCdkJykuZGF5KCkgIyBoYXZlIHRvIHdyYXAgby5ub3cgc28gYXMgbm90IHRvIG1vZGlmeSBvcmlnaW5hbFxuICAgIHJldHVybiByZXBlYXRbZGF5TWFwcGluZ1t5ZXN0ZXJkYXldXSAjIEZJWE1FIGlzIHRoaXMgY29ycmVjdD8/IERvIEkgbmVlZCB0byBkbyBhbnkgdGltZXpvbmUgY2FsY2F1bGF0aW9uIGhlcmU/XG5cbnV1aWQgPSAtPlxuICBcInh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eFwiLnJlcGxhY2UgL1t4eV0vZywgKGMpIC0+XG4gICAgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDBcbiAgICB2ID0gKGlmIGMgaXMgXCJ4XCIgdGhlbiByIGVsc2UgKHIgJiAweDMgfCAweDgpKVxuICAgIHYudG9TdHJpbmcgMTZcblxubW9kdWxlLmV4cG9ydHMgPVxuXG4gIHV1aWQ6IHV1aWRcblxuICB0YXNrRGVmYXVsdHM6ICh0YXNrLCBmaWx0ZXJzPXt9KSAtPlxuICAgIHNlbGYgPSBAXG4gICAgZGVmYXVsdHMgPVxuICAgICAgaWQ6IHNlbGYudXVpZCgpXG4gICAgICB0ZXh0OiAnJ1xuICAgICAgdXA6IHRydWVcbiAgICAgIGRvd246IHRydWVcbiAgICAgIHR5cGU6ICdoYWJpdCdcbiAgICAgIGNvbXBsZXRlZDogZmFsc2VcbiAgICAgIHJlcGVhdDoge3N1OnRydWUsbTp0cnVlLHQ6dHJ1ZSx3OnRydWUsdGg6dHJ1ZSxmOnRydWUsczp0cnVlfVxuICAgICAgbm90ZXM6ICcnXG4gICAgICB0YWdzOiBfLnRyYW5zZm9ybShmaWx0ZXJzLCAobSx2LGspIC0+IG1ba109diBpZiB2KVxuICAgIF8uZGVmYXVsdHMgdGFzaywgZGVmYXVsdHNcbiAgICB0YXNrLnZhbHVlID89IGlmIHRhc2sudHlwZSBpcyAncmV3YXJkJyB0aGVuIDEwIGVsc2UgMFxuICAgIHRhc2tcblxuICBuZXdVc2VyOiAoaXNEZXJieT1mYWxzZSkgLT5cbiAgICB1c2VyU2NoZW1hID1cbiAgICAjIF9pZCAvIGlkIGhhbmRsZWQgYnkgUmFjZXJcbiAgICAgIHN0YXRzOiB7IGdwOiAwLCBleHA6IDAsIGx2bDogMSwgaHA6IDUwIH1cbiAgICAgIGludml0YXRpb25zOiB7cGFydHk6bnVsbCwgZ3VpbGRzOiBbXX1cbiAgICAgIGl0ZW1zOiB7IHdlYXBvbjogMCwgYXJtb3I6IDAsIGhlYWQ6IDAsIHNoaWVsZDogMCB9XG4gICAgICBwcmVmZXJlbmNlczogeyBnZW5kZXI6ICdtJywgc2tpbjogJ3doaXRlJywgaGFpcjogJ2Jsb25kJywgYXJtb3JTZXQ6ICd2MScsIGRheVN0YXJ0OjAsIHNob3dIZWxtOiB0cnVlIH1cbiAgICAgIGFwaVRva2VuOiB1dWlkKCkgIyBzZXQgaW4gbmV3VXNlck9iamVjdCBiZWxvd1xuICAgICAgbGFzdENyb246ICtuZXcgRGF0ZSAjdGhpcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYCtuZXcgRGF0ZWAgb24gZmlyc3QgcnVuXG4gICAgICBiYWxhbmNlOiAwXG4gICAgICBmbGFnczpcbiAgICAgICAgcGFydHlFbmFibGVkOiBmYWxzZVxuICAgICAgICBpdGVtc0VuYWJsZWQ6IGZhbHNlXG4gICAgICAgIGFkczogJ3Nob3cnXG4gICAgICB0YWdzOiBbXVxuXG4gICAgaWYgaXNEZXJieVxuICAgICAgdXNlclNjaGVtYS5oYWJpdElkcyA9IFtdXG4gICAgICB1c2VyU2NoZW1hLmRhaWx5SWRzID0gW11cbiAgICAgIHVzZXJTY2hlbWEudG9kb0lkcyA9IFtdXG4gICAgICB1c2VyU2NoZW1hLnJld2FyZElkcyA9IFtdXG4gICAgICB1c2VyU2NoZW1hLnRhc2tzID0ge31cbiAgICBlbHNlXG4gICAgICB1c2VyU2NoZW1hLmhhYml0cyA9IFtdXG4gICAgICB1c2VyU2NoZW1hLmRhaWx5cyA9IFtdXG4gICAgICB1c2VyU2NoZW1hLnRvZG9zID0gW11cbiAgICAgIHVzZXJTY2hlbWEucmV3YXJkcyA9IFtdXG5cbiAgICAjIGRlZXAgY2xvbmUsIGVsc2UgZnVydGhlciBuZXcgdXNlcnMgZ2V0IGR1cGxpY2F0ZSBvYmplY3RzXG4gICAgbmV3VXNlciA9IF8uY2xvbmVEZWVwIHVzZXJTY2hlbWFcblxuICAgIHJlcGVhdCA9IHttOnRydWUsdDp0cnVlLHc6dHJ1ZSx0aDp0cnVlLGY6dHJ1ZSxzOnRydWUsc3U6dHJ1ZX1cbiAgICBkZWZhdWx0VGFza3MgPSBbXG4gICAgICB7dHlwZTogJ2hhYml0JywgdGV4dDogJzFoIFByb2R1Y3RpdmUgV29yaycsIG5vdGVzOiAnLS0gSGFiaXRzOiBDb25zdGFudGx5IFRyYWNrIC0tXFxuRm9yIHNvbWUgaGFiaXRzLCBpdCBvbmx5IG1ha2VzIHNlbnNlIHRvICpnYWluKiBwb2ludHMgKGxpa2UgdGhpcyBvbmUpLicsIHZhbHVlOiAwLCB1cDogdHJ1ZSwgZG93bjogZmFsc2UgfVxuICAgICAge3R5cGU6ICdoYWJpdCcsIHRleHQ6ICdFYXQgSnVuayBGb29kJywgbm90ZXM6ICdGb3Igb3RoZXJzLCBpdCBvbmx5IG1ha2VzIHNlbnNlIHRvICpsb3NlKiBwb2ludHMnLCB2YWx1ZTogMCwgdXA6IGZhbHNlLCBkb3duOiB0cnVlfVxuICAgICAge3R5cGU6ICdoYWJpdCcsIHRleHQ6ICdUYWtlIFRoZSBTdGFpcnMnLCBub3RlczogJ0ZvciB0aGUgcmVzdCwgYm90aCArIGFuZCAtIG1ha2Ugc2Vuc2UgKHN0YWlycyA9IGdhaW4sIGVsZXZhdG9yID0gbG9zZSknLCB2YWx1ZTogMCwgdXA6IHRydWUsIGRvd246IHRydWV9XG5cbiAgICAgIHt0eXBlOiAnZGFpbHknLCB0ZXh0OiAnMWggUGVyc29uYWwgUHJvamVjdCcsIG5vdGVzOiAnLS0gRGFpbGllczogQ29tcGxldGUgT25jZSBhIERheSAtLVxcbkF0IHRoZSBlbmQgb2YgZWFjaCBkYXksIG5vbi1jb21wbGV0ZWQgRGFpbGllcyBkb2NrIHlvdSBwb2ludHMuJywgdmFsdWU6IDAsIGNvbXBsZXRlZDogZmFsc2UsIHJlcGVhdDogcmVwZWF0IH1cbiAgICAgIHt0eXBlOiAnZGFpbHknLCB0ZXh0OiAnRXhlcmNpc2UnLCBub3RlczogXCJJZiB5b3UgYXJlIGRvaW5nIHdlbGwsIHRoZXkgdHVybiBncmVlbiBhbmQgYXJlIGxlc3MgdmFsdWFibGUgKGV4cGVyaWVuY2UsIGdvbGQpIGFuZCBsZXNzIGRhbWFnaW5nIChIUCkuIFRoaXMgbWVhbnMgeW91IGNhbiBlYXNlIHVwIG9uIHRoZW0gZm9yIGEgYml0LlwiLCB2YWx1ZTogMywgY29tcGxldGVkOiBmYWxzZSwgcmVwZWF0OiByZXBlYXQgfVxuICAgICAge3R5cGU6ICdkYWlseScsIHRleHQ6ICc0NW0gUmVhZGluZycsIG5vdGVzOiAnQnV0IGlmIHlvdSBhcmUgZG9pbmcgcG9vcmx5LCB0aGV5IHR1cm4gcmVkLiBUaGUgd29yc2UgeW91IGRvLCB0aGUgbW9yZSB2YWx1YWJsZSAoZXhwLCBnb2xkKSBhbmQgbW9yZSBkYW1hZ2luZyAoSFApIHRoZXNlIGdvYWxzIGJlY29tZS4gVGhpcyBlbmNvdXJhZ2VzIHlvdSB0byBmb2N1cyBvbiB5b3VyIHNob3J0Y29taW5ncywgdGhlIHJlZHMuJywgdmFsdWU6IC0xMCwgY29tcGxldGVkOiBmYWxzZSwgcmVwZWF0OiByZXBlYXQgfVxuXG4gICAgICB7dHlwZTogJ3RvZG8nLCB0ZXh0OiAnQ2FsbCBNb20nLCBub3RlczogXCItLSBUb2RvczogQ29tcGxldGUgRXZlbnR1YWxseSAtLVxcbk5vbi1jb21wbGV0ZWQgVG9kb3Mgd29uJ3QgaHVydCB5b3UsIGJ1dCB0aGV5IHdpbGwgYmVjb21lIG1vcmUgdmFsdWFibGUgb3ZlciB0aW1lLiBUaGlzIHdpbGwgZW5jb3VyYWdlIHlvdSB0byB3cmFwIHVwIHN0YWxlIFRvZG9zLlwiLCB2YWx1ZTogLTMsIGNvbXBsZXRlZDogZmFsc2UgfVxuXG4gICAgICB7dHlwZTogJ3Jld2FyZCcsIHRleHQ6ICcxIEVwaXNvZGUgb2YgR2FtZSBvZiBUaHJvbmVzJywgbm90ZXM6ICctLSBSZXdhcmRzOiBUcmVhdCBZb3Vyc2VsZiEgLS1cXG5BcyB5b3UgY29tcGxldGUgZ29hbHMsIHlvdSBlYXJuIGdvbGQgdG8gYnV5IHJld2FyZHMuIEJ1eSB0aGVtIGxpYmVyYWxseSAtIHJld2FyZHMgYXJlIGludGVncmFsIGluIGZvcm1pbmcgZ29vZCBoYWJpdHMuJywgdmFsdWU6IDIwIH1cbiAgICAgIHt0eXBlOiAncmV3YXJkJywgdGV4dDogJ0Nha2UnLCBub3RlczogJ0J1dCBvbmx5IGJ1eSBpZiB5b3UgaGF2ZSBlbm91Z2ggZ29sZCAtIHlvdSBsb3NlIEhQIG90aGVyd2lzZS4nLCB2YWx1ZTogMTAgfVxuICAgIF1cblxuICAgIGRlZmF1bHRUYWdzID0gW1xuICAgICAge25hbWU6ICdtb3JuaW5nJ31cbiAgICAgIHtuYW1lOiAnYWZ0ZXJub29uJ31cbiAgICAgIHtuYW1lOiAnZXZlbmluZyd9XG4gICAgXVxuXG4gICAgZm9yIHRhc2sgaW4gZGVmYXVsdFRhc2tzXG4gICAgICBndWlkID0gdGFzay5pZCA9IHV1aWQoKVxuICAgICAgaWYgaXNEZXJieVxuICAgICAgICBuZXdVc2VyLnRhc2tzW2d1aWRdID0gdGFza1xuICAgICAgICBuZXdVc2VyW1wiI3t0YXNrLnR5cGV9SWRzXCJdLnB1c2ggZ3VpZFxuICAgICAgZWxzZVxuICAgICAgICBuZXdVc2VyW1wiI3t0YXNrLnR5cGV9c1wiXS5wdXNoIHRhc2tcblxuICAgIGZvciB0YWcgaW4gZGVmYXVsdFRhZ3NcbiAgICAgIHRhZy5pZCA9IHV1aWQoKVxuICAgICAgbmV3VXNlci50YWdzLnB1c2ggdGFnXG5cbiAgICBuZXdVc2VyXG5cbiAgcGVyY2VudDogKHgseSkgLT5cbiAgICB4PTEgaWYgeD09MFxuICAgIE1hdGgucm91bmQoeC95KjEwMClcblxuICAjIyNcbiAgICBUaGlzIGFsbG93cyB5b3UgdG8gc2V0IG9iamVjdCBwcm9wZXJ0aWVzIGJ5IGRvdC1wYXRoLiBFZywgeW91IGNhbiBydW4gcGF0aFNldCgnc3RhdHMuaHAnLDUwLHVzZXIpIHdoaWNoIGlzIHRoZSBzYW1lIGFzXG4gICAgdXNlci5zdGF0cy5ocCA9IDUwLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGluIG91ciBoYWJpdHJwZy1zaGFyZWQgZnVuY3Rpb25zIHdlJ3JlIHJldHVybmluZyBjaGFuZ2VzZXRzIGFzIHtwYXRoOnZhbHVlfSxcbiAgICBzbyB0aGF0IGRpZmZlcmVudCBjb25zdW1lcnMgY2FuIGltcGxlbWVudCBzZXR0ZXJzIHRoZWlyIG93biB3YXkuIERlcmJ5IG5lZWRzIG1vZGVsLnNldChwYXRoLCB2YWx1ZSkgZm9yIGV4YW1wbGUsIHdoZXJlXG4gICAgQW5ndWxhciBzZXRzIG9iamVjdCBwcm9wZXJ0aWVzIGRpcmVjdGx5IC0gaW4gd2hpY2ggY2FzZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuXG4gICMjI1xuICBkb3RTZXQ6IChwYXRoLCB2YWwsIG9iaikgLT5cbiAgICByZXR1cm4gaWYgfnBhdGguaW5kZXhPZigndW5kZWZpbmVkJylcbiAgICBhcnIgPSBwYXRoLnNwbGl0KCcuJylcbiAgICBfLnJlZHVjZSBhcnIsIChjdXJyLCBuZXh0LCBpbmRleCkgLT5cbiAgICAgIGlmIChhcnIubGVuZ3RoIC0gMSkgPT0gaW5kZXhcbiAgICAgICAgY3VycltuZXh0XSA9IHZhbFxuICAgICAgY3VycltuZXh0XVxuICAgICwgb2JqXG5cbiAgZG90R2V0OiAocGF0aCwgb2JqKSAtPlxuICAgIHJldHVybiB1bmRlZmluZWQgaWYgfnBhdGguaW5kZXhPZigndW5kZWZpbmVkJylcbiAgICBfLnJlZHVjZSBwYXRoLnNwbGl0KCcuJyksICgoY3VyciwgbmV4dCkgLT4gY3VycltuZXh0XSksIG9ialxuXG4gIGRheXNTaW5jZTogZGF5c1NpbmNlXG4gIHN0YXJ0T2ZXZWVrOiBzdGFydE9mV2Vla1xuICBzdGFydE9mRGF5OiBzdGFydE9mRGF5XG5cbiAgc2hvdWxkRG86IHNob3VsZERvXG5cbiAgIyMjXG4gICAgR2V0IGEgcmFuZG9tIHByb3BlcnR5IGZyb20gYW4gb2JqZWN0XG4gICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNTMyMjE4L3BpY2stcmFuZG9tLXByb3BlcnR5LWZyb20tYS1qYXZhc2NyaXB0LW9iamVjdFxuICAgIHJldHVybnMgcmFuZG9tIHByb3BlcnR5ICh0aGUgdmFsdWUpXG4gICMjI1xuICByYW5kb21WYWw6IChvYmopIC0+XG4gICAgcmVzdWx0ID0gdW5kZWZpbmVkXG4gICAgY291bnQgPSAwXG4gICAgZm9yIGtleSwgdmFsIG9mIG9ialxuICAgICAgcmVzdWx0ID0gdmFsIGlmIE1hdGgucmFuZG9tKCkgPCAoMSAvICsrY291bnQpXG4gICAgcmVzdWx0XG5cbiAgIyMjXG4gICAgUmVtb3ZlIHdoaXRlc3BhY2UgI0ZJWE1FIGFyZSB3ZSB1c2luZyB0aGlzIGFueXd3aGVyZT8gU2hvdWxkIHdlIGJlP1xuICAjIyNcbiAgcmVtb3ZlV2hpdGVzcGFjZTogKHN0cikgLT5cbiAgICByZXR1cm4gJycgdW5sZXNzIHN0clxuICAgIHN0ci5yZXBsYWNlIC9cXHMvZywgJydcblxuICAjIyNcbiAgICBHZW5lcmF0ZSB0aGUgdXNlcm5hbWUsIHNpbmNlIGl0IGNhbiBiZSBvbmUgb2YgbWFueSB0aGluZ3M6IHRoZWlyIHVzZXJuYW1lLCB0aGVpciBmYWNlYm9vayBmdWxsbmFtZSwgdGhlaXIgbWFudWFsbHktc2V0IHByb2ZpbGUgbmFtZVxuICAjIyNcbiAgdXNlcm5hbWU6IChhdXRoLCBvdmVycmlkZSkgLT5cbiAgICAjc29tZSBwZW9wbGUgZGVmaW5lIGN1c3RvbSBwcm9maWxlIG5hbWUgaW4gQXZhdGFyIC0+IFByb2ZpbGVcbiAgICByZXR1cm4gb3ZlcnJpZGUgaWYgb3ZlcnJpZGVcblxuICAgIGlmIGF1dGg/LmZhY2Vib29rPy5kaXNwbGF5TmFtZT9cbiAgICAgIGF1dGguZmFjZWJvb2suZGlzcGxheU5hbWVcbiAgICBlbHNlIGlmIGF1dGg/LmZhY2Vib29rP1xuICAgICAgZmIgPSBhdXRoLmZhY2Vib29rXG4gICAgICBpZiBmYi5fcmF3IHRoZW4gXCIje2ZiLm5hbWUuZ2l2ZW5OYW1lfSAje2ZiLm5hbWUuZmFtaWx5TmFtZX1cIiBlbHNlIGZiLm5hbWVcbiAgICBlbHNlIGlmIGF1dGg/LmxvY2FsP1xuICAgICAgYXV0aC5sb2NhbC51c2VybmFtZVxuICAgIGVsc2VcbiAgICAgICdBbm9ueW1vdXMnXG5cbiAgIyMjXG4gICAgRW5jb2RlIHRoZSBkb3dubG9hZCBsaW5rIGZvciAuaWNzIGlDYWwgZmlsZVxuICAjIyNcbiAgZW5jb2RlaUNhbExpbms6ICh1aWQsIGFwaVRva2VuKSAtPlxuICAgIGxvYyA9IHdpbmRvdz8ubG9jYXRpb24uaG9zdCBvciBwcm9jZXNzPy5lbnY/LkJBU0VfVVJMIG9yICcnXG4gICAgZW5jb2RlVVJJQ29tcG9uZW50IFwiaHR0cDovLyN7bG9jfS92MS91c2Vycy8je3VpZH0vY2FsZW5kYXIuaWNzP2FwaVRva2VuPSN7YXBpVG9rZW59XCJcblxuICAjIyNcbiAgICBVc2VyJ3MgY3VycmVudGx5IGVxdWlwZWQgaXRlbVxuICAjIyNcbiAgZXF1aXBwZWQ6ICh0eXBlLCBpdGVtPTAsIHByZWZlcmVuY2VzPXtnZW5kZXI6J20nLCBhcm1vclNldDondjEnfSwgYmFja2VyVGllcj0wKSAtPlxuICAgIHtnZW5kZXIsIGFybW9yU2V0fSA9IHByZWZlcmVuY2VzXG4gICAgaXRlbSA9IH5+aXRlbVxuICAgIGJhY2tlclRpZXIgPSB+fmJhY2tlclRpZXJcblxuICAgIHN3aXRjaCB0eXBlXG4gICAgICB3aGVuJ2FybW9yJ1xuICAgICAgICBpZiBpdGVtID4gNVxuICAgICAgICAgIHJldHVybiAnYXJtb3JfNicgaWYgYmFja2VyVGllciA+PSA0NVxuICAgICAgICAgIGl0ZW0gPSA1ICMgc2V0IHRoZW0gYmFjayBpZiB0aGV5J3JlIHRyeWluZyB0byBjaGVhdFxuICAgICAgICBpZiBnZW5kZXIgaXMgJ2YnXG4gICAgICAgICAgcmV0dXJuIGlmIChpdGVtIGlzIDApIHRoZW4gXCJmX2FybW9yXyN7aXRlbX1fI3thcm1vclNldH1cIiBlbHNlIFwiZl9hcm1vcl8je2l0ZW19XCJcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldHVybiBcIm1fYXJtb3JfI3tpdGVtfVwiXG5cbiAgICAgIHdoZW4gJ2hlYWQnXG4gICAgICAgIGlmIGl0ZW0gPiA1XG4gICAgICAgICAgcmV0dXJuICdoZWFkXzYnIGlmIGJhY2tlclRpZXIgPj0gNDVcbiAgICAgICAgICBpdGVtID0gNVxuICAgICAgICBpZiBnZW5kZXIgaXMgJ2YnXG4gICAgICAgICAgcmV0dXJuIGlmIChpdGVtID4gMSkgdGhlbiBcImZfaGVhZF8je2l0ZW19XyN7YXJtb3JTZXR9XCIgZWxzZSBcImZfaGVhZF8je2l0ZW19XCJcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldHVybiBcIm1faGVhZF8je2l0ZW19XCJcblxuICAgICAgd2hlbiAnc2hpZWxkJ1xuICAgICAgICBpZiBpdGVtID4gNVxuICAgICAgICAgIHJldHVybiAnc2hpZWxkXzYnIGlmIGJhY2tlclRpZXIgPj0gNDVcbiAgICAgICAgICBpdGVtID0gNVxuICAgICAgICByZXR1cm4gXCIje3ByZWZlcmVuY2VzLmdlbmRlcn1fc2hpZWxkXyN7aXRlbX1cIlxuXG4gICAgICB3aGVuICd3ZWFwb24nXG4gICAgICAgIGlmIGl0ZW0gPiA2XG4gICAgICAgICAgcmV0dXJuICd3ZWFwb25fNycgaWYgYmFja2VyVGllciA+PSA3MFxuICAgICAgICAgIGl0ZW0gPSA2XG4gICAgICAgIHJldHVybiBcIiN7cHJlZmVyZW5jZXMuZ2VuZGVyfV93ZWFwb25fI3tpdGVtfVwiXG5cbiAgIyMjXG4gICAgR29sZCBhbW91bnQgZnJvbSB0aGVpciBtb25leVxuICAjIyNcbiAgZ29sZDogKG51bSkgLT5cbiAgICBpZiBudW1cbiAgICAgIHJldHVybiAobnVtKS50b0ZpeGVkKDEpLnNwbGl0KCcuJylbMF1cbiAgICBlbHNlXG4gICAgICByZXR1cm4gXCIwXCJcblxuICAjIyNcbiAgICBTaWx2ZXIgYW1vdW50IGZyb20gdGhlaXIgbW9uZXlcbiAgIyMjXG4gIHNpbHZlcjogKG51bSkgLT5cbiAgICBpZiBudW1cbiAgICAgIChudW0pLnRvRml4ZWQoMikuc3BsaXQoJy4nKVsxXVxuICAgIGVsc2VcbiAgICAgIHJldHVybiBcIjAwXCJcblxuICAjIyNcbiAgICBUYXNrIGNsYXNzZXMgZ2l2ZW4gZXZlcnl0aGluZyBhYm91dCB0aGUgY2xhc3NcbiAgIyMjXG4gIHRhc2tDbGFzc2VzOiAodGFzaywgZmlsdGVycywgZGF5U3RhcnQsIGxhc3RDcm9uLCBzaG93Q29tcGxldGVkPWZhbHNlLCBtYWluKSAtPlxuICAgIHJldHVybiB1bmxlc3MgdGFza1xuICAgIHt0eXBlLCBjb21wbGV0ZWQsIHZhbHVlLCByZXBlYXR9ID0gdGFza1xuXG4gICAgIyBjb21wbGV0ZWQgLyByZW1haW5pbmcgdG9nZ2xlXG4gICAgcmV0dXJuICdoaWRkZW4nIGlmICh0eXBlIGlzICd0b2RvJykgYW5kIChjb21wbGV0ZWQgIT0gc2hvd0NvbXBsZXRlZClcblxuICAgICMgRmlsdGVyc1xuICAgIGlmIG1haW4gIyBvbmx5IHNob3cgd2hlbiBvbiB5b3VyIG93biBsaXN0XG4gICAgICBmb3IgZmlsdGVyLCBlbmFibGVkIG9mIGZpbHRlcnNcbiAgICAgICAgaWYgZW5hYmxlZCBhbmQgbm90IHRhc2sudGFncz9bZmlsdGVyXVxuICAgICAgICAgICMgQWxsIHRoZSBvdGhlciBjbGFzc2VzIGRvbid0IG1hdHRlclxuICAgICAgICAgIHJldHVybiAnaGlkZGVuJ1xuXG4gICAgY2xhc3NlcyA9IHR5cGVcblxuICAgICMgc2hvdyBhcyBjb21wbGV0ZWQgaWYgY29tcGxldGVkIChuYXR1cmFsbHkpIG9yIG5vdCByZXF1aXJlZCBmb3IgdG9kYXlcbiAgICBpZiB0eXBlIGluIFsndG9kbycsICdkYWlseSddXG4gICAgICBpZiBjb21wbGV0ZWQgb3IgKHR5cGUgaXMgJ2RhaWx5JyBhbmQgIXNob3VsZERvKCtuZXcgRGF0ZSwgdGFzay5yZXBlYXQsIHtkYXlTdGFydH0pKVxuICAgICAgICBjbGFzc2VzICs9IFwiIGNvbXBsZXRlZFwiXG4gICAgICBlbHNlXG4gICAgICAgIGNsYXNzZXMgKz0gXCIgdW5jb21wbGV0ZWRcIlxuICAgIGVsc2UgaWYgdHlwZSBpcyAnaGFiaXQnXG4gICAgICBjbGFzc2VzICs9ICcgaGFiaXQtd2lkZScgaWYgdGFzay5kb3duIGFuZCB0YXNrLnVwXG5cbiAgICBpZiB2YWx1ZSA8IC0yMFxuICAgICAgY2xhc3NlcyArPSAnIGNvbG9yLXdvcnN0J1xuICAgIGVsc2UgaWYgdmFsdWUgPCAtMTBcbiAgICAgIGNsYXNzZXMgKz0gJyBjb2xvci13b3JzZSdcbiAgICBlbHNlIGlmIHZhbHVlIDwgLTFcbiAgICAgIGNsYXNzZXMgKz0gJyBjb2xvci1iYWQnXG4gICAgZWxzZSBpZiB2YWx1ZSA8IDFcbiAgICAgIGNsYXNzZXMgKz0gJyBjb2xvci1uZXV0cmFsJ1xuICAgIGVsc2UgaWYgdmFsdWUgPCA1XG4gICAgICBjbGFzc2VzICs9ICcgY29sb3ItZ29vZCdcbiAgICBlbHNlIGlmIHZhbHVlIDwgMTBcbiAgICAgIGNsYXNzZXMgKz0gJyBjb2xvci1iZXR0ZXInXG4gICAgZWxzZVxuICAgICAgY2xhc3NlcyArPSAnIGNvbG9yLWJlc3QnXG4gICAgcmV0dXJuIGNsYXNzZXNcblxuICAjIyNcbiAgICBEb2VzIHRoZSB1c2VyIG93biB0aGlzIHBldD9cbiAgIyMjXG4gIG93bnNQZXQ6IChwZXQsIHVzZXJQZXRzKSAtPiBfLmlzQXJyYXkodXNlclBldHMpIGFuZCB1c2VyUGV0cy5pbmRleE9mKHBldCkgIT0gLTFcblxuICAjIyNcbiAgICBGcmllbmRseSB0aW1lc3RhbXBcbiAgIyMjXG4gIGZyaWVuZGx5VGltZXN0YW1wOiAodGltZXN0YW1wKSAtPiBtb21lbnQodGltZXN0YW1wKS5mb3JtYXQoJ01NL0REIGg6bW06c3MgYScpXG5cbiAgIyMjXG4gICAgRG9lcyB1c2VyIGhhdmUgbmV3IGNoYXQgbWVzc2FnZXM/XG4gICMjI1xuICBuZXdDaGF0TWVzc2FnZXM6IChtZXNzYWdlcywgbGFzdE1lc3NhZ2VTZWVuKSAtPlxuICAgIHJldHVybiBmYWxzZSB1bmxlc3MgbWVzc2FnZXM/Lmxlbmd0aCA+IDBcbiAgICBtZXNzYWdlcz9bMF0gYW5kIChtZXNzYWdlc1swXS5pZCAhPSBsYXN0TWVzc2FnZVNlZW4pXG5cbiAgIyMjXG4gICAgUmVsYXRpdmUgRGF0ZVxuICAjIyNcbiAgcmVsYXRpdmVEYXRlOiByZXF1aXJlKCdyZWxhdGl2ZS1kYXRlJylcblxuICAjIyNcbiAgICBhcmUgYW55IHRhZ3MgYWN0aXZlP1xuICAjIyNcbiAgbm9UYWdzOiAodGFncykgLT4gXy5pc0VtcHR5KHRhZ3MpIG9yIF8uaXNFbXB0eShfLmZpbHRlciggdGFncywgKHQpIC0+IHQgKSApXG5cbiAgIyMjXG4gICAgQXJlIHRoZXJlIHRhZ3MgYXBwbGllZD9cbiAgIyMjXG4gIGFwcGxpZWRUYWdzOiAodXNlclRhZ3MsIHRhc2tUYWdzKSAtPlxuICAgIGFyciA9IFtdXG4gICAgXy5lYWNoIHVzZXJUYWdzLCAodCkgLT5cbiAgICAgIHJldHVybiB1bmxlc3MgdD9cbiAgICAgIGFyci5wdXNoKHQubmFtZSkgaWYgdGFza1RhZ3M/W3QuaWRdXG4gICAgYXJyLmpvaW4oJywgJylcblxuICAjIyNcbiAgICBVc2VyIHN0YXRzXG4gICMjI1xuXG4gIHVzZXJTdHI6IChsZXZlbCkgLT5cbiAgICAobGV2ZWwtMSkgLyAyXG5cbiAgdG90YWxTdHI6IChsZXZlbCwgd2VhcG9uPTApIC0+XG4gICAgc3RyID0gKGxldmVsLTEpIC8gMlxuICAgIChzdHIgKyBpdGVtcy5nZXRJdGVtKCd3ZWFwb24nLCB3ZWFwb24pLnN0cmVuZ3RoKVxuXG4gIHVzZXJEZWY6IChsZXZlbCkgLT5cbiAgICAobGV2ZWwtMSkgLyAyXG5cbiAgdG90YWxEZWY6IChsZXZlbCwgYXJtb3I9MCwgaGVhZD0wLCBzaGllbGQ9MCkgLT5cbiAgICB0b3RhbERlZiA9XG4gICAgICAobGV2ZWwgLSAxKSAvIDIgKyAjIGRlZmVuc2VcbiAgICAgIGl0ZW1zLmdldEl0ZW0oJ2FybW9yJywgYXJtb3IpLmRlZmVuc2UgK1xuICAgICAgaXRlbXMuZ2V0SXRlbSgnaGVhZCcsIGhlYWQpLmRlZmVuc2UgK1xuICAgICAgaXRlbXMuZ2V0SXRlbSgnc2hpZWxkJywgc2hpZWxkKS5kZWZlbnNlXG4gICAgcmV0dXJuIHRvdGFsRGVmXG5cbiAgaXRlbVRleHQ6ICh0eXBlLCBpdGVtPTApIC0+XG4gICAgaXRlbXMuZ2V0SXRlbSh0eXBlLCBpdGVtKS50ZXh0XG5cbiAgaXRlbVN0YXQ6ICh0eXBlLCBpdGVtPTApIC0+XG4gICAgaSA9IGl0ZW1zLmdldEl0ZW0odHlwZSwgaXRlbSlcbiAgICBpZiB0eXBlIGlzICd3ZWFwb24nIHRoZW4gaS5zdHJlbmd0aCBlbHNlIGkuZGVmZW5zZVxuXG5cbiAgIyMjXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgRGVyYnktc3BlY2lmaWMgaGVscGVycy4gV2lsbCByZW1vdmUgYWZ0ZXIgdGhlIHJld3JpdGUsIG5lZWQgdGhlbSBoZXJlIGZvciBub3dcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAjIyNcblxuICAjIyNcbiAgTWFrZSBzdXJlIG1vZGVsLmdldCgpIHJldHVybnMgYWxsIHByb3BlcnRpZXMsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY29kZXBhcnR5L3JhY2VyL2lzc3Vlcy8xMTZcbiAgIyMjXG4gIGh5ZHJhdGU6IChzcGVjKSAtPlxuICAgIGlmIF8uaXNPYmplY3Qoc3BlYykgYW5kICFfLmlzQXJyYXkoc3BlYylcbiAgICAgIGh5ZHJhdGVkID0ge31cbiAgICAgIGtleXMgPSBfLmtleXMoc3BlYykuY29uY2F0KF8ua2V5cyhzcGVjLl9fcHJvdG9fXykpXG4gICAgICBrZXlzLmZvckVhY2ggKGspID0+IGh5ZHJhdGVkW2tdID0gQGh5ZHJhdGUoc3BlY1trXSlcbiAgICAgIGh5ZHJhdGVkXG4gICAgZWxzZSBzcGVjIiwiZXhwb3J0cy5hbGdvcyA9IHJlcXVpcmUoJy4vYWxnb3MuY29mZmVlJyk7XG5leHBvcnRzLml0ZW1zID0gcmVxdWlyZSgnLi9pdGVtcy5jb2ZmZWUnKTtcbmV4cG9ydHMuaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycy5jb2ZmZWUnKTtcblxudHJ5IHtcbiAgICB3aW5kb3c7XG4gICAgd2luZG93LmhhYml0cnBnU2hhcmVkID0gZXhwb3J0cztcbn0gY2F0Y2goZSkge30iLCJfID0gcmVxdWlyZSAnbG9kYXNoJ1xuXG5pdGVtcyA9IG1vZHVsZS5leHBvcnRzLml0ZW1zID1cbiAgd2VhcG9uOiBbXG4gICAge2luZGV4OiAwLCB0ZXh0OiBcIlRyYWluaW5nIFN3b3JkXCIsIGNsYXNzZXM6IFwid2VhcG9uXzBcIiwgbm90ZXM6J1RyYWluaW5nIHdlYXBvbi4nLCBzdHJlbmd0aDogMCwgdmFsdWU6MH1cbiAgICB7aW5kZXg6IDEsIHRleHQ6IFwiU3dvcmRcIiwgY2xhc3Nlczond2VhcG9uXzEnLCBub3RlczonSW5jcmVhc2VzIGV4cGVyaWVuY2UgZ2FpbiBieSAzJS4nLCBzdHJlbmd0aDogMywgdmFsdWU6MjB9XG4gICAge2luZGV4OiAyLCB0ZXh0OiBcIkF4ZVwiLCBjbGFzc2VzOid3ZWFwb25fMicsIG5vdGVzOidJbmNyZWFzZXMgZXhwZXJpZW5jZSBnYWluIGJ5IDYlLicsIHN0cmVuZ3RoOiA2LCB2YWx1ZTozMH1cbiAgICB7aW5kZXg6IDMsIHRleHQ6IFwiTW9ybmluZ3N0YXJcIiwgY2xhc3Nlczond2VhcG9uXzMnLCBub3RlczonSW5jcmVhc2VzIGV4cGVyaWVuY2UgZ2FpbiBieSA5JS4nLCBzdHJlbmd0aDogOSwgdmFsdWU6NDV9XG4gICAge2luZGV4OiA0LCB0ZXh0OiBcIkJsdWUgU3dvcmRcIiwgY2xhc3Nlczond2VhcG9uXzQnLCBub3RlczonSW5jcmVhc2VzIGV4cGVyaWVuY2UgZ2FpbiBieSAxMiUuJywgc3RyZW5ndGg6IDEyLCB2YWx1ZTo2NX1cbiAgICB7aW5kZXg6IDUsIHRleHQ6IFwiUmVkIFN3b3JkXCIsIGNsYXNzZXM6J3dlYXBvbl81Jywgbm90ZXM6J0luY3JlYXNlcyBleHBlcmllbmNlIGdhaW4gYnkgMTUlLicsIHN0cmVuZ3RoOiAxNSwgdmFsdWU6OTB9XG4gICAge2luZGV4OiA2LCB0ZXh0OiBcIkdvbGRlbiBTd29yZFwiLCBjbGFzc2VzOid3ZWFwb25fNicsIG5vdGVzOidJbmNyZWFzZXMgZXhwZXJpZW5jZSBnYWluIGJ5IDE4JS4nLCBzdHJlbmd0aDogMTgsIHZhbHVlOjEyMH1cbiAgICB7aW5kZXg6IDcsIHRleHQ6IFwiRGFyayBTb3VscyBCbGFkZVwiLCBjbGFzc2VzOid3ZWFwb25fNycsIG5vdGVzOidJbmNyZWFzZXMgZXhwZXJpZW5jZSBnYWluIGJ5IDIxJS4nLCBzdHJlbmd0aDogMjEsIHZhbHVlOjE1MH1cbiAgXVxuICBhcm1vcjogW1xuICAgIHtpbmRleDogMCwgdGV4dDogXCJDbG90aCBBcm1vclwiLCBjbGFzc2VzOiAnYXJtb3JfMCcsIG5vdGVzOidUcmFpbmluZyBhcm1vci4nLCBkZWZlbnNlOiAwLCB2YWx1ZTowfVxuICAgIHtpbmRleDogMSwgdGV4dDogXCJMZWF0aGVyIEFybW9yXCIsIGNsYXNzZXM6ICdhcm1vcl8xJywgbm90ZXM6J0RlY3JlYXNlcyBIUCBsb3NzIGJ5IDQlLicsIGRlZmVuc2U6IDQsIHZhbHVlOjMwfVxuICAgIHtpbmRleDogMiwgdGV4dDogXCJDaGFpbiBNYWlsXCIsIGNsYXNzZXM6ICdhcm1vcl8yJywgbm90ZXM6J0RlY3JlYXNlcyBIUCBsb3NzIGJ5IDYlLicsIGRlZmVuc2U6IDYsIHZhbHVlOjQ1fVxuICAgIHtpbmRleDogMywgdGV4dDogXCJQbGF0ZSBNYWlsXCIsIGNsYXNzZXM6ICdhcm1vcl8zJywgbm90ZXM6J0RlY3JlYXNlcyBIUCBsb3NzIGJ5IDclLicsIGRlZmVuc2U6IDcsIHZhbHVlOjY1fVxuICAgIHtpbmRleDogNCwgdGV4dDogXCJSZWQgQXJtb3JcIiwgY2xhc3NlczogJ2FybW9yXzQnLCBub3RlczonRGVjcmVhc2VzIEhQIGxvc3MgYnkgOCUuJywgZGVmZW5zZTogOCwgdmFsdWU6OTB9XG4gICAge2luZGV4OiA1LCB0ZXh0OiBcIkdvbGRlbiBBcm1vclwiLCBjbGFzc2VzOiAnYXJtb3JfNScsIG5vdGVzOidEZWNyZWFzZXMgSFAgbG9zcyBieSAxMCUuJywgZGVmZW5zZTogMTAsIHZhbHVlOjEyMH1cbiAgICB7aW5kZXg6IDYsIHRleHQ6IFwiU2hhZGUgQXJtb3JcIiwgY2xhc3NlczogJ2FybW9yXzYnLCBub3RlczonRGVjcmVhc2VzIEhQIGxvc3MgYnkgMTIlLicsIGRlZmVuc2U6IDEyLCB2YWx1ZToxNTB9XG4gIF1cbiAgaGVhZDogW1xuICAgIHtpbmRleDogMCwgdGV4dDogXCJObyBIZWxtXCIsIGNsYXNzZXM6ICdoZWFkXzAnLCBub3RlczonVHJhaW5pbmcgaGVsbS4nLCBkZWZlbnNlOiAwLCB2YWx1ZTowfVxuICAgIHtpbmRleDogMSwgdGV4dDogXCJMZWF0aGVyIEhlbG1cIiwgY2xhc3NlczogJ2hlYWRfMScsIG5vdGVzOidEZWNyZWFzZXMgSFAgbG9zcyBieSAyJS4nLCBkZWZlbnNlOiAyLCB2YWx1ZToxNX1cbiAgICB7aW5kZXg6IDIsIHRleHQ6IFwiQ2hhaW4gQ29pZlwiLCBjbGFzc2VzOiAnaGVhZF8yJywgbm90ZXM6J0RlY3JlYXNlcyBIUCBsb3NzIGJ5IDMlLicsIGRlZmVuc2U6IDMsIHZhbHVlOjI1fVxuICAgIHtpbmRleDogMywgdGV4dDogXCJQbGF0ZSBIZWxtXCIsIGNsYXNzZXM6ICdoZWFkXzMnLCBub3RlczonRGVjcmVhc2VzIEhQIGxvc3MgYnkgNCUuJywgZGVmZW5zZTogNCwgdmFsdWU6NDV9XG4gICAge2luZGV4OiA0LCB0ZXh0OiBcIlJlZCBIZWxtXCIsIGNsYXNzZXM6ICdoZWFkXzQnLCBub3RlczonRGVjcmVhc2VzIEhQIGxvc3MgYnkgNSUuJywgZGVmZW5zZTogNSwgdmFsdWU6NjB9XG4gICAge2luZGV4OiA1LCB0ZXh0OiBcIkdvbGRlbiBIZWxtXCIsIGNsYXNzZXM6ICdoZWFkXzUnLCBub3RlczonRGVjcmVhc2VzIEhQIGxvc3MgYnkgNiUuJywgZGVmZW5zZTogNiwgdmFsdWU6ODB9XG4gICAge2luZGV4OiA2LCB0ZXh0OiBcIlNoYWRlIEhlbG1cIiwgY2xhc3NlczogJ2hlYWRfNicsIG5vdGVzOidEZWNyZWFzZXMgSFAgbG9zcyBieSA3JS4nLCBkZWZlbnNlOiA3LCB2YWx1ZToxMDB9XG4gIF1cbiAgc2hpZWxkOiBbXG4gICAge2luZGV4OiAwLCB0ZXh0OiBcIk5vIFNoaWVsZFwiLCBjbGFzc2VzOiAnc2hpZWxkXzAnLCBub3RlczonTm8gU2hpZWxkLicsIGRlZmVuc2U6IDAsIHZhbHVlOjB9XG4gICAge2luZGV4OiAxLCB0ZXh0OiBcIldvb2RlbiBTaGllbGRcIiwgY2xhc3NlczogJ3NoaWVsZF8xJywgbm90ZXM6J0RlY3JlYXNlcyBIUCBsb3NzIGJ5IDMlJywgZGVmZW5zZTogMywgdmFsdWU6MjB9XG4gICAge2luZGV4OiAyLCB0ZXh0OiBcIkJ1Y2tsZXJcIiwgY2xhc3NlczogJ3NoaWVsZF8yJywgbm90ZXM6J0RlY3JlYXNlcyBIUCBsb3NzIGJ5IDQlLicsIGRlZmVuc2U6IDQsIHZhbHVlOjM1fVxuICAgIHtpbmRleDogMywgdGV4dDogXCJSZWluZm9yY2VkIFNoaWVsZFwiLCBjbGFzc2VzOiAnc2hpZWxkXzMnLCBub3RlczonRGVjcmVhc2VzIEhQIGxvc3MgYnkgNSUuJywgZGVmZW5zZTogNSwgdmFsdWU6NTV9XG4gICAge2luZGV4OiA0LCB0ZXh0OiBcIlJlZCBTaGllbGRcIiwgY2xhc3NlczogJ3NoaWVsZF80Jywgbm90ZXM6J0RlY3JlYXNlcyBIUCBsb3NzIGJ5IDclLicsIGRlZmVuc2U6IDcsIHZhbHVlOjcwfVxuICAgIHtpbmRleDogNSwgdGV4dDogXCJHb2xkZW4gU2hpZWxkXCIsIGNsYXNzZXM6ICdzaGllbGRfNScsIG5vdGVzOidEZWNyZWFzZXMgSFAgbG9zcyBieSA4JS4nLCBkZWZlbnNlOiA4LCB2YWx1ZTo5MH1cbiAgICB7aW5kZXg6IDYsIHRleHQ6IFwiVG9ybWVudGVkIFNrdWxsXCIsIGNsYXNzZXM6ICdzaGllbGRfNicsIG5vdGVzOidEZWNyZWFzZXMgSFAgbG9zcyBieSA5JS4nLCBkZWZlbnNlOiA5LCB2YWx1ZToxMjB9XG4gIF1cbiAgcG90aW9uOiB7dHlwZTogJ3BvdGlvbicsIHRleHQ6IFwiUG90aW9uXCIsIG5vdGVzOiBcIlJlY292ZXIgMTUgSFAgKEluc3RhbnQgVXNlKVwiLCB2YWx1ZTogMjUsIGNsYXNzZXM6ICdwb3Rpb24nfVxuICByZXJvbGw6IHt0eXBlOiAncmVyb2xsJywgdGV4dDogXCJSZS1Sb2xsXCIsIGNsYXNzZXM6ICdyZXJvbGwnLCBub3RlczogXCJSZXNldHMgeW91ciB0YXNrIHZhbHVlcyBiYWNrIHRvIDAgKHllbGxvdykuIFVzZWZ1bCB3aGVuIGV2ZXJ5dGhpbmcncyByZWQgYW5kIGl0J3MgaGFyZCB0byBzdGF5IGFsaXZlLlwiLCB2YWx1ZTowIH1cblxuICBwZXRzOiBbXG4gICAge3RleHQ6ICdXb2xmJywgbmFtZTogJ1dvbGYnLCB2YWx1ZTogM31cbiAgICB7dGV4dDogJ1RpZ2VyIEN1YicsIG5hbWU6ICdUaWdlckN1YicsIHZhbHVlOiAzfVxuICAgICN7dGV4dDogJ1BvbGFyIEJlYXIgQ3ViJywgbmFtZTogJ1BvbGFyQmVhckN1YicsIHZhbHVlOiAzfSAjY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXJlIGFyZSBubyBwb2xhcmJlYXIgbW9kaWZpZXJzIHlldCwgc3BlY2lhbCBkcm9wP1xuICAgIHt0ZXh0OiAnUGFuZGEgQ3ViJywgbmFtZTogJ1BhbmRhQ3ViJywgdmFsdWU6IDN9XG4gICAge3RleHQ6ICdMaW9uIEN1YicsIG5hbWU6ICdMaW9uQ3ViJywgdmFsdWU6IDN9XG4gICAge3RleHQ6ICdGb3gnLCBuYW1lOiAnRm94JywgdmFsdWU6IDN9XG4gICAge3RleHQ6ICdGbHlpbmcgUGlnJywgbmFtZTogJ0ZseWluZ1BpZycsIHZhbHVlOiAzfVxuICAgIHt0ZXh0OiAnRHJhZ29uJywgbmFtZTogJ0RyYWdvbicsIHZhbHVlOiAzfVxuICAgIHt0ZXh0OiAnQ2FjdHVzJywgbmFtZTogJ0NhY3R1cycsIHZhbHVlOiAzfVxuICAgIHt0ZXh0OiAnQmVhciBDdWInLCBuYW1lOiAnQmVhckN1YicsIHZhbHVlOiAzfVxuICBdXG5cbiAgaGF0Y2hpbmdQb3Rpb25zOiBbXG4gICAge3RleHQ6ICdCYXNlJywgbmFtZTogJ0Jhc2UnLCBub3RlczogXCJIYXRjaGVzIHlvdXIgcGV0IGluIGl0J3MgYmFzZSBmb3JtLlwiLCB2YWx1ZTogMX1cbiAgICB7dGV4dDogJ1doaXRlJywgbmFtZTogJ1doaXRlJywgbm90ZXM6ICdUdXJucyB5b3VyIGFuaW1hbCBpbnRvIGEgV2hpdGUgcGV0LicsIHZhbHVlOiAyfVxuICAgIHt0ZXh0OiAnRGVzZXJ0JywgbmFtZTogJ0Rlc2VydCcsIG5vdGVzOiAnVHVybnMgeW91ciBhbmltYWwgaW50byBhIERlc2VydCBwZXQuJywgdmFsdWU6IDJ9XG4gICAge3RleHQ6ICdSZWQnLCBuYW1lOiAnUmVkJywgbm90ZXM6ICdUdXJucyB5b3VyIGFuaW1hbCBpbnRvIGEgUmVkIHBldC4nLCB2YWx1ZTogM31cbiAgICB7dGV4dDogJ1NoYWRlJywgbmFtZTogJ1NoYWRlJywgbm90ZXM6ICdUdXJucyB5b3VyIGFuaW1hbCBpbnRvIGEgU2hhZGUgcGV0LicsIHZhbHVlOiAzfVxuICAgIHt0ZXh0OiAnU2tlbGV0b24nLCBuYW1lOiAnU2tlbGV0b24nLCBub3RlczogJ1R1cm5zIHlvdXIgYW5pbWFsIGludG8gYSBTa2VsZXRvbi4nLCB2YWx1ZTogM31cbiAgICB7dGV4dDogJ1pvbWJpZScsIG5hbWU6ICdab21iaWUnLCBub3RlczogJ1R1cm5zIHlvdXIgYW5pbWFsIGludG8gYSBab21iaWUuJywgdmFsdWU6IDR9XG4gICAge3RleHQ6ICdDb3R0b24gQ2FuZHkgUGluaycsIG5hbWU6ICdDb3R0b25DYW5keVBpbmsnLCBub3RlczogJ1R1cm5zIHlvdXIgYW5pbWFsIGludG8gYSBDb3R0b24gQ2FuZHkgUGluayBwZXQuJywgdmFsdWU6IDR9XG4gICAge3RleHQ6ICdDb3R0b24gQ2FuZHkgQmx1ZScsIG5hbWU6ICdDb3R0b25DYW5keUJsdWUnLCBub3RlczogJ1R1cm5zIHlvdXIgYW5pbWFsIGludG8gYSBDb3R0b24gQ2FuZHkgQmx1ZSBwZXQuJywgdmFsdWU6IDR9XG4gICAge3RleHQ6ICdHb2xkZW4nLCBuYW1lOiAnR29sZGVuJywgbm90ZXM6ICdUdXJucyB5b3VyIGFuaW1hbCBpbnRvIGEgR29sZGVuIHBldC4nLCB2YWx1ZTogNX1cbiAgXVxuXG4jIGFkZCBcInR5cGVcIiB0byBlYWNoIGl0ZW0sIHNvIHdlIGNhbiByZWZlcmVuY2UgdGhhdCBhcyBcIndlYXBvblwiIG9yIFwiYXJtb3JcIiBpbiB0aGUgaHRtbFxuXy5lYWNoIFsnd2VhcG9uJywgJ2FybW9yJywgJ2hlYWQnLCAnc2hpZWxkJ10sIChrZXkpIC0+XG4gIF8uZWFjaCBpdGVtc1trZXldLCAoaXRlbSkgLT4gaXRlbS50eXBlID0ga2V5XG5cbl8uZWFjaCBpdGVtcy5wZXRzLCAocGV0KSAtPiBwZXQubm90ZXMgPSAnRmluZCBhIGhhdGNoaW5nIHBvdGlvbiB0byBwb3VyIG9uIHRoaXMgZWdnLCBhbmQgaXQgd2lsbCBoYXRjaCBpbnRvIGEgbG95YWwgcGV0Lidcbl8uZWFjaCBpdGVtcy5oYXRjaGluZ1BvdGlvbnMsIChoYXRjaGluZ1BvdGlvbikgLT4gaGF0Y2hpbmdQb3Rpb24ubm90ZXMgPSBcIlBvdXIgdGhpcyBvbiBhbiBlZ2csIGFuZCBpdCB3aWxsIGhhdGNoIGFzIGEgI3toYXRjaGluZ1BvdGlvbi50ZXh0fSBwZXQuXCJcblxubW9kdWxlLmV4cG9ydHMuYnV5SXRlbSA9ICh1c2VyLCB0eXBlLCBvcHRpb25zPXt9KSAtPlxuICBfLmRlZmF1bHRzIG9wdGlvbnMsIHtwYXRoczoge319XG5cbiAgbmV4dEl0ZW0gPVxuICAgICAgaWYgdHlwZSBpcyAncG90aW9uJyB0aGVuIGl0ZW1zLnBvdGlvblxuICAgICAgZWxzZSBtb2R1bGUuZXhwb3J0cy5nZXRJdGVtIHR5cGUsICgofn51c2VyLml0ZW1zW3R5cGVdIG9yIDApICsgMSlcblxuICByZXR1cm4gZmFsc2UgaWYgK3VzZXIuc3RhdHMuZ3AgPCArbmV4dEl0ZW0udmFsdWVcbiAgaWYgbmV4dEl0ZW0udHlwZSBpcyAncG90aW9uJ1xuICAgIHVzZXIuc3RhdHMuaHAgKz0gMTU7XG4gICAgdXNlci5zdGF0cy5ocCA9IDUwIGlmIHVzZXIuc3RhdHMuaHAgPiA1MFxuICAgIG9wdGlvbnMucGF0aHNbJ3N0YXRzLmhwJ10gPSB0cnVlXG4gIGVsc2VcbiAgICB1c2VyLml0ZW1zW3R5cGVdID0gfn5uZXh0SXRlbS5pbmRleFxuICAgIG9wdGlvbnMucGF0aHNbXCJpdGVtcy4je3R5cGV9XCJdID0gdHJ1ZVxuICB1c2VyLnN0YXRzLmdwIC09ICtuZXh0SXRlbS52YWx1ZVxuICBvcHRpb25zLnBhdGhzWydzdGF0cy5ncCddID0gdHJ1ZVxuICB0cnVlXG5cbiMjI1xuICB1cGRhdGUgc3RvcmVcbiMjI1xubW9kdWxlLmV4cG9ydHMudXBkYXRlU3RvcmUgPSAodXNlcikgLT5cbiAgY2hhbmdlcyA9IHt9XG4gIF8uZWFjaCBbJ3dlYXBvbicsICdhcm1vcicsICdzaGllbGQnLCAnaGVhZCddLCAodHlwZSkgLT5cbiAgICBpID0gfn4odXNlci5pdGVtcz9bdHlwZV0gb3IgMCkgKyAxXG4gICAgc2hvd05leHQgPSB0cnVlXG4gICAgaWYgaSBpcyBpdGVtc1t0eXBlXS5sZW5ndGggLSAxXG4gICAgICBpZiAodHlwZSBpbiBbJ2FybW9yJywgJ3NoaWVsZCcsICdoZWFkJ10pXG4gICAgICAgIHNob3dOZXh0ID0gdXNlci5iYWNrZXI/LnRpZXIgYW5kIHVzZXIuYmFja2VyLnRpZXIgPj0gNDUgIyBiYWNrZXIgYXJtb3JcbiAgICAgIGVsc2VcbiAgICAgICAgc2hvd05leHQgPSB1c2VyLmJhY2tlcj8udGllciBhbmQgdXNlci5iYWNrZXIudGllciA+PSA3MCAjIGJhY2tlciB3ZWFwb25cbiAgICBlbHNlIGlmIGkgaXMgaXRlbXNbdHlwZV0ubGVuZ3RoXG4gICAgICBzaG93TmV4dCA9IGZhbHNlXG4gICAgY2hhbmdlc1t0eXBlXSA9IGlmIHNob3dOZXh0IHRoZW4gaXRlbXNbdHlwZV1baV0gZWxzZSB7aGlkZTp0cnVlfVxuICBjaGFuZ2VzLnBvdGlvbiA9IGl0ZW1zLnBvdGlvblxuICBjaGFuZ2VzLnJlcm9sbCA9ICBpdGVtcy5yZXJvbGxcbiAgY2hhbmdlc1xuXG4jIyNcbiAgR2V0cyBhbiBpdG1lLCBhbmQgY2FwcyBtYXggdG8gdGhlIGxhc3QgaXRlbSBpbiBpdHMgYXJyYXlcbiMjI1xubW9kdWxlLmV4cG9ydHMuZ2V0SXRlbSA9ICh0eXBlLCBpbmRleD0wKSAtPlxuICBpID0gaWYgKH5+aW5kZXggPiBpdGVtc1t0eXBlXS5sZW5ndGggLSAxKSB0aGVuIGl0ZW1zW3R5cGVdLmxlbmd0aCAtIDEgZWxzZSB+fmluZGV4XG4gIGl0ZW1zW3R5cGVdW2ldXG4iXX0= ; \ No newline at end of file diff --git a/dist/spritesheets.css b/dist/spritesheets.css index 6e76d99876..3b4aa396bd 100644 --- a/dist/spritesheets.css +++ b/dist/spritesheets.css @@ -1,463 +1 @@ -.Mount_Head_Lion, .Mount_Body_Lion, .Mount_Head_PolarBear, .Mount_Body_PolarBear, .Mount_Head_Panda, .Mount_Body_Panda, .Mount_Head_Tiger, .Mount_Body_Tiger, .Mount_Head_Bear, .Mount_Body_Bear, .Mount_Head_EtherealLion, .Mount_Body_EtherealLion {background: url('img/sprites/Mount-SpriteSheet.png') no-repeat; } -.Mount_Head_Lion {background-position: 0 0; width: 105px; height: 123px} -.Mount_Body_Lion {background-position: -105 0; width: 105px; height: 123px} -.Mount_Head_PolarBear {background-position: -210 0; width: 105px; height: 123px} -.Mount_Body_PolarBear {background-position: -315 0; width: 105px; height: 123px} -.Mount_Head_Panda {background-position: -420 0; width: 105px; height: 123px} -.Mount_Body_Panda {background-position: -525 0; width: 105px; height: 123px} -.Mount_Head_Tiger {background-position: -630 0; width: 105px; height: 123px} -.Mount_Body_Tiger {background-position: -735 0; width: 105px; height: 123px} -.Mount_Head_Bear {background-position: -840 0; width: 105px; height: 123px} -.Mount_Body_Bear {background-position: -945 0; width: 105px; height: 123px} -.Mount_Head_EtherealLion {background-position: -1050 0; width: 105px; height: 123px} -.Mount_Body_EtherealLion {background-position: -1155 0; width: 105px; height: 123px} -.Pet_Egg_Wolf, .Pet_Egg_TigerCub, .Pet_Egg_PolarBear, .Pet_Egg_PandaCub, .Pet_Egg_LionCub, .Pet_Egg_Fox, .Pet_Egg_FlyingPig, .Pet_Egg_Dragon, .Pet_Egg_Cactus, .Pet_Egg_BearCub, .Pet_HatchingPotion_Base, .Pet_HatchingPotion_White, .Pet_HatchingPotion_Desert, .Pet_HatchingPotion_Red, .Pet_HatchingPotion_Shade, .Pet_HatchingPotion_Skeleton, .Pet_HatchingPotion_Zombie, .Pet_HatchingPotion_CottonCandyPink, .Pet_HatchingPotion_CottonCandyBlue, .Pet_HatchingPotion_Golden, .Pet_Currency_Gem, .Pet_Currency_Gem2x, .Pet_Currency_Gem1x {background: url('img/sprites/Egg_Sprite_Sheet.png') no-repeat} -.Pet_Egg_Wolf {background-position: 0px 0px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_TigerCub {background-position: 0px -51px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_PolarBear {background-position: 0px -102px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_PandaCub {background-position: 0px -153px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_LionCub {background-position: 0px -204px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_Fox {background-position: 0px -255px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_FlyingPig {background-position: 0px -306px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_Dragon {background-position: 0px -357px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_Cactus {background-position: 0px -408px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_BearCub {background-position: 0px -459px; width: 48px; height: 53px; margin-left: 1.25em;} - -.Pet_HatchingPotion_Base {background-position: -48px -0px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_White {background-position: -48px -51px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Desert {background-position: -48px -102px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Red {background-position: -48px -153px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Shade {background-position: -48px -204px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Skeleton {background-position: -48px -255px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Zombie {background-position: -48px -306px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_CottonCandyPink {background-position: -48px -357px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_CottonCandyBlue {background-position: -48px -408px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Golden {background-position: -48px -459px; width: 48px; height: 53px; margin-left: 1.25em;} - -.Pet_Currency_Gem {background-position: 0px -510px; width: 51px; height: 45px} /* Not an egg or potion so has a different size */ -.Pet_Currency_Gem2x {background-position: -55px -513px; width: 34px; height: 30px} -.Pet_Currency_Gem1x {background-position: -63px -542px; width: 19px; height: 17px} -.achievements-container { - margin: 20px; -} - -.achievement { - background: url('img/sprites/achievements.png') no-repeat; - width: 24px; - height: 26px; - float:left; - clear:right; - margin-right: 10px; -} - -.achievement-sword {background-position:0px 0px} -.achievement-tree {background-position:-24px 0px} -.achievement-rat {background-position:-48px 0px} -.achievement-comment {background-position:-72px 0px} -.achievement-armor {background-position:-96px 0px} -.achievement-cave {background-position:-120px 0px} -.achievement-sun {background-position:-144px 0px} -.achievement-boot {background-position:-168px 0px} -.achievement-coffin {background-position:-192px 0px} -.achievement-alien {background-position:-216px 0px} -.achievement-ninja {background-position:-240px 0px} -.achievement-cactus {background-position:-264px 0px} -.achievement-bow {background-position:-288px 0px} -.achievement-heart {background-position:-312px 0px} -.achievement-shield {background-position:-336px 0px} -.achievement-thermometer {background-position:-360px 0px} -.achievement-helm {background-position:-384px 0px} -.achievement-firefox {background-position:0px -26px} -.achievement-cake {background-position:-24px -26px} -.achievement-karaoke {background-position:-48px -26px} -.weapon_7, .armor_6, .head_6, .shield_6 { - /*background: url('img/sprites/backer-only/BackerOnly-SpriteSheet.png') no-repeat*/ - width: 105px; - height: 105px; - - /*FIXME - not he best way of handling the alignment issues*/ - margin-left: -3px; - margin-top: -18px; -} - -.head_6 { - background: url('img/sprites/backer-only/BackerOnly-Equip-ShadeHelmet.gif') no-repeat; -} - -.armor_6 { - background: url('img/sprites/backer-only/BackerOnly-Equip-ShadeArmor.gif') no-repeat; -} - -.shield_6 { - background: url('img/sprites/backer-only/BackerOnly-Shield-TormentedSkull.gif') no-repeat; -} - -.weapon_7 { - background: url('img/sprites/backer-only/BackerOnly-Weapon-DarkSoulsBlade.gif') no-repeat; -} - -.Pet-Wolf-Cerberus { - width: 105px; - height: 72px; - background: url('img/sprites/backer-only/BackerOnly-Pet-CerberusPup.gif') no-repeat; -} - -.shop_shield_6 {background-position: -1040px 0} -.shop_weapon_7 {background-position: -1080px 0} -.shop_armor_6 {background-position: -1160px 0} -.shop_head_6 {background-position: -1120px 0} - -.f_weapon_6, -.f_weapon_5, -.f_weapon_4, -.f_weapon_3, -.f_weapon_2, -.f_weapon_1, -.f_weapon_0, -.f_shield_5, -.f_shield_4, -.f_shield_3, -.f_shield_2, -.f_shield_1, -.f_head_5_v2, -.f_head_5_v1, -.f_head_4_v2, -.f_head_4_v1, -.f_head_3_v2, -.f_head_3_v1, -.f_head_2_v2, -.f_head_2_v1, -.f_head_1, -.f_head_0, -.f_hair_white, -.f_hair_brown, -.f_hair_black, -.f_hair_blond, -.f_armor_5, -.f_armor_4, -.f_armor_3, -.f_armor_2, -.f_armor_1, -.f_armor_0_v2, -.f_armor_0_v1, -.f_skin_dead, -.f_skin_orc, -.f_skin_asian, -.f_skin_black, -.f_skin_white { - background: url('img/sprites/female_sprites.png') no-repeat; -} - -.f_weapon_6 {background-position: 0 0; width: 90px; height: 90px} -.f_weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -.f_weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -.f_weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -.f_weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -.f_weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -.f_weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -.f_shield_5 {background-position: -630px 0; width: 90px; height: 90px} -.f_shield_4 {background-position: -720px 0; width: 90px; height: 90px} -.f_shield_3 {background-position: -810px 0; width: 90px; height: 90px} -.f_shield_2 {background-position: -900px 0; width: 90px; height: 90px} -.f_shield_1 {background-position: -990px 0; width: 90px; height: 90px} -.f_head_5_v2 {background-position: -1080px 0; width: 90px; height: 90px} -.f_head_5_v1 {background-position: -1170px 0; width: 90px; height: 90px} -.f_head_4_v2 {background-position: -1260px 0; width: 90px; height: 90px} -.f_head_4_v1 {background-position: -1350px 0; width: 90px; height: 90px} -.f_head_3_v2 {background-position: -1440px 0; width: 90px; height: 90px} -.f_head_3_v1 {background-position: -1530px 0; width: 90px; height: 90px} -.f_head_2_v2 {background-position: -1620px 0; width: 90px; height: 90px} -.f_head_2_v1 {background-position: -1710px 0; width: 90px; height: 90px} -.f_head_1 {background-position: -1800px 0; width: 90px; height: 90px} -.f_head_0 {background-position: -1890px 0; width: 90px; height: 90px} -.f_hair_white {background-position: -1980px 0; width: 90px; height: 90px} -.f_hair_brown {background-position: -2070px 0; width: 90px; height: 90px} -.f_hair_black {background-position: -2160px 0; width: 90px; height: 90px} -.f_hair_blond {background-position: -2250px 0; width: 90px; height: 90px} -.f_armor_5 {background-position: -2340px 0; width: 90px; height: 90px} -.f_armor_4 {background-position: -2430px 0; width: 90px; height: 90px} -.f_armor_3 {background-position: -2520px 0; width: 90px; height: 90px} -.f_armor_2 {background-position: -2610px 0; width: 90px; height: 90px} -.f_armor_1 {background-position: -2700px 0; width: 90px; height: 90px} -.f_armor_0_v2 {background-position: -2790px 0; width: 90px; height: 90px} -.f_armor_0_v1 {background-position: -2880px 0; width: 90px; height: 90px} -.f_skin_dead {background-position: -2970px 0; width: 90px; height: 90px} -.f_skin_orc {background-position: -3060px 0; width: 90px; height: 90px} -.f_skin_asian {background-position: -3150px 0; width: 90px; height: 90px} -.f_skin_black {background-position: -3240px 0; width: 90px; height: 90px} -.f_skin_white {background-position: -3330px 0; width: 90px; height: 90px}.m_weapon_6, -.m_weapon_5, -.m_weapon_4, -.m_weapon_3, -.m_weapon_2, -.m_weapon_1, -.m_weapon_0, -.m_shield_5, -.m_shield_4, -.m_shield_3, -.m_shield_2, -.m_shield_1, -.m_head_5, -.m_head_4, -.m_head_3, -.m_head_2, -.m_head_1, -.m_head_0, -.m_hair_blond, -.m_hair_black, -.m_hair_brown, -.m_hair_white, -.m_armor_5, -.m_armor_4, -.m_armor_3, -.m_armor_2, -.m_armor_1, -.m_armor_0, -.m_skin_dead, -.m_skin_orc, -.m_skin_asian, -.m_skin_black, -.m_skin_white { - background: url('img/sprites/male_sprites.png') no-repeat; -} - -.m_weapon_6 {background-position: 0 0; width: 90px; height: 90px} -.m_weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -.m_weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -.m_weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -.m_weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -.m_weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -.m_weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -.m_shield_5 {background-position: -630px 0; width: 90px; height: 90px} -.m_shield_4 {background-position: -720px 0; width: 90px; height: 90px} -.m_shield_3 {background-position: -810px 0; width: 90px; height: 90px} -.m_shield_2 {background-position: -900px 0; width: 90px; height: 90px} -.m_shield_1 {background-position: -990px 0; width: 90px; height: 90px} -.m_head_5 {background-position: -1080px 0; width: 90px; height: 90px} -.m_head_4 {background-position: -1170px 0; width: 90px; height: 90px} -.m_head_3 {background-position: -1260px 0; width: 90px; height: 90px} -.m_head_2 {background-position: -1350px 0; width: 90px; height: 90px} -.m_head_1 {background-position: -1440px 0; width: 90px; height: 90px} -.m_head_0 {background-position: -1530px 0; width: 90px; height: 90px} -.m_hair_blond {background-position: -1620px 0; width: 90px; height: 90px} -.m_hair_black {background-position: -1710px 0; width: 90px; height: 90px} -.m_hair_brown {background-position: -1800px 0; width: 90px; height: 90px} -.m_hair_white {background-position: -1890px 0; width: 90px; height: 90px} -.m_armor_5 {background-position: -1980px 0; width: 90px; height: 90px} -.m_armor_4 {background-position: -2070px 0; width: 90px; height: 90px} -.m_armor_3 {background-position: -2160px 0; width: 90px; height: 90px} -.m_armor_2 {background-position: -2250px 0; width: 90px; height: 90px} -.m_armor_1 {background-position: -2340px 0; width: 90px; height: 90px} -.m_armor_0 {background-position: -2430px 0; width: 90px; height: 90px} -.m_skin_dead {background-position: -2520px 0; width: 90px; height: 90px} -.m_skin_orc {background-position: -2610px 0; width: 90px; height: 90px} -.m_skin_asian {background-position: -2700px 0; width: 90px; height: 90px} -.m_skin_black {background-position: -2790px 0; width: 90px; height: 90px} -.m_skin_white {background-position: -2880px 0; width: 90px; height: 90px}.Pet-Wolf-Zombie, .Pet-Wolf-White, .Pet-Wolf-Veteran, .Pet-Wolf-Skeleton, .Pet-Wolf-Shade, .Pet-Wolf-Red, .Pet-Wolf-Golden, .Pet-Wolf-Desert, .Pet-Wolf-CottonCandyPink, .Pet-Wolf-CottonCandyBlue, .Pet-TigerCub-Zombie, .Pet-TigerCub-White, .Pet-TigerCub-Skeleton, .Pet-TigerCub-Shade, .Pet-TigerCub-Red, .Pet-TigerCub-Golden, .Pet-TigerCub-Desert, .Pet-TigerCub-CottonCandyPink, .Pet-TigerCub-CottonCandyBlue, .Pet-TigerCub-Base, .Pet-PolarBearCub-Base, .Pet-PandaCub-Zombie, .Pet-PandaCub-White, .Pet-PandaCub-Skeleton, .Pet-PandaCub-Shade, .Pet-PandaCub-Red, .Pet-PandaCub-Golden, .Pet-PandaCub-Desert, .Pet-PandaCub-CottonCandyPink, .Pet-PandaCub-CottonCandyBlue, .Pet-PandaCub-Base, .Pet-LionCub-Zombie, .Pet-LionCub-White, .Pet-LionCub-Skeleton, .Pet-LionCub-Shade, .Pet-LionCub-Red, .Pet-LionCub-Golden, .Pet-LionCub-Desert, .Pet-LionCub-CottonCandyPink, .Pet-LionCub-CottonCandyBlue, .Pet-LionCub-Base, .Pet-Fox-Zombie, .Pet-Fox-White, .Pet-Fox-Skeleton, .Pet-Fox-Shade, .Pet-Fox-Red, .Pet-Fox-Golden, .Pet-Fox-Desert, .Pet-Fox-CottonCandyPink, .Pet-Fox-CottonCandyBlue, .Pet-Fox-Base, .Pet-FlyingPig-Zombie, .Pet-FlyingPig-White, .Pet-FlyingPig-Skeleton, .Pet-FlyingPig-Shade, .Pet-FlyingPig-Red, .Pet-FlyingPig-Golden, .Pet-FlyingPig-Desert, .Pet-FlyingPig-CottonCandyPink, .Pet-FlyingPig-CottonCandyBlue, .Pet-FlyingPig-Base, .Pet-Dragon-Zombie, .Pet-Dragon-White, .Pet-Dragon-Skeleton, .Pet-Dragon-Shade, .Pet-Dragon-Red, .Pet-Dragon-Golden, .Pet-Dragon-Desert, .Pet-Dragon-CottonCandyPink, .Pet-Dragon-CottonCandyBlue, .Pet-Dragon-Base, .Pet-Cactus-Skeleton, .Pet-Cactus-Red, .Pet-Cactus-Zombie, .Pet-Cactus-Shade, .Pet-Cactus-Golden, .Pet-Cactus-White, .Pet-Cactus-CottonCandyPink, .Pet-Cactus-CottonCandyBlue, .Pet-Cactus-Desert, .Pet-Cactus-Base, .Pet-BearCub-Zombie, .Pet-BearCub-White, .Pet-BearCub-Skeleton, .Pet-BearCub-Shade, .Pet-BearCub-Red, .Pet-BearCub-Golden, .Pet-BearCub-Desert, .Pet-BearCub-CottonCandyPink, .Pet-BearCub-CottonCandyBlue, .Pet-BearCub-Base, .Pet-Wolf-Base {background: url('img/sprites/pet_sprites.png') no-repeat} - -.Pet-Wolf-Zombie {background-position: 0 0; width: 81px; height: 99px} -.Pet-Wolf-White {background-position: -81px 0; width: 81px; height: 99px} -.Pet-Wolf-Veteran {background-position: -162px 0; width: 81px; height: 99px} -.Pet-Wolf-Skeleton {background-position: -243px 0; width: 81px; height: 99px} -.Pet-Wolf-Shade {background-position: -324px 0; width: 81px; height: 99px} -.Pet-Wolf-Red {background-position: -405px 0; width: 81px; height: 99px} -.Pet-Wolf-Golden {background-position: -486px 0; width: 81px; height: 99px} -.Pet-Wolf-Desert {background-position: -567px 0; width: 81px; height: 99px} -.Pet-Wolf-CottonCandyPink {background-position: -648px 0; width: 81px; height: 99px} -.Pet-Wolf-CottonCandyBlue {background-position: -729px 0; width: 81px; height: 99px} -.Pet-TigerCub-Zombie {background-position: -810px 0; width: 81px; height: 99px} -.Pet-TigerCub-White {background-position: -891px 0; width: 81px; height: 99px} -.Pet-TigerCub-Skeleton {background-position: -972px 0; width: 81px; height: 99px} -.Pet-TigerCub-Shade {background-position: -1053px 0; width: 81px; height: 99px} -.Pet-TigerCub-Red {background-position: -1134px 0; width: 81px; height: 99px} -.Pet-TigerCub-Golden {background-position: -1215px 0; width: 81px; height: 99px} -.Pet-TigerCub-Desert {background-position: -1296px 0; width: 81px; height: 99px} -.Pet-TigerCub-CottonCandyPink {background-position: -1377px 0; width: 81px; height: 99px} -.Pet-TigerCub-CottonCandyBlue {background-position: -1458px 0; width: 81px; height: 99px} -.Pet-TigerCub-Base {background-position: -1539px 0; width: 81px; height: 99px} -.Pet-PolarBearCub-Base {background-position: -1620px 0; width: 81px; height: 99px} -.Pet-PandaCub-Zombie {background-position: -1701px 0; width: 81px; height: 99px} -.Pet-PandaCub-White {background-position: -1782px 0; width: 81px; height: 99px} -.Pet-PandaCub-Skeleton {background-position: -1863px 0; width: 81px; height: 99px} -.Pet-PandaCub-Shade {background-position: -1944px 0; width: 81px; height: 99px} -.Pet-PandaCub-Red {background-position: -2025px 0; width: 81px; height: 99px} -.Pet-PandaCub-Golden {background-position: -2106px 0; width: 81px; height: 99px} -.Pet-PandaCub-Desert {background-position: -2187px 0; width: 81px; height: 99px} -.Pet-PandaCub-CottonCandyPink {background-position: -2268px 0; width: 81px; height: 99px} -.Pet-PandaCub-CottonCandyBlue {background-position: -2349px 0; width: 81px; height: 99px} -.Pet-PandaCub-Base {background-position: -2430px 0; width: 81px; height: 99px} -.Pet-LionCub-Zombie {background-position: -2511px 0; width: 81px; height: 99px} -.Pet-LionCub-White {background-position: -2592px 0; width: 81px; height: 99px} -.Pet-LionCub-Skeleton {background-position: -2673px 0; width: 81px; height: 99px} -.Pet-LionCub-Shade {background-position: -2754px 0; width: 81px; height: 99px} -.Pet-LionCub-Red {background-position: -2835px 0; width: 81px; height: 99px} -.Pet-LionCub-Golden {background-position: -2916px 0; width: 81px; height: 99px} -.Pet-LionCub-Desert {background-position: -2997px 0; width: 81px; height: 99px} -.Pet-LionCub-CottonCandyPink {background-position: -3078px 0; width: 81px; height: 99px} -.Pet-LionCub-CottonCandyBlue {background-position: -3159px 0; width: 81px; height: 99px} -.Pet-LionCub-Base {background-position: -3240px 0; width: 81px; height: 99px} -.Pet-Fox-Zombie {background-position: -3321px 0; width: 81px; height: 99px} -.Pet-Fox-White {background-position: -3402px 0; width: 81px; height: 99px} -.Pet-Fox-Skeleton {background-position: -3483px 0; width: 81px; height: 99px} -.Pet-Fox-Shade {background-position: -3564px 0; width: 81px; height: 99px} -.Pet-Fox-Red {background-position: -3645px 0; width: 81px; height: 99px} -.Pet-Fox-Golden {background-position: -3726px 0; width: 81px; height: 99px} -.Pet-Fox-Desert {background-position: -3807px 0; width: 81px; height: 99px} -.Pet-Fox-CottonCandyPink {background-position: -3888px 0; width: 81px; height: 99px} -.Pet-Fox-CottonCandyBlue {background-position: -3969px 0; width: 81px; height: 99px} -.Pet-Fox-Base {background-position: -4050px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Zombie {background-position: -4131px 0; width: 81px; height: 99px} -.Pet-FlyingPig-White {background-position: -4212px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Skeleton {background-position: -4293px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Shade {background-position: -4374px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Red {background-position: -4455px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Golden {background-position: -4536px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Desert {background-position: -4617px 0; width: 81px; height: 99px} -.Pet-FlyingPig-CottonCandyPink {background-position: -4698px 0; width: 81px; height: 99px} -.Pet-FlyingPig-CottonCandyBlue {background-position: -4779px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Base {background-position: -4860px 0; width: 81px; height: 99px} -.Pet-Dragon-Zombie {background-position: -4941px 0; width: 81px; height: 99px} -.Pet-Dragon-White {background-position: -5022px 0; width: 81px; height: 99px} -.Pet-Dragon-Skeleton {background-position: -5103px 0; width: 81px; height: 99px} -.Pet-Dragon-Shade {background-position: -5184px 0; width: 81px; height: 99px} -.Pet-Dragon-Red {background-position: -5265px 0; width: 81px; height: 99px} -.Pet-Dragon-Golden {background-position: -5346px 0; width: 81px; height: 99px} -.Pet-Dragon-Desert {background-position: -5427px 0; width: 81px; height: 99px} -.Pet-Dragon-CottonCandyPink {background-position: -5508px 0; width: 81px; height: 99px} -.Pet-Dragon-CottonCandyBlue {background-position: -5589px 0; width: 81px; height: 99px} -.Pet-Dragon-Base {background-position: -5670px 0; width: 81px; height: 99px} -.Pet-Cactus-Zombie {background-position: -5913px 0; width: 81px; height: 99px} -.Pet-Cactus-White {background-position: -6156px 0; width: 81px; height: 99px} -.Pet-Cactus-Skeleton {background-position: -5751px 0; width: 81px; height: 99px} -.Pet-Cactus-Red {background-position: -5832px 0; width: 81px; height: 99px} -.Pet-Cactus-Shade {background-position: -5994px 0; width: 81px; height: 99px} -.Pet-Cactus-Golden {background-position: -6075px 0; width: 81px; height: 99px} -.Pet-Cactus-Desert {background-position: -6399px 0; width: 81px; height: 99px} -.Pet-Cactus-CottonCandyPink {background-position: -6237px 0; width: 81px; height: 99px} -.Pet-Cactus-CottonCandyBlue {background-position: -6318px 0; width: 81px; height: 99px} -.Pet-Cactus-Base {background-position: -6480px 0; width: 81px; height: 99px} -.Pet-BearCub-Zombie {background-position: -6561px 0; width: 81px; height: 99px} -.Pet-BearCub-White {background-position: -6642px 0; width: 81px; height: 99px} -.Pet-BearCub-Skeleton {background-position: -6723px 0; width: 81px; height: 99px} -.Pet-BearCub-Shade {background-position: -6804px 0; width: 81px; height: 99px} -.Pet-BearCub-Red {background-position: -6885px 0; width: 81px; height: 99px} -.Pet-BearCub-Golden {background-position: -6966px 0; width: 81px; height: 99px} -.Pet-BearCub-Desert {background-position: -7047px 0; width: 81px; height: 99px} -.Pet-BearCub-CottonCandyPink {background-position: -7128px 0; width: 81px; height: 99px} -.Pet-BearCub-CottonCandyBlue {background-position: -7209px 0; width: 81px; height: 99px} -.Pet-BearCub-Base {background-position: -7290px 0; width: 81px; height: 99px} -.Pet-Wolf-Base {background-position: -7371px 0; width: 81px; height: 99px} -.Pet-Egg {background: url('img/sprites/egg.png') no-repeat; width: 39px; height: 42px;} -.Gems{background: url('img/sprites/Egg_Sprite_Sheet.png'); background-position: -57px 50px; display:inline-block; margin-right:5px;border-style:none; width: 30px; height: 30px} -.weapon_6, .weapon_5, .weapon_4, .weapon_3, .weapon_2, .weapon_1, .weapon_0, .skin_white, .skin_pale, .skin_orc, .skin_dead, .skin_black, .skin_asian, .shield_5_v1, .shield_5_v0, .shield_4_v0, .shield_3_v1, .shield_3_v0, .shield_2_v1, .shield_2_v0, .shield_1_v1, .shield_1_v0, _shield_4_v1, .nh_hair_white_v1, .nh_hair_white_v0, .nh_hair_brown_v1, .nh_hair_brown_v0, .nh_hair_blond_v1, .nh_hair_blond_v0, .nh_hair_black_v1, .nh_hair_black_v0, .head_5_v2, .head_5_v1, .head_5_v0, .head_4_v2, .head_4_v1, .head_4_v0, .head_3_v2, .head_3_v1, .head_3_v0, .head_2_v2, .head_2_v1, .head_2_v0, .head_1_v1, .head_1_v0, .head_0_v1, .head_0_v0, .hair_white_v1, .hair_white_v0, .hair_brown_v1, .hair_brown_v0, .hair_blond_v1, .hair_blond_v0, .hair_black_v1, .hair_black_v0, .armor_5_v1, .armor_5_v0, .armor_4_v1, .armor_4_v0, .armor_3_v1, .armor_3_v0, .armor_2_v0, .armor_1_v1, .armor_1_v0, .armor_0_v11, .armor_0_v10, .armor_0_v9, .armor_0_v8, .armor_0_v7, .armor_0_v6, .armor_0_v5, .armor_0_v4, .armor_0_v3, .armor_0_v2, .armor_0_v1, .armor_0_v0 {background: url('img/sprites/player_sprites.png') no-repeat} -.weapon_6 {background-position: 0 0; width: 90px; height: 90px} -.weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -.weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -.weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -.weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -.weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -.weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -.skin_white {background-position: -630px 0; width: 90px; height: 90px} -.skin_pale {background-position: -720px 0; width: 90px; height: 90px} -.skin_orc {background-position: -810px 0; width: 90px; height: 90px} -.skin_dead {background-position: -900px 0; width: 90px; height: 90px} -.skin_black {background-position: -990px 0; width: 90px; height: 90px} -.skin_asian {background-position: -1080px 0; width: 90px; height: 90px} -.shield_5_v1 {background-position: -1170px 0; width: 90px; height: 90px} -.shield_5_v0 {background-position: -1260px 0; width: 90px; height: 90px} -.shield_4_v0 {background-position: -1350px 0; width: 90px; height: 90px} -.shield_3_v1 {background-position: -1440px 0; width: 90px; height: 90px} -.shield_3_v0 {background-position: -1530px 0; width: 90px; height: 90px} -.shield_2_v1 {background-position: -1620px 0; width: 90px; height: 90px} -.shield_2_v0 {background-position: -1710px 0; width: 90px; height: 90px} -.shield_1_v1 {background-position: -1800px 0; width: 90px; height: 90px} -.shield_1_v0 {background-position: -1890px 0; width: 90px; height: 90px} -._shield_4_v1 {background-position: -1980px 0; width: 90px; height: 90px} -.nh_hair_white_v1 {background-position: -2070px 0; width: 90px; height: 90px} -.nh_hair_white_v0 {background-position: -2160px 0; width: 90px; height: 90px} -.nh_hair_brown_v1 {background-position: -2250px 0; width: 90px; height: 90px} -.nh_hair_brown_v0 {background-position: -2340px 0; width: 90px; height: 90px} -.nh_hair_blond_v1 {background-position: -2430px 0; width: 90px; height: 90px} -.nh_hair_blond_v0 {background-position: -2520px 0; width: 90px; height: 90px} -.nh_hair_black_v1 {background-position: -2610px 0; width: 90px; height: 90px} -.nh_hair_black_v0 {background-position: -2700px 0; width: 90px; height: 90px} -.head_5_v2 {background-position: -2790px 0; width: 90px; height: 90px} -.head_5_v1 {background-position: -2880px 0; width: 90px; height: 90px} -.head_5_v0 {background-position: -2970px 0; width: 90px; height: 90px} -.head_4_v2 {background-position: -3060px 0; width: 90px; height: 90px} -.head_4_v1 {background-position: -3150px 0; width: 90px; height: 90px} -.head_4_v0 {background-position: -3240px 0; width: 90px; height: 90px} -.head_3_v2 {background-position: -3330px 0; width: 90px; height: 90px} -.head_3_v1 {background-position: -3420px 0; width: 90px; height: 90px} -.head_3_v0 {background-position: -3510px 0; width: 90px; height: 90px} -.head_2_v2 {background-position: -3600px 0; width: 90px; height: 90px} -.head_2_v1 {background-position: -3690px 0; width: 90px; height: 90px} -.head_2_v0 {background-position: -3780px 0; width: 90px; height: 90px} -.head_1_v1 {background-position: -3870px 0; width: 90px; height: 90px} -.head_1_v0 {background-position: -3960px 0; width: 90px; height: 90px} -.head_0_v1 {background-position: -4050px 0; width: 90px; height: 90px} -.head_0_v0 {background-position: -4140px 0; width: 90px; height: 90px} -.hair_white_v1 {background-position: -4230px 0; width: 90px; height: 90px} -.hair_white_v0 {background-position: -4320px 0; width: 90px; height: 90px} -.hair_brown_v1 {background-position: -4410px 0; width: 90px; height: 90px} -.hair_brown_v0 {background-position: -4500px 0; width: 90px; height: 90px} -.hair_blond_v1 {background-position: -4590px 0; width: 90px; height: 90px} -.hair_blond_v0 {background-position: -4680px 0; width: 90px; height: 90px} -.hair_black_v1 {background-position: -4770px 0; width: 90px; height: 90px} -.hair_black_v0 {background-position: -4860px 0; width: 90px; height: 90px} -.armor_5_v1 {background-position: -4950px 0; width: 90px; height: 90px} -.armor_5_v0 {background-position: -5040px 0; width: 90px; height: 90px} -.armor_4_v1 {background-position: -5130px 0; width: 90px; height: 90px} -.armor_4_v0 {background-position: -5220px 0; width: 90px; height: 90px} -.armor_3_v1 {background-position: -5310px 0; width: 90px; height: 90px} -.armor_3_v0 {background-position: -5400px 0; width: 90px; height: 90px} -.armor_2_v0 {background-position: -5490px 0; width: 90px; height: 90px} -.armor_1_v1 {background-position: -5580px 0; width: 90px; height: 90px} -.armor_1_v0 {background-position: -5670px 0; width: 90px; height: 90px} -.armor_0_v11 {background-position: -5760px 0; width: 90px; height: 90px} -.armor_0_v10 {background-position: -5850px 0; width: 90px; height: 90px} -.armor_0_v9 {background-position: -5940px 0; width: 90px; height: 90px} -.armor_0_v8 {background-position: -6030px 0; width: 90px; height: 90px} -.armor_0_v7 {background-position: -6120px 0; width: 90px; height: 90px} -.armor_0_v6 {background-position: -6210px 0; width: 90px; height: 90px} -.armor_0_v5 {background-position: -6300px 0; width: 90px; height: 90px} -.armor_0_v4 {background-position: -6390px 0; width: 90px; height: 90px} -.armor_0_v3 {background-position: -6480px 0; width: 90px; height: 90px} -.armor_0_v2 {background-position: -6570px 0; width: 90px; height: 90px} -.armor_0_v1 {background-position: -6660px 0; width: 90px; height: 90px} -.armor_0_v0 {background-position: -6750px 0; width: 90px; height: 90px} -[class^="shop_"] { - background: url('img/sprites/shop_sprites.png') no-repeat; -} - -[class^="shop_weapon_"], [class^="shop_shield_"], [class^="shop_head_"], [class^="shop_armor_"] { - width: 40px; - height: 40px; -} - -.shop_weapon_6 {background-position: 0 0} -.shop_weapon_5 {background-position: -40px 0} -.shop_weapon_4 {background-position: -80px 0} -.shop_weapon_3 {background-position: -120px 0} -.shop_weapon_2 {background-position: -160px 0} -.shop_weapon_1 {background-position: -200px 0} -.shop_shield_5 {background-position: -240px 0} -.shop_shield_4 {background-position: -280px 0} -.shop_shield_3 {background-position: -320px 0} -.shop_shield_2 {background-position: -360px 0} -.shop_shield_1 {background-position: -400px 0} -.shop_head_5 {background-position: -440px 0} -.shop_head_4 {background-position: -480px 0} -.shop_head_3 {background-position: -520px 0} -.shop_head_2 {background-position: -560px 0} -.shop_head_1 {background-position: -600px 0} -.shop_armor_5 {background-position: -640px 0} -.shop_armor_4 {background-position: -680px 0} -.shop_armor_3 {background-position: -720px 0} -.shop_armor_2 {background-position: -760px 0} -.shop_armor_1 {background-position: -800px 0} -.shop_reroll {background-position: -840px 0; width: 40px; height: 40px} -.shop_potion {background-position: -880px 0; width: 40px; height: 40px} -.shop_copper {background-position: -923px -8px; width: 32px; height: 22px} -.shop_silver {background-position: -963px -8px; width: 32px; height: 22px} -.shop_gold {background-position: -1003px -8px; width: 32px; height: 22px} \ No newline at end of file +.Mount_Head_Lion,.Mount_Body_Lion,.Mount_Head_PolarBear,.Mount_Body_PolarBear,.Mount_Head_Panda,.Mount_Body_Panda,.Mount_Head_Tiger,.Mount_Body_Tiger,.Mount_Head_Bear,.Mount_Body_Bear,.Mount_Head_EtherealLion,.Mount_Body_EtherealLion{background:url(../img/sprites/Mount-SpriteSheet.png) no-repeat}.Mount_Head_Lion{background-position:0 0;width:105px;height:123px}.Mount_Body_Lion{background-position:-105 0;width:105px;height:123px}.Mount_Head_PolarBear{background-position:-210 0;width:105px;height:123px}.Mount_Body_PolarBear{background-position:-315 0;width:105px;height:123px}.Mount_Head_Panda{background-position:-420 0;width:105px;height:123px}.Mount_Body_Panda{background-position:-525 0;width:105px;height:123px}.Mount_Head_Tiger{background-position:-630 0;width:105px;height:123px}.Mount_Body_Tiger{background-position:-735 0;width:105px;height:123px}.Mount_Head_Bear{background-position:-840 0;width:105px;height:123px}.Mount_Body_Bear{background-position:-945 0;width:105px;height:123px}.Mount_Head_EtherealLion{background-position:-1050 0;width:105px;height:123px}.Mount_Body_EtherealLion{background-position:-1155 0;width:105px;height:123px}.Pet_Egg_Wolf,.Pet_Egg_TigerCub,.Pet_Egg_PolarBear,.Pet_Egg_PandaCub,.Pet_Egg_LionCub,.Pet_Egg_Fox,.Pet_Egg_FlyingPig,.Pet_Egg_Dragon,.Pet_Egg_Cactus,.Pet_Egg_BearCub,.Pet_HatchingPotion_Base,.Pet_HatchingPotion_White,.Pet_HatchingPotion_Desert,.Pet_HatchingPotion_Red,.Pet_HatchingPotion_Shade,.Pet_HatchingPotion_Skeleton,.Pet_HatchingPotion_Zombie,.Pet_HatchingPotion_CottonCandyPink,.Pet_HatchingPotion_CottonCandyBlue,.Pet_HatchingPotion_Golden,.Pet_Currency_Gem,.Pet_Currency_Gem2x,.Pet_Currency_Gem1x{background:url(../img/sprites/Egg_Sprite_Sheet.png) no-repeat}.Pet_Egg_Wolf{background-position:0 0;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_TigerCub{background-position:0 -51px;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_PolarBear{background-position:0 -102px;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_PandaCub{background-position:0 -153px;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_LionCub{background-position:0 -204px;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_Fox{background-position:0 -255px;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_FlyingPig{background-position:0 -306px;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_Dragon{background-position:0 -357px;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_Cactus{background-position:0 -408px;width:48px;height:53px;margin-left:1.25em}.Pet_Egg_BearCub{background-position:0 -459px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_Base{background-position:-48px -0px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_White{background-position:-48px -51px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_Desert{background-position:-48px -102px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_Red{background-position:-48px -153px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_Shade{background-position:-48px -204px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_Skeleton{background-position:-48px -255px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_Zombie{background-position:-48px -306px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_CottonCandyPink{background-position:-48px -357px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_CottonCandyBlue{background-position:-48px -408px;width:48px;height:53px;margin-left:1.25em}.Pet_HatchingPotion_Golden{background-position:-48px -459px;width:48px;height:53px;margin-left:1.25em}.Pet_Currency_Gem{background-position:0 -510px;width:51px;height:45px}.Pet_Currency_Gem2x{background-position:-55px -513px;width:34px;height:30px}.Pet_Currency_Gem1x{background-position:-63px -542px;width:19px;height:17px}.achievements-container{margin:20px}.achievement{background:url(../img/sprites/achievements.png) no-repeat;width:24px;height:26px;float:left;clear:right;margin-right:10px}.achievement-sword{background-position:0 0}.achievement-tree{background-position:-24px 0}.achievement-rat{background-position:-48px 0}.achievement-comment{background-position:-72px 0}.achievement-armor{background-position:-96px 0}.achievement-cave{background-position:-120px 0}.achievement-sun{background-position:-144px 0}.achievement-boot{background-position:-168px 0}.achievement-coffin{background-position:-192px 0}.achievement-alien{background-position:-216px 0}.achievement-ninja{background-position:-240px 0}.achievement-cactus{background-position:-264px 0}.achievement-bow{background-position:-288px 0}.achievement-heart{background-position:-312px 0}.achievement-shield{background-position:-336px 0}.achievement-thermometer{background-position:-360px 0}.achievement-helm{background-position:-384px 0}.achievement-firefox{background-position:0 -26px}.achievement-cake{background-position:-24px -26px}.achievement-karaoke{background-position:-48px -26px}.weapon_7,.armor_6,.head_6,.shield_6{width:105px;height:105px;margin-left:-3px;margin-top:-18px}.head_6{background:url(../img/sprites/backer-only/BackerOnly-Equip-ShadeHelmet.gif) no-repeat}.armor_6{background:url(../img/sprites/backer-only/BackerOnly-Equip-ShadeArmor.gif) no-repeat}.shield_6{background:url(../img/sprites/backer-only/BackerOnly-Shield-TormentedSkull.gif) no-repeat}.weapon_7{background:url(../img/sprites/backer-only/BackerOnly-Weapon-DarkSoulsBlade.gif) no-repeat}.Pet-Wolf-Cerberus{width:105px;height:72px;background:url(../img/sprites/backer-only/BackerOnly-Pet-CerberusPup.gif) no-repeat}.shop_shield_6{background-position:-1040px 0}.shop_weapon_7{background-position:-1080px 0}.shop_armor_6{background-position:-1160px 0}.shop_head_6{background-position:-1120px 0}.f_weapon_6,.f_weapon_5,.f_weapon_4,.f_weapon_3,.f_weapon_2,.f_weapon_1,.f_weapon_0,.f_shield_5,.f_shield_4,.f_shield_3,.f_shield_2,.f_shield_1,.f_head_5_v2,.f_head_5_v1,.f_head_4_v2,.f_head_4_v1,.f_head_3_v2,.f_head_3_v1,.f_head_2_v2,.f_head_2_v1,.f_head_1,.f_head_0,.f_hair_white,.f_hair_brown,.f_hair_black,.f_hair_blond,.f_armor_5,.f_armor_4,.f_armor_3,.f_armor_2,.f_armor_1,.f_armor_0_v2,.f_armor_0_v1,.f_skin_dead,.f_skin_orc,.f_skin_asian,.f_skin_black,.f_skin_white{background:url(../img/sprites/female_sprites.png) no-repeat}.f_weapon_6{background-position:0 0;width:90px;height:90px}.f_weapon_5{background-position:-90px 0;width:90px;height:90px}.f_weapon_4{background-position:-180px 0;width:90px;height:90px}.f_weapon_3{background-position:-270px 0;width:90px;height:90px}.f_weapon_2{background-position:-360px 0;width:90px;height:90px}.f_weapon_1{background-position:-450px 0;width:90px;height:90px}.f_weapon_0{background-position:-540px 0;width:90px;height:90px}.f_shield_5{background-position:-630px 0;width:90px;height:90px}.f_shield_4{background-position:-720px 0;width:90px;height:90px}.f_shield_3{background-position:-810px 0;width:90px;height:90px}.f_shield_2{background-position:-900px 0;width:90px;height:90px}.f_shield_1{background-position:-990px 0;width:90px;height:90px}.f_head_5_v2{background-position:-1080px 0;width:90px;height:90px}.f_head_5_v1{background-position:-1170px 0;width:90px;height:90px}.f_head_4_v2{background-position:-1260px 0;width:90px;height:90px}.f_head_4_v1{background-position:-1350px 0;width:90px;height:90px}.f_head_3_v2{background-position:-1440px 0;width:90px;height:90px}.f_head_3_v1{background-position:-1530px 0;width:90px;height:90px}.f_head_2_v2{background-position:-1620px 0;width:90px;height:90px}.f_head_2_v1{background-position:-1710px 0;width:90px;height:90px}.f_head_1{background-position:-1800px 0;width:90px;height:90px}.f_head_0{background-position:-1890px 0;width:90px;height:90px}.f_hair_white{background-position:-1980px 0;width:90px;height:90px}.f_hair_brown{background-position:-2070px 0;width:90px;height:90px}.f_hair_black{background-position:-2160px 0;width:90px;height:90px}.f_hair_blond{background-position:-2250px 0;width:90px;height:90px}.f_armor_5{background-position:-2340px 0;width:90px;height:90px}.f_armor_4{background-position:-2430px 0;width:90px;height:90px}.f_armor_3{background-position:-2520px 0;width:90px;height:90px}.f_armor_2{background-position:-2610px 0;width:90px;height:90px}.f_armor_1{background-position:-2700px 0;width:90px;height:90px}.f_armor_0_v2{background-position:-2790px 0;width:90px;height:90px}.f_armor_0_v1{background-position:-2880px 0;width:90px;height:90px}.f_skin_dead{background-position:-2970px 0;width:90px;height:90px}.f_skin_orc{background-position:-3060px 0;width:90px;height:90px}.f_skin_asian{background-position:-3150px 0;width:90px;height:90px}.f_skin_black{background-position:-3240px 0;width:90px;height:90px}.f_skin_white{background-position:-3330px 0;width:90px;height:90px}.m_weapon_6,.m_weapon_5,.m_weapon_4,.m_weapon_3,.m_weapon_2,.m_weapon_1,.m_weapon_0,.m_shield_5,.m_shield_4,.m_shield_3,.m_shield_2,.m_shield_1,.m_head_5,.m_head_4,.m_head_3,.m_head_2,.m_head_1,.m_head_0,.m_hair_blond,.m_hair_black,.m_hair_brown,.m_hair_white,.m_armor_5,.m_armor_4,.m_armor_3,.m_armor_2,.m_armor_1,.m_armor_0,.m_skin_dead,.m_skin_orc,.m_skin_asian,.m_skin_black,.m_skin_white{background:url(../img/sprites/male_sprites.png) no-repeat}.m_weapon_6{background-position:0 0;width:90px;height:90px}.m_weapon_5{background-position:-90px 0;width:90px;height:90px}.m_weapon_4{background-position:-180px 0;width:90px;height:90px}.m_weapon_3{background-position:-270px 0;width:90px;height:90px}.m_weapon_2{background-position:-360px 0;width:90px;height:90px}.m_weapon_1{background-position:-450px 0;width:90px;height:90px}.m_weapon_0{background-position:-540px 0;width:90px;height:90px}.m_shield_5{background-position:-630px 0;width:90px;height:90px}.m_shield_4{background-position:-720px 0;width:90px;height:90px}.m_shield_3{background-position:-810px 0;width:90px;height:90px}.m_shield_2{background-position:-900px 0;width:90px;height:90px}.m_shield_1{background-position:-990px 0;width:90px;height:90px}.m_head_5{background-position:-1080px 0;width:90px;height:90px}.m_head_4{background-position:-1170px 0;width:90px;height:90px}.m_head_3{background-position:-1260px 0;width:90px;height:90px}.m_head_2{background-position:-1350px 0;width:90px;height:90px}.m_head_1{background-position:-1440px 0;width:90px;height:90px}.m_head_0{background-position:-1530px 0;width:90px;height:90px}.m_hair_blond{background-position:-1620px 0;width:90px;height:90px}.m_hair_black{background-position:-1710px 0;width:90px;height:90px}.m_hair_brown{background-position:-1800px 0;width:90px;height:90px}.m_hair_white{background-position:-1890px 0;width:90px;height:90px}.m_armor_5{background-position:-1980px 0;width:90px;height:90px}.m_armor_4{background-position:-2070px 0;width:90px;height:90px}.m_armor_3{background-position:-2160px 0;width:90px;height:90px}.m_armor_2{background-position:-2250px 0;width:90px;height:90px}.m_armor_1{background-position:-2340px 0;width:90px;height:90px}.m_armor_0{background-position:-2430px 0;width:90px;height:90px}.m_skin_dead{background-position:-2520px 0;width:90px;height:90px}.m_skin_orc{background-position:-2610px 0;width:90px;height:90px}.m_skin_asian{background-position:-2700px 0;width:90px;height:90px}.m_skin_black{background-position:-2790px 0;width:90px;height:90px}.m_skin_white{background-position:-2880px 0;width:90px;height:90px}.Pet-Wolf-Zombie,.Pet-Wolf-White,.Pet-Wolf-Veteran,.Pet-Wolf-Skeleton,.Pet-Wolf-Shade,.Pet-Wolf-Red,.Pet-Wolf-Golden,.Pet-Wolf-Desert,.Pet-Wolf-CottonCandyPink,.Pet-Wolf-CottonCandyBlue,.Pet-TigerCub-Zombie,.Pet-TigerCub-White,.Pet-TigerCub-Skeleton,.Pet-TigerCub-Shade,.Pet-TigerCub-Red,.Pet-TigerCub-Golden,.Pet-TigerCub-Desert,.Pet-TigerCub-CottonCandyPink,.Pet-TigerCub-CottonCandyBlue,.Pet-TigerCub-Base,.Pet-PolarBearCub-Base,.Pet-PandaCub-Zombie,.Pet-PandaCub-White,.Pet-PandaCub-Skeleton,.Pet-PandaCub-Shade,.Pet-PandaCub-Red,.Pet-PandaCub-Golden,.Pet-PandaCub-Desert,.Pet-PandaCub-CottonCandyPink,.Pet-PandaCub-CottonCandyBlue,.Pet-PandaCub-Base,.Pet-LionCub-Zombie,.Pet-LionCub-White,.Pet-LionCub-Skeleton,.Pet-LionCub-Shade,.Pet-LionCub-Red,.Pet-LionCub-Golden,.Pet-LionCub-Desert,.Pet-LionCub-CottonCandyPink,.Pet-LionCub-CottonCandyBlue,.Pet-LionCub-Base,.Pet-Fox-Zombie,.Pet-Fox-White,.Pet-Fox-Skeleton,.Pet-Fox-Shade,.Pet-Fox-Red,.Pet-Fox-Golden,.Pet-Fox-Desert,.Pet-Fox-CottonCandyPink,.Pet-Fox-CottonCandyBlue,.Pet-Fox-Base,.Pet-FlyingPig-Zombie,.Pet-FlyingPig-White,.Pet-FlyingPig-Skeleton,.Pet-FlyingPig-Shade,.Pet-FlyingPig-Red,.Pet-FlyingPig-Golden,.Pet-FlyingPig-Desert,.Pet-FlyingPig-CottonCandyPink,.Pet-FlyingPig-CottonCandyBlue,.Pet-FlyingPig-Base,.Pet-Dragon-Zombie,.Pet-Dragon-White,.Pet-Dragon-Skeleton,.Pet-Dragon-Shade,.Pet-Dragon-Red,.Pet-Dragon-Golden,.Pet-Dragon-Desert,.Pet-Dragon-CottonCandyPink,.Pet-Dragon-CottonCandyBlue,.Pet-Dragon-Base,.Pet-Cactus-Skeleton,.Pet-Cactus-Red,.Pet-Cactus-Zombie,.Pet-Cactus-Shade,.Pet-Cactus-Golden,.Pet-Cactus-White,.Pet-Cactus-CottonCandyPink,.Pet-Cactus-CottonCandyBlue,.Pet-Cactus-Desert,.Pet-Cactus-Base,.Pet-BearCub-Zombie,.Pet-BearCub-White,.Pet-BearCub-Skeleton,.Pet-BearCub-Shade,.Pet-BearCub-Red,.Pet-BearCub-Golden,.Pet-BearCub-Desert,.Pet-BearCub-CottonCandyPink,.Pet-BearCub-CottonCandyBlue,.Pet-BearCub-Base,.Pet-Wolf-Base{background:url(../img/sprites/pet_sprites.png) no-repeat}.Pet-Wolf-Zombie{background-position:0 0;width:81px;height:99px}.Pet-Wolf-White{background-position:-81px 0;width:81px;height:99px}.Pet-Wolf-Veteran{background-position:-162px 0;width:81px;height:99px}.Pet-Wolf-Skeleton{background-position:-243px 0;width:81px;height:99px}.Pet-Wolf-Shade{background-position:-324px 0;width:81px;height:99px}.Pet-Wolf-Red{background-position:-405px 0;width:81px;height:99px}.Pet-Wolf-Golden{background-position:-486px 0;width:81px;height:99px}.Pet-Wolf-Desert{background-position:-567px 0;width:81px;height:99px}.Pet-Wolf-CottonCandyPink{background-position:-648px 0;width:81px;height:99px}.Pet-Wolf-CottonCandyBlue{background-position:-729px 0;width:81px;height:99px}.Pet-TigerCub-Zombie{background-position:-810px 0;width:81px;height:99px}.Pet-TigerCub-White{background-position:-891px 0;width:81px;height:99px}.Pet-TigerCub-Skeleton{background-position:-972px 0;width:81px;height:99px}.Pet-TigerCub-Shade{background-position:-1053px 0;width:81px;height:99px}.Pet-TigerCub-Red{background-position:-1134px 0;width:81px;height:99px}.Pet-TigerCub-Golden{background-position:-1215px 0;width:81px;height:99px}.Pet-TigerCub-Desert{background-position:-1296px 0;width:81px;height:99px}.Pet-TigerCub-CottonCandyPink{background-position:-1377px 0;width:81px;height:99px}.Pet-TigerCub-CottonCandyBlue{background-position:-1458px 0;width:81px;height:99px}.Pet-TigerCub-Base{background-position:-1539px 0;width:81px;height:99px}.Pet-PolarBearCub-Base{background-position:-1620px 0;width:81px;height:99px}.Pet-PandaCub-Zombie{background-position:-1701px 0;width:81px;height:99px}.Pet-PandaCub-White{background-position:-1782px 0;width:81px;height:99px}.Pet-PandaCub-Skeleton{background-position:-1863px 0;width:81px;height:99px}.Pet-PandaCub-Shade{background-position:-1944px 0;width:81px;height:99px}.Pet-PandaCub-Red{background-position:-2025px 0;width:81px;height:99px}.Pet-PandaCub-Golden{background-position:-2106px 0;width:81px;height:99px}.Pet-PandaCub-Desert{background-position:-2187px 0;width:81px;height:99px}.Pet-PandaCub-CottonCandyPink{background-position:-2268px 0;width:81px;height:99px}.Pet-PandaCub-CottonCandyBlue{background-position:-2349px 0;width:81px;height:99px}.Pet-PandaCub-Base{background-position:-2430px 0;width:81px;height:99px}.Pet-LionCub-Zombie{background-position:-2511px 0;width:81px;height:99px}.Pet-LionCub-White{background-position:-2592px 0;width:81px;height:99px}.Pet-LionCub-Skeleton{background-position:-2673px 0;width:81px;height:99px}.Pet-LionCub-Shade{background-position:-2754px 0;width:81px;height:99px}.Pet-LionCub-Red{background-position:-2835px 0;width:81px;height:99px}.Pet-LionCub-Golden{background-position:-2916px 0;width:81px;height:99px}.Pet-LionCub-Desert{background-position:-2997px 0;width:81px;height:99px}.Pet-LionCub-CottonCandyPink{background-position:-3078px 0;width:81px;height:99px}.Pet-LionCub-CottonCandyBlue{background-position:-3159px 0;width:81px;height:99px}.Pet-LionCub-Base{background-position:-3240px 0;width:81px;height:99px}.Pet-Fox-Zombie{background-position:-3321px 0;width:81px;height:99px}.Pet-Fox-White{background-position:-3402px 0;width:81px;height:99px}.Pet-Fox-Skeleton{background-position:-3483px 0;width:81px;height:99px}.Pet-Fox-Shade{background-position:-3564px 0;width:81px;height:99px}.Pet-Fox-Red{background-position:-3645px 0;width:81px;height:99px}.Pet-Fox-Golden{background-position:-3726px 0;width:81px;height:99px}.Pet-Fox-Desert{background-position:-3807px 0;width:81px;height:99px}.Pet-Fox-CottonCandyPink{background-position:-3888px 0;width:81px;height:99px}.Pet-Fox-CottonCandyBlue{background-position:-3969px 0;width:81px;height:99px}.Pet-Fox-Base{background-position:-4050px 0;width:81px;height:99px}.Pet-FlyingPig-Zombie{background-position:-4131px 0;width:81px;height:99px}.Pet-FlyingPig-White{background-position:-4212px 0;width:81px;height:99px}.Pet-FlyingPig-Skeleton{background-position:-4293px 0;width:81px;height:99px}.Pet-FlyingPig-Shade{background-position:-4374px 0;width:81px;height:99px}.Pet-FlyingPig-Red{background-position:-4455px 0;width:81px;height:99px}.Pet-FlyingPig-Golden{background-position:-4536px 0;width:81px;height:99px}.Pet-FlyingPig-Desert{background-position:-4617px 0;width:81px;height:99px}.Pet-FlyingPig-CottonCandyPink{background-position:-4698px 0;width:81px;height:99px}.Pet-FlyingPig-CottonCandyBlue{background-position:-4779px 0;width:81px;height:99px}.Pet-FlyingPig-Base{background-position:-4860px 0;width:81px;height:99px}.Pet-Dragon-Zombie{background-position:-4941px 0;width:81px;height:99px}.Pet-Dragon-White{background-position:-5022px 0;width:81px;height:99px}.Pet-Dragon-Skeleton{background-position:-5103px 0;width:81px;height:99px}.Pet-Dragon-Shade{background-position:-5184px 0;width:81px;height:99px}.Pet-Dragon-Red{background-position:-5265px 0;width:81px;height:99px}.Pet-Dragon-Golden{background-position:-5346px 0;width:81px;height:99px}.Pet-Dragon-Desert{background-position:-5427px 0;width:81px;height:99px}.Pet-Dragon-CottonCandyPink{background-position:-5508px 0;width:81px;height:99px}.Pet-Dragon-CottonCandyBlue{background-position:-5589px 0;width:81px;height:99px}.Pet-Dragon-Base{background-position:-5670px 0;width:81px;height:99px}.Pet-Cactus-Zombie{background-position:-5913px 0;width:81px;height:99px}.Pet-Cactus-White{background-position:-6156px 0;width:81px;height:99px}.Pet-Cactus-Skeleton{background-position:-5751px 0;width:81px;height:99px}.Pet-Cactus-Red{background-position:-5832px 0;width:81px;height:99px}.Pet-Cactus-Shade{background-position:-5994px 0;width:81px;height:99px}.Pet-Cactus-Golden{background-position:-6075px 0;width:81px;height:99px}.Pet-Cactus-Desert{background-position:-6399px 0;width:81px;height:99px}.Pet-Cactus-CottonCandyPink{background-position:-6237px 0;width:81px;height:99px}.Pet-Cactus-CottonCandyBlue{background-position:-6318px 0;width:81px;height:99px}.Pet-Cactus-Base{background-position:-6480px 0;width:81px;height:99px}.Pet-BearCub-Zombie{background-position:-6561px 0;width:81px;height:99px}.Pet-BearCub-White{background-position:-6642px 0;width:81px;height:99px}.Pet-BearCub-Skeleton{background-position:-6723px 0;width:81px;height:99px}.Pet-BearCub-Shade{background-position:-6804px 0;width:81px;height:99px}.Pet-BearCub-Red{background-position:-6885px 0;width:81px;height:99px}.Pet-BearCub-Golden{background-position:-6966px 0;width:81px;height:99px}.Pet-BearCub-Desert{background-position:-7047px 0;width:81px;height:99px}.Pet-BearCub-CottonCandyPink{background-position:-7128px 0;width:81px;height:99px}.Pet-BearCub-CottonCandyBlue{background-position:-7209px 0;width:81px;height:99px}.Pet-BearCub-Base{background-position:-7290px 0;width:81px;height:99px}.Pet-Wolf-Base{background-position:-7371px 0;width:81px;height:99px}.Pet-Egg{background:url(../img/sprites/egg.png) no-repeat;width:39px;height:42px}.Gems{background:url(../img/sprites/Egg_Sprite_Sheet.png);background-position:-57px 50px;display:inline-block;margin-right:5px;border-style:none;width:30px;height:30px}.weapon_6,.weapon_5,.weapon_4,.weapon_3,.weapon_2,.weapon_1,.weapon_0,.skin_white,.skin_pale,.skin_orc,.skin_dead,.skin_black,.skin_asian,.shield_5_v1,.shield_5_v0,.shield_4_v0,.shield_3_v1,.shield_3_v0,.shield_2_v1,.shield_2_v0,.shield_1_v1,.shield_1_v0,_shield_4_v1,.nh_hair_white_v1,.nh_hair_white_v0,.nh_hair_brown_v1,.nh_hair_brown_v0,.nh_hair_blond_v1,.nh_hair_blond_v0,.nh_hair_black_v1,.nh_hair_black_v0,.head_5_v2,.head_5_v1,.head_5_v0,.head_4_v2,.head_4_v1,.head_4_v0,.head_3_v2,.head_3_v1,.head_3_v0,.head_2_v2,.head_2_v1,.head_2_v0,.head_1_v1,.head_1_v0,.head_0_v1,.head_0_v0,.hair_white_v1,.hair_white_v0,.hair_brown_v1,.hair_brown_v0,.hair_blond_v1,.hair_blond_v0,.hair_black_v1,.hair_black_v0,.armor_5_v1,.armor_5_v0,.armor_4_v1,.armor_4_v0,.armor_3_v1,.armor_3_v0,.armor_2_v0,.armor_1_v1,.armor_1_v0,.armor_0_v11,.armor_0_v10,.armor_0_v9,.armor_0_v8,.armor_0_v7,.armor_0_v6,.armor_0_v5,.armor_0_v4,.armor_0_v3,.armor_0_v2,.armor_0_v1,.armor_0_v0{background:url(../img/sprites/player_sprites.png) no-repeat}.weapon_6{background-position:0 0;width:90px;height:90px}.weapon_5{background-position:-90px 0;width:90px;height:90px}.weapon_4{background-position:-180px 0;width:90px;height:90px}.weapon_3{background-position:-270px 0;width:90px;height:90px}.weapon_2{background-position:-360px 0;width:90px;height:90px}.weapon_1{background-position:-450px 0;width:90px;height:90px}.weapon_0{background-position:-540px 0;width:90px;height:90px}.skin_white{background-position:-630px 0;width:90px;height:90px}.skin_pale{background-position:-720px 0;width:90px;height:90px}.skin_orc{background-position:-810px 0;width:90px;height:90px}.skin_dead{background-position:-900px 0;width:90px;height:90px}.skin_black{background-position:-990px 0;width:90px;height:90px}.skin_asian{background-position:-1080px 0;width:90px;height:90px}.shield_5_v1{background-position:-1170px 0;width:90px;height:90px}.shield_5_v0{background-position:-1260px 0;width:90px;height:90px}.shield_4_v0{background-position:-1350px 0;width:90px;height:90px}.shield_3_v1{background-position:-1440px 0;width:90px;height:90px}.shield_3_v0{background-position:-1530px 0;width:90px;height:90px}.shield_2_v1{background-position:-1620px 0;width:90px;height:90px}.shield_2_v0{background-position:-1710px 0;width:90px;height:90px}.shield_1_v1{background-position:-1800px 0;width:90px;height:90px}.shield_1_v0{background-position:-1890px 0;width:90px;height:90px}._shield_4_v1{background-position:-1980px 0;width:90px;height:90px}.nh_hair_white_v1{background-position:-2070px 0;width:90px;height:90px}.nh_hair_white_v0{background-position:-2160px 0;width:90px;height:90px}.nh_hair_brown_v1{background-position:-2250px 0;width:90px;height:90px}.nh_hair_brown_v0{background-position:-2340px 0;width:90px;height:90px}.nh_hair_blond_v1{background-position:-2430px 0;width:90px;height:90px}.nh_hair_blond_v0{background-position:-2520px 0;width:90px;height:90px}.nh_hair_black_v1{background-position:-2610px 0;width:90px;height:90px}.nh_hair_black_v0{background-position:-2700px 0;width:90px;height:90px}.head_5_v2{background-position:-2790px 0;width:90px;height:90px}.head_5_v1{background-position:-2880px 0;width:90px;height:90px}.head_5_v0{background-position:-2970px 0;width:90px;height:90px}.head_4_v2{background-position:-3060px 0;width:90px;height:90px}.head_4_v1{background-position:-3150px 0;width:90px;height:90px}.head_4_v0{background-position:-3240px 0;width:90px;height:90px}.head_3_v2{background-position:-3330px 0;width:90px;height:90px}.head_3_v1{background-position:-3420px 0;width:90px;height:90px}.head_3_v0{background-position:-3510px 0;width:90px;height:90px}.head_2_v2{background-position:-3600px 0;width:90px;height:90px}.head_2_v1{background-position:-3690px 0;width:90px;height:90px}.head_2_v0{background-position:-3780px 0;width:90px;height:90px}.head_1_v1{background-position:-3870px 0;width:90px;height:90px}.head_1_v0{background-position:-3960px 0;width:90px;height:90px}.head_0_v1{background-position:-4050px 0;width:90px;height:90px}.head_0_v0{background-position:-4140px 0;width:90px;height:90px}.hair_white_v1{background-position:-4230px 0;width:90px;height:90px}.hair_white_v0{background-position:-4320px 0;width:90px;height:90px}.hair_brown_v1{background-position:-4410px 0;width:90px;height:90px}.hair_brown_v0{background-position:-4500px 0;width:90px;height:90px}.hair_blond_v1{background-position:-4590px 0;width:90px;height:90px}.hair_blond_v0{background-position:-4680px 0;width:90px;height:90px}.hair_black_v1{background-position:-4770px 0;width:90px;height:90px}.hair_black_v0{background-position:-4860px 0;width:90px;height:90px}.armor_5_v1{background-position:-4950px 0;width:90px;height:90px}.armor_5_v0{background-position:-5040px 0;width:90px;height:90px}.armor_4_v1{background-position:-5130px 0;width:90px;height:90px}.armor_4_v0{background-position:-5220px 0;width:90px;height:90px}.armor_3_v1{background-position:-5310px 0;width:90px;height:90px}.armor_3_v0{background-position:-5400px 0;width:90px;height:90px}.armor_2_v0{background-position:-5490px 0;width:90px;height:90px}.armor_1_v1{background-position:-5580px 0;width:90px;height:90px}.armor_1_v0{background-position:-5670px 0;width:90px;height:90px}.armor_0_v11{background-position:-5760px 0;width:90px;height:90px}.armor_0_v10{background-position:-5850px 0;width:90px;height:90px}.armor_0_v9{background-position:-5940px 0;width:90px;height:90px}.armor_0_v8{background-position:-6030px 0;width:90px;height:90px}.armor_0_v7{background-position:-6120px 0;width:90px;height:90px}.armor_0_v6{background-position:-6210px 0;width:90px;height:90px}.armor_0_v5{background-position:-6300px 0;width:90px;height:90px}.armor_0_v4{background-position:-6390px 0;width:90px;height:90px}.armor_0_v3{background-position:-6480px 0;width:90px;height:90px}.armor_0_v2{background-position:-6570px 0;width:90px;height:90px}.armor_0_v1{background-position:-6660px 0;width:90px;height:90px}.armor_0_v0{background-position:-6750px 0;width:90px;height:90px}[class^=shop_],[class^=zzz]{background:url(../img/sprites/shop_sprites.png) no-repeat}[class^=shop_weapon_],[class^=shop_shield_],[class^=shop_head_],[class^=shop_armor_],[class^=zzz]{width:40px;height:40px}.shop_weapon_6{background-position:0 0}.shop_weapon_5{background-position:-40px 0}.shop_weapon_4{background-position:-80px 0}.shop_weapon_3{background-position:-120px 0}.shop_weapon_2{background-position:-160px 0}.shop_weapon_1{background-position:-200px 0}.shop_shield_5{background-position:-240px 0}.shop_shield_4{background-position:-280px 0}.shop_shield_3{background-position:-320px 0}.shop_shield_2{background-position:-360px 0}.shop_shield_1{background-position:-400px 0}.shop_head_5{background-position:-440px 0}.shop_head_4{background-position:-480px 0}.shop_head_3{background-position:-520px 0}.shop_head_2{background-position:-560px 0}.shop_head_1{background-position:-600px 0}.shop_armor_5{background-position:-640px 0}.shop_armor_4{background-position:-680px 0}.shop_armor_3{background-position:-720px 0}.shop_armor_2{background-position:-760px 0}.shop_armor_1{background-position:-800px 0}.shop_reroll{background-position:-840px 0;width:40px;height:40px}.shop_potion{background-position:-880px 0;width:40px;height:40px}.shop_copper{background-position:-923px -8px;width:32px;height:22px}.shop_silver{background-position:-963px -8px;width:32px;height:22px}.shop_gold{background-position:-1003px -8px;width:32px;height:22px}.zzz{background-position:-1200px 0}.zzz_light{background-position:-1280px 0} \ No newline at end of file diff --git a/package.json b/package.json index 5c38c4db4f..bd9d2b3d6c 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "devDependencies": { "mocha": "*", "expect.js": "*", - "grunt-concat-css": "~0.1.0", + "grunt-contrib-cssmin": "~0.6.0", "grunt": "~0.4.1", "grunt-browserify": "~1.2.4" }, diff --git a/spritesheets.css b/spritesheets.css deleted file mode 100644 index f851fc09a3..0000000000 --- a/spritesheets.css +++ /dev/null @@ -1,465 +0,0 @@ -.Mount_Head_Lion, .Mount_Body_Lion, .Mount_Head_PolarBear, .Mount_Body_PolarBear, .Mount_Head_Panda, .Mount_Body_Panda, .Mount_Head_Tiger, .Mount_Body_Tiger, .Mount_Head_Bear, .Mount_Body_Bear, .Mount_Head_EtherealLion, .Mount_Body_EtherealLion {background: url('img/sprites/Mount-SpriteSheet.png') no-repeat; } -.Mount_Head_Lion {background-position: 0 0; width: 105px; height: 123px} -.Mount_Body_Lion {background-position: -105 0; width: 105px; height: 123px} -.Mount_Head_PolarBear {background-position: -210 0; width: 105px; height: 123px} -.Mount_Body_PolarBear {background-position: -315 0; width: 105px; height: 123px} -.Mount_Head_Panda {background-position: -420 0; width: 105px; height: 123px} -.Mount_Body_Panda {background-position: -525 0; width: 105px; height: 123px} -.Mount_Head_Tiger {background-position: -630 0; width: 105px; height: 123px} -.Mount_Body_Tiger {background-position: -735 0; width: 105px; height: 123px} -.Mount_Head_Bear {background-position: -840 0; width: 105px; height: 123px} -.Mount_Body_Bear {background-position: -945 0; width: 105px; height: 123px} -.Mount_Head_EtherealLion {background-position: -1050 0; width: 105px; height: 123px} -.Mount_Body_EtherealLion {background-position: -1155 0; width: 105px; height: 123px} -.Pet_Egg_Wolf, .Pet_Egg_TigerCub, .Pet_Egg_PolarBear, .Pet_Egg_PandaCub, .Pet_Egg_LionCub, .Pet_Egg_Fox, .Pet_Egg_FlyingPig, .Pet_Egg_Dragon, .Pet_Egg_Cactus, .Pet_Egg_BearCub, .Pet_HatchingPotion_Base, .Pet_HatchingPotion_White, .Pet_HatchingPotion_Desert, .Pet_HatchingPotion_Red, .Pet_HatchingPotion_Shade, .Pet_HatchingPotion_Skeleton, .Pet_HatchingPotion_Zombie, .Pet_HatchingPotion_CottonCandyPink, .Pet_HatchingPotion_CottonCandyBlue, .Pet_HatchingPotion_Golden, .Pet_Currency_Gem, .Pet_Currency_Gem2x, .Pet_Currency_Gem1x {background: url('img/sprites/Egg_Sprite_Sheet.png') no-repeat} -.Pet_Egg_Wolf {background-position: 0px 0px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_TigerCub {background-position: 0px -51px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_PolarBear {background-position: 0px -102px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_PandaCub {background-position: 0px -153px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_LionCub {background-position: 0px -204px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_Fox {background-position: 0px -255px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_FlyingPig {background-position: 0px -306px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_Dragon {background-position: 0px -357px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_Cactus {background-position: 0px -408px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_Egg_BearCub {background-position: 0px -459px; width: 48px; height: 53px; margin-left: 1.25em;} - -.Pet_HatchingPotion_Base {background-position: -48px -0px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_White {background-position: -48px -51px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Desert {background-position: -48px -102px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Red {background-position: -48px -153px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Shade {background-position: -48px -204px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Skeleton {background-position: -48px -255px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Zombie {background-position: -48px -306px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_CottonCandyPink {background-position: -48px -357px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_CottonCandyBlue {background-position: -48px -408px; width: 48px; height: 53px; margin-left: 1.25em;} -.Pet_HatchingPotion_Golden {background-position: -48px -459px; width: 48px; height: 53px; margin-left: 1.25em;} - -.Pet_Currency_Gem {background-position: 0px -510px; width: 51px; height: 45px} /* Not an egg or potion so has a different size */ -.Pet_Currency_Gem2x {background-position: -55px -513px; width: 34px; height: 30px} -.Pet_Currency_Gem1x {background-position: -63px -542px; width: 19px; height: 17px} -.achievements-container { - margin: 20px; -} - -.achievement { - background: url('img/sprites/achievements.png') no-repeat; - width: 24px; - height: 26px; - float:left; - clear:right; - margin-right: 10px; -} - -.achievement-sword {background-position:0px 0px} -.achievement-tree {background-position:-24px 0px} -.achievement-rat {background-position:-48px 0px} -.achievement-comment {background-position:-72px 0px} -.achievement-armor {background-position:-96px 0px} -.achievement-cave {background-position:-120px 0px} -.achievement-sun {background-position:-144px 0px} -.achievement-boot {background-position:-168px 0px} -.achievement-coffin {background-position:-192px 0px} -.achievement-alien {background-position:-216px 0px} -.achievement-ninja {background-position:-240px 0px} -.achievement-cactus {background-position:-264px 0px} -.achievement-bow {background-position:-288px 0px} -.achievement-heart {background-position:-312px 0px} -.achievement-shield {background-position:-336px 0px} -.achievement-thermometer {background-position:-360px 0px} -.achievement-helm {background-position:-384px 0px} -.achievement-firefox {background-position:0px -26px} -.achievement-cake {background-position:-24px -26px} -.achievement-karaoke {background-position:-48px -26px} -.weapon_7, .armor_6, .head_6, .shield_6 { - /*background: url('img/sprites/backer-only/BackerOnly-SpriteSheet.png') no-repeat*/ - width: 105px; - height: 105px; - - /*FIXME - not he best way of handling the alignment issues*/ - margin-left: -3px; - margin-top: -18px; -} - -.head_6 { - background: url('img/sprites/backer-only/BackerOnly-Equip-ShadeHelmet.gif') no-repeat; -} - -.armor_6 { - background: url('img/sprites/backer-only/BackerOnly-Equip-ShadeArmor.gif') no-repeat; -} - -.shield_6 { - background: url('img/sprites/backer-only/BackerOnly-Shield-TormentedSkull.gif') no-repeat; -} - -.weapon_7 { - background: url('img/sprites/backer-only/BackerOnly-Weapon-DarkSoulsBlade.gif') no-repeat; -} - -.Pet-Wolf-Cerberus { - width: 105px; - height: 72px; - background: url('img/sprites/backer-only/BackerOnly-Pet-CerberusPup.gif') no-repeat; -} - -.shop_shield_6 {background-position: -1040px 0} -.shop_weapon_7 {background-position: -1080px 0} -.shop_armor_6 {background-position: -1160px 0} -.shop_head_6 {background-position: -1120px 0} - -.f_weapon_6, -.f_weapon_5, -.f_weapon_4, -.f_weapon_3, -.f_weapon_2, -.f_weapon_1, -.f_weapon_0, -.f_shield_5, -.f_shield_4, -.f_shield_3, -.f_shield_2, -.f_shield_1, -.f_head_5_v2, -.f_head_5_v1, -.f_head_4_v2, -.f_head_4_v1, -.f_head_3_v2, -.f_head_3_v1, -.f_head_2_v2, -.f_head_2_v1, -.f_head_1, -.f_head_0, -.f_hair_white, -.f_hair_brown, -.f_hair_black, -.f_hair_blond, -.f_armor_5, -.f_armor_4, -.f_armor_3, -.f_armor_2, -.f_armor_1, -.f_armor_0_v2, -.f_armor_0_v1, -.f_skin_dead, -.f_skin_orc, -.f_skin_asian, -.f_skin_black, -.f_skin_white { - background: url('img/sprites/female_sprites.png') no-repeat; -} - -.f_weapon_6 {background-position: 0 0; width: 90px; height: 90px} -.f_weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -.f_weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -.f_weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -.f_weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -.f_weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -.f_weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -.f_shield_5 {background-position: -630px 0; width: 90px; height: 90px} -.f_shield_4 {background-position: -720px 0; width: 90px; height: 90px} -.f_shield_3 {background-position: -810px 0; width: 90px; height: 90px} -.f_shield_2 {background-position: -900px 0; width: 90px; height: 90px} -.f_shield_1 {background-position: -990px 0; width: 90px; height: 90px} -.f_head_5_v2 {background-position: -1080px 0; width: 90px; height: 90px} -.f_head_5_v1 {background-position: -1170px 0; width: 90px; height: 90px} -.f_head_4_v2 {background-position: -1260px 0; width: 90px; height: 90px} -.f_head_4_v1 {background-position: -1350px 0; width: 90px; height: 90px} -.f_head_3_v2 {background-position: -1440px 0; width: 90px; height: 90px} -.f_head_3_v1 {background-position: -1530px 0; width: 90px; height: 90px} -.f_head_2_v2 {background-position: -1620px 0; width: 90px; height: 90px} -.f_head_2_v1 {background-position: -1710px 0; width: 90px; height: 90px} -.f_head_1 {background-position: -1800px 0; width: 90px; height: 90px} -.f_head_0 {background-position: -1890px 0; width: 90px; height: 90px} -.f_hair_white {background-position: -1980px 0; width: 90px; height: 90px} -.f_hair_brown {background-position: -2070px 0; width: 90px; height: 90px} -.f_hair_black {background-position: -2160px 0; width: 90px; height: 90px} -.f_hair_blond {background-position: -2250px 0; width: 90px; height: 90px} -.f_armor_5 {background-position: -2340px 0; width: 90px; height: 90px} -.f_armor_4 {background-position: -2430px 0; width: 90px; height: 90px} -.f_armor_3 {background-position: -2520px 0; width: 90px; height: 90px} -.f_armor_2 {background-position: -2610px 0; width: 90px; height: 90px} -.f_armor_1 {background-position: -2700px 0; width: 90px; height: 90px} -.f_armor_0_v2 {background-position: -2790px 0; width: 90px; height: 90px} -.f_armor_0_v1 {background-position: -2880px 0; width: 90px; height: 90px} -.f_skin_dead {background-position: -2970px 0; width: 90px; height: 90px} -.f_skin_orc {background-position: -3060px 0; width: 90px; height: 90px} -.f_skin_asian {background-position: -3150px 0; width: 90px; height: 90px} -.f_skin_black {background-position: -3240px 0; width: 90px; height: 90px} -.f_skin_white {background-position: -3330px 0; width: 90px; height: 90px}.m_weapon_6, -.m_weapon_5, -.m_weapon_4, -.m_weapon_3, -.m_weapon_2, -.m_weapon_1, -.m_weapon_0, -.m_shield_5, -.m_shield_4, -.m_shield_3, -.m_shield_2, -.m_shield_1, -.m_head_5, -.m_head_4, -.m_head_3, -.m_head_2, -.m_head_1, -.m_head_0, -.m_hair_blond, -.m_hair_black, -.m_hair_brown, -.m_hair_white, -.m_armor_5, -.m_armor_4, -.m_armor_3, -.m_armor_2, -.m_armor_1, -.m_armor_0, -.m_skin_dead, -.m_skin_orc, -.m_skin_asian, -.m_skin_black, -.m_skin_white { - background: url('img/sprites/male_sprites.png') no-repeat; -} - -.m_weapon_6 {background-position: 0 0; width: 90px; height: 90px} -.m_weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -.m_weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -.m_weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -.m_weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -.m_weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -.m_weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -.m_shield_5 {background-position: -630px 0; width: 90px; height: 90px} -.m_shield_4 {background-position: -720px 0; width: 90px; height: 90px} -.m_shield_3 {background-position: -810px 0; width: 90px; height: 90px} -.m_shield_2 {background-position: -900px 0; width: 90px; height: 90px} -.m_shield_1 {background-position: -990px 0; width: 90px; height: 90px} -.m_head_5 {background-position: -1080px 0; width: 90px; height: 90px} -.m_head_4 {background-position: -1170px 0; width: 90px; height: 90px} -.m_head_3 {background-position: -1260px 0; width: 90px; height: 90px} -.m_head_2 {background-position: -1350px 0; width: 90px; height: 90px} -.m_head_1 {background-position: -1440px 0; width: 90px; height: 90px} -.m_head_0 {background-position: -1530px 0; width: 90px; height: 90px} -.m_hair_blond {background-position: -1620px 0; width: 90px; height: 90px} -.m_hair_black {background-position: -1710px 0; width: 90px; height: 90px} -.m_hair_brown {background-position: -1800px 0; width: 90px; height: 90px} -.m_hair_white {background-position: -1890px 0; width: 90px; height: 90px} -.m_armor_5 {background-position: -1980px 0; width: 90px; height: 90px} -.m_armor_4 {background-position: -2070px 0; width: 90px; height: 90px} -.m_armor_3 {background-position: -2160px 0; width: 90px; height: 90px} -.m_armor_2 {background-position: -2250px 0; width: 90px; height: 90px} -.m_armor_1 {background-position: -2340px 0; width: 90px; height: 90px} -.m_armor_0 {background-position: -2430px 0; width: 90px; height: 90px} -.m_skin_dead {background-position: -2520px 0; width: 90px; height: 90px} -.m_skin_orc {background-position: -2610px 0; width: 90px; height: 90px} -.m_skin_asian {background-position: -2700px 0; width: 90px; height: 90px} -.m_skin_black {background-position: -2790px 0; width: 90px; height: 90px} -.m_skin_white {background-position: -2880px 0; width: 90px; height: 90px}.Pet-Wolf-Zombie, .Pet-Wolf-White, .Pet-Wolf-Veteran, .Pet-Wolf-Skeleton, .Pet-Wolf-Shade, .Pet-Wolf-Red, .Pet-Wolf-Golden, .Pet-Wolf-Desert, .Pet-Wolf-CottonCandyPink, .Pet-Wolf-CottonCandyBlue, .Pet-TigerCub-Zombie, .Pet-TigerCub-White, .Pet-TigerCub-Skeleton, .Pet-TigerCub-Shade, .Pet-TigerCub-Red, .Pet-TigerCub-Golden, .Pet-TigerCub-Desert, .Pet-TigerCub-CottonCandyPink, .Pet-TigerCub-CottonCandyBlue, .Pet-TigerCub-Base, .Pet-PolarBearCub-Base, .Pet-PandaCub-Zombie, .Pet-PandaCub-White, .Pet-PandaCub-Skeleton, .Pet-PandaCub-Shade, .Pet-PandaCub-Red, .Pet-PandaCub-Golden, .Pet-PandaCub-Desert, .Pet-PandaCub-CottonCandyPink, .Pet-PandaCub-CottonCandyBlue, .Pet-PandaCub-Base, .Pet-LionCub-Zombie, .Pet-LionCub-White, .Pet-LionCub-Skeleton, .Pet-LionCub-Shade, .Pet-LionCub-Red, .Pet-LionCub-Golden, .Pet-LionCub-Desert, .Pet-LionCub-CottonCandyPink, .Pet-LionCub-CottonCandyBlue, .Pet-LionCub-Base, .Pet-Fox-Zombie, .Pet-Fox-White, .Pet-Fox-Skeleton, .Pet-Fox-Shade, .Pet-Fox-Red, .Pet-Fox-Golden, .Pet-Fox-Desert, .Pet-Fox-CottonCandyPink, .Pet-Fox-CottonCandyBlue, .Pet-Fox-Base, .Pet-FlyingPig-Zombie, .Pet-FlyingPig-White, .Pet-FlyingPig-Skeleton, .Pet-FlyingPig-Shade, .Pet-FlyingPig-Red, .Pet-FlyingPig-Golden, .Pet-FlyingPig-Desert, .Pet-FlyingPig-CottonCandyPink, .Pet-FlyingPig-CottonCandyBlue, .Pet-FlyingPig-Base, .Pet-Dragon-Zombie, .Pet-Dragon-White, .Pet-Dragon-Skeleton, .Pet-Dragon-Shade, .Pet-Dragon-Red, .Pet-Dragon-Golden, .Pet-Dragon-Desert, .Pet-Dragon-CottonCandyPink, .Pet-Dragon-CottonCandyBlue, .Pet-Dragon-Base, .Pet-Cactus-Skeleton, .Pet-Cactus-Red, .Pet-Cactus-Zombie, .Pet-Cactus-Shade, .Pet-Cactus-Golden, .Pet-Cactus-White, .Pet-Cactus-CottonCandyPink, .Pet-Cactus-CottonCandyBlue, .Pet-Cactus-Desert, .Pet-Cactus-Base, .Pet-BearCub-Zombie, .Pet-BearCub-White, .Pet-BearCub-Skeleton, .Pet-BearCub-Shade, .Pet-BearCub-Red, .Pet-BearCub-Golden, .Pet-BearCub-Desert, .Pet-BearCub-CottonCandyPink, .Pet-BearCub-CottonCandyBlue, .Pet-BearCub-Base, .Pet-Wolf-Base {background: url('img/sprites/pet_sprites.png') no-repeat} - -.Pet-Wolf-Zombie {background-position: 0 0; width: 81px; height: 99px} -.Pet-Wolf-White {background-position: -81px 0; width: 81px; height: 99px} -.Pet-Wolf-Veteran {background-position: -162px 0; width: 81px; height: 99px} -.Pet-Wolf-Skeleton {background-position: -243px 0; width: 81px; height: 99px} -.Pet-Wolf-Shade {background-position: -324px 0; width: 81px; height: 99px} -.Pet-Wolf-Red {background-position: -405px 0; width: 81px; height: 99px} -.Pet-Wolf-Golden {background-position: -486px 0; width: 81px; height: 99px} -.Pet-Wolf-Desert {background-position: -567px 0; width: 81px; height: 99px} -.Pet-Wolf-CottonCandyPink {background-position: -648px 0; width: 81px; height: 99px} -.Pet-Wolf-CottonCandyBlue {background-position: -729px 0; width: 81px; height: 99px} -.Pet-TigerCub-Zombie {background-position: -810px 0; width: 81px; height: 99px} -.Pet-TigerCub-White {background-position: -891px 0; width: 81px; height: 99px} -.Pet-TigerCub-Skeleton {background-position: -972px 0; width: 81px; height: 99px} -.Pet-TigerCub-Shade {background-position: -1053px 0; width: 81px; height: 99px} -.Pet-TigerCub-Red {background-position: -1134px 0; width: 81px; height: 99px} -.Pet-TigerCub-Golden {background-position: -1215px 0; width: 81px; height: 99px} -.Pet-TigerCub-Desert {background-position: -1296px 0; width: 81px; height: 99px} -.Pet-TigerCub-CottonCandyPink {background-position: -1377px 0; width: 81px; height: 99px} -.Pet-TigerCub-CottonCandyBlue {background-position: -1458px 0; width: 81px; height: 99px} -.Pet-TigerCub-Base {background-position: -1539px 0; width: 81px; height: 99px} -.Pet-PolarBearCub-Base {background-position: -1620px 0; width: 81px; height: 99px} -.Pet-PandaCub-Zombie {background-position: -1701px 0; width: 81px; height: 99px} -.Pet-PandaCub-White {background-position: -1782px 0; width: 81px; height: 99px} -.Pet-PandaCub-Skeleton {background-position: -1863px 0; width: 81px; height: 99px} -.Pet-PandaCub-Shade {background-position: -1944px 0; width: 81px; height: 99px} -.Pet-PandaCub-Red {background-position: -2025px 0; width: 81px; height: 99px} -.Pet-PandaCub-Golden {background-position: -2106px 0; width: 81px; height: 99px} -.Pet-PandaCub-Desert {background-position: -2187px 0; width: 81px; height: 99px} -.Pet-PandaCub-CottonCandyPink {background-position: -2268px 0; width: 81px; height: 99px} -.Pet-PandaCub-CottonCandyBlue {background-position: -2349px 0; width: 81px; height: 99px} -.Pet-PandaCub-Base {background-position: -2430px 0; width: 81px; height: 99px} -.Pet-LionCub-Zombie {background-position: -2511px 0; width: 81px; height: 99px} -.Pet-LionCub-White {background-position: -2592px 0; width: 81px; height: 99px} -.Pet-LionCub-Skeleton {background-position: -2673px 0; width: 81px; height: 99px} -.Pet-LionCub-Shade {background-position: -2754px 0; width: 81px; height: 99px} -.Pet-LionCub-Red {background-position: -2835px 0; width: 81px; height: 99px} -.Pet-LionCub-Golden {background-position: -2916px 0; width: 81px; height: 99px} -.Pet-LionCub-Desert {background-position: -2997px 0; width: 81px; height: 99px} -.Pet-LionCub-CottonCandyPink {background-position: -3078px 0; width: 81px; height: 99px} -.Pet-LionCub-CottonCandyBlue {background-position: -3159px 0; width: 81px; height: 99px} -.Pet-LionCub-Base {background-position: -3240px 0; width: 81px; height: 99px} -.Pet-Fox-Zombie {background-position: -3321px 0; width: 81px; height: 99px} -.Pet-Fox-White {background-position: -3402px 0; width: 81px; height: 99px} -.Pet-Fox-Skeleton {background-position: -3483px 0; width: 81px; height: 99px} -.Pet-Fox-Shade {background-position: -3564px 0; width: 81px; height: 99px} -.Pet-Fox-Red {background-position: -3645px 0; width: 81px; height: 99px} -.Pet-Fox-Golden {background-position: -3726px 0; width: 81px; height: 99px} -.Pet-Fox-Desert {background-position: -3807px 0; width: 81px; height: 99px} -.Pet-Fox-CottonCandyPink {background-position: -3888px 0; width: 81px; height: 99px} -.Pet-Fox-CottonCandyBlue {background-position: -3969px 0; width: 81px; height: 99px} -.Pet-Fox-Base {background-position: -4050px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Zombie {background-position: -4131px 0; width: 81px; height: 99px} -.Pet-FlyingPig-White {background-position: -4212px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Skeleton {background-position: -4293px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Shade {background-position: -4374px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Red {background-position: -4455px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Golden {background-position: -4536px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Desert {background-position: -4617px 0; width: 81px; height: 99px} -.Pet-FlyingPig-CottonCandyPink {background-position: -4698px 0; width: 81px; height: 99px} -.Pet-FlyingPig-CottonCandyBlue {background-position: -4779px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Base {background-position: -4860px 0; width: 81px; height: 99px} -.Pet-Dragon-Zombie {background-position: -4941px 0; width: 81px; height: 99px} -.Pet-Dragon-White {background-position: -5022px 0; width: 81px; height: 99px} -.Pet-Dragon-Skeleton {background-position: -5103px 0; width: 81px; height: 99px} -.Pet-Dragon-Shade {background-position: -5184px 0; width: 81px; height: 99px} -.Pet-Dragon-Red {background-position: -5265px 0; width: 81px; height: 99px} -.Pet-Dragon-Golden {background-position: -5346px 0; width: 81px; height: 99px} -.Pet-Dragon-Desert {background-position: -5427px 0; width: 81px; height: 99px} -.Pet-Dragon-CottonCandyPink {background-position: -5508px 0; width: 81px; height: 99px} -.Pet-Dragon-CottonCandyBlue {background-position: -5589px 0; width: 81px; height: 99px} -.Pet-Dragon-Base {background-position: -5670px 0; width: 81px; height: 99px} -.Pet-Cactus-Zombie {background-position: -5913px 0; width: 81px; height: 99px} -.Pet-Cactus-White {background-position: -6156px 0; width: 81px; height: 99px} -.Pet-Cactus-Skeleton {background-position: -5751px 0; width: 81px; height: 99px} -.Pet-Cactus-Red {background-position: -5832px 0; width: 81px; height: 99px} -.Pet-Cactus-Shade {background-position: -5994px 0; width: 81px; height: 99px} -.Pet-Cactus-Golden {background-position: -6075px 0; width: 81px; height: 99px} -.Pet-Cactus-Desert {background-position: -6399px 0; width: 81px; height: 99px} -.Pet-Cactus-CottonCandyPink {background-position: -6237px 0; width: 81px; height: 99px} -.Pet-Cactus-CottonCandyBlue {background-position: -6318px 0; width: 81px; height: 99px} -.Pet-Cactus-Base {background-position: -6480px 0; width: 81px; height: 99px} -.Pet-BearCub-Zombie {background-position: -6561px 0; width: 81px; height: 99px} -.Pet-BearCub-White {background-position: -6642px 0; width: 81px; height: 99px} -.Pet-BearCub-Skeleton {background-position: -6723px 0; width: 81px; height: 99px} -.Pet-BearCub-Shade {background-position: -6804px 0; width: 81px; height: 99px} -.Pet-BearCub-Red {background-position: -6885px 0; width: 81px; height: 99px} -.Pet-BearCub-Golden {background-position: -6966px 0; width: 81px; height: 99px} -.Pet-BearCub-Desert {background-position: -7047px 0; width: 81px; height: 99px} -.Pet-BearCub-CottonCandyPink {background-position: -7128px 0; width: 81px; height: 99px} -.Pet-BearCub-CottonCandyBlue {background-position: -7209px 0; width: 81px; height: 99px} -.Pet-BearCub-Base {background-position: -7290px 0; width: 81px; height: 99px} -.Pet-Wolf-Base {background-position: -7371px 0; width: 81px; height: 99px} -.Pet-Egg {background: url('img/sprites/egg.png') no-repeat; width: 39px; height: 42px;} -.Gems{background: url('img/sprites/Egg_Sprite_Sheet.png'); background-position: -57px 50px; display:inline-block; margin-right:5px;border-style:none; width: 30px; height: 30px} -.weapon_6, .weapon_5, .weapon_4, .weapon_3, .weapon_2, .weapon_1, .weapon_0, .skin_white, .skin_pale, .skin_orc, .skin_dead, .skin_black, .skin_asian, .shield_5_v1, .shield_5_v0, .shield_4_v0, .shield_3_v1, .shield_3_v0, .shield_2_v1, .shield_2_v0, .shield_1_v1, .shield_1_v0, _shield_4_v1, .nh_hair_white_v1, .nh_hair_white_v0, .nh_hair_brown_v1, .nh_hair_brown_v0, .nh_hair_blond_v1, .nh_hair_blond_v0, .nh_hair_black_v1, .nh_hair_black_v0, .head_5_v2, .head_5_v1, .head_5_v0, .head_4_v2, .head_4_v1, .head_4_v0, .head_3_v2, .head_3_v1, .head_3_v0, .head_2_v2, .head_2_v1, .head_2_v0, .head_1_v1, .head_1_v0, .head_0_v1, .head_0_v0, .hair_white_v1, .hair_white_v0, .hair_brown_v1, .hair_brown_v0, .hair_blond_v1, .hair_blond_v0, .hair_black_v1, .hair_black_v0, .armor_5_v1, .armor_5_v0, .armor_4_v1, .armor_4_v0, .armor_3_v1, .armor_3_v0, .armor_2_v0, .armor_1_v1, .armor_1_v0, .armor_0_v11, .armor_0_v10, .armor_0_v9, .armor_0_v8, .armor_0_v7, .armor_0_v6, .armor_0_v5, .armor_0_v4, .armor_0_v3, .armor_0_v2, .armor_0_v1, .armor_0_v0 {background: url('img/sprites/player_sprites.png') no-repeat} -.weapon_6 {background-position: 0 0; width: 90px; height: 90px} -.weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -.weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -.weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -.weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -.weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -.weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -.skin_white {background-position: -630px 0; width: 90px; height: 90px} -.skin_pale {background-position: -720px 0; width: 90px; height: 90px} -.skin_orc {background-position: -810px 0; width: 90px; height: 90px} -.skin_dead {background-position: -900px 0; width: 90px; height: 90px} -.skin_black {background-position: -990px 0; width: 90px; height: 90px} -.skin_asian {background-position: -1080px 0; width: 90px; height: 90px} -.shield_5_v1 {background-position: -1170px 0; width: 90px; height: 90px} -.shield_5_v0 {background-position: -1260px 0; width: 90px; height: 90px} -.shield_4_v0 {background-position: -1350px 0; width: 90px; height: 90px} -.shield_3_v1 {background-position: -1440px 0; width: 90px; height: 90px} -.shield_3_v0 {background-position: -1530px 0; width: 90px; height: 90px} -.shield_2_v1 {background-position: -1620px 0; width: 90px; height: 90px} -.shield_2_v0 {background-position: -1710px 0; width: 90px; height: 90px} -.shield_1_v1 {background-position: -1800px 0; width: 90px; height: 90px} -.shield_1_v0 {background-position: -1890px 0; width: 90px; height: 90px} -._shield_4_v1 {background-position: -1980px 0; width: 90px; height: 90px} -.nh_hair_white_v1 {background-position: -2070px 0; width: 90px; height: 90px} -.nh_hair_white_v0 {background-position: -2160px 0; width: 90px; height: 90px} -.nh_hair_brown_v1 {background-position: -2250px 0; width: 90px; height: 90px} -.nh_hair_brown_v0 {background-position: -2340px 0; width: 90px; height: 90px} -.nh_hair_blond_v1 {background-position: -2430px 0; width: 90px; height: 90px} -.nh_hair_blond_v0 {background-position: -2520px 0; width: 90px; height: 90px} -.nh_hair_black_v1 {background-position: -2610px 0; width: 90px; height: 90px} -.nh_hair_black_v0 {background-position: -2700px 0; width: 90px; height: 90px} -.head_5_v2 {background-position: -2790px 0; width: 90px; height: 90px} -.head_5_v1 {background-position: -2880px 0; width: 90px; height: 90px} -.head_5_v0 {background-position: -2970px 0; width: 90px; height: 90px} -.head_4_v2 {background-position: -3060px 0; width: 90px; height: 90px} -.head_4_v1 {background-position: -3150px 0; width: 90px; height: 90px} -.head_4_v0 {background-position: -3240px 0; width: 90px; height: 90px} -.head_3_v2 {background-position: -3330px 0; width: 90px; height: 90px} -.head_3_v1 {background-position: -3420px 0; width: 90px; height: 90px} -.head_3_v0 {background-position: -3510px 0; width: 90px; height: 90px} -.head_2_v2 {background-position: -3600px 0; width: 90px; height: 90px} -.head_2_v1 {background-position: -3690px 0; width: 90px; height: 90px} -.head_2_v0 {background-position: -3780px 0; width: 90px; height: 90px} -.head_1_v1 {background-position: -3870px 0; width: 90px; height: 90px} -.head_1_v0 {background-position: -3960px 0; width: 90px; height: 90px} -.head_0_v1 {background-position: -4050px 0; width: 90px; height: 90px} -.head_0_v0 {background-position: -4140px 0; width: 90px; height: 90px} -.hair_white_v1 {background-position: -4230px 0; width: 90px; height: 90px} -.hair_white_v0 {background-position: -4320px 0; width: 90px; height: 90px} -.hair_brown_v1 {background-position: -4410px 0; width: 90px; height: 90px} -.hair_brown_v0 {background-position: -4500px 0; width: 90px; height: 90px} -.hair_blond_v1 {background-position: -4590px 0; width: 90px; height: 90px} -.hair_blond_v0 {background-position: -4680px 0; width: 90px; height: 90px} -.hair_black_v1 {background-position: -4770px 0; width: 90px; height: 90px} -.hair_black_v0 {background-position: -4860px 0; width: 90px; height: 90px} -.armor_5_v1 {background-position: -4950px 0; width: 90px; height: 90px} -.armor_5_v0 {background-position: -5040px 0; width: 90px; height: 90px} -.armor_4_v1 {background-position: -5130px 0; width: 90px; height: 90px} -.armor_4_v0 {background-position: -5220px 0; width: 90px; height: 90px} -.armor_3_v1 {background-position: -5310px 0; width: 90px; height: 90px} -.armor_3_v0 {background-position: -5400px 0; width: 90px; height: 90px} -.armor_2_v0 {background-position: -5490px 0; width: 90px; height: 90px} -.armor_1_v1 {background-position: -5580px 0; width: 90px; height: 90px} -.armor_1_v0 {background-position: -5670px 0; width: 90px; height: 90px} -.armor_0_v11 {background-position: -5760px 0; width: 90px; height: 90px} -.armor_0_v10 {background-position: -5850px 0; width: 90px; height: 90px} -.armor_0_v9 {background-position: -5940px 0; width: 90px; height: 90px} -.armor_0_v8 {background-position: -6030px 0; width: 90px; height: 90px} -.armor_0_v7 {background-position: -6120px 0; width: 90px; height: 90px} -.armor_0_v6 {background-position: -6210px 0; width: 90px; height: 90px} -.armor_0_v5 {background-position: -6300px 0; width: 90px; height: 90px} -.armor_0_v4 {background-position: -6390px 0; width: 90px; height: 90px} -.armor_0_v3 {background-position: -6480px 0; width: 90px; height: 90px} -.armor_0_v2 {background-position: -6570px 0; width: 90px; height: 90px} -.armor_0_v1 {background-position: -6660px 0; width: 90px; height: 90px} -.armor_0_v0 {background-position: -6750px 0; width: 90px; height: 90px} -[class^="shop_"], [class^="zzz"] { - background: url('img/sprites/shop_sprites.png') no-repeat; -} - -[class^="shop_weapon_"], [class^="shop_shield_"], [class^="shop_head_"], [class^="shop_armor_"], [class^="zzz"] { - width: 40px; - height: 40px; -} - -.shop_weapon_6 {background-position: 0 0} -.shop_weapon_5 {background-position: -40px 0} -.shop_weapon_4 {background-position: -80px 0} -.shop_weapon_3 {background-position: -120px 0} -.shop_weapon_2 {background-position: -160px 0} -.shop_weapon_1 {background-position: -200px 0} -.shop_shield_5 {background-position: -240px 0} -.shop_shield_4 {background-position: -280px 0} -.shop_shield_3 {background-position: -320px 0} -.shop_shield_2 {background-position: -360px 0} -.shop_shield_1 {background-position: -400px 0} -.shop_head_5 {background-position: -440px 0} -.shop_head_4 {background-position: -480px 0} -.shop_head_3 {background-position: -520px 0} -.shop_head_2 {background-position: -560px 0} -.shop_head_1 {background-position: -600px 0} -.shop_armor_5 {background-position: -640px 0} -.shop_armor_4 {background-position: -680px 0} -.shop_armor_3 {background-position: -720px 0} -.shop_armor_2 {background-position: -760px 0} -.shop_armor_1 {background-position: -800px 0} -.shop_reroll {background-position: -840px 0; width: 40px; height: 40px} -.shop_potion {background-position: -880px 0; width: 40px; height: 40px} -.shop_copper {background-position: -923px -8px; width: 32px; height: 22px} -.shop_silver {background-position: -963px -8px; width: 32px; height: 22px} -.shop_gold {background-position: -1003px -8px; width: 32px; height: 22px} -.zzz{background-position: -1200px 0} -.zzz_light{background-position: -1280px 0} \ No newline at end of file